@miadi/stateloom-web 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/package.json +1 -1
  2. package/server/.next/BUILD_ID +1 -1
  3. package/server/.next/app-path-routes-manifest.json +1 -0
  4. package/server/.next/build-manifest.json +5 -5
  5. package/server/.next/prerender-manifest.json +3 -3
  6. package/server/.next/required-server-files.json +1 -1
  7. package/server/.next/routes-manifest.json +6 -0
  8. package/server/.next/server/app/_global-error/page/build-manifest.json +3 -3
  9. package/server/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/server/.next/server/app/_global-error.html +2 -2
  12. package/server/.next/server/app/_global-error.rsc +1 -1
  13. package/server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  14. package/server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/server/.next/server/app/_not-found/page/build-manifest.json +3 -3
  19. package/server/.next/server/app/_not-found/page.js.nft.json +1 -1
  20. package/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/server/.next/server/app/_not-found.html +1 -1
  22. package/server/.next/server/app/_not-found.rsc +2 -2
  23. package/server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  24. package/server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  26. package/server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  29. package/server/.next/server/app/api/docs/route.js.nft.json +1 -1
  30. package/server/.next/server/app/api/file/route.js.nft.json +1 -1
  31. package/server/.next/server/app/api/marks/route.js.nft.json +1 -1
  32. package/server/.next/server/app/api/rispec/route.js.nft.json +1 -1
  33. package/server/.next/server/app/api/system-of/route/app-paths-manifest.json +3 -0
  34. package/server/.next/server/app/api/system-of/route/build-manifest.json +11 -0
  35. package/server/.next/server/app/api/system-of/route/server-reference-manifest.json +4 -0
  36. package/server/.next/server/app/api/system-of/route.js +8 -0
  37. package/server/.next/server/app/api/system-of/route.js.map +5 -0
  38. package/server/.next/server/app/api/system-of/route.js.nft.json +1 -0
  39. package/server/.next/server/app/api/system-of/route_client-reference-manifest.js +2 -0
  40. package/server/.next/server/app/api/watch/route.js.nft.json +1 -1
  41. package/server/.next/server/app/index.html +1 -1
  42. package/server/.next/server/app/index.rsc +3 -3
  43. package/server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  44. package/server/.next/server/app/index.segments/_full.segment.rsc +3 -3
  45. package/server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  46. package/server/.next/server/app/index.segments/_index.segment.rsc +2 -2
  47. package/server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  48. package/server/.next/server/app/page/build-manifest.json +3 -3
  49. package/server/.next/server/app/page.js.nft.json +1 -1
  50. package/server/.next/server/app/page_client-reference-manifest.js +1 -1
  51. package/server/.next/server/app-paths-manifest.json +1 -0
  52. package/server/.next/server/chunks/[root-of-the-server]__13c3d2a8._.js +1 -1
  53. package/server/.next/server/chunks/[root-of-the-server]__2046b812._.js +2 -2
  54. package/server/.next/server/chunks/[root-of-the-server]__87bf4b91._.js +1 -1
  55. package/server/.next/server/chunks/[root-of-the-server]__95b05635._.js +1 -1
  56. package/server/.next/server/chunks/[root-of-the-server]__aedef6d1._.js +1 -1
  57. package/server/.next/server/chunks/[root-of-the-server]__d21ea469._.js +3 -0
  58. package/server/.next/server/chunks/bridge-protocol_dist_index_179d02a5.js +1 -1
  59. package/server/.next/server/chunks/ssr/{2374f_next_dist_0c464f98._.js → 2374f_next_dist_491bc9ca._.js} +2 -2
  60. package/server/.next/server/chunks/ssr/{[root-of-the-server]__385c85a7._.js → [root-of-the-server]__0d719a8a._.js} +2 -2
  61. package/server/.next/server/chunks/ssr/[root-of-the-server]__199d50b6._.js +3 -0
  62. package/server/.next/server/chunks/ssr/[root-of-the-server]__5c28bab6._.js +3 -0
  63. package/server/.next/server/chunks/ssr/[root-of-the-server]__edbb995c._.js +6 -6
  64. package/server/.next/server/chunks/web__next-internal_server_app_api_system-of_route_actions_1988181c.js +3 -0
  65. package/server/.next/server/middleware-build-manifest.js +3 -3
  66. package/server/.next/server/pages/404.html +1 -1
  67. package/server/.next/server/pages/500.html +2 -2
  68. package/server/.next/server/server-reference-manifest.js +1 -1
  69. package/server/.next/server/server-reference-manifest.json +1 -1
  70. package/server/.next/static/chunks/0fd0d2a3caf9e5c4.js +14 -0
  71. package/server/.next/static/chunks/33df24ad2d3a04e7.js +1 -0
  72. package/server/.next/static/chunks/6052c4bfdd66ef5c.css +2 -0
  73. package/server/.next/static/chunks/b71bf89a3bbb72e1.js +5 -0
  74. package/server/.next/static/chunks/{turbopack-b3cae9131ae5086f.js → turbopack-3a774f5a5a8a9023.js} +1 -1
  75. package/server/package-lock.json +2 -2
  76. package/server/package.json +1 -1
  77. package/server/server.js +1 -1
  78. package/server/src/app/api/system-of/route.ts +22 -0
  79. package/server/src/app/globals.css +40 -2
  80. package/server/src/app/page.tsx +12 -8
  81. package/server/src/components/ChromeIcon.tsx +106 -0
  82. package/server/src/components/PropertiesPanel.tsx +3 -2
  83. package/server/src/components/Toolbar.tsx +37 -20
  84. package/server/src/components/erd/ErdWorkspace.tsx +2 -1
  85. package/server/src/components/sequence/SequenceWorkspace.tsx +10 -1
  86. package/server/src/components/stage/CompanionLayer.tsx +41 -6
  87. package/server/src/components/stage/StageLayer.tsx +206 -23
  88. package/server/src/components/stage/StageProvider.tsx +146 -25
  89. package/server/src/components/system/SystemWorkspace.tsx +26 -12
  90. package/server/src/lib/markRequest.ts +24 -0
  91. package/server/src/lib/systemOf.ts +80 -0
  92. package/server/src/lib/systemParam.ts +46 -1
  93. package/server/src/lib/useNarrow.ts +30 -0
  94. package/server/stateloom-web.json +2 -2
  95. package/server/tsconfig.tsbuildinfo +1 -1
  96. package/server/.next/server/chunks/ssr/[root-of-the-server]__a593e8b6._.js +0 -3
  97. package/server/.next/server/chunks/ssr/[root-of-the-server]__f25b51be._.js +0 -3
  98. package/server/.next/static/chunks/59a1ec89a1dc7e34.js +0 -14
  99. package/server/.next/static/chunks/662d1b0ce457c16b.js +0 -1
  100. package/server/.next/static/chunks/8f45e56f40c207bf.css +0 -2
  101. package/server/.next/static/chunks/96818f5620f039a1.js +0 -5
  102. /package/server/.next/static/{CZ4wRF1efsHnxjkcKHITP → 1YtenfowImzXV-wx5GWY1}/_buildManifest.js +0 -0
  103. /package/server/.next/static/{CZ4wRF1efsHnxjkcKHITP → 1YtenfowImzXV-wx5GWY1}/_clientMiddlewareManifest.json +0 -0
  104. /package/server/.next/static/{CZ4wRF1efsHnxjkcKHITP → 1YtenfowImzXV-wx5GWY1}/_ssgManifest.js +0 -0
@@ -1,17 +1,17 @@
1
1
  module.exports=[92509,(a,b,c)=>{b.exports=a.x("url",()=>require("url"))},21517,(a,b,c)=>{b.exports=a.x("http",()=>require("http"))},24836,(a,b,c)=>{b.exports=a.x("https",()=>require("https"))},53681,(a,b,c)=>{var d=a.r(22734),e=a.r(92509),f=a.r(33405).spawn;function g(b){"use strict";b=b||{};var c,g,h=this,i=a.r(21517),j=a.r(24836),k={},l=!1,m={"User-Agent":"node-XMLHttpRequest",Accept:"*/*"},n=Object.assign({},m),o=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","content-transfer-encoding","cookie","cookie2","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","via"],p=["TRACE","TRACK","CONNECT"],q=!1,r=!1,s=!1,t={};this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.readyState=this.UNSENT,this.onreadystatechange=null,this.responseText="",this.responseXML="",this.response=Buffer.alloc(0),this.status=null,this.statusText=null,this.open=function(a,b,c,d,e){if(this.abort(),r=!1,s=!1,!(a&&-1===p.indexOf(a)))throw Error("SecurityError: Request method not allowed");k={method:a,url:b.toString(),async:"boolean"!=typeof c||c,user:d||null,password:e||null},u(this.OPENED)},this.setDisableHeaderCheck=function(a){l=a},this.setRequestHeader=function(a,b){if(this.readyState!=this.OPENED)throw Error("INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN");if(!l&&(!a||-1!==o.indexOf(a.toLowerCase())))return console.warn('Refused to set unsafe header "'+a+'"'),!1;if(q)throw Error("INVALID_STATE_ERR: send flag is true");return n[a]=b,!0},this.getResponseHeader=function(a){return"string"==typeof a&&this.readyState>this.OPENED&&g.headers[a.toLowerCase()]&&!r?g.headers[a.toLowerCase()]:null},this.getAllResponseHeaders=function(){if(this.readyState<this.HEADERS_RECEIVED||r)return"";var a="";for(var b in g.headers)"set-cookie"!==b&&"set-cookie2"!==b&&(a+=b+": "+g.headers[b]+"\r\n");return a.substr(0,a.length-2)},this.getRequestHeader=function(a){return"string"==typeof a&&n[a]?n[a]:""},this.send=function(a){if(this.readyState!=this.OPENED)throw Error("INVALID_STATE_ERR: connection must be opened before send() is called");if(q)throw Error("INVALID_STATE_ERR: send has already been called");var l,m=!1,o=!1,p=e.parse(k.url);switch(p.protocol){case"https:":m=!0;case"http:":l=p.hostname;break;case"file:":o=!0;break;case void 0:case"":l="localhost";break;default:throw Error("Protocol not supported.")}if(o){if("GET"!==k.method)throw Error("XMLHttpRequest: Only GET method is supported");if(k.async)d.readFile(unescape(p.pathname),function(a,b){a?h.handleError(a,a.errno||-1):(h.status=200,h.responseText=b.toString("utf8"),h.response=b,u(h.DONE))});else try{this.response=d.readFileSync(unescape(p.pathname)),this.responseText=this.response.toString("utf8"),this.status=200,u(h.DONE)}catch(a){this.handleError(a,a.errno||-1)}return}var s=p.port||(m?443:80),t=p.pathname+(p.search?p.search:"");if(n.Host=l,m&&443===s||80===s||(n.Host+=":"+p.port),k.user){void 0===k.password&&(k.password="");var v=new Buffer(k.user+":"+k.password);n.Authorization="Basic "+v.toString("base64")}"GET"===k.method||"HEAD"===k.method?a=null:a?(n["Content-Length"]=Buffer.isBuffer(a)?a.length:Buffer.byteLength(a),Object.keys(n).some(function(a){return"content-type"===a.toLowerCase()})||(n["Content-Type"]="text/plain;charset=UTF-8")):"POST"===k.method&&(n["Content-Length"]=0);var w=b.agent||!1,x={host:l,port:s,path:t,method:k.method,headers:n,agent:w};if(m&&(x.pfx=b.pfx,x.key=b.key,x.passphrase=b.passphrase,x.cert=b.cert,x.ca=b.ca,x.ciphers=b.ciphers,x.rejectUnauthorized=!1!==b.rejectUnauthorized),r=!1,k.async){var y=m?j.request:i.request;q=!0,h.dispatchEvent("readystatechange");var z=function(a){if(302===(g=a).statusCode||303===g.statusCode||307===g.statusCode){k.url=g.headers.location;var d=e.parse(k.url);l=d.hostname;var f={hostname:d.hostname,port:d.port,path:d.path,method:303===g.statusCode?"GET":k.method,headers:n};m&&(f.pfx=b.pfx,f.key=b.key,f.passphrase=b.passphrase,f.cert=b.cert,f.ca=b.ca,f.ciphers=b.ciphers,f.rejectUnauthorized=!1!==b.rejectUnauthorized),(c=y(f,z).on("error",A)).end();return}u(h.HEADERS_RECEIVED),h.status=g.statusCode,g.on("data",function(a){if(a){var b=Buffer.from(a);h.response=Buffer.concat([h.response,b])}q&&u(h.LOADING)}),g.on("end",function(){q&&(q=!1,u(h.DONE),h.responseText=h.response.toString("utf8"))}),g.on("error",function(a){h.handleError(a)})},A=function(a){if(c.reusedSocket&&"ECONNRESET"===a.code)return y(x,z).on("error",A);h.handleError(a)};c=y(x,z).on("error",A),b.autoUnref&&c.on("socket",a=>{a.unref()}),a&&c.write(a),c.end(),h.dispatchEvent("loadstart")}else{var B=".node-xmlhttprequest-content-"+process.pid,C=".node-xmlhttprequest-sync-"+process.pid;d.writeFileSync(C,"","utf8");for(var D="var http = require('http'), https = require('https'), fs = require('fs');var doRequest = http"+(m?"s":"")+".request;var options = "+JSON.stringify(x)+";var responseText = '';var responseData = Buffer.alloc(0);var req = doRequest(options, function(response) {response.on('data', function(chunk) { var data = Buffer.from(chunk); responseText += data.toString('utf8'); responseData = Buffer.concat([responseData, data]);});response.on('end', function() {fs.writeFileSync('"+B+"', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText, data: responseData.toString('base64')}}), 'utf8');fs.unlinkSync('"+C+"');});response.on('error', function(error) {fs.writeFileSync('"+B+"', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');fs.unlinkSync('"+C+"');});}).on('error', function(error) {fs.writeFileSync('"+B+"', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');fs.unlinkSync('"+C+"');});"+(a?"req.write('"+JSON.stringify(a).slice(1,-1).replace(/'/g,"\\'")+"');":"")+"req.end();",E=f(process.argv[0],["-e",D]);d.existsSync(C););if(h.responseText=d.readFileSync(B,"utf8"),E.stdin.end(),d.unlinkSync(B),h.responseText.match(/^NODE-XMLHTTPREQUEST-ERROR:/)){var F=JSON.parse(h.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/,""));h.handleError(F,503)}else{h.status=h.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/,"$1");var G=JSON.parse(h.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/,"$1"));g={statusCode:h.status,headers:G.data.headers},h.responseText=G.data.text,h.response=Buffer.from(G.data.data,"base64"),u(h.DONE,!0)}}},this.handleError=function(a,b){this.status=b||0,this.statusText=a,this.responseText=a.stack,r=!0,u(this.DONE)},this.abort=function(){c&&(c.abort(),c=null),n=Object.assign({},m),this.responseText="",this.responseXML="",this.response=Buffer.alloc(0),r=s=!0,this.readyState!==this.UNSENT&&(this.readyState!==this.OPENED||q)&&this.readyState!==this.DONE&&(q=!1,u(this.DONE)),this.readyState=this.UNSENT},this.addEventListener=function(a,b){a in t||(t[a]=[]),t[a].push(b)},this.removeEventListener=function(a,b){a in t&&(t[a]=t[a].filter(function(a){return a!==b}))},this.dispatchEvent=function(a){if("function"==typeof h["on"+a]&&(this.readyState===this.DONE&&k.async?setTimeout(function(){h["on"+a]()},0):h["on"+a]()),a in t)for(let b=0,c=t[a].length;b<c;b++)this.readyState===this.DONE?setTimeout(function(){t[a][b].call(h)},0):t[a][b].call(h)};var u=function(a){if(h.readyState!==a&&(h.readyState!==h.UNSENT||!s)&&(h.readyState=a,(k.async||h.readyState<h.OPENED||h.readyState===h.DONE)&&h.dispatchEvent("readystatechange"),h.readyState===h.DONE)){let a;a=s?"abort":r?"error":"load",h.dispatchEvent(a),h.dispatchEvent("loadend")}}}b.exports=g,g.XMLHttpRequest=g},90538,(a,b,c)=>{function d(a,b,c,d){return Math.round(a/c)+" "+d+(b>=1.5*c?"s":"")}b.exports=function(a,b){b=b||{};var c,e,f,g,h=typeof a;if("string"===h&&a.length>0){var i=a;if(!((i=String(i)).length>100)){var j=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(j){var k=parseFloat(j[1]);switch((j[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*k;case"weeks":case"week":case"w":return 6048e5*k;case"days":case"day":case"d":return 864e5*k;case"hours":case"hour":case"hrs":case"hr":case"h":return 36e5*k;case"minutes":case"minute":case"mins":case"min":case"m":return 6e4*k;case"seconds":case"second":case"secs":case"sec":case"s":return 1e3*k;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return k;default:break}}}return}if("number"===h&&isFinite(a)){return b.long?(e=Math.abs(c=a))>=864e5?d(c,e,864e5,"day"):e>=36e5?d(c,e,36e5,"hour"):e>=6e4?d(c,e,6e4,"minute"):e>=1e3?d(c,e,1e3,"second"):c+" ms":(g=Math.abs(f=a))>=864e5?Math.round(f/864e5)+"d":g>=36e5?Math.round(f/36e5)+"h":g>=6e4?Math.round(f/6e4)+"m":g>=1e3?Math.round(f/1e3)+"s":f+"ms"}throw Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}},58449,(a,b,c)=>{b.exports=function(b){function c(a){let b,e,f,g=null;function h(...a){if(!h.enabled)return;let d=Number(new Date);h.diff=d-(b||d),h.prev=b,h.curr=d,b=d,a[0]=c.coerce(a[0]),"string"!=typeof a[0]&&a.unshift("%O");let e=0;a[0]=a[0].replace(/%([a-zA-Z%])/g,(b,d)=>{if("%%"===b)return"%";e++;let f=c.formatters[d];if("function"==typeof f){let c=a[e];b=f.call(h,c),a.splice(e,1),e--}return b}),c.formatArgs.call(h,a),(h.log||c.log).apply(h,a)}return h.namespace=a,h.useColors=c.useColors(),h.color=c.selectColor(a),h.extend=d,h.destroy=c.destroy,Object.defineProperty(h,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==g?g:(e!==c.namespaces&&(e=c.namespaces,f=c.enabled(a)),f),set:a=>{g=a}}),"function"==typeof c.init&&c.init(h),h}function d(a,b){let d=c(this.namespace+(void 0===b?":":b)+a);return d.log=this.log,d}function e(a,b){let c=0,d=0,e=-1,f=0;for(;c<a.length;)if(d<b.length&&(b[d]===a[c]||"*"===b[d]))"*"===b[d]?(e=d,f=c):c++,d++;else{if(-1===e)return!1;d=e+1,c=++f}for(;d<b.length&&"*"===b[d];)d++;return d===b.length}return c.debug=c,c.default=c,c.coerce=function(a){return a instanceof Error?a.stack||a.message:a},c.disable=function(){let a=[...c.names,...c.skips.map(a=>"-"+a)].join(",");return c.enable(""),a},c.enable=function(a){for(let b of(c.save(a),c.namespaces=a,c.names=[],c.skips=[],("string"==typeof a?a:"").trim().replace(/\s+/g,",").split(",").filter(Boolean)))"-"===b[0]?c.skips.push(b.slice(1)):c.names.push(b)},c.enabled=function(a){for(let b of c.skips)if(e(a,b))return!1;for(let b of c.names)if(e(a,b))return!0;return!1},c.humanize=a.r(90538),c.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(b).forEach(a=>{c[a]=b[a]}),c.names=[],c.skips=[],c.formatters={},c.selectColor=function(a){let b=0;for(let c=0;c<a.length;c++)b=(b<<5)-b+a.charCodeAt(c)|0;return c.colors[Math.abs(b)%c.colors.length]},c.enable(c.load()),c}},70722,(a,b,c)=>{b.exports=a.x("tty",()=>require("tty"))},9031,(a,b,c)=>{let d=a.r(70722),e=a.r(24361);c.init=function(a){a.inspectOpts={};let b=Object.keys(c.inspectOpts);for(let d=0;d<b.length;d++)a.inspectOpts[b[d]]=c.inspectOpts[b[d]]},c.log=function(...a){return process.stderr.write(e.formatWithOptions(c.inspectOpts,...a)+"\n")},c.formatArgs=function(a){let{namespace:d,useColors:e}=this;if(e){let c=this.color,e="\x1b[3"+(c<8?c:"8;5;"+c),f=` ${e};1m${d} \u001B[0m`;a[0]=f+a[0].split("\n").join("\n"+f),a.push(e+"m+"+b.exports.humanize(this.diff)+"\x1b[0m")}else a[0]=(c.inspectOpts.hideDate?"":new Date().toISOString()+" ")+d+" "+a[0]},c.save=function(a){a?process.env.DEBUG=a:delete process.env.DEBUG},c.load=function(){return process.env.DEBUG},c.useColors=function(){return"colors"in c.inspectOpts?!!c.inspectOpts.colors:d.isatty(process.stderr.fd)},c.destroy=e.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),c.colors=[6,2,3,4,5,1];try{let a=(()=>{let a=Error("Cannot find module 'supports-color'");throw a.code="MODULE_NOT_FOUND",a})();a&&(a.stderr||a).level>=2&&(c.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(a){}c.inspectOpts=Object.keys(process.env).filter(a=>/^debug_/i.test(a)).reduce((a,b)=>{let c=b.substring(6).toLowerCase().replace(/_([a-z])/g,(a,b)=>b.toUpperCase()),d=process.env[b];return d=!!/^(yes|on|true|enabled)$/i.test(d)||!/^(no|off|false|disabled)$/i.test(d)&&("null"===d?null:Number(d)),a[c]=d,a},{}),b.exports=a.r(58449)(c);let{formatters:f}=b.exports;f.o=function(a){return this.inspectOpts.colors=this.useColors,e.inspect(a,this.inspectOpts).split("\n").map(a=>a.trim()).join(" ")},f.O=function(a){return this.inspectOpts.colors=this.useColors,e.inspect(a,this.inspectOpts)}},83021,(a,b,c)=>{let d;c.formatArgs=function(a){if(a[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+a[0]+(this.useColors?"%c ":" ")+"+"+b.exports.humanize(this.diff),!this.useColors)return;let c="color: "+this.color;a.splice(1,0,c,"color: inherit");let d=0,e=0;a[0].replace(/%[a-zA-Z%]/g,a=>{"%%"!==a&&(d++,"%c"===a&&(e=d))}),a.splice(e,0,c)},c.save=function(a){try{a?c.storage.setItem("debug",a):c.storage.removeItem("debug")}catch(a){}},c.load=function(){let a;try{a=c.storage.getItem("debug")||c.storage.getItem("DEBUG")}catch(a){}return!a&&"u">typeof process&&"env"in process&&(a=process.env.DEBUG),a},c.useColors=function(){let a;return!("u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("u">typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"u">typeof navigator&&navigator.userAgent&&(a=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(a[1],10)>=31||"u">typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},c.storage=function(){try{return localStorage}catch(a){}}(),d=!1,c.destroy=()=>{d||(d=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))},c.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],c.log=console.debug||console.log||(()=>{}),b.exports=a.r(58449)(c);let{formatters:e}=b.exports;e.j=function(a){try{return JSON.stringify(a)}catch(a){return"[UnexpectedJSONParseError]: "+a.message}}},72724,(a,b,c)=>{"u"<typeof process||"renderer"===process.type||process.__nwjs?b.exports=a.r(83021):b.exports=a.r(9031)},27699,(a,b,c)=>{b.exports=a.x("events",()=>require("events"))},4446,(a,b,c)=>{b.exports=a.x("net",()=>require("net"))},55004,(a,b,c)=>{b.exports=a.x("tls",()=>require("tls"))},54799,(a,b,c)=>{b.exports=a.x("crypto",()=>require("crypto"))},88947,(a,b,c)=>{b.exports=a.x("stream",()=>require("stream"))},6461,(a,b,c)=>{b.exports=a.x("zlib",()=>require("zlib"))},63046,(a,b,c)=>{"use strict";let d=["nodebuffer","arraybuffer","fragments"],e="u">typeof Blob;e&&d.push("blob"),b.exports={BINARY_TYPES:d,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:e,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}},40338,(a,b,c)=>{"use strict";let{EMPTY_BUFFER:d}=a.r(63046),e=Buffer[Symbol.species];function f(a,b,c,d,e){for(let f=0;f<e;f++)c[d+f]=a[f]^b[3&f]}function g(a,b){for(let c=0;c<a.length;c++)a[c]^=b[3&c]}function h(a){let b;return(h.readOnly=!0,Buffer.isBuffer(a))?a:(a instanceof ArrayBuffer?b=new e(a):ArrayBuffer.isView(a)?b=new e(a.buffer,a.byteOffset,a.byteLength):(b=Buffer.from(a),h.readOnly=!1),b)}if(b.exports={concat:function(a,b){if(0===a.length)return d;if(1===a.length)return a[0];let c=Buffer.allocUnsafe(b),f=0;for(let b=0;b<a.length;b++){let d=a[b];c.set(d,f),f+=d.length}return f<b?new e(c.buffer,c.byteOffset,f):c},mask:f,toArrayBuffer:function(a){return a.length===a.buffer.byteLength?a.buffer:a.buffer.slice(a.byteOffset,a.byteOffset+a.length)},toBuffer:h,unmask:g},!process.env.WS_NO_BUFFER_UTIL)try{let a=(()=>{let a=Error("Cannot find module 'bufferutil'");throw a.code="MODULE_NOT_FOUND",a})();b.exports.mask=function(b,c,d,e,g){g<48?f(b,c,d,e,g):a.mask(b,c,d,e,g)},b.exports.unmask=function(b,c){b.length<32?g(b,c):a.unmask(b,c)}}catch(a){}},14025,(a,b,c)=>{"use strict";let d=Symbol("kDone"),e=Symbol("kRun");b.exports=class{constructor(a){this[d]=()=>{this.pending--,this[e]()},this.concurrency=a||1/0,this.jobs=[],this.pending=0}add(a){this.jobs.push(a),this[e]()}[e](){if(this.pending!==this.concurrency&&this.jobs.length){let a=this.jobs.shift();this.pending++,a(this[d])}}}},31276,(a,b,c)=>{"use strict";let d,e=a.r(6461),f=a.r(40338),g=a.r(14025),{kStatusCode:h}=a.r(63046),i=Buffer[Symbol.species],j=Buffer.from([0,0,255,255]),k=Symbol("permessage-deflate"),l=Symbol("total-length"),m=Symbol("callback"),n=Symbol("buffers"),o=Symbol("error");function p(a){this[n].push(a),this[l]+=a.length}function q(a){(this[l]+=a.length,this[k]._maxPayload<1||this[l]<=this[k]._maxPayload)?this[n].push(a):(this[o]=RangeError("Max payload size exceeded"),this[o].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[o][h]=1009,this.removeListener("data",q),this.reset())}function r(a){(this[k]._inflate=null,this[o])?this[m](this[o]):(a[h]=1007,this[m](a))}b.exports=class{constructor(a){this._options=a||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._maxPayload=0|this._options.maxPayload,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,d||(d=new g(void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10))}static get extensionName(){return"permessage-deflate"}offer(){let a={};return this._options.serverNoContextTakeover&&(a.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(a.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(a.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?a.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(a.client_max_window_bits=!0),a}accept(a){return a=this.normalizeParams(a),this.params=this._isServer?this.acceptAsServer(a):this.acceptAsClient(a),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let a=this._deflate[m];this._deflate.close(),this._deflate=null,a&&a(Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(a){let b=this._options,c=a.find(a=>(!1!==b.serverNoContextTakeover||!a.server_no_context_takeover)&&(!a.server_max_window_bits||!1!==b.serverMaxWindowBits&&("number"!=typeof b.serverMaxWindowBits||!(b.serverMaxWindowBits>a.server_max_window_bits)))&&("number"!=typeof b.clientMaxWindowBits||!!a.client_max_window_bits));if(!c)throw Error("None of the extension offers can be accepted");return b.serverNoContextTakeover&&(c.server_no_context_takeover=!0),b.clientNoContextTakeover&&(c.client_no_context_takeover=!0),"number"==typeof b.serverMaxWindowBits&&(c.server_max_window_bits=b.serverMaxWindowBits),"number"==typeof b.clientMaxWindowBits?c.client_max_window_bits=b.clientMaxWindowBits:(!0===c.client_max_window_bits||!1===b.clientMaxWindowBits)&&delete c.client_max_window_bits,c}acceptAsClient(a){let b=a[0];if(!1===this._options.clientNoContextTakeover&&b.client_no_context_takeover)throw Error('Unexpected parameter "client_no_context_takeover"');if(b.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&b.client_max_window_bits>this._options.clientMaxWindowBits)throw Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(b.client_max_window_bits=this._options.clientMaxWindowBits);return b}normalizeParams(a){return a.forEach(a=>{Object.keys(a).forEach(b=>{let c=a[b];if(c.length>1)throw Error(`Parameter "${b}" must have only a single value`);if(c=c[0],"client_max_window_bits"===b){if(!0!==c){let a=+c;if(!Number.isInteger(a)||a<8||a>15)throw TypeError(`Invalid value for parameter "${b}": ${c}`);c=a}else if(!this._isServer)throw TypeError(`Invalid value for parameter "${b}": ${c}`)}else if("server_max_window_bits"===b){let a=+c;if(!Number.isInteger(a)||a<8||a>15)throw TypeError(`Invalid value for parameter "${b}": ${c}`);c=a}else if("client_no_context_takeover"===b||"server_no_context_takeover"===b){if(!0!==c)throw TypeError(`Invalid value for parameter "${b}": ${c}`)}else throw Error(`Unknown parameter "${b}"`);a[b]=c})}),a}decompress(a,b,c){d.add(d=>{this._decompress(a,b,(a,b)=>{d(),c(a,b)})})}compress(a,b,c){d.add(d=>{this._compress(a,b,(a,b)=>{d(),c(a,b)})})}_decompress(a,b,c){let d=this._isServer?"client":"server";if(!this._inflate){let a=`${d}_max_window_bits`,b="number"!=typeof this.params[a]?e.Z_DEFAULT_WINDOWBITS:this.params[a];this._inflate=e.createInflateRaw({...this._options.zlibInflateOptions,windowBits:b}),this._inflate[k]=this,this._inflate[l]=0,this._inflate[n]=[],this._inflate.on("error",r),this._inflate.on("data",q)}this._inflate[m]=c,this._inflate.write(a),b&&this._inflate.write(j),this._inflate.flush(()=>{let a=this._inflate[o];if(a){this._inflate.close(),this._inflate=null,c(a);return}let e=f.concat(this._inflate[n],this._inflate[l]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[l]=0,this._inflate[n]=[],b&&this.params[`${d}_no_context_takeover`]&&this._inflate.reset()),c(null,e)})}_compress(a,b,c){let d=this._isServer?"server":"client";if(!this._deflate){let a=`${d}_max_window_bits`,b="number"!=typeof this.params[a]?e.Z_DEFAULT_WINDOWBITS:this.params[a];this._deflate=e.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:b}),this._deflate[l]=0,this._deflate[n]=[],this._deflate.on("data",p)}this._deflate[m]=c,this._deflate.write(a),this._deflate.flush(e.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let a=f.concat(this._deflate[n],this._deflate[l]);b&&(a=new i(a.buffer,a.byteOffset,a.length-4)),this._deflate[m]=null,this._deflate[l]=0,this._deflate[n]=[],b&&this.params[`${d}_no_context_takeover`]&&this._deflate.reset(),c(null,a)})}}},874,(a,b,c)=>{b.exports=a.x("buffer",()=>require("buffer"))},42673,(a,b,c)=>{"use strict";let{isUtf8:d}=a.r(874),{hasBlob:e}=a.r(63046);function f(a){let b=a.length,c=0;for(;c<b;)if((128&a[c])==0)c++;else if((224&a[c])==192){if(c+1===b||(192&a[c+1])!=128||(254&a[c])==192)return!1;c+=2}else if((240&a[c])==224){if(c+2>=b||(192&a[c+1])!=128||(192&a[c+2])!=128||224===a[c]&&(224&a[c+1])==128||237===a[c]&&(224&a[c+1])==160)return!1;c+=3}else{if((248&a[c])!=240||c+3>=b||(192&a[c+1])!=128||(192&a[c+2])!=128||(192&a[c+3])!=128||240===a[c]&&(240&a[c+1])==128||244===a[c]&&a[c+1]>143||a[c]>244)return!1;c+=4}return!0}if(b.exports={isBlob:function(a){return e&&"object"==typeof a&&"function"==typeof a.arrayBuffer&&"string"==typeof a.type&&"function"==typeof a.stream&&("Blob"===a[Symbol.toStringTag]||"File"===a[Symbol.toStringTag])},isValidStatusCode:function(a){return a>=1e3&&a<=1014&&1004!==a&&1005!==a&&1006!==a||a>=3e3&&a<=4999},isValidUTF8:f,tokenChars:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0]},d)b.exports.isValidUTF8=function(a){return a.length<24?f(a):d(a)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let a=(()=>{let a=Error("Cannot find module 'utf-8-validate'");throw a.code="MODULE_NOT_FOUND",a})();b.exports.isValidUTF8=function(b){return b.length<32?f(b):a(b)}}catch(a){}},28719,(a,b,c)=>{"use strict";let{Writable:d}=a.r(88947),e=a.r(31276),{BINARY_TYPES:f,EMPTY_BUFFER:g,kStatusCode:h,kWebSocket:i}=a.r(63046),{concat:j,toArrayBuffer:k,unmask:l}=a.r(40338),{isValidStatusCode:m,isValidUTF8:n}=a.r(42673),o=Buffer[Symbol.species];b.exports=class extends d{constructor(a={}){super(),this._allowSynchronousEvents=void 0===a.allowSynchronousEvents||a.allowSynchronousEvents,this._binaryType=a.binaryType||f[0],this._extensions=a.extensions||{},this._isServer=!!a.isServer,this._maxBufferedChunks=0|a.maxBufferedChunks,this._maxFragments=0|a.maxFragments,this._maxPayload=0|a.maxPayload,this._skipUTF8Validation=!!a.skipUTF8Validation,this[i]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._numFragments=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(a,b,c){return 8===this._opcode&&0==this._state?c():this._maxBufferedChunks>0&&this._buffers.length>=this._maxBufferedChunks?void c(this.createError(RangeError,"Too many buffered chunks",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS")):void(this._bufferedBytes+=a.length,this._buffers.push(a),this.startLoop(c))}consume(a){if(this._bufferedBytes-=a,a===this._buffers[0].length)return this._buffers.shift();if(a<this._buffers[0].length){let b=this._buffers[0];return this._buffers[0]=new o(b.buffer,b.byteOffset+a,b.length-a),new o(b.buffer,b.byteOffset,a)}let b=Buffer.allocUnsafe(a);do{let c=this._buffers[0],d=b.length-a;a>=c.length?b.set(this._buffers.shift(),d):(b.set(new Uint8Array(c.buffer,c.byteOffset,a),d),this._buffers[0]=new o(c.buffer,c.byteOffset+a,c.length-a)),a-=c.length}while(a>0)return b}startLoop(a){this._loop=!0;do switch(this._state){case 0:this.getInfo(a);break;case 1:this.getPayloadLength16(a);break;case 2:this.getPayloadLength64(a);break;case 3:this.getMask();break;case 4:this.getData(a);break;case 5:case 6:this._loop=!1;return}while(this._loop)this._errored||a()}getInfo(a){if(this._bufferedBytes<2){this._loop=!1;return}let b=this.consume(2);if((48&b[0])!=0)return void a(this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3"));let c=(64&b[0])==64;if(c&&!this._extensions[e.extensionName])return void a(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"));if(this._fin=(128&b[0])==128,this._opcode=15&b[0],this._payloadLength=127&b[1],0===this._opcode){if(c)return void a(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"));if(!this._fragmented)return void a(this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE"));this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented)return void a(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"));this._compressed=c}else{if(!(this._opcode>7)||!(this._opcode<11))return void a(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"));if(!this._fin)return void a(this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN"));if(c)return void a(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"));if(this._payloadLength>125||8===this._opcode&&1===this._payloadLength)return void a(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"))}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=(128&b[1])==128,this._isServer){if(!this._masked)return void a(this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK"))}else if(this._masked)return void a(this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK"));126===this._payloadLength?this._state=1:127===this._payloadLength?this._state=2:this.haveLength(a)}getPayloadLength16(a){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(a)}getPayloadLength64(a){if(this._bufferedBytes<8){this._loop=!1;return}let b=this.consume(8),c=b.readUInt32BE(0);c>2097151?a(this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH")):(this._payloadLength=0x100000000*c+b.readUInt32BE(4),this.haveLength(a))}haveLength(a){this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)?a(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH")):this._masked?this._state=3:this._state=4}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=4}getData(a){let b=g;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}b=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!=0&&l(b,this._mask)}if(this._opcode>7)return void this.controlMessage(b,a);if(this._maxFragments>0&&++this._numFragments>this._maxFragments)return void a(this.createError(RangeError,"Too many message fragments",!1,1008,"WS_ERR_TOO_MANY_BUFFERED_PARTS"));if(this._compressed){this._state=5,this.decompress(b,a);return}b.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(b)),this.dataMessage(a)}decompress(a,b){this._extensions[e.extensionName].decompress(a,this._fin,(a,c)=>{if(a)return b(a);if(c.length){if(this._messageLength+=c.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return void b(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"));this._fragments.push(c)}this.dataMessage(b),0===this._state&&this.startLoop(b)})}dataMessage(a){if(!this._fin){this._state=0;return}let b=this._messageLength,c=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._numFragments=0,this._fragments=[],2===this._opcode){let d;d="nodebuffer"===this._binaryType?j(c,b):"arraybuffer"===this._binaryType?k(j(c,b)):"blob"===this._binaryType?new Blob(c):c,this._allowSynchronousEvents?(this.emit("message",d,!0),this._state=0):(this._state=6,setImmediate(()=>{this.emit("message",d,!0),this._state=0,this.startLoop(a)}))}else{let d=j(c,b);if(!this._skipUTF8Validation&&!n(d))return void a(this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8"));5===this._state||this._allowSynchronousEvents?(this.emit("message",d,!1),this._state=0):(this._state=6,setImmediate(()=>{this.emit("message",d,!1),this._state=0,this.startLoop(a)}))}}controlMessage(a,b){if(8===this._opcode){if(0===a.length)this._loop=!1,this.emit("conclude",1005,g),this.end();else{let c=a.readUInt16BE(0);if(!m(c))return void b(this.createError(RangeError,`invalid status code ${c}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE"));let d=new o(a.buffer,a.byteOffset+2,a.length-2);if(!this._skipUTF8Validation&&!n(d))return void b(this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8"));this._loop=!1,this.emit("conclude",c,d),this.end()}this._state=0;return}this._allowSynchronousEvents?(this.emit(9===this._opcode?"ping":"pong",a),this._state=0):(this._state=6,setImmediate(()=>{this.emit(9===this._opcode?"ping":"pong",a),this._state=0,this.startLoop(b)}))}createError(a,b,c,d,e){this._loop=!1,this._errored=!0;let f=new a(c?`Invalid WebSocket frame: ${b}`:b);return Error.captureStackTrace(f,this.createError),f.code=e,f[h]=d,f}}},63349,(a,b,c)=>{"use strict";let d,{Duplex:e}=a.r(88947),{randomFillSync:f}=a.r(54799),{types:{isUint8Array:g}}=a.r(24361),h=a.r(31276),{EMPTY_BUFFER:i,kWebSocket:j,NOOP:k}=a.r(63046),{isBlob:l,isValidStatusCode:m}=a.r(42673),{mask:n,toBuffer:o}=a.r(40338),p=Symbol("kByteLength"),q=Buffer.alloc(4),r=8192;class s{constructor(a,b,c){this._extensions=b||{},c&&(this._generateMask=c,this._maskBuffer=Buffer.alloc(4)),this._socket=a,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=0,this.onerror=k,this[j]=void 0}static frame(a,b){let c,e,g=!1,h=2,i=!1;b.mask&&(c=b.maskBuffer||q,b.generateMask?b.generateMask(c):(8192===r&&(void 0===d&&(d=Buffer.alloc(8192)),f(d,0,8192),r=0),c[0]=d[r++],c[1]=d[r++],c[2]=d[r++],c[3]=d[r++]),i=(c[0]|c[1]|c[2]|c[3])==0,h=6),"string"==typeof a?e=(!b.mask||i)&&void 0!==b[p]?b[p]:(a=Buffer.from(a)).length:(e=a.length,g=b.mask&&b.readOnly&&!i);let j=e;e>=65536?(h+=8,j=127):e>125&&(h+=2,j=126);let k=Buffer.allocUnsafe(g?e+h:h);return(k[0]=b.fin?128|b.opcode:b.opcode,b.rsv1&&(k[0]|=64),k[1]=j,126===j?k.writeUInt16BE(e,2):127===j&&(k[2]=k[3]=0,k.writeUIntBE(e,4,6)),b.mask)?(k[1]|=128,k[h-4]=c[0],k[h-3]=c[1],k[h-2]=c[2],k[h-1]=c[3],i)?[k,a]:g?(n(a,c,k,h,e),[k]):(n(a,c,a,0,e),[k,a]):[k,a]}close(a,b,c,d){let e;if(void 0===a)e=i;else if("number"==typeof a&&m(a))if(void 0!==b&&b.length){let c=Buffer.byteLength(b);if(c>123)throw RangeError("The message must not be greater than 123 bytes");if((e=Buffer.allocUnsafe(2+c)).writeUInt16BE(a,0),"string"==typeof b)e.write(b,2);else if(g(b))e.set(b,2);else throw TypeError("Second argument must be a string or a Uint8Array")}else(e=Buffer.allocUnsafe(2)).writeUInt16BE(a,0);else throw TypeError("First argument must be a valid error code number");let f={[p]:e.length,fin:!0,generateMask:this._generateMask,mask:c,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};0!==this._state?this.enqueue([this.dispatch,e,!1,f,d]):this.sendFrame(s.frame(e,f),d)}ping(a,b,c){let d,e;if("string"==typeof a?(d=Buffer.byteLength(a),e=!1):l(a)?(d=a.size,e=!1):(d=(a=o(a)).length,e=o.readOnly),d>125)throw RangeError("The data size must not be greater than 125 bytes");let f={[p]:d,fin:!0,generateMask:this._generateMask,mask:b,maskBuffer:this._maskBuffer,opcode:9,readOnly:e,rsv1:!1};l(a)?0!==this._state?this.enqueue([this.getBlobData,a,!1,f,c]):this.getBlobData(a,!1,f,c):0!==this._state?this.enqueue([this.dispatch,a,!1,f,c]):this.sendFrame(s.frame(a,f),c)}pong(a,b,c){let d,e;if("string"==typeof a?(d=Buffer.byteLength(a),e=!1):l(a)?(d=a.size,e=!1):(d=(a=o(a)).length,e=o.readOnly),d>125)throw RangeError("The data size must not be greater than 125 bytes");let f={[p]:d,fin:!0,generateMask:this._generateMask,mask:b,maskBuffer:this._maskBuffer,opcode:10,readOnly:e,rsv1:!1};l(a)?0!==this._state?this.enqueue([this.getBlobData,a,!1,f,c]):this.getBlobData(a,!1,f,c):0!==this._state?this.enqueue([this.dispatch,a,!1,f,c]):this.sendFrame(s.frame(a,f),c)}send(a,b,c){let d,e,f=this._extensions[h.extensionName],g=b.binary?2:1,i=b.compress;"string"==typeof a?(d=Buffer.byteLength(a),e=!1):l(a)?(d=a.size,e=!1):(d=(a=o(a)).length,e=o.readOnly),this._firstFragment?(this._firstFragment=!1,i&&f&&f.params[f._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(i=d>=f._threshold),this._compress=i):(i=!1,g=0),b.fin&&(this._firstFragment=!0);let j={[p]:d,fin:b.fin,generateMask:this._generateMask,mask:b.mask,maskBuffer:this._maskBuffer,opcode:g,readOnly:e,rsv1:i};l(a)?0!==this._state?this.enqueue([this.getBlobData,a,this._compress,j,c]):this.getBlobData(a,this._compress,j,c):0!==this._state?this.enqueue([this.dispatch,a,this._compress,j,c]):this.dispatch(a,this._compress,j,c)}getBlobData(a,b,c,d){this._bufferedBytes+=c[p],this._state=2,a.arrayBuffer().then(a=>{if(this._socket.destroyed){let a=Error("The socket was closed while the blob was being read");process.nextTick(t,this,a,d);return}this._bufferedBytes-=c[p];let e=o(a);b?this.dispatch(e,b,c,d):(this._state=0,this.sendFrame(s.frame(e,c),d),this.dequeue())}).catch(a=>{process.nextTick(u,this,a,d)})}dispatch(a,b,c,d){if(!b)return void this.sendFrame(s.frame(a,c),d);let e=this._extensions[h.extensionName];this._bufferedBytes+=c[p],this._state=1,e.compress(a,c.fin,(a,b)=>{this._socket.destroyed?t(this,Error("The socket was closed while data was being compressed"),d):(this._bufferedBytes-=c[p],this._state=0,c.readOnly=!1,this.sendFrame(s.frame(b,c),d),this.dequeue())})}dequeue(){for(;0===this._state&&this._queue.length;){let a=this._queue.shift();this._bufferedBytes-=a[3][p],Reflect.apply(a[0],this,a.slice(1))}}enqueue(a){this._bufferedBytes+=a[3][p],this._queue.push(a)}sendFrame(a,b){2===a.length?(this._socket.cork(),this._socket.write(a[0]),this._socket.write(a[1],b),this._socket.uncork()):this._socket.write(a[0],b)}}function t(a,b,c){"function"==typeof c&&c(b);for(let c=0;c<a._queue.length;c++){let d=a._queue[c],e=d[d.length-1];"function"==typeof e&&e(b)}}function u(a,b,c){t(a,b,c),a.onerror(b)}b.exports=s},25841,(a,b,c)=>{"use strict";let{kForOnEventAttribute:d,kListener:e}=a.r(63046),f=Symbol("kCode"),g=Symbol("kData"),h=Symbol("kError"),i=Symbol("kMessage"),j=Symbol("kReason"),k=Symbol("kTarget"),l=Symbol("kType"),m=Symbol("kWasClean");class n{constructor(a){this[k]=null,this[l]=a}get target(){return this[k]}get type(){return this[l]}}Object.defineProperty(n.prototype,"target",{enumerable:!0}),Object.defineProperty(n.prototype,"type",{enumerable:!0});class o extends n{constructor(a,b={}){super(a),this[f]=void 0===b.code?0:b.code,this[j]=void 0===b.reason?"":b.reason,this[m]=void 0!==b.wasClean&&b.wasClean}get code(){return this[f]}get reason(){return this[j]}get wasClean(){return this[m]}}Object.defineProperty(o.prototype,"code",{enumerable:!0}),Object.defineProperty(o.prototype,"reason",{enumerable:!0}),Object.defineProperty(o.prototype,"wasClean",{enumerable:!0});class p extends n{constructor(a,b={}){super(a),this[h]=void 0===b.error?null:b.error,this[i]=void 0===b.message?"":b.message}get error(){return this[h]}get message(){return this[i]}}Object.defineProperty(p.prototype,"error",{enumerable:!0}),Object.defineProperty(p.prototype,"message",{enumerable:!0});class q extends n{constructor(a,b={}){super(a),this[g]=void 0===b.data?null:b.data}get data(){return this[g]}}function r(a,b,c){"object"==typeof a&&a.handleEvent?a.handleEvent.call(a,c):a.call(b,c)}Object.defineProperty(q.prototype,"data",{enumerable:!0}),b.exports={CloseEvent:o,ErrorEvent:p,Event:n,EventTarget:{addEventListener(a,b,c={}){let f;for(let f of this.listeners(a))if(!c[d]&&f[e]===b&&!f[d])return;if("message"===a)f=function(a,c){let d=new q("message",{data:c?a:a.toString()});d[k]=this,r(b,this,d)};else if("close"===a)f=function(a,c){let d=new o("close",{code:a,reason:c.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});d[k]=this,r(b,this,d)};else if("error"===a)f=function(a){let c=new p("error",{error:a,message:a.message});c[k]=this,r(b,this,c)};else{if("open"!==a)return;f=function(){let a=new n("open");a[k]=this,r(b,this,a)}}f[d]=!!c[d],f[e]=b,c.once?this.once(a,f):this.on(a,f)},removeEventListener(a,b){for(let c of this.listeners(a))if(c[e]===b&&!c[d]){this.removeListener(a,c);break}}},MessageEvent:q}},15251,(a,b,c)=>{"use strict";let{tokenChars:d}=a.r(42673);function e(a,b,c){void 0===a[b]?a[b]=[c]:a[b].push(c)}b.exports={format:function(a){return Object.keys(a).map(b=>{let c=a[b];return Array.isArray(c)||(c=[c]),c.map(a=>[b].concat(Object.keys(a).map(b=>{let c=a[b];return Array.isArray(c)||(c=[c]),c.map(a=>!0===a?b:`${b}=${a}`).join("; ")})).join("; ")).join(", ")}).join(", ")},parse:function(a){let b,c,f=Object.create(null),g=Object.create(null),h=!1,i=!1,j=!1,k=-1,l=-1,m=-1,n=0;for(;n<a.length;n++)if(l=a.charCodeAt(n),void 0===b)if(-1===m&&1===d[l])-1===k&&(k=n);else if(0!==n&&(32===l||9===l))-1===m&&-1!==k&&(m=n);else if(59===l||44===l){if(-1===k)throw SyntaxError(`Unexpected character at index ${n}`);-1===m&&(m=n);let c=a.slice(k,m);44===l?(e(f,c,g),g=Object.create(null)):b=c,k=m=-1}else throw SyntaxError(`Unexpected character at index ${n}`);else if(void 0===c)if(-1===m&&1===d[l])-1===k&&(k=n);else if(32===l||9===l)-1===m&&-1!==k&&(m=n);else if(59===l||44===l){if(-1===k)throw SyntaxError(`Unexpected character at index ${n}`);-1===m&&(m=n),e(g,a.slice(k,m),!0),44===l&&(e(f,b,g),g=Object.create(null),b=void 0),k=m=-1}else if(61===l&&-1!==k&&-1===m)c=a.slice(k,n),k=m=-1;else throw SyntaxError(`Unexpected character at index ${n}`);else if(i){if(1!==d[l])throw SyntaxError(`Unexpected character at index ${n}`);-1===k?k=n:h||(h=!0),i=!1}else if(j)if(1===d[l])-1===k&&(k=n);else if(34===l&&-1!==k)j=!1,m=n;else if(92===l)i=!0;else throw SyntaxError(`Unexpected character at index ${n}`);else if(34===l&&61===a.charCodeAt(n-1))j=!0;else if(-1===m&&1===d[l])-1===k&&(k=n);else if(-1!==k&&(32===l||9===l))-1===m&&(m=n);else if(59===l||44===l){if(-1===k)throw SyntaxError(`Unexpected character at index ${n}`);-1===m&&(m=n);let d=a.slice(k,m);h&&(d=d.replace(/\\/g,""),h=!1),e(g,c,d),44===l&&(e(f,b,g),g=Object.create(null),b=void 0),c=void 0,k=m=-1}else throw SyntaxError(`Unexpected character at index ${n}`);if(-1===k||j||32===l||9===l)throw SyntaxError("Unexpected end of input");-1===m&&(m=n);let o=a.slice(k,m);return void 0===b?e(f,o,g):(void 0===c?e(g,o,!0):h?e(g,c,o.replace(/\\/g,"")):e(g,c,o),e(f,b,g)),f}}},50842,(a,b,c)=>{"use strict";let d=a.r(27699),e=a.r(24836),f=a.r(21517),g=a.r(4446),h=a.r(55004),{randomBytes:i,createHash:j}=a.r(54799),{Duplex:k,Readable:l}=a.r(88947),{URL:m}=a.r(92509),n=a.r(31276),o=a.r(28719),p=a.r(63349),{isBlob:q}=a.r(42673),{BINARY_TYPES:r,CLOSE_TIMEOUT:s,EMPTY_BUFFER:t,GUID:u,kForOnEventAttribute:v,kListener:w,kStatusCode:x,kWebSocket:y,NOOP:z}=a.r(63046),{EventTarget:{addEventListener:A,removeEventListener:B}}=a.r(25841),{format:C,parse:D}=a.r(15251),{toBuffer:E}=a.r(40338),F=Symbol("kAborted"),G=[8,13],H=["CONNECTING","OPEN","CLOSING","CLOSED"],I=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;class J extends d{constructor(a,b,c){super(),this._binaryType=r[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=t,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=J.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,null!==a?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,void 0===b?b=[]:Array.isArray(b)||("object"==typeof b&&null!==b?(c=b,b=[]):b=[b]),function a(b,c,d,g){let h,k,l,o,p={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:s,protocolVersion:G[1],maxBufferedChunks:262144,maxFragments:16384,maxPayload:0x6400000,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...g,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(b._autoPong=p.autoPong,b._closeTimeout=p.closeTimeout,!G.includes(p.protocolVersion))throw RangeError(`Unsupported protocol version: ${p.protocolVersion} (supported versions: ${G.join(", ")})`);if(c instanceof m)h=c;else try{h=new m(c)}catch{throw SyntaxError(`Invalid URL: ${c}`)}"http:"===h.protocol?h.protocol="ws:":"https:"===h.protocol&&(h.protocol="wss:"),b._url=h.href;let q="wss:"===h.protocol,r="ws+unix:"===h.protocol;if("ws:"===h.protocol||q||r?r&&!h.pathname?k="The URL's pathname is empty":h.hash&&(k="The URL contains a fragment identifier"):k='The URL\'s protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"',k){let a=SyntaxError(k);if(0!==b._redirects)return void K(b,a);throw a}let t=q?443:80,v=i(16).toString("base64"),w=q?e.request:f.request,x=new Set;if(p.createConnection=p.createConnection||(q?M:L),p.defaultPort=p.defaultPort||t,p.port=h.port||t,p.host=h.hostname.startsWith("[")?h.hostname.slice(1,-1):h.hostname,p.headers={...p.headers,"Sec-WebSocket-Version":p.protocolVersion,"Sec-WebSocket-Key":v,Connection:"Upgrade",Upgrade:"websocket"},p.path=h.pathname+h.search,p.timeout=p.handshakeTimeout,p.perMessageDeflate&&(l=new n({...p.perMessageDeflate,isServer:!1,maxPayload:p.maxPayload}),p.headers["Sec-WebSocket-Extensions"]=C({[n.extensionName]:l.offer()})),d.length){for(let a of d){if("string"!=typeof a||!I.test(a)||x.has(a))throw SyntaxError("An invalid or duplicated subprotocol was specified");x.add(a)}p.headers["Sec-WebSocket-Protocol"]=d.join(",")}if(p.origin&&(p.protocolVersion<13?p.headers["Sec-WebSocket-Origin"]=p.origin:p.headers.Origin=p.origin),(h.username||h.password)&&(p.auth=`${h.username}:${h.password}`),r){let a=p.path.split(":");p.socketPath=a[0],p.path=a[1]}if(p.followRedirects){if(0===b._redirects){b._originalIpc=r,b._originalSecure=q,b._originalHostOrSocketPath=r?p.socketPath:h.host;let a=g&&g.headers;if(g={...g,headers:{}},a)for(let[b,c]of Object.entries(a))g.headers[b.toLowerCase()]=c}else if(0===b.listenerCount("redirect")){let a=r?!!b._originalIpc&&p.socketPath===b._originalHostOrSocketPath:!b._originalIpc&&h.host===b._originalHostOrSocketPath;a&&(!b._originalSecure||q)||(delete p.headers.authorization,delete p.headers.cookie,a||delete p.headers.host,p.auth=void 0)}p.auth&&!g.headers.authorization&&(g.headers.authorization="Basic "+Buffer.from(p.auth).toString("base64")),o=b._req=w(p),b._redirects&&b.emit("redirect",b.url,o)}else o=b._req=w(p);p.timeout&&o.on("timeout",()=>{N(b,o,"Opening handshake has timed out")}),o.on("error",a=>{null===o||o[F]||(o=b._req=null,K(b,a))}),o.on("response",e=>{let f=e.headers.location,h=e.statusCode;if(f&&p.followRedirects&&h>=300&&h<400){let e;if(++b._redirects>p.maxRedirects)return void N(b,o,"Maximum redirects exceeded");o.abort();try{e=new m(f,c)}catch(a){K(b,SyntaxError(`Invalid URL: ${f}`));return}a(b,e,d,g)}else b.emit("unexpected-response",o,e)||N(b,o,`Unexpected server response: ${e.statusCode}`)}),o.on("upgrade",(a,c,d)=>{let e;if(b.emit("upgrade",a),b.readyState!==J.CONNECTING)return;o=b._req=null;let f=a.headers.upgrade;if(void 0===f||"websocket"!==f.toLowerCase())return void N(b,c,"Invalid Upgrade header");let g=j("sha1").update(v+u).digest("base64");if(a.headers["sec-websocket-accept"]!==g)return void N(b,c,"Invalid Sec-WebSocket-Accept header");let h=a.headers["sec-websocket-protocol"];if(void 0!==h?x.size?x.has(h)||(e="Server sent an invalid subprotocol"):e="Server sent a subprotocol but none was requested":x.size&&(e="Server sent no subprotocol"),e)return void N(b,c,e);h&&(b._protocol=h);let i=a.headers["sec-websocket-extensions"];if(void 0!==i){let a;if(!l)return void N(b,c,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");try{a=D(i)}catch(a){N(b,c,"Invalid Sec-WebSocket-Extensions header");return}let d=Object.keys(a);if(1!==d.length||d[0]!==n.extensionName)return void N(b,c,"Server indicated an extension that was not requested");try{l.accept(a[n.extensionName])}catch(a){N(b,c,"Invalid Sec-WebSocket-Extensions header");return}b._extensions[n.extensionName]=l}b.setSocket(c,d,{allowSynchronousEvents:p.allowSynchronousEvents,generateMask:p.generateMask,maxBufferedChunks:p.maxBufferedChunks,maxFragments:p.maxFragments,maxPayload:p.maxPayload,skipUTF8Validation:p.skipUTF8Validation})}),p.finishRequest?p.finishRequest(o,b):o.end()}(this,a,b,c)):(this._autoPong=c.autoPong,this._closeTimeout=c.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(a){r.includes(a)&&(this._binaryType=a,this._receiver&&(this._receiver._binaryType=a))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(a,b,c){let d=new o({allowSynchronousEvents:c.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxBufferedChunks:c.maxBufferedChunks,maxFragments:c.maxFragments,maxPayload:c.maxPayload,skipUTF8Validation:c.skipUTF8Validation}),e=new p(a,this._extensions,c.generateMask);this._receiver=d,this._sender=e,this._socket=a,d[y]=this,e[y]=this,a[y]=this,d.on("conclude",P),d.on("drain",Q),d.on("error",R),d.on("message",T),d.on("ping",U),d.on("pong",V),e.onerror=X,a.setTimeout&&a.setTimeout(0),a.setNoDelay&&a.setNoDelay(),b.length>0&&a.unshift(b),a.on("close",Z),a.on("data",$),a.on("end",_),a.on("error",aa),this._readyState=J.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=J.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[n.extensionName]&&this._extensions[n.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=J.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(a,b){if(this.readyState!==J.CLOSED){if(this.readyState===J.CONNECTING)return void N(this,this._req,"WebSocket was closed before the connection was established");if(this.readyState===J.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=J.CLOSING,this._sender.close(a,b,!this._isServer,a=>{!a&&(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Y(this)}}pause(){this.readyState!==J.CONNECTING&&this.readyState!==J.CLOSED&&(this._paused=!0,this._socket.pause())}ping(a,b,c){if(this.readyState===J.CONNECTING)throw Error("WebSocket is not open: readyState 0 (CONNECTING)");("function"==typeof a?(c=a,a=b=void 0):"function"==typeof b&&(c=b,b=void 0),"number"==typeof a&&(a=a.toString()),this.readyState!==J.OPEN)?O(this,a,c):(void 0===b&&(b=!this._isServer),this._sender.ping(a||t,b,c))}pong(a,b,c){if(this.readyState===J.CONNECTING)throw Error("WebSocket is not open: readyState 0 (CONNECTING)");("function"==typeof a?(c=a,a=b=void 0):"function"==typeof b&&(c=b,b=void 0),"number"==typeof a&&(a=a.toString()),this.readyState!==J.OPEN)?O(this,a,c):(void 0===b&&(b=!this._isServer),this._sender.pong(a||t,b,c))}resume(){this.readyState!==J.CONNECTING&&this.readyState!==J.CLOSED&&(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(a,b,c){if(this.readyState===J.CONNECTING)throw Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof b&&(c=b,b={}),"number"==typeof a&&(a=a.toString()),this.readyState!==J.OPEN)return void O(this,a,c);let d={binary:"string"!=typeof a,mask:!this._isServer,compress:!0,fin:!0,...b};this._extensions[n.extensionName]||(d.compress=!1),this._sender.send(a||t,d,c)}terminate(){if(this.readyState!==J.CLOSED){if(this.readyState===J.CONNECTING)return void N(this,this._req,"WebSocket was closed before the connection was established");this._socket&&(this._readyState=J.CLOSING,this._socket.destroy())}}}function K(a,b){a._readyState=J.CLOSING,a._errorEmitted=!0,a.emit("error",b),a.emitClose()}function L(a){return a.path=a.socketPath,g.connect(a)}function M(a){return a.path=void 0,a.servername||""===a.servername||(a.servername=g.isIP(a.host)?"":a.host),h.connect(a)}function N(a,b,c){a._readyState=J.CLOSING;let d=Error(c);Error.captureStackTrace(d,N),b.setHeader?(b[F]=!0,b.abort(),b.socket&&!b.socket.destroyed&&b.socket.destroy(),process.nextTick(K,a,d)):(b.destroy(d),b.once("error",a.emit.bind(a,"error")),b.once("close",a.emitClose.bind(a)))}function O(a,b,c){if(b){let c=q(b)?b.size:E(b).length;a._socket?a._sender._bufferedBytes+=c:a._bufferedAmount+=c}if(c){let b=Error(`WebSocket is not open: readyState ${a.readyState} (${H[a.readyState]})`);process.nextTick(c,b)}}function P(a,b){let c=this[y];c._closeFrameReceived=!0,c._closeMessage=b,c._closeCode=a,void 0!==c._socket[y]&&(c._socket.removeListener("data",$),process.nextTick(W,c._socket),1005===a?c.close():c.close(a,b))}function Q(){let a=this[y];a.isPaused||a._socket.resume()}function R(a){let b=this[y];void 0!==b._socket[y]&&(b._socket.removeListener("data",$),process.nextTick(W,b._socket),b.close(a[x])),b._errorEmitted||(b._errorEmitted=!0,b.emit("error",a))}function S(){this[y].emitClose()}function T(a,b){this[y].emit("message",a,b)}function U(a){let b=this[y];b._autoPong&&b.pong(a,!this._isServer,z),b.emit("ping",a)}function V(a){this[y].emit("pong",a)}function W(a){a.resume()}function X(a){let b=this[y];b.readyState!==J.CLOSED&&(b.readyState===J.OPEN&&(b._readyState=J.CLOSING,Y(b)),this._socket.end(),b._errorEmitted||(b._errorEmitted=!0,b.emit("error",a)))}function Y(a){a._closeTimer=setTimeout(a._socket.destroy.bind(a._socket),a._closeTimeout)}function Z(){let a=this[y];if(this.removeListener("close",Z),this.removeListener("data",$),this.removeListener("end",_),a._readyState=J.CLOSING,!this._readableState.endEmitted&&!a._closeFrameReceived&&!a._receiver._writableState.errorEmitted&&0!==this._readableState.length){let b=this.read(this._readableState.length);a._receiver.write(b)}a._receiver.end(),this[y]=void 0,clearTimeout(a._closeTimer),a._receiver._writableState.finished||a._receiver._writableState.errorEmitted?a.emitClose():(a._receiver.on("error",S),a._receiver.on("finish",S))}function $(a){this[y]._receiver.write(a)||this.pause()}function _(){let a=this[y];a._readyState=J.CLOSING,a._receiver.end(),this.end()}function aa(){let a=this[y];this.removeListener("error",aa),this.on("error",z),a&&(a._readyState=J.CLOSING,this.destroy())}Object.defineProperty(J,"CONNECTING",{enumerable:!0,value:H.indexOf("CONNECTING")}),Object.defineProperty(J.prototype,"CONNECTING",{enumerable:!0,value:H.indexOf("CONNECTING")}),Object.defineProperty(J,"OPEN",{enumerable:!0,value:H.indexOf("OPEN")}),Object.defineProperty(J.prototype,"OPEN",{enumerable:!0,value:H.indexOf("OPEN")}),Object.defineProperty(J,"CLOSING",{enumerable:!0,value:H.indexOf("CLOSING")}),Object.defineProperty(J.prototype,"CLOSING",{enumerable:!0,value:H.indexOf("CLOSING")}),Object.defineProperty(J,"CLOSED",{enumerable:!0,value:H.indexOf("CLOSED")}),Object.defineProperty(J.prototype,"CLOSED",{enumerable:!0,value:H.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(a=>{Object.defineProperty(J.prototype,a,{enumerable:!0})}),["open","error","close","message"].forEach(a=>{Object.defineProperty(J.prototype,`on${a}`,{enumerable:!0,get(){for(let b of this.listeners(a))if(b[v])return b[w];return null},set(b){for(let b of this.listeners(a))if(b[v]){this.removeListener(a,b);break}"function"==typeof b&&this.addEventListener(a,b,{[v]:!0})}})}),J.prototype.addEventListener=A,J.prototype.removeEventListener=B,b.exports=J},31594,(a,b,c)=>{"use strict";a.r(50842);let{Duplex:d}=a.r(88947);function e(a){a.emit("close")}function f(){!this.destroyed&&this._writableState.finished&&this.destroy()}function g(a){this.removeListener("error",g),this.destroy(),0===this.listenerCount("error")&&this.emit("error",a)}b.exports=function(a,b){let c=!0,h=new d({...b,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return a.on("message",function(b,c){let d=!c&&h._readableState.objectMode?b.toString():b;h.push(d)||a.pause()}),a.once("error",function(a){h.destroyed||(c=!1,h.destroy(a))}),a.once("close",function(){h.destroyed||h.push(null)}),h._destroy=function(b,d){if(a.readyState===a.CLOSED){d(b),process.nextTick(e,h);return}let f=!1;a.once("error",function(a){f=!0,d(a)}),a.once("close",function(){f||d(b),process.nextTick(e,h)}),c&&a.terminate()},h._final=function(b){a.readyState===a.CONNECTING?a.once("open",function(){h._final(b)}):null!==a._socket&&(a._socket._writableState.finished?(b(),h._readableState.endEmitted&&h.destroy()):(a._socket.once("finish",function(){b()}),a.close()))},h._read=function(){a.isPaused&&a.resume()},h._write=function(b,c,d){a.readyState===a.CONNECTING?a.once("open",function(){h._write(b,c,d)}):a.send(b,d)},h.on("end",f),h.on("error",g),h}},54129,(a,b,c)=>{"use strict";let{tokenChars:d}=a.r(42673);b.exports={parse:function(a){let b=new Set,c=-1,e=-1,f=0;for(;f<a.length;f++){let g=a.charCodeAt(f);if(-1===e&&1===d[g])-1===c&&(c=f);else if(0!==f&&(32===g||9===g))-1===e&&-1!==c&&(e=f);else if(44===g){if(-1===c)throw SyntaxError(`Unexpected character at index ${f}`);-1===e&&(e=f);let d=a.slice(c,e);if(b.has(d))throw SyntaxError(`The "${d}" subprotocol is duplicated`);b.add(d),c=e=-1}else throw SyntaxError(`Unexpected character at index ${f}`)}if(-1===c||-1!==e)throw SyntaxError("Unexpected end of input");let g=a.slice(c,f);if(b.has(g))throw SyntaxError(`The "${g}" subprotocol is duplicated`);return b.add(g),b}}},36972,(a,b,c)=>{"use strict";let d=a.r(27699),e=a.r(21517),{Duplex:f}=a.r(88947),{createHash:g}=a.r(54799),h=a.r(15251),i=a.r(31276),j=a.r(54129),k=a.r(50842),{CLOSE_TIMEOUT:l,GUID:m,kWebSocket:n}=a.r(63046),o=/^[+/0-9A-Za-z]{22}==$/;function p(a){a._state=2,a.emit("close")}function q(){this.destroy()}function r(a,b,c,d){c=c||e.STATUS_CODES[b],d={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(c),...d},a.once("finish",a.destroy),a.end(`HTTP/1.1 ${b} ${e.STATUS_CODES[b]}\r
2
- `+Object.keys(d).map(a=>`${a}: ${d[a]}`).join("\r\n")+"\r\n\r\n"+c)}function s(a,b,c,d,e,f){if(a.listenerCount("wsClientError")){let d=Error(e);Error.captureStackTrace(d,s),a.emit("wsClientError",d,c,b)}else r(c,d,e,f)}b.exports=class extends d{constructor(a,b){if(super(),null==(a={allowSynchronousEvents:!0,autoPong:!0,maxBufferedChunks:262144,maxFragments:16384,maxPayload:0x6400000,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:l,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:k,...a}).port&&!a.server&&!a.noServer||null!=a.port&&(a.server||a.noServer)||a.server&&a.noServer)throw TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=a.port?(this._server=e.createServer((a,b)=>{let c=e.STATUS_CODES[426];b.writeHead(426,{"Content-Length":c.length,"Content-Type":"text/plain"}),b.end(c)}),this._server.listen(a.port,a.host,a.backlog,b)):a.server&&(this._server=a.server),this._server){const a=this.emit.bind(this,"connection");this._removeListeners=function(a,b){for(let c of Object.keys(b))a.on(c,b[c]);return function(){for(let c of Object.keys(b))a.removeListener(c,b[c])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(b,c,d)=>{this.handleUpgrade(b,c,d,a)}})}!0===a.perMessageDeflate&&(a.perMessageDeflate={}),a.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=a,this._state=0}address(){if(this.options.noServer)throw Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(a){if(2===this._state){a&&this.once("close",()=>{a(Error("The server is not running"))}),process.nextTick(p,this);return}if(a&&this.once("close",a),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(p,this);else{let a=this._server;this._removeListeners(),this._removeListeners=this._server=null,a.close(()=>{p(this)})}}shouldHandle(a){if(this.options.path){let b=a.url.indexOf("?");if((-1!==b?a.url.slice(0,b):a.url)!==this.options.path)return!1}return!0}handleUpgrade(a,b,c,d){b.on("error",q);let e=a.headers["sec-websocket-key"],f=a.headers.upgrade,g=+a.headers["sec-websocket-version"];if("GET"!==a.method)return void s(this,a,b,405,"Invalid HTTP method");if(void 0===f||"websocket"!==f.toLowerCase())return void s(this,a,b,400,"Invalid Upgrade header");if(void 0===e||!o.test(e))return void s(this,a,b,400,"Missing or invalid Sec-WebSocket-Key header");if(13!==g&&8!==g)return void s(this,a,b,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});if(!this.shouldHandle(a))return void r(b,400);let k=a.headers["sec-websocket-protocol"],l=new Set;if(void 0!==k)try{l=j.parse(k)}catch(c){s(this,a,b,400,"Invalid Sec-WebSocket-Protocol header");return}let m=a.headers["sec-websocket-extensions"],n={};if(this.options.perMessageDeflate&&void 0!==m){let c=new i({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let a=h.parse(m);a[i.extensionName]&&(c.accept(a[i.extensionName]),n[i.extensionName]=c)}catch(c){s(this,a,b,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let f={origin:a.headers[`${8===g?"sec-websocket-origin":"origin"}`],secure:!!(a.socket.authorized||a.socket.encrypted),req:a};if(2===this.options.verifyClient.length)return void this.options.verifyClient(f,(f,g,h,i)=>{if(!f)return r(b,g||401,h,i);this.completeUpgrade(n,e,l,a,b,c,d)});if(!this.options.verifyClient(f))return r(b,401)}this.completeUpgrade(n,e,l,a,b,c,d)}completeUpgrade(a,b,c,d,e,f,j){if(!e.readable||!e.writable)return e.destroy();if(e[n])throw Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return r(e,503);let k=g("sha1").update(b+m).digest("base64"),l=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${k}`],o=new this.options.WebSocket(null,void 0,this.options);if(c.size){let a=this.options.handleProtocols?this.options.handleProtocols(c,d):c.values().next().value;a&&(l.push(`Sec-WebSocket-Protocol: ${a}`),o._protocol=a)}if(a[i.extensionName]){let b=a[i.extensionName].params,c=h.format({[i.extensionName]:[b]});l.push(`Sec-WebSocket-Extensions: ${c}`),o._extensions=a}this.emit("headers",l,d),e.write(l.concat("\r\n").join("\r\n")),e.removeListener("error",q),o.setSocket(e,f,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxBufferedChunks:this.options.maxBufferedChunks,maxFragments:this.options.maxFragments,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(o),o.on("close",()=>{this.clients.delete(o),this._shouldEmitClose&&!this.clients.size&&process.nextTick(p,this)})),j(o,d)}}},95421,a=>{"use strict";let b,c,d,e;var f,g,h=a.i(56856),i=a.i(55132);function j(a){return JSON.parse(JSON.stringify(a))}function k(a,b){for(let c of a.states??[]){if(c.name===b)return a;let d=k(c,b);if(d)return d}return null}function l(a,b,c){let d=function a(b,c){if(b.name===c)return b;for(let d of b.states??[]){let b=a(d,c);if(b)return b}return null}(a,b);if(!d)throw Error(`applyPatchOps: ${c} references missing state "${b}"`);return d}function m(a,b,c){let d=function(a,b){for(let c of a.events){let a=c.events??[];for(let d=0;d<a.length;d++)if(a[d].id===b)return{source:c,event:a[d],index:d}}return null}(a,b);if(!d)throw Error(`applyPatchOps: ${c} references missing event "${b}"`);return d}function n(a,b){let c=j(a);for(let a of(Array.isArray(c.events)||(c.events=[]),b))switch(a.op){case"settings.update":c.settings={...c.settings,...a.patch},""===c.settings.notes&&delete c.settings.notes;break;case"state.add":{let b=null===a.parent?c.state:l(c.state,a.parent,"state.add");b.states||(b.states=[]);let d=a.index??b.states.length;b.states.splice(d,0,j(a.state));break}case"state.update":{let b=l(c.state,a.name,"state.update");Object.assign(b,a.patch),""===b.notes&&delete b.notes,""===b.prompt&&delete b.prompt;break}case"state.remove":{if(c.state.name===a.name)throw Error(`applyPatchOps: cannot remove root state "${a.name}"`);let b=k(c.state,a.name);if(!b||!b.states)throw Error(`applyPatchOps: state.remove references missing state "${a.name}"`);let d=b.states.findIndex(b=>b.name===a.name);if(d<0)throw Error(`applyPatchOps: state.remove references missing state "${a.name}"`);b.states.splice(d,1),0===b.states.length&&delete b.states;break}case"state.nest":{let b=l(c.state,a.child,"state.nest"),d=l(c.state,a.newParent,"state.nest"),e=k(c.state,a.child);if(!e||!e.states)throw Error(`applyPatchOps: state.nest cannot detach root or missing state "${a.child}"`);let f=e.states.findIndex(b=>b.name===a.child),[g]=e.states.splice(f,1);0===e.states.length&&delete e.states,d.states||(d.states=[]),d.states.push(g??j(b));break}case"eventSource.add":{let b=a.index??c.events.length;c.events.splice(b,0,j(a.source));break}case"eventSource.update":{let b=c.events[a.index];if(!b)throw Error(`applyPatchOps: eventSource.update index ${a.index} out of range`);c.events[a.index]={...b,...a.patch};break}case"eventSource.remove":if(!c.events[a.index])throw Error(`applyPatchOps: eventSource.remove index ${a.index} out of range`);c.events.splice(a.index,1);break;case"event.add":{let b=c.events[a.sourceIndex];if(!b)throw Error(`applyPatchOps: event.add sourceIndex ${a.sourceIndex} out of range`);b.events||(b.events=[]);let d=a.index??b.events.length;b.events.splice(d,0,j(a.event));break}case"event.update":Object.assign(m(c,a.id,"event.update").event,a.patch);break;case"event.remove":{let b=m(c,a.id,"event.remove");b.source.events.splice(b.index,1),0===b.source.events.length&&delete b.source.events;break}case"parameter.add":{let b=m(c,a.eventId,"parameter.add");b.event.parameters||(b.event.parameters=[]);let d=a.index??b.event.parameters.length;b.event.parameters.splice(d,0,j(a.parameter));break}case"parameter.update":{let b=m(c,a.eventId,"parameter.update").event.parameters??[];if(!b[a.index])throw Error(`applyPatchOps: parameter.update index ${a.index} out of range for event "${a.eventId}"`);b[a.index]={...b[a.index],...a.patch};break}case"parameter.remove":{let b=m(c,a.eventId,"parameter.remove"),d=b.event.parameters;if(!d||!d[a.index])throw Error(`applyPatchOps: parameter.remove index ${a.index} out of range for event "${a.eventId}"`);d.splice(a.index,1),0===d.length&&delete b.event.parameters;break}case"transition.add":{let b=l(c.state,a.state,"transition.add");b.transitions||(b.transitions=[]);let d=a.index??b.transitions.length;b.transitions.splice(d,0,j(a.transition));break}case"transition.update":{let b=l(c.state,a.state,"transition.update").transitions??[];if(!b[a.index])throw Error(`applyPatchOps: transition.update index ${a.index} out of range for state "${a.state}"`);b[a.index]={...b[a.index],...a.patch};break}case"transition.remove":{let b=l(c.state,a.state,"transition.remove"),d=b.transitions;if(!d||!d[a.index])throw Error(`applyPatchOps: transition.remove index ${a.index} out of range for state "${a.state}"`);d.splice(a.index,1),0===d.length&&delete b.transitions;break}case"action.add":{let b=l(c.state,a.state,"action.add"),d=b[a.hook]??(b[a.hook]={actions:[]}),e=a.index??d.actions.length;d.actions.splice(e,0,j(a.action));break}case"action.update":{let b=l(c.state,a.state,"action.update")[a.hook];if(!b||!b.actions[a.index])throw Error(`applyPatchOps: action.update index ${a.index} out of range for state "${a.state}" ${a.hook}`);b.actions[a.index]=j(a.action);break}case"action.remove":{let b=l(c.state,a.state,"action.remove"),d=b[a.hook];if(!d||!d.actions[a.index])throw Error(`applyPatchOps: action.remove index ${a.index} out of range for state "${a.state}" ${a.hook}`);d.actions.splice(a.index,1),0===d.actions.length&&delete b[a.hook];break}case"runtime.enter":case"runtime.exit":break;default:throw Error(`applyPatchOps: unknown op ${JSON.stringify(a)}`)}return c}function o(a){let b=[a];for(let c of a.states??[])b.push(...o(c));return b}function p(a){let b=new Map;b.set(a.name,null);let c=a=>{for(let d of a.states??[])b.set(d.name,a.name),c(d)};return c(a),b}function q(a,b){return JSON.stringify(a)===JSON.stringify(b)}function r(a,b,c,d,e){let f=Math.min(c.length,d.length);for(let g=0;g<f;g++)q(c[g],d[g])||e.push({op:"action.update",state:a,hook:b,index:g,action:d[g]});for(let c=f;c<d.length;c++)e.push({op:"action.add",state:a,hook:b,action:d[c],index:c});for(let f=c.length-1;f>=d.length;f--)e.push({op:"action.remove",state:a,hook:b,index:f})}function s(a){let b=0;for(let c=0;c<a.length;c++)b=Math.imul(b,31)+a.charCodeAt(c)|0;let c=(b%360+360)%360;return`hsl(${c}, 65%, 55%)`}let t={hSpacing:220,vSpacing:140,nodeWidth:160,nodeHeight:60,compositeWidth:300,compositeHeight:200,originX:100,originY:120,sweeps:2,includeRoot:!0},u=(a,b)=>`${a}\u0000${b}`;function v(a){let b=new Set,c=[];for(let d of a.states??[])b.has(d.name)||(b.add(d.name),c.push(d));return c}function w(a,b){let c=new Map(a.map(a=>[a,[]]));for(let a of b)c.get(a.from).push(a.to);return c}function x(a,b={}){let c={...t,...b},d="state"in a?a.state:a,e={};if(!d)return e;if(!function a(b,c,d,e,f){let g=v(b);if(0===g.length)return;let h=g.map(a=>a.name),i=new Map(g.map(a=>[a.name,a])),j=function(a){let b=new Set,c=[];for(let d of a)for(let e of d.transitions??[]){let f=e.nextState?function(a,b){for(let c of a){if(c.name===b)return c.name;let a=[...c.states??[],...c.parallel?.states??[]];for(;a.length;){let d=a.pop();if(d.name===b)return c.name;a.push(...d.states??[],...d.parallel?.states??[])}}}(a,e.nextState):void 0;if(!f||f===d.name)continue;let g=u(d.name,f);b.has(g)||(b.add(g),c.push({from:d.name,to:f}))}return c}(g),k=function(a,b){let c=w(a,b),d=new Map(a.map(a=>[a,0])),e=new Set;for(let b of a){if(0!==d.get(b))continue;d.set(b,1);let a=[{node:b,i:0}];for(;a.length>0;){let b=a[a.length-1],f=c.get(b.node);if(b.i<f.length){let c=f[b.i++],g=d.get(c);1===g?e.add(u(b.node,c)):0===g&&(d.set(c,1),a.push({node:c,i:0}))}else d.set(b.node,2),a.pop()}}return e}(h,j),l=j.filter(a=>!k.has(u(a.from,a.to))),m=function(a,b){let c=w(a,b),d=new Map(a.map(a=>[a,0]));for(let a of b)d.set(a.to,(d.get(a.to)??0)+1);let e=new Map(a.map(a=>[a,0])),f=a.filter(a=>0===d.get(a));for(let a=0;a<f.length;a++){let b=f[a];for(let a of c.get(b)){e.set(a,Math.max(e.get(a),e.get(b)+1));let c=d.get(a)-1;d.set(a,c),0===c&&f.push(a)}}return e}(h,l),n=function(a,b,c){let d=new Map(a.map(a=>[a,[]]));for(let a of b)d.get(a.from).push(a.to),d.get(a.to).push(a.from);let e=new Set([c]),f=[c];for(;f.length>0;){let a=f.pop();for(let b of d.get(a)??[])e.has(b)||(e.add(b),f.push(b))}return e}(h,j,h[0]),o=0;for(let a of h)n.has(a)&&(o=Math.max(o,m.get(a)));for(let a of h)n.has(a)||m.set(a,m.get(a)+o+1);let p=Array.from({length:Math.max(...h.map(a=>m.get(a)))+1},()=>[]);for(let a of h)p[m.get(a)].push(a);!function(a,b,c){let d=new Map,e=new Map,f=(a,b,c)=>{let d=a.get(b);d?d.push(c):a.set(b,[c])};for(let a of b)f(d,a.to,a.from),f(e,a.from,a.to);let g=new Map,h=()=>{a.forEach(a=>a.forEach((a,b)=>g.set(a,b)))};h();let i=(a,b)=>{let c=a.map((a,c)=>{let d=(b.get(a)??[]).filter(a=>g.has(a));return{name:a,key:d.length?d.reduce((a,b)=>a+g.get(b),0)/d.length:c,i:c}});c.sort((a,b)=>a.key===b.key?a.i-b.i:a.key-b.key);for(let b=0;b<c.length;b++)a[b]=c[b].name};for(let b=0;b<c;b++){for(let b=1;b<a.length;b++)i(a[b],d),h();for(let b=a.length-2;b>=0;b--)i(a[b],e),h()}}(p,l,e.sweeps);let q=e.hSpacing-e.nodeWidth,r=e.vSpacing-e.nodeHeight,s=a=>Math.max(e.hSpacing,a+q),t=new Map(h.map(a=>{var b;return[a,(b=i.get(a),(b.states?.length??0)>0?{width:e.compositeWidth,height:e.compositeHeight}:{width:e.nodeWidth,height:e.nodeHeight})]})),x=p.map(a=>a.reduce((a,b)=>a+s(t.get(b).width),0)),y=c+Math.max(...x,0)/2,z=d;for(let b of(p.forEach((a,b)=>{let c=y-x[b]/2,d=e.nodeHeight;for(let b of a){let a=t.get(b),e=s(a.width);f[b]={x:Math.round(c+(e-a.width)/2),y:Math.round(z),width:a.width,height:a.height},c+=e,d=Math.max(d,a.height)}z+=d+r}),g)){if((b.states?.length??0)===0)continue;let c=f[b.name];a(b,c.x+20,c.y+40,e,f)}}(d,c.originX,c.originY,c,e),c.includeRoot){let a=v(d).map(a=>e[a.name]).filter(Boolean);if(0===a.length)e[d.name]={x:20,y:20,width:400,height:350};else{let b=Math.min(...a.map(a=>a.x)),c=Math.min(...a.map(a=>a.y)),f=Math.max(...a.map(a=>a.x+a.width)),g=Math.max(...a.map(a=>a.y+a.height));e[d.name]={x:Math.round(b-40),y:Math.round(c-40),width:Math.round(f-b+80),height:Math.round(g-c+80)}}}return e}let y=(a,b)=>a.length*b*.55,z=a=>`[${a.length>32?`${a.slice(0,31).trimEnd()}…`:a}]`,A=a=>({width:Math.max(56,Math.max(y(a.event,11),a.condition?y(z(a.condition),9):0)+16)+16*!!a.glyph,height:a.condition?28:18}),B=a=>({x:a.x+5,y:a.cy-12-3}),C=(a,b)=>a.x<b.x+b.width&&b.x<a.x+a.width&&a.y<b.y+b.height&&b.y<a.y+a.height,D={along:[.5,.36,.64,.24,.76,.14,.86],aside:[0,.6,-.6],across:[0,-1.3,1.3,-2.6,2.6]};function E(a,b,c={}){let{along:d,aside:e,across:f}={...D,...c},g=a.map((a,b)=>({label:a,i:b,width:A(a).width})).sort((a,b)=>a.width===b.width?a.i-b.i:b.width-a.width),h=[];for(let{label:a}of g){let{width:c,height:g}=A(a),i=8*!!a.glyph,j=null,k=1/0;a:for(let l of f)for(let f of e)for(let e of d){let d=a.at(e),m=d.x+f*c,n=d.y+l*g,o={x:m-c/2,y:n-18,width:c,height:g},p=[...h,...b].filter(a=>C(o,a)).length,q={...o,cx:m+i,cy:n,label:a};if(0===p){j=q;break a}p<k&&(k=p,j=q)}j&&h.push(j)}return h}let F=(a,b,c=2.2,d)=>({id:a,paths:b,strokeWidth:c,circles:d}),G=F("signal",["M3 12h10","m13 6 6 6-6 6Z"]),H=[{glyph:F("confirm",["m4 13 5.5 5.5L20 6"],2.4),words:["confirm","approve","accept","commit"]},{glyph:F("complete",["m8 12 3 3 5-6"],2.2,[{cx:12,cy:12,r:8.5}]),words:["complete","finish","done","close"]},{glyph:F("skip",["M4 17c0-6 4.5-9 9-9h6","m15 4 4.5 4-4.5 4"]),words:["skip","ignore","bypass"]},{glyph:F("flag",["M6 21V4","M6 4h12l-3 4.5 3 4.5H6Z"]),words:["flag","mark","revisit","review"]},{glyph:F("advance",["M4 6l8 6-8 6Z","M13 6l7 6-7 6Z"]),words:["advance","next","forward","step"]},{glyph:F("pause",["M9 5v14M15 5v14"],2.6),words:["pause","hold","suspend","stop"]},{glyph:F("play",["M7 4.5 19 12 7 19.5Z"]),words:["resume","start","begin","play","run"]},{glyph:F("clock",["M12 7.5V12l3.5 2.5"],2.2,[{cx:12,cy:12,r:8.5}]),words:["timeout","expire","tick","delay","after","elapse"]},{glyph:F("change",["M3 14c3-6 6-6 9 0s6 6 9 0"]),words:["change","update","edit","modify","set"]}];[...H.map(a=>a.glyph)];let I=a=>Math.round(100*a)/100;function J(a,b,c,d){return{p0:a,p1:b,p2:c,p3:d,path:`M ${I(a.x)} ${I(a.y)} C ${I(b.x)} ${I(b.y)}, ${I(c.x)} ${I(c.y)}, ${I(d.x)} ${I(d.y)}`,at:e=>{let f=1-e,g=f*f*f,h=3*f*f*e,i=3*f*e*e,j=e*e*e;return{x:g*a.x+h*b.x+i*c.x+j*d.x,y:g*a.y+h*b.y+i*c.y+j*d.y}}}}function K(a,b){let c=a.map(({from:a,to:c})=>{var d,e;return a===c?null:(d=b(a),(e=b(c)).y>=d.y+d.height?["bottom","top"]:e.y+e.height<=d.y?["top","bottom"]:e.x>=d.x+d.width?["right","left"]:e.x+e.width<=d.x?["left","right"]:["bottom","top"])}),d=new Map,e=(a,b,c)=>{let e=`${a}\0${b}`,f=d.get(e);f?f.push(c):d.set(e,[c])},f=(a,b)=>"top"===b||"bottom"===b?a.x+a.width/2:a.y+a.height/2;a.forEach((a,d)=>{let g=c[d];if(!g)return;let[h,i]=g;e(a.from,h,{edge:d,toward:f(b(a.to),h),role:"out"}),e(a.to,i,{edge:d,toward:f(b(a.from),i),role:"in"})});let g=new Map;for(let[a,c]of d){let[d,e]=a.split("\0"),f=b(d),h=[...c].sort((a,b)=>a.toward===b.toward?a.edge-b.edge:a.toward-b.toward);h.forEach((a,b)=>{g.set(`${a.edge}\0${a.role}`,function(a,b,c,d){let e="top"===b||"bottom"===b,f=e?a.width:a.height,g=e?a.x+a.width/2:a.y+a.height/2,h=d>1?Math.min(.72*f,40*(d-1)):0,i=d>1?g-h/2+h*c/(d-1):g;return"top"===b?{x:i,y:a.y}:"bottom"===b?{x:i,y:a.y+a.height}:"left"===b?{x:a.x,y:i}:{x:a.x+a.width,y:i}}(f,e,b,h.length))})}return a.map((a,d)=>{let e=c[d];if(!e){var f;let c,d,e;return c=(f=b(a.from)).x+f.width,d=f.y+.35*f.height,J({x:c,y:d},{x:c+44,y:d-12},{x:c+44,y:(e=f.y+.65*f.height)+12},{x:c,y:e})}let h=g.get(`${d}\0out`),i=g.get(`${d}\0in`);var j=e[0];if("top"===j||"bottom"===j){let a=(h.y+i.y)/2;return J(h,{x:h.x,y:a},{x:i.x,y:a},i)}let k=(h.x+i.x)/2;return J(h,{x:k,y:h.y},{x:k,y:i.y},i)})}let L={min:.2,max:2.5},M={x:0,y:0,scale:1};function N(a,b=L){return Number.isFinite(a)?Math.min(b.max,Math.max(b.min,a)):1}function O(a,b){return{x:(b.x-a.x)/a.scale,y:(b.y-a.y)/a.scale}}function P(a,b,c){return{x:a.x+b,y:a.y+c,scale:a.scale}}function Q(a,b,c,d=L){return R(a,a.scale*b,c,d)}function R(a,b,c,d=L){let e=N(b,d);if(e===a.scale)return a;let f=O(a,c);return{x:c.x-f.x*e,y:c.y-f.y*e,scale:e}}function S(a,b,c,d={}){let e=d.padding??48,f=d.maxScale??1,g=d.limits??L;if(0===a.length||b<=0||c<=0)return{...M};let h=1/0,i=1/0,j=-1/0,k=-1/0;for(let b of a)h=Math.min(h,b.x),i=Math.min(i,b.y),j=Math.max(j,b.x+b.width),k=Math.max(k,b.y+b.height);let l=Math.max(1,j-h),m=Math.max(1,k-i),n=N(Math.min(f,Math.min(Math.max(1,b-2*e)/l,Math.max(1,c-2*e)/m)),g);return{x:(b-l*n)/2-h*n,y:(c-m*n)/2-i*n,scale:n}}function T(a){return`translate(${a.x} ${a.y}) scale(${a.scale})`}function U(a){let b=new Set,c=[];for(let d of a.states??[])b.has(d.name)||(b.add(d.name),c.push(d));return c}function V(a){return a.stateOf?Array.isArray(a.stateOf)?a.stateOf:[a.stateOf]:[]}let W=["1:1","1:N","N:1","N:M"];function X(a){return!!a&&"object"==typeof a&&Array.isArray(a.entities)&&!("state"in a)}function Y(a){let b=[],c=function(a){let b=new Map;for(let c of a.entities??[])c?.name&&!b.has(c.name)&&b.set(c.name,c);return b}(a),d=new Set;for(let[e,f]of(a.entities??[]).entries()){if(!f?.name){b.push({ruleId:"E001",message:`Entity at index ${e} has no name`,element:`entities[${e}]`});continue}d.has(f.name)&&b.push({ruleId:"E001",message:`Duplicate entity name "${f.name}"`,element:f.name}),d.add(f.name);let a=new Set;for(let[d,e]of(f.attributes??[]).entries()){if(!e?.name){b.push({ruleId:"E002",message:`Attribute at index ${d} of "${f.name}" has no name`,element:`${f.name}[${d}]`});continue}let g=`${f.name}.${e.name}`;if(a.has(e.name)&&b.push({ruleId:"E002",message:`Duplicate attribute "${g}"`,element:g}),a.add(e.name),e.references){let a=function(a){let b=a.indexOf(".");return b<0?{entity:a}:{entity:a.slice(0,b),attribute:a.slice(b+1)}}(e.references),d=c.get(a.entity);d?a.attribute&&!(d.attributes??[]).some(b=>b?.name===a.attribute)&&b.push({ruleId:"E005",message:`"${g}" references undefined attribute "${e.references}"`,element:g}):b.push({ruleId:"E005",message:`"${g}" references undefined entity "${a.entity}"`,element:g})}}}for(let[d,e]of(a.relationships??[]).entries()){let a=`relationships[${d}]`;for(let f of["from","to"]){let g=e?.[f];g&&c.has(g)||b.push({ruleId:"E003",message:`Relationship ${d} ${f} names undefined entity "${g??""}"`,element:a})}W.includes(e?.cardinality)||b.push({ruleId:"E004",message:`Relationship ${d} cardinality "${e?.cardinality??""}" is not one of ${W.join(", ")}`,element:a})}return b}function Z(a,b){let c=RegExp(`(?<![\\w.])${b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.([A-Za-z_]\\w*)\\b(?!\\s*\\()`,"g"),d=[];for(let b of a.matchAll(c))d.includes(b[1])||d.push(b[1]);return d}function $(a,b){let c=[],d=new Map;for(let a of b.entities??[])a?.name&&!d.has(a.name)&&d.set(a.name,a);let e=a.settings?.name??"",f=a.settings?.objects??[],g=a.state?function a(b){let c=[b];for(let d of b.states??[])c.push(...a(d));for(let d of b.parallel?.states??[])c.push(...a(d));return c}(a.state):[],h=g.flatMap(a=>(a.transitions??[]).map(a=>a.condition??"")),i=new Map;for(let a of f){let e=d.get(a.class);if(e){i.set(a.instance,e);continue}h.some(b=>Z(b,a.instance).length>0)&&c.push({ruleId:"L001",message:`Object "${a.instance}" has class "${a.class}", which is not an entity in "${b.settings?.name??""}", and a guard reads its fields`,element:a.instance})}for(let a of g)for(let b of a.transitions??[])if(b.condition)for(let[d,e]of i)for(let f of Z(b.condition,d))(e.attributes??[]).some(a=>a?.name===f)||c.push({ruleId:"L002",message:`Guard on ${a.name} [${b.event}] reads "${d}.${f}", which is not an attribute of "${e.name}"`,element:a.name});if(e){let a=new Set([...i.values()].map(a=>a.name));for(let d of b.entities??[])for(let b of d?.attributes??[])b&&V(b).includes(e)&&(a.has(d.name)||c.push({ruleId:"L003",message:`"${d.name}.${b.name}" stores the state of "${e}", but "${d.name}" is not the class of any of that machine's objects`,element:`${d.name}.${b.name}`}))}return c}function _(a,b){let c=[];for(let d of a.entities??[])for(let a of d?.attributes??[])if(a)for(let e of V(a))b.includes(e)||c.push({ruleId:"L004",message:`"${d.name}.${a.name}" stores the state of "${e}", which is not among the machines checked (${b.join(", ")||"none"})`,element:`${d.name}.${a.name}`});return c}let aa=a=>({settings:{...a.settings},entities:(a.entities??[]).map(a=>({...a,attributes:(a.attributes??[]).map(a=>({...a}))})),relationships:(a.relationships??[]).map(a=>({...a}))});function ab(a,b){let c=a.entities.find(a=>a.name===b);if(!c){let c=a.entities.map(a=>a.name).join(", ")||"none";throw Error(`Entity '${b}' not found. Entities: ${c}.`)}return c}function ac(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a))}function ad(a,b){if(!b.name?.trim())throw Error("An entity needs a name.");let c=aa(a);if(c.entities.some(a=>a.name===b.name))throw Error(`Entity '${b.name}' already exists.`);return c.entities.push(ac({...b,attributes:b.attributes??[]})),c}function ae(a,b,c){let d=aa(a),e=ab(d,b);return void 0!==c.notes&&(c.notes.trim()?e.notes=c.notes:delete e.notes),void 0!==c.description&&(c.description?e.description=c.description:delete e.description),void 0!==c.weak&&(c.weak?e.weak=!0:delete e.weak),d}let af=a=>(a.attributes??[]).filter(a=>a?.name);function ag(a){return Math.max(110,Math.ceil(8.4*(a.name??"").length+36))}function ah(a){return Math.max(38,Math.ceil(3.5*Math.max(0,...a.map(a=>a.name.length))+14))}let ai=a=>Math.ceil(a/2);function aj(a){let b=af(a),c=ag(a);return 0===b.length?{width:c,height:40}:{width:c+2*(34+2*ah(b)),height:Math.max(40,32*ai(b.length))}}let ak={"1:1":"||--||","1:N":"||--o{","N:1":"}o--||","N:M":"}o--o{"},al=/^[A-Za-z_][A-Za-z0-9_-]*$/,am=a=>al.test(a)?a:`"${a.replace(/"/g,"'")}"`,an=(a,b)=>{let c=a.trim().replace(/[^A-Za-z0-9_()[\]-]+/g,"_").replace(/^_+|_+$/g,"");return/^[A-Za-z_]/.test(c)?c:c?`_${c}`:b},ao=a=>`"${a.replace(/"/g,"'")}"`,ap=["settings","states","parallel","entities","participants","messages","fragments","members","state"];function aq(a){let b=!1,c=a=>{if(Array.isArray(a)){let b=!1,d=a.map(a=>{let d=c(a);return d!==a&&(b=!0),d});return b?d:a}if(!a||"object"!=typeof a)return a;let d=null;if("notes"in a&&"string"!=typeof a.notes&&void 0!==a.notes){d={...a};let c=function(a){if(null!=a)return"string"==typeof a?a:Array.isArray(a)?a.map(a=>"string"==typeof a?a:JSON.stringify(a)).join("\n\n"):JSON.stringify(a)}(a.notes);void 0!==c&&c.trim()?d.notes=c:delete d.notes,b=!0}for(let b of ap){if(!(b in a))continue;let e=(d??a)[b],f=c(e);f!==e&&((d??={...a})[b]=f)}return d??a},d=c(a);return b?d:a}function ar(a){return`${a.name} : ${a.type}`}function as(a){let b=(a.attributes??[]).filter(a=>a?.name);return{width:Math.min(340,Math.max(170,Math.ceil(6.6*Math.max(1.15*(a.name??"").length,...b.map(a=>ar(a).length+6.96969696969697))+28))),height:30+20*Math.max(1,b.length)+8}}function at(a){return a.trim().replace(/[\s_]+/g,"-").replace(/[^A-Za-z0-9.-]/g,"").replace(/-{2,}/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,60)}let au=["alt","opt","loop"];function av(a){return!!a&&"object"==typeof a&&Array.isArray(a.participants)&&Array.isArray(a.messages)&&!("state"in a)&&!("entities"in a)}function aw(a,b,c){return{settings:c?{namespace:a,name:b,description:c}:{namespace:a,name:b},participants:[],messages:[]}}function ax(a,b){return null===a?String(b+1):`f${a+1}.${b+1}`}function ay(a,b){if(/^\d+$/.exec(b)){let c=Number(b)-1,d=a.messages?.[c];return d?{fragment:null,index:c,message:d}:null}let c=/^f(\d+)\.(\d+)$/.exec(b);if(!c)return null;let d=Number(c[1])-1,e=Number(c[2])-1,f=a.fragments?.[d]?.messages?.[e];return f?{fragment:d,index:e,message:f}:null}function az(a){let b=[];return(a.messages??[]).forEach((a,c)=>b.push({ref:ax(null,c),message:a,fragment:null})),(a.fragments??[]).forEach((a,c)=>(a?.messages??[]).forEach((a,d)=>b.push({ref:ax(c,d),message:a,fragment:c}))),b}function aA(a){let b=[];a?.settings?.name||b.push({ruleId:"S001",message:"The sequence has no settings.name",element:"settings"});let c=new Set;for(let[d,e]of(a.participants??[]).entries()){if(!e?.name){b.push({ruleId:"S002",message:`Participant at index ${d} has no name`,element:`participants[${d}]`});continue}c.has(e.name)&&b.push({ruleId:"S002",message:`Duplicate participant "${e.name}"`,element:e.name}),c.add(e.name)}let d=(a,d)=>{if(!a)return void b.push({ruleId:"S003",message:`Message ${d} is empty`,element:`message:${d}`});for(let e of["from","to"])a[e]&&c.has(a[e])||b.push({ruleId:"S003",message:`Message ${d} ${"from"===e?"comes from":"goes to"} "${a[e]??""}", which is not a participant`,element:`message:${d}`});a.label?.trim()||b.push({ruleId:"S004",message:`Message ${d} has no label`,element:`message:${d}`})};(a.messages??[]).forEach((a,b)=>d(a,ax(null,b)));let e=(a.messages??[]).length;for(let[c,f]of(a.fragments??[]).entries()){let a=`fragment:${c+1}`;if(!f||!au.includes(f.kind)){b.push({ruleId:"S005",message:`Fragment ${c+1} has kind "${f?.kind??""}"; expected one of ${au.join(", ")}`,element:a});continue}(!Number.isInteger(f.after)||f.after<0||f.after>e)&&b.push({ruleId:"S005",message:`Fragment ${c+1} branches after message ${f.after}, but the main sequence has messages 1 to ${e}`,element:a}),f.messages?.length||b.push({ruleId:"S006",message:`Fragment ${c+1} (${f.kind}) holds no message`,element:a}),(f.messages??[]).forEach((a,b)=>d(a,ax(c,b)))}return b}let aB=a=>{let b={settings:{...a.settings},participants:(a.participants??[]).map(a=>({...a,...a.holds?{holds:[...a.holds]}:{}})),messages:(a.messages??[]).map(a=>({...a}))};return a.fragments&&(b.fragments=a.fragments.map(a=>({...a,messages:(a.messages??[]).map(a=>({...a}))}))),b};function aC(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a&&""!==a&&!(Array.isArray(a)&&0===a.length)))}function aD(a,b){let c=a.participants.find(a=>a.name===b);if(!c){let c=a.participants.map(a=>a.name).join(", ")||"none";throw Error(`Participant '${b}' not found. Participants: ${c}.`)}return c}function aE(a,b){if(aD(a,b.from),aD(a,b.to),!b.label?.trim())throw Error("A message needs a label: what is said or done, in a few words.")}function aF(a,b){let c=a.fragments?.[b];if(c&&!Array.isArray(c.messages)&&(c.messages=[]),!c)throw Error(`Fragment ${b+1} not found. The sequence has ${a.fragments?.length??0} fragment(s).`);return c}function aG(a,b,c){let d=aB(a),e=aD(d,b),f=aC({...e,...c});return d.participants[d.participants.indexOf(e)]=f,d}function aH(a,b,c){let d=aB(a);aE(d,b);let e=void 0===c?d.messages.length:Math.max(0,Math.min(c,d.messages.length));if(d.messages.splice(e,0,aC({...b})),d.fragments)for(let a of d.fragments)a.after>e&&(a.after+=1);return d}function aI(a,b,c,d=null){let e=aB(a),f=null===d?e.messages:aF(e,d).messages,g=f[b];if(!g)throw Error(`Message ${b+1} not found${null===d?"":` in fragment ${d+1}`}.`);let h=aC({...g,...c});return aE(e,h),f[b]=h,e}function aJ(a,b,c){let d=aB(a);if(!d.messages[b])throw Error(`Message ${b+1} not found.`);let e=Math.max(0,Math.min(c,d.messages.length-1)),f=(d.fragments??[]).map(a=>a.after>0?d.messages[a.after-1]:null),[g]=d.messages.splice(b,1);return d.messages.splice(e,0,g),(d.fragments??[]).forEach((a,b)=>{let c=f[b];c&&(a.after=d.messages.indexOf(c)+1)}),d}let aK={columnGap:150,rowHeight:34,headerHeight:34,topGap:30,fragmentPad:30,margin:24,fontSize:12};function aL(a,b={}){let c={...aK,...b},d=(Array.isArray(a.participants)?a.participants:[]).map(a=>({...a,name:"string"==typeof a?.name?a.name:""})),e=(Array.isArray(a.messages)?a.messages:[]).filter(a=>!!a&&"object"==typeof a),f=a=>Math.max(90,y(a,c.fontSize)+28),g=[],h=c.margin;d.forEach((b,i)=>{let j=f(b.name);if(0===i)g.push(h+j/2);else{let h=f(d[i-1].name),k=function(a,b,c,d,e){let f=0;for(let g of[...a,...(Array.isArray(b.fragments)?b.fragments:[]).flatMap(a=>(Array.isArray(a?.messages)?a.messages:[]).filter(a=>!!a&&"object"==typeof a))])(g.from===c&&g.to===d||g.from===d&&g.to===c)&&(f=Math.max(f,y("string"==typeof g.label?g.label:"",e)+30));return f}(e,a,d[i-1].name,b.name,c.fontSize),l=Math.max(c.columnGap,(h+j)/2+20,k+24);g.push(g[i-1]+l)}});let i=new Map(d.map((a,b)=>[a.name,g[b]])),j=d.map((a,b)=>{let d=f(a.name);return{name:a.name,x:g[b],left:g[b]-d/2,top:c.margin,width:d,height:c.headerHeight}}),k=[],l=c.margin+c.headerHeight+c.topGap,m=0,n=(a,b,d,e,f)=>{let g=i.get(d)??c.margin,h=i.get(e)??c.margin,j=d===e;j&&(m=Math.max(m,g+44+y("string"==typeof f?f:"",c.fontSize))),k.push({ref:ax(a,b),fragment:a,index:b,y:l,fromX:g,toX:h,self:j}),l+=c.rowHeight};(Array.isArray(a.messages)?a.messages:[]).forEach((a,b)=>{a&&"object"==typeof a&&n(null,b,a.from,a.to,a.label)});let o=c.margin/2,p=Math.max(g.length?g[g.length-1]+f(d[d.length-1].name)/2:c.margin,m)+c.margin/2,q=[];(Array.isArray(a.fragments)?a.fragments:[]).forEach((a,b)=>{if(!a||"object"!=typeof a)return;let d=(l+=c.rowHeight/2)-c.rowHeight/2;l+=c.fragmentPad-c.rowHeight/2+6,(Array.isArray(a.messages)?a.messages:[]).forEach((a,c)=>{a&&"object"==typeof a&&n(b,c,a.from,a.to,a.label)});let e=l-d+c.fragmentPad/2-c.rowHeight/2;q.push({index:b,left:o,top:d,width:p-o,height:e,headingY:d+16}),l=d+e+c.rowHeight/2});let r=c.margin+c.headerHeight,s=l;return{participants:j,rows:k,fragments:q,lifelineTop:r,lifelineBottom:s,width:Math.max(p+c.margin/2,2*c.margin+200),height:s+c.margin}}let aM=a=>a.replace(/[;#\n\r]+/g," ").replace(/\s+/g," ").trim(),aN=["propose","auto"];function aO(a,b){return"auto"===b||"propose"===b?b:a?.settings?.reconcile==="auto"?"auto":"propose"}let aP=["person","agent","service","external"];function aQ(a){return a.toLowerCase().endsWith(".sysdf.json")}function aR(a){return!!a&&"object"==typeof a&&Array.isArray(a.members)&&!("state"in a)&&!("entities"in a)&&!("participants"in a)}function aS(a){return a.toLowerCase().endsWith(".erdf.json")?"erd":a.toLowerCase().endsWith(".sqdf.json")?"sequence":aQ(a)?"system":"machine"}function aT(a){return a&&"object"==typeof a?X(a)?"erd":av(a)?"sequence":aR(a)?"system":"state"in a?"machine":null:null}let aU=["erd","machine","sequence"];function aV(a,b){return b.startsWith("/")?aW(b):aW((a.slice(0,a.lastIndexOf("/")+1)||"./")+b)}function aW(a){let b=a.startsWith("/"),c=[];for(let d of a.split("/"))if(d&&"."!==d){if(".."===d){c.length&&".."!==c[c.length-1]?c.pop():b||c.push("..");continue}c.push(d)}return(b?"/":"")+c.join("/")}let aX=a=>({settings:{...a.settings},members:(a.members??[]).map(a=>({...a})),actors:(a.actors??[]).map(a=>({...a}))});function aY(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a&&""!==a))}function aZ(a,b){let c=aX(a);return c.settings=aY({...c.settings,...b}),c}let a$=["refused","unknown-event","ended","state-mismatch"];function a_(a,b=0){return a.settings?.name||a.state?.name||`machine ${b+1}`}function a0(a){let b=a.map((a,b)=>a_(a,b));return b.map((a,c)=>b.indexOf(a)===c&&b.lastIndexOf(a)===c?a:`${a} #${c+1}`)}function a1(a,b){let c=a.states.get(b);for(;c&&c.states?.length;){let a=c.states.find(a=>"history"!==a.kind);if(!a)return null;c=a}return c?.name??null}function a2(a,b,c){let d=b;for(;d;){if(d===c)return!0;d=a.parent.get(d)}return!1}let a3=(a,b)=>a.states.get(b)?.kind==="final";function a4(a,b){let c,d,e=a0(b),f=b.map((a,b)=>(function(a,b,c){let d=new Map,e=new Map,f=(a,b)=>{if(a?.name){for(let c of(d.has(a.name)||(d.set(a.name,a),e.set(a.name,b)),a.states??[]))f(c,a.name);for(let b of a.parallel?.states??[])f(b,a.name)}};a.state&&f(a.state,null);let g=new Set;for(let b of a.events??[])for(let a of b?.events??[])a?.id&&g.add(a.id);for(let b of a.events??[])for(let a of b?.timers??[])a?.id&&g.add(a.id);let h={name:c,def:a,states:d,parent:e,events:g,initial:null};return h.initial=a.state?a1(h,a.state.name):null,h})(a,0,e[b])),g=(d=[{name:"main",kind:"main",items:c=(a.messages??[]).map((a,b)=>({ref:ax(null,b),message:a}))}],c.some(a=>a.message?.optional)&&d.push({name:"main without optional messages",kind:"without-optional",items:c.filter(a=>!a.message?.optional)}),(a.fragments??[]).forEach((a,b)=>{if(!a)return;let e=(a.messages??[]).map((a,c)=>({ref:ax(b,c),message:a})),f=Math.max(0,Math.min(a.after??0,c.length)),g=c.slice(0,f),h=c.slice(f),i=`${a.kind} ${b+1} \xb7 ${a.label??""}`.trim();"alt"===a.kind?d.push({name:i,kind:"alt",fragment:b,items:[...g,...e]}):"opt"===a.kind?d.push({name:i,kind:"opt",fragment:b,items:[...g,...e,...h]}):"loop"===a.kind&&d.push({name:i,kind:"loop",fragment:b,items:[...g,...e,...e,...h]})}),d).map(a=>(function(a,b){let c=new Map;for(let a of b){let b=a.initial&&a3(a,a.initial)?a.initial:null;c.set(a.name,{states:a.initial?[a.initial]:[],ended:b})}let d=[],e=new Map;for(let a of b){let b=a_(a.def);e.set(b,e.has(b)?null:a),a.name!==b&&e.set(a.name,a)}for(let{ref:f,message:g}of a.items){if(!g)continue;let a=g.label??"";if(!g.event){let e={ref:f,label:a,from:[],to:[],result:"data"};g.state&&function(a,b,c,d){let e=c.filter(a=>b.machine?a.name===b.machine:a.states.has(b.state));if(!e.length){a.result="state-mismatch",a.note=b.machine?`no member machine is named "${b.machine}"`:`no member machine has a state "${b.state}"`;return}for(let c of e){let e=d.get(c.name),f=e.states.filter(a=>a2(c,a,b.state));if(f.length){e.states=f;continue}a.machine=c.name,a.from=a.to=[...e.states],a.result="state-mismatch",a.note=`the scenario says ${c.name} is in ${b.state}; the walk has it in ${e.states.join(" or ")||"no state"}`;return}}(e,g,b,c),d.push(e);continue}let h=g.event,i=b.filter(a=>a.events.has(h));if(g.machine){let b=e.get(g.machine);if(!b){let c=null===b?`two member machines are named "${g.machine}"`:`no member machine is named "${g.machine}"`;d.push({ref:f,label:a,event:h,from:[],to:[],result:"unknown-event",note:c});continue}if(!(i=i.filter(a=>a===b)).length){d.push({ref:f,label:a,event:h,machine:b.name,from:[],to:[],result:"unknown-event",note:`"${b.name}" does not define the event "${h}"`});continue}}if(!i.length){d.push({ref:f,label:a,event:h,from:[],to:[],result:"unknown-event",note:`no member machine defines the event "${h}"`});continue}for(let b of i){let e=c.get(b.name),i=[...e.states];if(e.ended){d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"ended",note:`${b.name} ended in ${e.ended} before this message`});continue}let j=i.filter(a=>!a3(b,a));if(!j.length){d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"ended",note:`${b.name} ended in ${i.join(" or ")} before this message`});continue}let k=new Set,l=new Map,m=new Set,n=[];for(let a of j)for(let c of function(a,b,c){let d=[],e=b;for(;e;){for(let b of a.states.get(e)?.transitions??[])if(b?.event===c&&(d.push(b),!b.condition))return d;e=a.parent.get(e)}return d}(b,a,h)){let d=c.nextState?a1(b,c.nextState):a;if(!d){n.push(c.nextState);continue}k.add(d),d!==a&&m.add(d),c.condition&&l.set(d,(l.get(d)??new Set).add(c.condition))}if(!k.size){let c=n.length?`${b.name}'s transition for "${h}" from ${j.join(" or ")} leads to ${[...new Set(n)].join(", ")}, which cannot be entered`:`${b.name} has no transition for "${h}" from ${j.join(" or ")}`;d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"refused",note:c});continue}let o=[...k],p={ref:f,label:a,event:h,machine:b.name,from:i,to:o,result:"moved"};if(g.state&&(!g.machine||g.machine===b.name)){let a=b.states.has(g.state);if(a||g.machine===b.name){let c=o.filter(a=>a2(b,a,g.state));c.length?o=c:(p.result="state-mismatch",p.note=a?`the scenario says ${b.name} is in ${g.state}; the walk has it in ${o.join(" or ")}`:`${b.name} has no state "${g.state}"`)}}p.to=o,"moved"!==p.result||o.some(a=>m.has(a))||(p.result="stayed");let q=new Set(o.flatMap(a=>[...l.get(a)??[]]));q.size&&(p.guards=[...q]),e.states=o;let r=o.filter(a=>a3(b,a));r.length&&r.length===o.length&&(e.ended=r[0]),d.push(p)}}let f={};for(let[a,b]of c)f[a]=b.states;return{name:a.name,kind:a.kind,...void 0===a.fragment?{}:{fragment:a.fragment},steps:d,accepted:!d.some(a=>a$.includes(a.result)),end:f}})(a,f));return{scenario:a.settings?.name??"",machines:f.map(a=>a.name),paths:g,accepted:g.every(a=>a.accepted)}}function a5(a){let b={machines:[],erds:[],sequences:[]};for(let c of a)c.def&&!c.error&&aT(c.def)===c.kind&&("machine"===c.kind&&b.machines.push({member:c.path,def:c.def}),"erd"===c.kind&&b.erds.push({member:c.path,def:c.def}),"sequence"===c.kind&&b.sequences.push({member:c.path,def:c.def}));return b}function a6(a,b){let c=[],d=(a,b,d,e)=>{c.push({ruleId:a,message:b,severity:"error",...d?{member:d}:{},...e?{element:e}:{}})},e=(a,b,d,e)=>{c.push({ruleId:a,message:b,severity:"warning",...d?{member:d}:{},...e?{element:e}:{}})};if(a){a.settings?.name||d("Y001","The system has no settings.name"),a.settings?.namespace||d("Y001","The system has no settings.namespace");let b=new Set;for(let[c,e]of(a.members??[]).entries()){if(!e?.path){d("Y002",`Member at index ${c} has no path`,void 0,`members[${c}]`);continue}b.has(e.path)&&d("Y002",`"${e.path}" is listed twice`,e.path),b.add(e.path),aU.includes(aS(e.path))&&e.path.endsWith(".json")||d("Y002",`"${e.path}" is not a document a system holds (.erdf.json, .smdf.json, .sqdf.json)`,e.path)}let c=new Set;for(let[b,e]of(a.actors??[]).entries()){if(!e?.name){d("Y004",`Actor at index ${b} has no name`,void 0,`actors[${b}]`);continue}c.has(e.name)&&d("Y004",`Duplicate actor "${e.name}"`,void 0,e.name),c.add(e.name),aP.includes(e.kind)||d("Y004",`Actor "${e.name}" has kind "${e.kind??""}"; expected one of ${aP.join(", ")}`,void 0,e.name)}}for(let a of b)a.error||!a.def?d("Y003",`"${a.path}" cannot be read: ${a.error??"no content"}`,a.path):aT(a.def)!==a.kind&&d("Y003",`"${a.path}" is named as a ${a.kind} but holds ${aT(a.def)??"something else"}`,a.path);let{machines:f,erds:g,sequences:h}=a5(b),i=new Map;for(let{member:a,def:b}of f){let c=a_(b),e=i.get(c);e?d("Y005",`"${a}" and "${e}" are both machines named "${c}"; a message cannot say which`,a):i.set(c,a)}for(let{member:a,def:b}of g)for(let c of Y(b))d(c.ruleId,c.message,a,c.element);for(let{member:a,def:b}of h)for(let c of aA(b))d(c.ruleId,c.message,a,c.element);let j=function(a){if(!a.length)return null;let b=new Set,c=a.flatMap(({def:a})=>a.entities??[]).filter(a=>a?.name&&!b.has(a.name)&&b.add(a.name));return{settings:{namespace:a[0].def.settings?.namespace??"",name:a.map(a=>a.def.settings?.name).join(" + ")},entities:c,relationships:a.flatMap(({def:a})=>a.relationships??[])}}(g);if(j){for(let{member:a,def:b}of f)for(let c of $(b,j))d(c.ruleId,c.message,a,c.element);let a=f.map(({def:a},b)=>a_(a,b));for(let{member:b,def:c}of g)for(let e of _(c,a))d(e.ruleId,e.message,b,e.element)}for(let{member:a,def:b}of f){let c=(d,f)=>{if(!d)return;let g=f||(d.transitions??[]).length>0,h=d.states??[];for(let f of(h.length||d.parallel||d===b.state||"final"===d.kind||"history"===d.kind||g||e("L009",`${a_(b)}: ${d.name} has no way out and is not final; say how the machine leaves it, or mark it final`,a,`state:${d.name}`),h))c(f,g)};c(b.state,!1)}let k=f.map(a=>a.def),l=new Set(k.map((a,b)=>a_(a,b))),m=new Map,n=new Set,o=new Set;k.forEach((a,b)=>{let c=new Set;for(let b of a.events??[]){for(let a of b?.events??[])a?.id&&c.add(a.id);for(let a of b?.timers??[])a?.id&&c.add(a.id)}m.set(a_(a,b),c);let d=a=>{a&&(n.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};for(let b of(d(a.state),a.settings?.objects??[]))b?.instance&&o.add(b.instance)});let p=new Set((j?.entities??[]).map(a=>a.name)),q=new Set((a?.actors??[]).map(a=>a.name)),r=[];for(let{member:b,def:c}of h){let f=!1,g=a=>!!j||(f||e("L006",`${a} name entities, but the system has no ERD to hold them`,b),f=!0,!1);for(let e of c.participants??[]){if(!e?.name)continue;let c=`participant:${e.name}`;if(e.actor&&a&&!q.has(e.actor)&&d("L006",`Participant "${e.name}" is the actor "${e.actor}", which the system does not list`,b,c),e.object&&!o.has(e.object)&&d("L006",`Participant "${e.name}" is the object "${e.object}", which no member machine declares`,b,c),e.holds?.length&&g("Participants' holds"))for(let a of e.holds)p.has(a)||d("L006",`Participant "${e.name}" holds "${a}", which is not an entity`,b,c)}for(let{ref:a,message:f}of az(c)){if(!f)continue;let c=`message:${a}`;f.machine&&!l.has(f.machine)?d("L005",`Message ${a} names the machine "${f.machine}", which is not a member`,b,c):f.event&&((f.machine?m.get(f.machine)?.has(f.event):[...m.values()].some(a=>a.has(f.event)))||d("L005",`Message ${a} fires "${f.event}", which ${f.machine?`"${f.machine}" does not define`:"no member machine defines"}`,b,c)),f.carries&&g("Messages' carries")&&!p.has(f.carries)&&d("L007",`Message ${a} carries "${f.carries}", which is not an entity`,b,c),f.state&&!n.has(f.state)&&e("L008",`Message ${a} says the machine is then in "${f.state}", which no member machine has`,b,c)}let h=a4(c,k);for(let a of(r.push({member:b,report:h}),h.paths)){let c=a.steps.filter(a=>"refused"===a.result||"ended"===a.result||"state-mismatch"===a.result);for(let d of[...new Set(c.map(a=>a.machine??""))]){let f=c.filter(a=>(a.machine??"")===d),g=f[0],h=f.length>1?` (${f.length-1} later message${f.length>2?"s stop":" stops"} too)`:"",i="without-optional"===a.kind?" — a message the rest depends on may not be optional":"";e("L008",`${a.name}, message ${g.ref}: ${g.note??g.result}${h}${i}`,b,`message:${g.ref}`)}}}return{issues:c,replays:r}}function a7(a){return`${a.kind}:${a.name}`}function a8(a){let b=a.indexOf(":");if(b<=0)return null;let c=a.slice(0,b);return["entity","attribute","machine","object","event","state","participant","message"].includes(c)?{kind:c,name:a.slice(b+1)}:null}function a9(a){let{machines:b,erds:c,sequences:d}=a5(a),e=[],f=new Map;for(let{member:a,def:b}of c)for(let c of b.entities??[])c?.name&&!f.has(c.name)&&f.set(c.name,a);let g=new Map;for(let{def:a}of c)for(let b of a.entities??[])g.set(b.name,new Set((b.attributes??[]).map(a=>a.name)));let h=new Map,i=new Map;b.forEach(({member:a,def:b},c)=>{let d=a_(b,c);for(let c of b.events??[])for(let b of[...c?.events??[],...c?.timers??[]]){if(!b?.id)continue;let c=h.get(b.id)??[];c.push({member:a,machine:d}),h.set(b.id,c)}for(let c of b.settings?.objects??[]){if(!c?.instance)continue;i.has(c.instance)||i.set(c.instance,{member:a,className:c.class});let b=f.get(c.class);b&&e.push({from:{member:a,kind:"object",name:c.instance},to:{member:b,kind:"entity",name:c.class},rule:"L001",text:`is constructed as the entity ${c.class}`,back:`is the class of ${d}'s object ${c.instance}`})}let j=c=>{if(c){for(let d of c.transitions??[])if(d?.condition)for(let h of b.settings?.objects??[]){let b=f.get(h.class);if(b)for(let f of Z(d.condition,h.instance))g.get(h.class)?.has(f)&&e.push({from:{member:a,kind:"event",name:d.event},to:{member:b,kind:"attribute",name:`${h.class}.${f}`},rule:"L002",text:`its guard on ${c.name} reads ${h.class}.${f}`,back:`is read by the ${d.event} guard on ${c.name}`})}(c.states??[]).forEach(j)}};j(b.state)});let j=a0(b.map(a=>a.def)),k=new Map(b.map(({member:a},b)=>[j[b],a]));for(let{member:a,def:d}of c)for(let c of d.entities??[])for(let d of c.attributes??[])for(let f of V(d)){let g=k.get(f)??b.find(({def:a})=>a_(a)===f)?.member;g&&e.push({from:{member:a,kind:"attribute",name:`${c.name}.${d.name}`},to:{member:g,kind:"machine",name:f},rule:"L003",text:`stores the state of ${f}`,back:`keeps its state in ${c.name}.${d.name}`})}for(let{member:a,def:c}of d){for(let b of c.participants??[]){if(!b?.name)continue;let c={member:a,kind:"participant",name:b.name},d=b.object?i.get(b.object):void 0;for(let a of(d&&e.push({from:c,to:{member:d.member,kind:"object",name:b.object},rule:"L006",text:`is the object ${b.object}`,back:`is the participant ${b.name}`}),b.holds??[])){let d=f.get(a);d&&e.push({from:c,to:{member:d,kind:"entity",name:a},rule:"L006",text:`holds ${a}`,back:`is held by ${b.name}`})}}for(let{ref:b,message:d}of az(c)){if(!d)continue;let g={member:a,kind:"message",name:b};if(d.event)for(let a of h.get(d.event)??[])d.machine&&d.machine!==a.machine||e.push({from:g,to:{member:a.member,kind:"event",name:d.event},rule:"L005",text:`fires ${d.event}`,back:`is fired by message ${b} of ${c.settings?.name??"the scenario"}`});if(d.carries){let a=f.get(d.carries);a&&e.push({from:g,to:{member:a,kind:"entity",name:d.carries},rule:"L007",text:`carries ${d.carries}`,back:`is carried by message ${b}`})}}let d=a4(c,b.map(a=>a.def)).paths.find(a=>"main"===a.kind);for(let b of d?.steps??[]){if("moved"!==b.result||!b.machine)continue;let c=k.get(b.machine);if(c)for(let d of b.to)e.push({from:{member:a,kind:"message",name:b.ref},to:{member:c,kind:"state",name:d},rule:"L008",text:`moves ${b.machine} to ${d}`,back:`is entered on message ${b.ref}`})}}return e}let ba=a=>{let b=a.replace(/[^A-Za-z0-9]+(.)?/g,(a,b)=>b?b.toUpperCase():"").replace(/^[^A-Za-z]+/,"");return b?b.charAt(0).toUpperCase()+b.slice(1):"Scenario"};function bb(a,b){let c=a=>!!a&&(a.name===b||(a.states??[]).some(c)||(a.parallel?.states??[]).some(c));return c(a.state)}let bc=(a,b)=>b?"service":/\b(agent|bot|assistant)\b/i.test(a)?"agent":"person";function bd(a,b){let{machines:c,erds:d,sequences:e}=a5(b),f=[],g=a=>{f.includes(a)||f.push(a)},h=a,i=[];if(h)for(let{def:a}of e)for(let b of a.participants??[]){if(!b?.actor||(h.actors??[]).some(a=>a.name===b.actor))continue;let c=bc(b.actor,b.service);h=function(a,b){if(!b.name?.trim())throw Error("An actor needs a name.");if(!aP.includes(b.kind))throw Error(`An actor is one of ${aP.join(", ")}; got '${b.kind}'.`);let c=aX(a);if((c.actors??[]).some(a=>a.name===b.name))throw Error(`Actor '${b.name}' already exists.`);return(c.actors??=[]).push(aY({...b})),c}(h,{name:b.actor,kind:c}),i.push(`the system gains the ${c} "${b.actor}", who takes part in ${a.settings?.name??"a scenario"}`)}let j=d.map(a=>({member:a.member,def:a.def,reasons:[]})),k=new Set(j.flatMap(a=>(a.def.entities??[]).map(a=>a.name)));for(let{def:a}of e){let b=[];for(let c of a.participants??[])for(let d of c?.holds??[])d?.trim()&&b.push({name:d.trim(),why:`${c.name} holds it in ${a.settings?.name??"a scenario"}`});for(let{ref:c,message:d}of az(a))d?.carries?.trim()&&b.push({name:d.carries,why:`message ${c} of ${a.settings?.name??"a scenario"} carries it`});for(let a of b){if(k.has(a.name))continue;if(!j.length){g(`"${a.name}" is named as data (${a.why}), but the system has no ERD to hold it; add a .erdf.json member`);continue}let b=j[0];b.def=ad(b.def,{name:a.name,notes:`Added from the scenario: ${a.why}.`}),b.reasons.push(`${b.def.settings?.name??b.member} gains the entity ${a.name}, because ${a.why}`),k.add(a.name)}}let l=c.map(a=>a.def),m=a0(l),o=l.map(()=>[]),p=l.map(()=>[]),q=(a,b,c)=>{l=l.map((c,d)=>d===a?n(c,b):c),o[a].push(...b),p[a].push(c)},r=a=>a.charAt(0).toLowerCase()+a.slice(1);for(let{def:a}of j)for(let b of a.entities??[])for(let a of b.attributes??[])for(let c of a?.stateOf===void 0?[]:Array.isArray(a.stateOf)?a.stateOf:[a.stateOf]){let d=m.findIndex((a,b)=>a===c||a_(l[b])===c);if(d<0)continue;let e=l[d].settings?.objects??[];if(e.some(a=>a.class===b.name))continue;let f=r(b.name);for(;e.some(a=>a.instance===f);)f+="_";q(d,[{op:"settings.update",patch:{objects:[...e,{instance:f,class:b.name}]}}],`${m[d]} is constructed with the object ${f} : ${b.name}, because ${b.name}.${a.name} stores its state`)}for(let{def:a}of e){for(let b of a.participants??[]){if(!b?.object||l.some(a=>(a.settings?.objects??[]).some(a=>a.instance===b.object)))continue;let a=(b.holds??[]).filter(a=>a?.trim()),c=1===a.length?a[0].trim():null;1===l.length&&c?q(0,[{op:"settings.update",patch:{objects:[...l[0].settings?.objects??[],{instance:b.object,class:c}]}}],`${m[0]} is constructed with the object ${b.object} : ${c}, because ${b.name} is it`):g(`${b.name} is the object "${b.object}", which no machine declares; ${1===l.length?"say which entity it is by holding exactly one":"declare it on the machine it belongs to"}`)}let b=function(a,b,c={}){let d=c.maxRounds??100,e=b.map(a=>a),f=a0(e),g=new Map,h=[],i=new Set,j=a4(a,e),k=new Set,l="",m=(a,b,c)=>{k.add(`${a}|${JSON.stringify(b)}`),e=e.map((c,d)=>d===a?n(c,b):c);let d=g.get(a)??{machine:f[a],index:a,ops:[],reasons:[]};d.ops.push(...b),d.reasons.push(c),g.set(a,d)},o=!0;for(let b=0;b<d;b++){let b=(function(a){let b=[];for(let c of a.paths)for(let a of c.steps)("refused"===a.result||"unknown-event"===a.result||"ended"===a.result||"state-mismatch"===a.result)&&b.push({path:c,step:a});return b})(a4(a,e)).find(({path:a,step:b})=>!i.has(`${b.ref}|${b.machine??""}|${b.result}|${a.name}`)&&!i.has(`${a.name}|${b.machine??""}`));if(!b){o=!1;break}let{path:c,step:d}=b,g=`${d.ref}|${d.machine??""}|${d.result}|${c.name}`,j=`${g}|${d.from.join("|")}`,n=j===l;l=j;let p=ay(a,d.ref)?.message,q=`message ${d.ref} (${c.name})`,r=(a,b)=>{i.add(g),i.add(`${c.name}|${d.machine??""}`),h.includes(b)||h.push(b)};if("without-optional"===c.kind){let b=(a.messages??[]).map((a,b)=>a?.optional?String(b+1):"").filter(Boolean);r(g,`${q}: without its optional message${b.length>1?"s":""} ${b.join(", ")} the scenario stops (${d.note??d.result}); if the rest depends on ${b.length>1?"them, they are":"it, it is"} not optional`);continue}if(!p){r(g,`${q}: cannot be read back from the sequence`);continue}if(n){r(g,`${q}: the change proposed for it did not let the walk through (${d.note??d.result}); a person has to look at ${d.machine??"the machine"}`);continue}let s=(a,b,c)=>{k.has(`${a}|${JSON.stringify(b)}`)?r(g,`${q}: the change it needs was already proposed and did not take effect (${d.note??d.result})`):m(a,b,c)};if("unknown-event"===d.result){let a=p.machine?e.map((a,b)=>f[b]===p.machine||(a.settings?.name??"")===p.machine?b:-1).filter(a=>a>=0):1===e.length?[0]:[];if(a.length>1){r(g,`${q}: ${a.length} member machines are named "${p.machine}"; rename one so the message can say which`);continue}let b=a.length?a[0]:-1;if(b<0){r(g,p.machine?`${q}: fires "${p.event}" for "${p.machine}", which is not a member machine`:`${q}: fires "${p.event}", which no machine defines; set the message's machine to say which one should`);continue}let c=e[b],d=`${ba(p.from)}Events`,h=ba(p.from),i=(c.events??[]).findIndex(a=>a?.name===d||a?.name===h||a?.name===p.from||a?.feeder===p.from),j=i>=0?c.events[i].name:d,k={id:p.event,...p.label?.trim()?{description:p.label.trim()}:{}};s(b,i>=0?[{op:"event.add",sourceIndex:i,event:k}]:[{op:"eventSource.add",source:{name:d,events:[k]}}],`${f[b]} defines "${p.event}" in ${j}, because ${q} fires it`);continue}if("refused"===d.result){let a=f.indexOf(d.machine??"");if(!p.state){r(g,`${q}: ${d.machine} refuses "${p.event}" from ${d.from.join(" or ")}; give the message a state to say where it leads, and reconcile can add the transition`);continue}if(1!==d.from.length){r(g,`${q}: ${d.machine} could be in ${d.from.join(" or ")}; choose which state "${p.event}" leaves from`);continue}let b=e[a],c=d.from[0],h=bb(b,p.state);if(!h&&!p.machine){let b=f.filter((b,c)=>c!==a&&bb(e[c],p.state)),c=e.filter(a=>(function(a){let b=new Set;for(let c of a.events??[])for(let a of[...c?.events??[],...c?.timers??[]])a?.id&&b.add(a.id);return b})(a).has(p.event)).length;if(b.length||c>1){r(g,`${q}: "${p.state}" ${b.length?"is a state of another machine":"is claimed while several machines hear the event"}; set the message's machine to say which machine it is about`);continue}}if(!function(a,b){let c=a=>!!a&&(a.name===b||(a.states??[]).some(c));return c(a.state)}(b,c)){r(g,`${q}: ${d.machine} is in ${c}, inside a parallel region, which reconcile does not edit`);continue}let i=[],j=[],k=c===b.state?.name&&!(b.state?.states??[]).length;if(h||(i.push({op:"state.add",parent:null,state:{name:p.state,...p.label?.trim()?{description:`Reached when: ${p.label.trim()}`}:{},transitions:[]}}),j.push(k?`gains its first state, ${p.state}`:`adds the state ${p.state}`)),k){s(a,i,`${f[a]} ${j.join(" and ")}, because ${q} says the machine is there`);continue}let l=p.label?.trim()?{description:p.label.trim()}:{};i.push(c===p.state?{op:"transition.add",state:c,transition:{event:p.event,...l}}:{op:"transition.add",state:c,transition:{event:p.event,nextState:p.state,...l}}),j.push(c===p.state?`handles "${p.event}" in ${c} without leaving it`:`goes from ${c} to ${p.state} on "${p.event}"`),s(a,i,`${f[a]} ${j.join(" and ")}, because ${q} says so`);continue}if("state-mismatch"===d.result){r(g,`${q}: ${d.note??"the scenario and the machine disagree"}; one of them has to change, and that is a person's call`);continue}r(g,`${q}: ${d.note??d.result}`)}return o&&h.push(`reconcile stopped after ${d} rounds; what it proposed so far is kept, and the rest needs a person`),{proposals:[...g.values()].sort((a,b)=>a.index-b.index),unresolved:h,before:j,after:a4(a,e),machines:e}}(a,l);for(let a of b.proposals)o[a.index].push(...a.ops),p[a.index].push(...a.reasons);for(let c of(l=b.machines,b.unresolved))g(`${a.settings?.name??"scenario"}: ${c}`)}let s=c.map((a,b)=>({member:a.member,index:b,machine:m[b],ops:o[b],reasons:p[b],def:l[b]})).filter(a=>a.ops.length),t=j.filter(a=>a.reasons.length);return{machines:s,erds:t,system:h&&i.length?{def:h,reasons:i}:null,unresolved:f,count:s.reduce((a,b)=>a+b.reasons.length,0)+t.reduce((a,b)=>a+b.reasons.length,0)+i.length}}function be(a,b){if(!a.count&&!a.unresolved.length)return"auto"===b?"auto: the drawings already agree":"the drawings agree";let c=[...a.machines.map(a=>`${a.machine} +${a.reasons.length}`),...a.erds.map(a=>`${a.def.settings?.name??a.member} +${a.reasons.length}`),...a.system?[`system +${a.system.reasons.length}`]:[]],d=c.length?c.join(", "):"no change",e=a.unresolved.length?`; ${a.unresolved.length} left open`:"";return"auto"===b?`auto: ${d}${e}`:`${a.count} change${1===a.count?"":"s"} proposed (${d})${e}`}let bf="default",bg=/^[A-Za-z0-9._-]{1,64}$/;function bh(a){return"string"==typeof a&&bg.test(a)}let bi=["comment","question","looks_good","delete"],bj=["open","answered","resolved"],bk=a=>"string"==typeof a?a:"";function bl(a){let b=a&&"object"==typeof a?a:{},c="agent"===b.role?"agent":"person",d=bk(b.name)||bk(b.id)||("agent"===c?"agent":"someone");return{id:bk(b.id)||d,name:d,role:c}}function bm(a){let b=a&&"object"==typeof a?a:{},c=bk(b.text).trim();return c?{author:bl(b.author),text:c,at:bk(b.at)}:null}function bn(a){if(!a||"object"!=typeof a)return null;let b=bk(a.id),c=bk(a.text).trim();if(!b||!c)return null;let d=Array.isArray(a.elements)?a.elements.filter(a=>"string"==typeof a&&a.length>0):[],e=function(a){if(!a||"object"!=typeof a)return;let b=b=>"number"==typeof a[b]&&Number.isFinite(a[b])?a[b]:NaN,c={x:b("x"),y:b("y"),width:b("width"),height:b("height")};if(!Object.values(c).some(Number.isNaN)&&!(c.width<=0)&&!(c.height<=0))return c}(a.region),f=Array.isArray(a.replies)?a.replies.map(bm).filter(a=>null!==a):[];return{id:b,kind:bi.includes(a.kind)?a.kind:"comment",...d.length?{elements:d}:{},...e?{region:e}:{},...bk(a.level)?{level:bk(a.level)}:{},text:c,author:bl(a.author),at:bk(a.at),status:bj.includes(a.status)?a.status:"open",...f.length?{replies:f}:{}}}function bo(a,b){return a.filter(a=>"open"===a.status&&a.author.role!==b||"answered"===a.status&&a.author.role===b)}function bp(a){return a.replies?.length?a.replies[a.replies.length-1].author.role:a.author.role}function bq(a,b={}){return a.filter(a=>(function(a,b={}){if("resolved"===a.status||"agent"!==bp(a))return!1;let c=b[a.id];return"number"!=typeof c||c<(a.replies?.length??0)})(a,b))}function br(a){let b=[];if(a.elements?.length&&b.push(a.elements.join(", ")),a.region){let c=a.region;b.push(`the area ${Math.round(c.x)},${Math.round(c.y)} ${Math.round(c.width)}\xd7${Math.round(c.height)}${a.level?` inside ${a.level}`:""}`)}return b.length?b.join(" in "):"the drawing"}function bs(a){if(!a.length)return null;let b=1/0,c=1/0,d=-1/0,e=-1/0;for(let f of a)b=Math.min(b,f.x),c=Math.min(c,f.y),d=Math.max(d,f.x+f.width),e=Math.max(e,f.y+f.height);return{x:b,y:c,width:d-b,height:e-c}}function bt(a,b){return{x:a.x-b,y:a.y-b,width:a.width+2*b,height:a.height+2*b}}function bu(a,b){let c=new Set(b);return a.filter(a=>c.has(a.focus)).map(a=>a.box)}let bv=a=>a.split("/").pop()||a;function bw(a){return a.replace(/\s+/g," ").trim()}function bx(a){return a.parallel?a.parallel.states:a.states??[]}function by(a,b){return bx(a).find(a=>a.name===b)??null}function bz(a,b){return bx(function(a,b){let c=a;for(let a of b){let b=by(c,a);if(!b)break;c=b}return c}(a,b))}let bA={surface:"--slc-surface",nodeFill:"--slc-node-fill",nodeStroke:"--slc-node-stroke",compositeFill:"--slc-composite-fill",finalFill:"--slc-final-fill",accent:"--slc-accent",accentFill:"--slc-accent-fill",accentInk:"--slc-accent-ink",danger:"--slc-danger",drawSource:"--slc-draw-source",edge:"--slc-edge",chipFill:"--slc-chip-fill",chipStroke:"--slc-chip-stroke",label:"--slc-label",muted:"--slc-muted",faint:"--slc-faint",entry:"--slc-entry",exit:"--slc-exit",composite:"--slc-composite",active:"--slc-active",panelBg:"--slc-panel-bg",panelBorder:"--slc-panel-border",panelHover:"--slc-panel-hover"};function bB(a){let b={};if(!a)return b;for(let[c,d]of Object.entries(a)){let a=bA[c];a&&"string"==typeof d&&(b[a]=d)}return b}let bC={x:100,y:100,width:160,height:60};function bD(a,b){return 1===b?16*a:2===b?400*a:a}function bE(a){return!!a&&"string"==typeof a.tagName&&(!!a.isContentEditable||["INPUT","TEXTAREA","SELECT","BUTTON","OPTION"].includes(a.tagName))}function bF(a){return(a.states?.length??0)>0||(a.parallel?.states.length??0)>0}function bG({mark:a,x:b,y:c,selected:d}){return(0,h.jsxs)("g",{transform:`translate(${b} ${c}) scale(0.5)`,strokeWidth:a.strokeWidth,className:`slc-glyph${d?" slc-glyph--selected":""}`,children:[(a.circles??[]).map((a,b)=>(0,h.jsx)("circle",{cx:a.cx,cy:a.cy,r:a.r,className:a.filled?"slc-glyph-dot":void 0},`c${b}`)),a.paths.map((a,b)=>(0,h.jsx)("path",{d:a},`p${b}`))]})}let bH={kind:null,id:null},bI=(0,i.forwardRef)(function(a,b){let{definition:c,positions:d,path:e=[],rootLabel:f,viewport:g,onViewportChange:j,selection:k=bH,activeStates:l,errorElements:m,drawMode:n="select",drawSource:o=null,readOnly:p=!1,showBreadcrumb:q=!0,showHud:r=!0,fitKey:s,onSelect:t,onClearSelection:u,onStateMove:v,onNavigateInto:w,onNavigateTo:x,onContextMenu:y,onCreateTransition:A,onCancelDraw:C,onDeleteState:D,onUndo:F,onRedo:I,hudExtras:J,emptyHint:N,theme:O,className:U,style:V,svgId:W,pinchOwner:X="canvas"}=a,Y=(0,i.useRef)(null),Z=(0,i.useId)().replace(/:/g,""),$=(0,i.useRef)(g);$.current=g;let[_,aa]=(0,i.useState)(null),ab=(0,i.useRef)(null),ac=(0,i.useCallback)(a=>{ab.current=a,aa(a)},[]),[ad,ae]=(0,i.useState)(null),af=(0,i.useRef)(!1),[ag,ah]=(0,i.useState)(!1),ai=(0,i.useRef)(null),[aj,ak]=(0,i.useState)(!1),al=(0,i.useRef)(!1),am=(0,i.useRef)(new Map),an=(0,i.useRef)(new Map),ao=(0,i.useRef)(null),[ap,aq]=(0,i.useState)(!1),ar=(0,i.useRef)(null),as=(0,i.useRef)(!1),[at,au]=(0,i.useState)(!1),av=c.state,aw=(0,i.useMemo)(()=>{let a=function(a,b){let c=[],d=a;for(let a of b){let b=by(d,a);if(!b)break;c.push(a),d=b}return c}(av,e);return[f??av?.name??"Root",...a]},[av,e,f]),ax=(0,i.useMemo)(()=>av?bz(av,e):[],[av,e]),ay=aw[aw.length-1],az=(0,i.useMemo)(()=>(function(a){let b=new Set,c=[];for(let d of a.events??[])for(let a of d.events??[])b.has(a.id)||(b.add(a.id),c.push(a.id));return c})(c),[c]),aA=(0,i.useMemo)(()=>new Set(l??[]),[l]),aB=(0,i.useMemo)(()=>new Set(m??[]),[m]),aC=(0,i.useCallback)((a,b)=>{let c=Y.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]),aD=(0,i.useCallback)(a=>{let b=am.current.get(a);am.current.delete(a),b?.hasPointerCapture?.(a)&&b.releasePointerCapture?.(a)},[]),aE=(0,i.useCallback)(a=>{let b=ar.current;b&&(void 0===a||b.pointerId===a)&&(clearTimeout(b.timer),ar.current=null)},[]),aF=(0,i.useCallback)((a,b)=>{if("touch"!==a.pointerType||!y)return;aE();let{pointerId:c,clientX:d,clientY:e}=a,f=setTimeout(()=>{ar.current=null,ac(null),ai.current=null,ak(!1),as.current=!0,navigator.vibrate?.(10),y(d,e,b)},500);ar.current={pointerId:c,x:d,y:e,target:b,timer:f}},[aE,y,ac]);(0,i.useEffect)(()=>{},[]),(0,i.useEffect)(()=>{let a=a=>{an.current.delete(a.pointerId)};return window.addEventListener("pointerup",a),window.addEventListener("pointercancel",a),()=>{window.removeEventListener("pointerup",a),window.removeEventListener("pointercancel",a)}},[]),(0,i.useEffect)(()=>()=>aE(),[aE]);let aG=(0,i.useRef)(new Set),aH=(0,i.useRef)(new Map),aI=(0,i.useRef)(ay),aJ=(0,i.useRef)(new Set),[aK,aL]=(0,i.useState)(new Set),[aM,aN]=(0,i.useState)(new Set),[aO,aP]=(0,i.useState)(new Map),aQ=at?10/g.scale:0,aR=at?28/g.scale:0,aS=(0,i.useCallback)(a=>d[a]??bC,[d]);(0,i.useEffect)(()=>{let a=a=>{(a.ctrlKey||a.metaKey)&&"z"===a.key&&F&&(a.preventDefault(),F()),(a.ctrlKey||a.metaKey)&&("y"===a.key||a.shiftKey&&"z"===a.key)&&I&&(a.preventDefault(),I()),"Escape"===a.key&&(ae(null),C?.()),"Delete"===a.key&&"state"===k.kind&&k.id&&D&&D(k.id)};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[F,I,C,D,k]);let aT=(0,i.useCallback)(a=>{let b=$.current;ai.current={pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,origX:b.x,origY:b.y},al.current=!1,ak(!0);let c=Y.current;c&&(am.current.set(a.pointerId,c),c.setPointerCapture(a.pointerId))},[]),aU=(0,i.useCallback)(()=>{let a=[...an.current.entries()];if(a.length<2)return;let[[b,c],[d,e]]=a;aE(),ac(null),ai.current=null;let f=Math.max(1,Math.hypot(e.x-c.x,e.y-c.y)),g=aC((c.x+e.x)/2,(c.y+e.y)/2);ao.current={a:b,b:d,startDist:f,startMidX:g.x,startMidY:g.y,start:$.current},al.current=!0,aq(!0);let h=Y.current;if(h){for(let a of[b,d])if(!am.current.has(a))try{h.setPointerCapture(a),am.current.set(a,h)}catch{}}},[aE,aC,ac]),aV=(0,i.useCallback)(a=>{if(as.current=!1,"touch"!==a.pointerType)return;au(!0),an.current.set(a.pointerId,{x:a.clientX,y:a.clientY});let b=an.current.size;b<2||(a.stopPropagation(),2===b&&aU())},[aU]),aW=(0,i.useCallback)((a,b)=>{if(0!==a.button||af.current)return;if(a.stopPropagation(),aF(a,{kind:"state",id:b}),!p&&"transition"===n)return void(o?o!==b&&ae({stateName:o,targetName:b,x:a.clientX,y:a.clientY}):t?.("state",b));if(t?.("state",b),p||!v)return;let c=aS(b);ac({name:b,pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,origX:c.x,origY:c.y});let d=a.currentTarget;am.current.set(a.pointerId,d),d.setPointerCapture?.(a.pointerId)},[t,aS,n,o,aF,ac,p,v]),aX=(0,i.useCallback)(a=>{if("touch"===a.pointerType){aF(a,{kind:"canvas"}),aT(a);return}(1===a.button||0===a.button&&af.current)&&(a.preventDefault(),aT(a))},[aF,aT]),aY=(0,i.useCallback)(a=>{an.current.has(a.pointerId)&&an.current.set(a.pointerId,{x:a.clientX,y:a.clientY});let b=ar.current;b&&b.pointerId===a.pointerId&&Math.hypot(a.clientX-b.x,a.clientY-b.y)>8&&aE(a.pointerId);let c=ao.current;if(c){if(a.pointerId!==c.a&&a.pointerId!==c.b)return;let b=an.current.get(c.a),d=an.current.get(c.b);if(!b||!d)return;let e=Math.hypot(d.x-b.x,d.y-b.y),f=aC((b.x+d.x)/2,(b.y+d.y)/2);j(P(R(c.start,c.start.scale*(e/c.startDist),{x:c.startMidX,y:c.startMidY}),f.x-c.startMidX,f.y-c.startMidY));return}let d=ai.current;if(d){if(d.pointerId!==a.pointerId)return;let b=a.clientX-d.startX,c=a.clientY-d.startY,e=8*("touch"===a.pointerType);(Math.abs(b)>e||Math.abs(c)>e)&&(al.current=!0),j({x:d.origX+b,y:d.origY+c,scale:$.current.scale});return}if(!_||_.pointerId!==a.pointerId||!v)return;let e=$.current.scale,f=(a.clientX-_.startX)/e,g=(a.clientY-_.startY)/e,h=aS(_.name);v(_.name,{...h,x:Math.max(0,_.origX+f),y:Math.max(0,_.origY+g)})},[_,aS,v,j,aE,aC]),aZ=(0,i.useCallback)(a=>{an.current.delete(a.pointerId),aE(a.pointerId),aD(a.pointerId);let b=ao.current;if(b&&(b.a===a.pointerId||b.b===a.pointerId)){ao.current=null,aq(!1);let c=b.a===a.pointerId?b.b:b.a,d=an.current.get(c);if(d){let a=$.current;ai.current={pointerId:c,startX:d.x,startY:d.y,origX:a.x,origY:a.y},al.current=!0,ak(!0)}}ai.current?.pointerId===a.pointerId&&(ai.current=null),ab.current?.pointerId===a.pointerId&&ac(null),ai.current||ak(!1),ao.current||aq(!1)},[aE,aD,ac]);(0,i.useEffect)(()=>{let a=Y.current;if(!a)return;let b=a=>{a.preventDefault();let b=$.current,c=bD(a.deltaX,a.deltaMode),d=bD(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey){let c=Q(b,Math.exp(-(.0025*d)),aC(a.clientX,a.clientY));c!==b&&j(c);return}let e=a.shiftKey?-(c||d):-c,f=a.shiftKey?0:-d;(0!==e||0!==f)&&j(P(b,e,f))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[j,aC]),(0,i.useEffect)(()=>{let a=a=>{"Space"!==a.code||a.repeat||bE(a.target)||bE(document.activeElement)||(a.preventDefault(),af.current=!0,ah(!0))},b=a=>{"Space"===a.code&&(af.current=!1,ah(!1))},c=()=>{af.current=!1,ah(!1)};return window.addEventListener("keydown",a),window.addEventListener("keyup",b),window.addEventListener("blur",c),()=>{window.removeEventListener("keydown",a),window.removeEventListener("keyup",b),window.removeEventListener("blur",c)}},[]);let a$=(0,i.useCallback)(a=>{let b=Y.current?.getBoundingClientRect(),c={x:(b?.width??0)/2,y:(b?.height??0)/2},d=$.current,e=Q(d,a,c);e!==d&&j(e)},[j]),a_=(0,i.useCallback)(()=>{let a=Y.current?.getBoundingClientRect(),b={x:(a?.width??0)/2,y:(a?.height??0)/2};j(R($.current,1,b))},[j]),a0=(0,i.useCallback)(()=>{let a=Y.current?.getBoundingClientRect();if(!a)return;let b=ax.map(a=>aS(a.name));j(b.length?S(b,a.width,a.height):{...M})},[ax,aS,j]);(0,i.useImperativeHandle)(b,()=>({fit:a0,zoomIn:()=>a$(1.25),zoomOut:()=>a$(.8),resetZoom:a_,element:()=>Y.current}),[a0,a$,a_]);let a1=(0,i.useRef)(a0);a1.current=a0,(0,i.useEffect)(()=>{if(void 0===s)return;let a=requestAnimationFrame(()=>a1.current());return()=>cancelAnimationFrame(a)},[s]);let a2=(0,i.useCallback)((a,b)=>{y&&(a.preventDefault(),a.stopPropagation(),y(a.clientX,a.clientY,b?{kind:"state",id:b}:{kind:"canvas"}))},[y]),a3=(0,i.useMemo)(()=>{let a=new Set(ax.map(a=>a.name)),b=[];for(let c of ax)for(let[d,e]of(c.transitions??[]).entries())e.nextState&&a.has(e.nextState)&&b.push({from:c.name,to:e.nextState,event:e.event,stateName:c.name,index:d,condition:e.condition});return b},[ax]),a4=(0,i.useMemo)(()=>{let a=K(a3,aS),b=new Map(E(a3.map((b,c)=>{let d=aS(b.from);return{id:`${b.stateName}:${b.index}`,event:b.event,condition:b.condition,glyph:!0,at:b.from===b.to?()=>({x:d.x+d.width+44+30,y:d.y+d.height/2+4}):a[c].at}}),ax.map(a=>aS(a.name))).map(a=>[a.label.id,a]));return a3.flatMap((c,d)=>{let e=`${c.stateName}:${c.index}`,f=b.get(e);return f?[{arrow:c,id:e,curve:a[d],spot:f}]:[]})},[a3,ax,aS]);(0,i.useEffect)(()=>{let a=new Set(ax.map(a=>a.name)),b=new Set(a3.map(a=>`${a.stateName}:${a.index}`)),c=aI.current===ay,d=[...a].filter(a=>!aG.current.has(a));d.length&&aL(a=>{let b=new Set(a);return d.forEach(a=>b.add(a)),b});let e=[...b].filter(a=>!aJ.current.has(a));e.length&&aN(a=>{let b=new Set(a);return e.forEach(a=>b.add(a)),b}),aL(b=>{let c=!1,d=new Set(b);return b.forEach(b=>{a.has(b)||(d.delete(b),c=!0)}),c?d:b}),aN(a=>{let c=!1,d=new Set(a);return a.forEach(a=>{b.has(a)||(d.delete(a),c=!0)}),c?d:a}),c?aP(b=>{let c=new Map(b),d=!1;return aH.current.forEach((b,e)=>{a.has(e)||c.has(e)||(c.set(e,b),d=!0)}),a.forEach(a=>{c.delete(a)&&(d=!0)}),d?c:b}):aP(a=>a.size?new Map:a),aG.current=a,aH.current=new Map(ax.map(a=>[a.name,{state:a,pos:aS(a.name)}])),aJ.current=b,aI.current=ay},[ax,ay,a3,aS]);let a5={...bB(O),...V},a6=at?" slc-hud--coarse":"";return(0,h.jsxs)("div",{className:`slc-pane${U?` ${U}`:""}`,style:a5,"data-pinch-owner":X,children:[q&&aw.length>1&&(0,h.jsx)("div",{className:"slc-crumbs",children:aw.map((a,b)=>(0,h.jsxs)("span",{className:"slc-crumb-item",children:[b>0&&(0,h.jsx)("span",{className:"slc-crumb-sep",children:"›"}),(0,h.jsx)("button",{type:"button",className:`slc-crumb${b===aw.length-1?" slc-crumb--current":""}`,onClick:()=>x?.(b),children:a})]},`${a}-${b}`))}),(0,h.jsxs)("svg",{ref:Y,id:W,className:"slc-surface",style:{cursor:aj?"grabbing":ag?"grab":void 0,touchAction:"none",...at?{WebkitUserSelect:"none",userSelect:"none",WebkitTouchCallout:"none"}:{}},onPointerDownCapture:aV,onPointerDown:aX,onPointerMove:aY,onPointerUp:aZ,onPointerCancel:aZ,onAuxClick:a=>a.preventDefault(),onClick:a=>{if(as.current){as.current=!1,a.stopPropagation();return}if(al.current){al.current=!1;return}a.target?.tagName==="svg"&&(u?.(),ae(null))},onContextMenu:a=>a2(a),children:[(0,h.jsxs)("defs",{children:[(0,h.jsx)("marker",{id:`slc-arrow-${Z}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,h.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead"})}),(0,h.jsx)("marker",{id:`slc-arrow-sel-${Z}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,h.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead slc-arrowhead--selected"})})]}),"transition"===n&&o&&(0,h.jsxs)("text",{x:"50%",y:"30",textAnchor:"middle",className:"slc-draw-hint",children:['Click target state to create transition from "',o,'"']}),(0,h.jsxs)("g",{transform:T(g),style:aj||ap?{pointerEvents:"none"}:void 0,children:[a4.map(({arrow:a,id:b,curve:c,spot:d})=>{let e="transition"===k.kind&&k.id===b,f=aM.has(b),g=c.at(.5),i=Math.hypot(g.x-d.cx,g.y-d.cy)>4;return(0,h.jsxs)("g",{children:[at&&(0,h.jsx)("path",{d:c.path,fill:"none",stroke:"transparent",strokeWidth:aR,strokeLinecap:"round",pointerEvents:"stroke",onClick:a=>{a.stopPropagation(),t?.("transition",b)}}),(0,h.jsx)("path",{d:c.path,pathLength:1,markerEnd:`url(#slc-arrow${e?"-sel":""}-${Z})`,className:`slc-edge${e?" slc-edge--selected":""}${f?" slc-edge-enter":""}`,onClick:a=>{a.stopPropagation(),t?.("transition",b)}}),(0,h.jsxs)("g",{className:"slc-chip",onClick:a=>{a.stopPropagation(),t?.("transition",b)},children:[i&&(0,h.jsx)("line",{x1:g.x,y1:g.y,x2:d.cx,y2:d.cy-5,className:`slc-chip-leader${e?" slc-chip-leader--selected":""}`}),at&&(0,h.jsx)("rect",{x:d.x-aQ,y:d.y-aQ,width:d.width+2*aQ,height:d.height+2*aQ,fill:"transparent",pointerEvents:"all"}),(0,h.jsx)("rect",{x:d.x,y:d.y,width:d.width,height:d.height,rx:4,className:`slc-chip-plate${e?" slc-chip-plate--selected":""}`}),(0,h.jsx)(bG,{mark:function(a){let b=a.toLowerCase();for(let{glyph:a,words:c}of H)if(c.some(a=>b.includes(a)))return a;return G}(a.event),x:B(d).x,y:B(d).y,selected:e}),(0,h.jsx)("text",{x:d.cx,y:d.cy-5,textAnchor:"middle",className:`slc-chip-text${e?" slc-chip-text--selected":""}`,children:a.event}),a.condition&&(0,h.jsxs)("text",{x:d.cx,y:d.cy+7,textAnchor:"middle",className:"slc-chip-guard",children:[(0,h.jsx)("title",{children:a.condition}),z(a.condition)]})]})]},`arrow-${b}`)}),ax.map(a=>{let b=aS(a.name),c="state"===k.kind&&k.id===a.name,d="final"===a.kind,e="history"===a.kind,f=bF(a),g=o===a.name,i=aB.has(a.name),j=(a.onEntry?.actions?.length??0)>0,l=(a.onExit?.actions?.length??0)>0,m=aA.has(a.name),q=aK.has(a.name),r=ag?void 0:"transition"!==n||p?f?"slc-node--drillable":p||!v?"slc-node--static":"slc-node--draggable":"slc-node--drawing";return(0,h.jsxs)("g",{className:r,onPointerDown:b=>aW(b,a.name),onDoubleClick:b=>{b.stopPropagation(),f&&w?.(a.name)},onContextMenu:b=>a2(b,a.name),children:[at&&(0,h.jsx)("rect",{x:b.x-aQ,y:b.y-aQ,width:b.width+2*aQ,height:b.height+2*aQ,rx:12,fill:"transparent",pointerEvents:"all"}),(0,h.jsxs)("g",{className:q?"slc-node-enter":void 0,children:[(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:e?30:d?4:8,strokeDasharray:d?"6 3":f?"4 2":void 0,className:["slc-node",d?"slc-node--final":f?"slc-node--composite":"",g?"slc-node--source":"",i?"slc-node--error":"",c?"slc-node--selected":"",m?"slc-node--active":""].filter(Boolean).join(" ")}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+(j||l?b.height/2:b.height/2+5),textAnchor:"middle",className:"slc-node-name",children:a.name}),a.kind&&"normal"!==a.kind&&(0,h.jsx)("text",{x:b.x+b.width-8,y:b.y+14,textAnchor:"end",className:"slc-node-kind",children:a.kind}),j&&(0,h.jsx)("text",{x:b.x+6,y:b.y+b.height-6,className:"slc-node-entry",children:"▸entry"}),l&&(0,h.jsx)("text",{x:b.x+b.width-6,y:b.y+b.height-6,textAnchor:"end",className:"slc-node-exit",children:"exit◂"}),i&&(0,h.jsx)("path",{d:`M ${b.x+6} ${b.y+15} l 5.5 -9.5 l 5.5 9.5 Z M ${b.x+11.5} ${b.y+9.5} v 2.6`,className:"slc-node-warn-mark"}),a.notes?.trim()&&(0,h.jsxs)("g",{children:[(0,h.jsx)("title",{children:`Notes: ${a.notes}`}),(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"})]}),f&&(0,h.jsxs)("text",{x:b.x+b.width/2,y:b.y+b.height-6,textAnchor:"middle",className:"slc-node-drill",children:["▼ ",(a.states?.length??0)+(a.parallel?.states.length??0)," children — ",at?"double-tap":"double-click"," to enter"]})]})]},a.name)}),Array.from(aO.entries()).map(([a,{state:b,pos:c}])=>{let d="final"===b.kind,e=bF(b);return(0,h.jsxs)("g",{className:"slc-node-exit-group",onAnimationEnd:b=>{"slc-node-out"===b.animationName&&aP(b=>{if(!b.has(a))return b;let c=new Map(b);return c.delete(a),c})},children:[(0,h.jsx)("rect",{x:c.x,y:c.y,width:c.width,height:c.height,rx:"history"===b.kind?30:d?4:8,strokeDasharray:d?"6 3":e?"4 2":void 0,className:`slc-node${d?" slc-node--final":e?" slc-node--composite":""}`}),(0,h.jsx)("text",{x:c.x+c.width/2,y:c.y+c.height/2+5,textAnchor:"middle",className:"slc-node-name",children:a})]},`exit-${a}`)})]}),0===ax.length&&(0,h.jsx)("text",{x:"50%",y:"50%",textAnchor:"middle",className:"slc-empty",children:N??"This level has no states."})]}),r&&(0,h.jsxs)("div",{className:`slc-hud${a6}`,children:[(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom out (Ctrl + wheel down, or pinch in)",disabled:g.scale<=L.min,onClick:()=>a$(.8),children:"−"}),(0,h.jsxs)("button",{type:"button",className:"slc-hud-btn slc-hud-btn--scale",title:"Reset zoom to 100%",onClick:a_,children:[Math.round(100*g.scale),"%"]}),(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom in (Ctrl + wheel up, or pinch out)",disabled:g.scale>=L.max,onClick:()=>a$(1.25),children:"+"}),(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Fit the whole machine in view",onClick:a0,children:"⤢ Fit"}),J&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),J]}),(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,h.jsx)("span",{className:"slc-hud-hint",title:at?"Drag to pan · pinch with two fingers to zoom · press and hold for the menu · double-tap a composite to enter it":"Wheel scrolls · Shift+wheel scrolls sideways · Ctrl+wheel zooms at the cursor · middle-drag or Space+drag pans",children:ap?"pinching":aj?"panning":at?"drag · pinch · hold":ag?"space to pan":"wheel · ⌃wheel · space"})]}),ad&&(0,h.jsxs)("div",{className:"slc-picker",style:{left:ad.x,top:ad.y-80},onClick:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-picker-title",children:[ad.stateName," → ",ad.targetName]}),(0,h.jsx)("div",{className:"slc-picker-sub",children:"Select event:"}),0===az.length?(0,h.jsx)("div",{className:"slc-picker-empty",children:"No events defined. Add events first."}):az.map(a=>(0,h.jsx)("button",{type:"button",className:"slc-picker-item",onClick:()=>{ad&&(A?.(ad.stateName,ad.targetName,a),ae(null),C?.())},children:a},a)),(0,h.jsx)("button",{type:"button",className:"slc-picker-cancel",onClick:()=>{ae(null),C?.()},children:"Cancel"})]})]})});function bJ(a,b){return 1===b?16*a:2===b?400*a:a}let bK={"1:1":["one","one"],"1:N":["one","many"],"N:1":["many","one"],"N:M":["many","many"]};function bL(a,b,c){let d=b.x-a.x,e=b.y-a.y,f=Math.hypot(d,e)||1,g=d/f,h=e/f,i=-h,j=(b,c)=>`${(a.x+g*b+i*c).toFixed(1)} ${(a.y+h*b+g*c).toFixed(1)}`;return"one"===c?`M ${j(9,6)} L ${j(9,-6)}`:`M ${j(13,0)} L ${j(0,7)} M ${j(13,0)} L ${j(0,-7)} M ${j(13,0)} L ${j(0,0)}`}function bM(a){return[a.description??"",a.notes?.trim()?`Notes: ${a.notes}`:""].filter(Boolean).join("\n\n")}function bN(a,b){if(!a)return"";let c=Math.min(a.x+a.width,Math.max(a.x,b.x)),d=Math.min(a.y+a.height,Math.max(a.y,b.y));return c===b.x&&d===b.y?"":`M ${b.x} ${b.y} L ${c} ${d}`}function bO({definition:a,notation:b="crowsfoot",positions:c,viewport:d,onViewportChange:e,selection:f=null,errorElements:g,readOnly:j=!1,fitKey:k,onSelect:l,onClearSelection:m,onEntityMove:n,onOpenMachine:o,onContextMenu:p,emptyHint:q,theme:r,className:s,style:t,svgId:u}){let v=(0,i.useRef)(null),w=(0,i.useRef)(d);w.current=d;let x=(0,i.useRef)(null),y=(0,i.useRef)(new Map),z=(0,i.useRef)(null),A=(0,i.useMemo)(()=>{let b=new Set;return(a.entities??[]).filter(a=>!(!a?.name||b.has(a.name))&&!!c[a.name]&&(b.add(a.name),!0))},[a.entities,c]),B="chen"===b,C=(0,i.useMemo)(()=>new Map(B?A.map(a=>{var b;let d,e,f,g,h,i,j;return[a.name,(b=c[a.name],d=af(a),e=ag(a),f={x:b.x+(b.width-e)/2,y:b.y+(b.height-40)/2,width:e,height:40},g=ah(d),h=f.y+f.height/2,i=ai(d.length),j=d.map((a,b)=>{let c=b<i,e=c?i:d.length-i,j=h+((c?b:b-i)-(e-1)/2)*32,k=c?f.x-34-g:f.x+f.width+34+g;return{attribute:a,cx:k,cy:j,rx:g,ry:13,from:{x:c?f.x:f.x+f.width,y:h},to:{x:c?k+g:k-g,y:j}}}),{rect:f,ovals:j,routingBox:{x:f.x,y:b.y,width:f.width,height:b.height}})]}):[]),[B,A,c]),D=(0,i.useMemo)(()=>{let b=new Map(A.map((a,b)=>[a.name,`e${b}`])),d=(a.relationships??[]).filter(a=>a&&b.has(a.from)&&b.has(a.to)),e=K(d.map(a=>({from:b.get(a.from),to:b.get(a.to)})),a=>{let b=A[Number(a.slice(1))].name;return C.get(b)?.routingBox??c[b]});return d.map((a,b)=>({rel:a,curve:e[b]}))},[a.relationships,A,c,C]),F=(0,i.useMemo)(()=>E(D.filter(({rel:a})=>B||a.label).map(({rel:a,curve:b})=>({event:a.label||" ",at:b.at,rel:a})),A.map(a=>c[a.name])),[B,D,A,c]),G=(0,i.useCallback)((a,b)=>{let c=v.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]);(0,i.useEffect)(()=>{if(void 0===k)return;let a=v.current?.getBoundingClientRect(),b=Object.values(c);a&&0!==b.length&&e(S(b,a.width,a.height))},[k]),(0,i.useEffect)(()=>{let a=v.current;if(!a)return;let b=a=>{a.preventDefault();let b=w.current,c=bJ(a.deltaX,a.deltaMode),d=bJ(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey)return void e(Q(b,Math.exp(-(.0025*d)),G(a.clientX,a.clientY)));let f=a.shiftKey?-(c||d):-c,g=a.shiftKey?0:-d;(0!==f||0!==g)&&e(P(b,f,g))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[e,G]);let H=()=>{let a=[...y.current.values()];if(a.length<2)return null;let[b,c]=a;return{distance:Math.hypot(c.x-b.x,c.y-b.y)||1,mid:{x:(b.x+c.x)/2,y:(b.y+c.y)/2}}},I=(a,b)=>{if(0!==a.button&&"mouse"===a.pointerType)return;if(a.stopPropagation(),v.current?.setPointerCapture(a.pointerId),y.current.set(a.pointerId,G(a.clientX,a.clientY)),y.current.size>=2){x.current=null,z.current=H();return}let d=void 0!==b&&!j;x.current={kind:d?"move":"pan",pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,lastX:a.clientX,lastY:a.clientY,name:b,origin:d?c[b]:void 0,moved:!1}},J=a=>{if(y.current.delete(a.pointerId),z.current){y.current.size<2&&(z.current=null);return}let b=x.current;!b||b.pointerId!==a.pointerId||(x.current=null,b.moved||(b.name?l?.(b.name):m?.()))},L=new Set(g??[]);return(0,h.jsxs)("div",{className:`slc-pane${s?` ${s}`:""}`,style:{...bB(r),...t},children:[(0,h.jsx)("svg",{ref:v,id:u,className:"slc-surface",onPointerDown:a=>I(a),onPointerMove:a=>{if(y.current.has(a.pointerId)&&y.current.set(a.pointerId,G(a.clientX,a.clientY)),z.current){let a=H();if(!a)return;let b=z.current;e(Q(P(w.current,a.mid.x-b.mid.x,a.mid.y-b.mid.y),a.distance/b.distance,a.mid)),z.current=a;return}let b=x.current;if(b&&b.pointerId===a.pointerId&&!(!b.moved&&4>Math.hypot(a.clientX-b.startX,a.clientY-b.startY))){if(b.moved=!0,"pan"===b.kind)e(P(w.current,a.clientX-b.lastX,a.clientY-b.lastY));else if(b.name&&b.origin){var c,d,f;let e=(c=w.current,d=a.clientX-b.startX,f=a.clientY-b.startY,{x:d/c.scale,y:f/c.scale});n?.(b.name,{...b.origin,x:b.origin.x+e.x,y:b.origin.y+e.y})}b.lastX=a.clientX,b.lastY=a.clientY}},onPointerUp:J,onPointerCancel:J,onContextMenu:a=>{p&&(a.preventDefault(),p(a.clientX,a.clientY,{kind:"canvas"}))},children:(0,h.jsxs)("g",{transform:T(d),children:[D.map(({rel:a,curve:b},c)=>{if(B){let[d,e]=function(a){switch(a){case"1:1":return["1","1"];case"N:1":return["N","1"];case"N:M":return["M","N"];default:return["1","N"]}}(a.cardinality),f=b.at(.12),g=b.at(.88);return(0,h.jsxs)("g",{className:"slc-erd-rel",children:[(0,h.jsx)("path",{d:bN(C.get(a.from)?.rect,b.p0),className:"slc-erd-line"}),(0,h.jsx)("path",{d:bN(C.get(a.to)?.rect,b.p3),className:"slc-erd-line"}),(0,h.jsx)("path",{d:b.path,className:"slc-erd-line"}),(0,h.jsx)("text",{x:f.x+9,y:f.y+4,className:"slc-erd-card",children:d}),(0,h.jsx)("text",{x:g.x+9,y:g.y+4,className:"slc-erd-card",children:e})]},`r${c}`)}let[d,e]=bK[a.cardinality]??bK["1:N"];return(0,h.jsxs)("g",{className:"slc-erd-rel",children:[(0,h.jsx)("path",{d:b.path,className:"slc-erd-line"}),(0,h.jsx)("path",{d:bL(b.p0,b.p1,d),className:"slc-erd-mark"}),(0,h.jsx)("path",{d:bL(b.p3,b.p2,e),className:"slc-erd-mark"})]},`r${c}`)}),A.map(a=>{let b=c[a.name],d=(a.attributes??[]).filter(a=>a?.name),e=["slc-node",f===a.name?"slc-node--selected":"",L.has(a.name)?"slc-node--error":""].filter(Boolean).join(" "),g=C.get(a.name);if(g){let{rect:b,ovals:c}=g;return(0,h.jsxs)("g",{className:j?"slc-node--static":"slc-node--draggable",onPointerDown:b=>I(b,a.name),onContextMenu:b=>{p&&(b.preventDefault(),b.stopPropagation(),p(b.clientX,b.clientY,{kind:"entity",id:a.name}))},children:[c.map(a=>(0,h.jsx)("path",{d:`M ${a.from.x} ${a.from.y} L ${a.to.x} ${a.to.y}`,className:"slc-erd-attr-line"},`l-${a.attribute.name}`)),c.map(a=>{var b;let c,d=V(a.attribute),e=d.length>0&&!!o;return(0,h.jsxs)("g",{className:e?"slc-erd-state":void 0,onPointerDown:e?a=>a.stopPropagation():void 0,onClick:e?()=>o(d[0]):void 0,children:[(0,h.jsx)("title",{children:(c=V(b=a.attribute),[`${ar(b)}${b.nullable?" ?":""}`,"pk"===b.key?"primary key":"uk"===b.key?"unique":"",b.references?`references ${b.references}`:"",c.length?`stores the state of ${c.join(", ")}`:"",b.description??""].filter(Boolean).join(" — "))}),(0,h.jsx)("ellipse",{cx:a.cx,cy:a.cy,rx:a.rx,ry:a.ry,className:"slc-erd-oval"}),(0,h.jsxs)("text",{x:a.cx,y:a.cy+4,textAnchor:"middle",className:`slc-erd-oval-text${"pk"===a.attribute.key?" slc-erd-oval-text--pk":""}${d.length?" slc-erd-row--state":""}`,children:[d.length?"◉ ":"",a.attribute.name]})]},a.attribute.name)}),bM(a)&&(0,h.jsx)("title",{children:bM(a)}),(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:2,className:e}),a.notes?.trim()&&(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),a.weak&&(0,h.jsx)("rect",{x:b.x+4,y:b.y+4,width:b.width-8,height:b.height-8,rx:1,className:"slc-erd-weak"}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+b.height/2+5,textAnchor:"middle",className:"slc-node-name",children:a.name})]},a.name)}return(0,h.jsxs)("g",{className:j?"slc-node--static":"slc-node--draggable",onPointerDown:b=>I(b,a.name),onContextMenu:b=>{p&&(b.preventDefault(),b.stopPropagation(),p(b.clientX,b.clientY,{kind:"entity",id:a.name}))},children:[bM(a)&&(0,h.jsx)("title",{children:bM(a)}),(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:6,className:e}),a.notes?.trim()&&(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),(0,h.jsx)("path",{d:`M ${b.x} ${b.y+30} h ${b.width}`,className:"slc-erd-rule"}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+15+5,textAnchor:"middle",className:"slc-node-name",children:a.name}),0===d.length&&(0,h.jsx)("text",{x:b.x+14,y:b.y+30+15,className:"slc-erd-row slc-erd-row--empty",children:"no attributes"}),d.map((a,c)=>{let d=b.y+30+20*c+15,e=V(a),f=["pk"===a.key?"PK":"uk"===a.key?"UK":"",a.references?"FK":""].filter(Boolean).join(" ");return(0,h.jsxs)("g",{className:e.length&&o?"slc-erd-state":void 0,onPointerDown:e.length&&o?a=>a.stopPropagation():void 0,onClick:e.length&&o?()=>o(e[0]):void 0,children:[(e.length>0||a.description)&&(0,h.jsx)("title",{children:[e.length?`stores the state of ${e.join(", ")}`:"",a.description??""].filter(Boolean).join(" — ")}),(0,h.jsxs)("text",{x:b.x+14,y:d,className:`slc-erd-row${e.length?" slc-erd-row--state":""}${"pk"===a.key?" slc-erd-row--pk":""}`,children:[e.length?"◉ ":"",ar(a),a.nullable?" ?":""]}),f&&(0,h.jsx)("text",{x:b.x+b.width-14,y:d,textAnchor:"end",className:"slc-erd-badge",children:f})]},a.name)})]},a.name)}),F.map((a,b)=>{if(!B)return null;let c=a.x+a.width/2,d=a.y+a.height/2,e=Math.max(34,Math.ceil(3.7*(a.label.rel.label??"").length+18));return(0,h.jsxs)("g",{pointerEvents:"none",children:[(0,h.jsx)("path",{d:`M ${c-e} ${d} L ${c} ${d-18} L ${c+e} ${d} L ${c} ${d+18} Z`,className:"slc-erd-diamond"}),(0,h.jsx)("text",{x:c,y:d+4,textAnchor:"middle",className:"slc-erd-rel-label",children:a.label.rel.label??""})]},`d${b}`)}),!B&&F.map((a,b)=>(0,h.jsxs)("g",{pointerEvents:"none",children:[(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:4,className:"slc-chip-plate"}),(0,h.jsx)("text",{x:a.cx,y:a.cy-5,textAnchor:"middle",className:"slc-erd-rel-label",children:a.label.event})]},`l${b}`))]})}),0===A.length&&q&&(0,h.jsx)("div",{className:"slc-erd-empty",children:q})]})}function bP(a,b){return 1===b?16*a:2===b?400*a:a}function bQ(a,b,c,d){let e=a-9*c;return d?`M ${e} ${b-4.5} L ${a} ${b} L ${e} ${b+4.5}`:`M ${e} ${b-4.5} L ${a} ${b} L ${e} ${b+4.5} Z`}function bR(a){return[a.actor?`actor ${a.actor}`:a.object?`object ${a.object}`:a.service?`service ${a.service}`:"",a.holds?.length?`holds ${a.holds.join(", ")}`:"",a.description??"",a.notes?.trim()?`Notes: ${a.notes}`:""].filter(Boolean).join("\n")}let bS=a=>"string"==typeof a?a:null==a?"":String(a);function bT(a){let b=a&&"object"==typeof a?a:{};return{from:bS(b.from),to:bS(b.to),label:bS(b.label),event:bS(b.event)||void 0,machine:bS(b.machine)||void 0,carries:bS(b.carries)||void 0,state:bS(b.state)||void 0,description:bS(b.description)||void 0,notes:bS(b.notes)||void 0,optional:!0===b.optional||void 0,reply:!0===b.reply||void 0}}function bU(a){let b=a&&"object"==typeof a?a:{},c=a=>Array.isArray(a)?a:[],d=b.settings&&"object"==typeof b.settings?b.settings:{};return{settings:{namespace:bS(d.namespace),name:bS(d.name),notes:bS(d.notes)||void 0},participants:c(b.participants).map(a=>{let b=a&&"object"==typeof a?a:{};return{name:bS(b.name),description:bS(b.description)||void 0,notes:bS(b.notes)||void 0,actor:bS(b.actor)||void 0,service:bS(b.service)||void 0,object:bS(b.object)||void 0,holds:Array.isArray(b.holds)?b.holds.map(bS):"string"==typeof b.holds?[b.holds]:void 0}}),messages:c(b.messages).map(bT),...Array.isArray(b.fragments)?{fragments:b.fragments.map(a=>{let b=a&&"object"==typeof a?a:{};return{kind:bS(b.kind),label:bS(b.label),after:"number"==typeof b.after&&Number.isFinite(b.after)?b.after:0,notes:bS(b.notes)||void 0,messages:c(b.messages).map(bT)}})}:{}}}function bV({definition:a,layout:b,viewport:c,onViewportChange:d,selection:e=null,errorElements:f,warningElements:g,fitKey:j,onSelect:k,onClearSelection:l,onContextMenu:m,emptyHint:n,theme:o,className:p,style:q,svgId:r}){let s=(0,i.useRef)(null),t=(0,i.useRef)(c);t.current=c;let u=(0,i.useRef)(null),v=(0,i.useRef)(new Map),w=(0,i.useRef)(null),x=(0,i.useMemo)(()=>bU(a),[a]),z=(0,i.useMemo)(()=>b??aL(x),[b,x]),A=(0,i.useRef)(new Map),[B,C]=(0,i.useState)({}),D=a=>b=>{b?A.current.set(a,b):A.current.delete(a)};(0,i.useLayoutEffect)(()=>{let a={},b=!1;for(let[c,d]of A.current){let e="function"==typeof d.getComputedTextLength?d.getComputedTextLength():0;e&&(a[c]=e,Math.abs((B[c]??-1)-e)>.5&&(b=!0))}b&&C(a)},[z,x]);let E=(0,i.useMemo)(()=>new Map(az(x).map(a=>[a.ref,a.message])),[x]),F=(0,i.useMemo)(()=>new Map(x.participants.filter(a=>a.name).map(a=>[a.name,a])),[x.participants]),G=(0,i.useCallback)((a,b)=>{let c=s.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]);(0,i.useEffect)(()=>{if(void 0===j)return;let a=s.current?.getBoundingClientRect();a&&0!==z.participants.length&&d(S([{x:0,y:0,width:z.width,height:z.height}],a.width,a.height,{padding:16}))},[j]),(0,i.useEffect)(()=>{let a=s.current;if(!a)return;let b=a=>{a.preventDefault();let b=t.current,c=bP(a.deltaX,a.deltaMode),e=bP(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey)return void d(Q(b,Math.exp(-(.0025*e)),G(a.clientX,a.clientY)));let f=a.shiftKey?-(c||e):-c,g=a.shiftKey?0:-e;(0!==f||0!==g)&&d(P(b,f,g))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[d,G]);let H=()=>{let a=[...v.current.values()];if(a.length<2)return null;let[b,c]=a;return{distance:Math.hypot(c.x-b.x,c.y-b.y)||1,mid:{x:(b.x+c.x)/2,y:(b.y+c.y)/2}}},I=(a,b)=>{if(0===a.button||"mouse"!==a.pointerType){if(a.stopPropagation(),s.current?.setPointerCapture(a.pointerId),v.current.set(a.pointerId,G(a.clientX,a.clientY)),v.current.size>=2){u.current=null,w.current=H();return}u.current={pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,lastX:a.clientX,lastY:a.clientY,target:b,moved:!1}}},J=a=>{if(v.current.delete(a.pointerId),w.current){v.current.size<2&&(w.current=null);return}let b=u.current;!b||b.pointerId!==a.pointerId||(u.current=null,b.moved||(b.target?k?.(b.target.kind,b.target.id):l?.()))},K=a=>b=>{m&&(b.preventDefault(),b.stopPropagation(),m(b.clientX,b.clientY,a))},L=new Set(f??[]),M=new Set(g??[]),N=(a,b)=>e?.kind===a&&e.id===b,O=e?.kind==="message"?E.get(e.id):void 0;return(0,h.jsxs)("div",{className:`slc-pane${p?` ${p}`:""}`,style:{...bB(o),...q},children:[(0,h.jsx)("svg",{ref:s,id:r,className:"slc-surface",onPointerDown:a=>I(a),onPointerMove:a=>{if(v.current.has(a.pointerId)&&v.current.set(a.pointerId,G(a.clientX,a.clientY)),w.current){let a=H();if(!a)return;let b=w.current;d(Q(P(t.current,a.mid.x-b.mid.x,a.mid.y-b.mid.y),a.distance/b.distance,a.mid)),w.current=a;return}let b=u.current;!b||b.pointerId!==a.pointerId||!b.moved&&4>Math.hypot(a.clientX-b.startX,a.clientY-b.startY)||(b.moved=!0,d(P(t.current,a.clientX-b.lastX,a.clientY-b.lastY)),b.lastX=a.clientX,b.lastY=a.clientY)},onPointerUp:J,onPointerCancel:J,onContextMenu:K({kind:"canvas"}),children:(0,h.jsxs)("g",{transform:T(c),children:[z.fragments.map(a=>{let b=x.fragments?.[a.index];if(!b)return null;let c=y(`${b.kind} \xb7 after ${b.after} \xb7 ${b.label}`,11)+18,d=a.top;return(0,h.jsxs)("g",{className:"slc-sqd-fragment",children:[b.notes?.trim()&&(0,h.jsx)("title",{children:`Notes: ${b.notes}`}),(0,h.jsx)("rect",{x:a.left,y:d,width:a.width,height:a.height,rx:3,className:"slc-sqd-frame"}),(0,h.jsx)("path",{d:`M ${a.left} ${d+22} L ${a.left} ${d} L ${a.left+c} ${d} L ${a.left+c} ${d+15} L ${a.left+c-7} ${d+22} Z`,className:"slc-sqd-frame-tab"}),(0,h.jsxs)("text",{x:a.left+8,y:d+15,className:"slc-sqd-frame-heading",children:[(0,h.jsx)("tspan",{className:"slc-sqd-frame-kind",children:b.kind}),` \xb7 after ${b.after} \xb7 ${b.label}`]}),b.notes?.trim()&&(0,h.jsx)("rect",{x:a.left+c+6,y:d+7,width:13,height:5,rx:1.5,className:"slc-note-mark"})]},`f${a.index}`)}),z.participants.map(a=>{let b=N("participant",a.name);return(0,h.jsxs)("g",{onPointerDown:b=>I(b,{kind:"participant",id:a.name}),children:[(0,h.jsx)("path",{d:`M ${a.x} ${z.lifelineTop} V ${z.lifelineBottom}`,className:"slc-sqd-hit"}),(0,h.jsx)("path",{d:`M ${a.x} ${z.lifelineTop} V ${z.lifelineBottom}`,className:`slc-sqd-lifeline${b?" slc-sqd-lifeline--selected":""}`})]},`l-${a.name}`)}),z.fragments.map(a=>{let b=x.fragments?.[a.index],c=b&&b.after>0?z.rows.find(a=>null===a.fragment&&a.index===b.after-1):void 0;if(!c)return null;let d=a.left+4;return(0,h.jsx)("path",{d:`M ${Math.min(c.fromX,c.toX)-14} ${c.y} H ${d} V ${a.top}`,className:"slc-sqd-branch"},`fa${a.index}`)}),z.rows.map(a=>{var b;let c,d,e,f,g=E.get(a.ref);if(!g)return null;let i=`message:${a.ref}`,j=N("message",a.ref),k=L.has(i),l=!k&&M.has(i),m=["slc-sqd-line",g.reply?"slc-sqd-line--reply":"",g.optional?"slc-sqd-line--optional":"",k?"slc-sqd-line--error":l?"slc-sqd-line--warn":"",j?"slc-sqd-line--selected":""].filter(Boolean).join(" "),n=`slc-sqd-head${g.reply?" slc-sqd-head--open":""}${j?" slc-sqd-head--selected":k?" slc-sqd-head--error":""}`,o=a.ref,p=y(o,10)+8,q=B[`${a.ref}:label`]??y(g.label??"",11),r=g.optional?y("opt",10)+8:0,s=g.event?(B[`${a.ref}:event`]??6.1*g.event.length)+12:0,t=g.state?`→ ${g.state}`:"",u=g.state?B[`${a.ref}:state`]??y(t,11):0,v=p+5+q+(r?5+r:0)+(s?5+s:0)+(u?5+u:0);if(a.self){let b=a.fromX,i=a.y-7-2,j=i+14;e=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:`M ${b} ${i} H ${b+30} V ${j} H ${b+2}`,className:m}),(0,h.jsx)("path",{d:bQ(b+1,j,-1,!!g.reply),className:n})]}),c=b+30+8,d=a.y+2,f={x:b-6,y:i-8,w:44+v,h:30}}else{let b=a.toX>=a.fromX?1:-1,i=a.toX-b;e=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:`M ${a.fromX} ${a.y} H ${i}`,className:m}),(0,h.jsx)("path",{d:bQ(i,a.y,b,!!g.reply),className:n})]}),c=(a.fromX+a.toX)/2-v/2,d=a.y-6;let j=Math.min(a.fromX,a.toX,c),k=Math.max(a.fromX,a.toX,c+v);f={x:j-4,y:a.y-22,w:k-j+8,h:30}}let w=c,x=a=>{let b=w;return w+=a+5,b},z=x(p),A=x(q),C=r?x(r):0,F=s?x(s):0,G=u?x(u):0;return(0,h.jsxs)("g",{className:"slc-sqd-message",onPointerDown:b=>I(b,{kind:"message",id:a.ref}),onContextMenu:K({kind:"message",id:a.ref}),children:[(0,h.jsx)("title",{children:(b=a.ref,[`${b}. ${g.from} → ${g.to}: ${g.label}`,g.event?`fires ${g.event}${g.machine?` on ${g.machine}`:""}`:"",g.carries?`carries ${g.carries}`:"",g.state?`then ${g.state}`:"",g.optional?"optional":"",g.reply?"reply":"",g.description??"",g.notes?.trim()?`Notes: ${g.notes}`:""].filter(Boolean).join("\n"))}),(0,h.jsx)("rect",{x:f.x,y:f.y,width:f.w,height:f.h,className:"slc-sqd-hitbox"}),j&&(0,h.jsx)("rect",{x:f.x,y:f.y,width:f.w,height:f.h,rx:4,className:"slc-sqd-selected-plate"}),e,(0,h.jsx)("rect",{x:z,y:d-10,width:p-2,height:13,rx:6.5,className:`slc-sqd-ref-plate${j?" slc-sqd-ref-plate--selected":""}`}),(0,h.jsx)("text",{x:z+(p-2)/2,y:d,textAnchor:"middle",className:"slc-sqd-ref",children:o}),(0,h.jsx)("text",{ref:D(`${a.ref}:label`),x:A,y:d,className:`slc-sqd-label${j?" slc-sqd-label--selected":""}${k?" slc-sqd-label--error":""}`,children:g.label}),r>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:C,y:d-10,width:r,height:13,rx:3,className:"slc-sqd-opt"}),(0,h.jsx)("text",{x:C+r/2,y:d-.5,textAnchor:"middle",className:"slc-sqd-opt-text",children:"opt"})]}),s>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:F,y:d-10.5,width:s,height:14,rx:7,className:"slc-sqd-event"}),(0,h.jsx)("text",{ref:D(`${a.ref}:event`),x:F+s/2,y:d-.5,textAnchor:"middle",className:"slc-sqd-event-text",children:g.event})]}),u>0&&(0,h.jsx)("text",{ref:D(`${a.ref}:state`),x:G,y:d,className:"slc-sqd-state",children:t}),g.notes?.trim()&&(0,h.jsx)("rect",{x:w-5+3,y:d-9,width:5,height:11,rx:1.5,className:"slc-note-mark"})]},`m-${a.ref}`)}),z.participants.map(a=>{let b=F.get(a.name);if(!b)return null;let c=`participant:${a.name}`,d=N("participant",a.name)||!!O&&(O.from===a.name||O.to===a.name),e=["slc-node","slc-sqd-header",N("participant",a.name)?"slc-node--selected":d?"slc-sqd-header--involved":"",L.has(c)?"slc-node--error":""].filter(Boolean).join(" "),f=b.actor?"actor":b.object?"object":b.service?"service":"";return(0,h.jsxs)("g",{className:"slc-node--static slc-sqd-participant",onPointerDown:b=>I(b,{kind:"participant",id:a.name}),onContextMenu:K({kind:"participant",id:a.name}),children:[bR(b)&&(0,h.jsx)("title",{children:bR(b)}),(0,h.jsx)("rect",{x:a.left,y:a.top,width:a.width,height:a.height,rx:b.actor?a.height/2:4,className:e}),b.notes?.trim()&&(0,h.jsx)("rect",{x:a.left+a.width-24,y:a.top-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),(0,h.jsx)("text",{x:a.x,y:a.top+a.height/2+(f?1:4),textAnchor:"middle",className:`slc-node-name slc-sqd-name${b.object?" slc-sqd-name--object":""}`,children:a.name}),f&&(0,h.jsxs)("text",{x:a.x,y:a.top+a.height-4,textAnchor:"middle",className:"slc-sqd-kind",children:["object"===f?`:${b.object}`:"service"===f?"service":"actor",b.holds?.length?` \xb7 holds ${b.holds.length}`:""]})]},`p-${a.name}`)})]})}),0===z.participants.length&&n&&(0,h.jsx)("div",{className:"slc-erd-empty",children:n})]})}function bW({viewport:a,boxes:b,spotlight:c,region:d,marks:e,selectedMark:f=null,onSelectMark:g,unread:j,hideResolved:k=!0,marking:l=!1,onDraft:m,draft:n=null,theme:o,className:p,style:q}){let r=`slc-stage-mask-${(0,i.useId)().replace(/[^a-zA-Z0-9_-]/g,"")}`,s=(0,i.useRef)(null),t=(0,i.useRef)(null),[u,v]=(0,i.useState)(null),w=(0,i.useMemo)(()=>c?.length?bu(b,c).map(a=>bt(a,8)):[],[b,c]),x=T(a),y=e?.find(a=>a.id===f)??null,z=(0,i.useMemo)(()=>new Set(j??[]),[j]),A=(0,i.useMemo)(()=>{let a=[];return y?.elements?.length&&a.push(...bu(b,y.elements)),n?.elements.length&&a.push(...bu(b,n.elements)),a.map(a=>bt(a,4))},[b,y,n]),B=[y?.region,n?.region].filter(a=>!!a),C=(e??[]).map((a,b)=>({mark:a,n:b+1})).filter(({mark:a})=>!(k&&"resolved"===a.status&&a.id!==f)).map(({mark:c,n:d})=>{var e;let f=bs(c.elements?.length?bu(b,c.elements):[])??c.region??null;if(!f)return null;let g={x:(e={x:f.x+f.width,y:f.y}).x*a.scale+a.x,y:e.y*a.scale+a.y};return{mark:c,n:d,x:g.x,y:g.y}}).filter(a=>null!==a),D=a=>{let b=s.current?.getBoundingClientRect();return{x:a.clientX-(b?.left??0),y:a.clientY-(b?.top??0)}};return(0,h.jsxs)("div",{ref:s,className:`slc-stage${l?" slc-stage--marking":""}${p?` ${p}`:""}`,style:{...bB(o),...q},children:[(0,h.jsxs)("svg",{className:"slc-stage-svg","aria-hidden":"true",children:[w.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("defs",{children:(0,h.jsxs)("mask",{id:r,maskUnits:"userSpaceOnUse",x:"0",y:"0",width:"100%",height:"100%",children:[(0,h.jsx)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"}),(0,h.jsx)("g",{transform:x,children:w.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:10,fill:"black"},b))})]})}),(0,h.jsx)("rect",{x:"0",y:"0",width:"100%",height:"100%",className:"slc-stage-scrim",mask:`url(#${r})`}),(0,h.jsx)("g",{transform:x,children:w.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:10,className:"slc-stage-ring",vectorEffect:"non-scaling-stroke"},b))})]}),(0,h.jsxs)("g",{transform:x,children:[d&&(0,h.jsx)("rect",{x:d.x,y:d.y,width:d.width,height:d.height,rx:6,className:"slc-stage-region",vectorEffect:"non-scaling-stroke"}),A.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:8,className:"slc-stage-mark-ring",vectorEffect:"non-scaling-stroke"},`r${b}`)),B.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:4,className:"slc-stage-mark-area",vectorEffect:"non-scaling-stroke"},`f${b}`))]}),u&&(0,h.jsx)("rect",{x:u.x,y:u.y,width:u.w,height:u.h,rx:4,className:"slc-stage-drag"})]}),C.map(({mark:a,n:b,x:c,y:d})=>(0,h.jsxs)("button",{type:"button",className:`slc-stage-pin slc-stage-pin--${"resolved"===a.status?"resolved":"agent"===a.author.role?"answered"===a.status?"answered":"question":"answered"===a.status?"answered":"open"}${z.has(a.id)?" slc-stage-pin--new":""}${a.id===f?" slc-stage-pin--selected":""}`,style:{left:c,top:d},title:`${a.author.name}: ${a.text}${a.replies?.length?` (${a.replies.length} repl${1===a.replies.length?"y":"ies"})`:""}${z.has(a.id)?" · new":""}`,"aria-label":`Mark ${b}, ${a.status}${z.has(a.id)?", new":""}: ${a.text}`,onPointerDown:a=>a.stopPropagation(),onClick:b=>{b.stopPropagation(),g?.(a.id)},children:[b,(a.replies?.length??0)>0&&(0,h.jsx)("span",{className:"slc-stage-pin-count",children:a.replies.length})]},a.id)),l&&(0,h.jsx)("div",{className:"slc-stage-catch",onPointerDown:a=>{if(0!==a.button&&"mouse"===a.pointerType)return;a.currentTarget.setPointerCapture(a.pointerId);let b=D(a);t.current={id:a.pointerId,x:b.x,y:b.y,moved:!1}},onPointerMove:a=>{let b=t.current;if(!b||b.id!==a.pointerId)return;let c=D(a);!b.moved&&6>Math.hypot(c.x-b.x,c.y-b.y)||(b.moved=!0,v({x:Math.min(b.x,c.x),y:Math.min(b.y,c.y),w:Math.abs(c.x-b.x),h:Math.abs(c.y-b.y)}))},onPointerUp:c=>{let d=t.current;if(!d||d.id!==c.pointerId)return;t.current=null,v(null);let e=D(c);if(d.moved){let c=O(a,{x:Math.min(d.x,e.x),y:Math.min(d.y,e.y)}),f=O(a,{x:Math.max(d.x,e.x),y:Math.max(d.y,e.y)}),g={x:c.x,y:c.y,width:Math.max(1,f.x-c.x),height:Math.max(1,f.y-c.y)};m?.({elements:function(a,b,c=1/3){let d=[];for(let{focus:e,box:f}of a){let a=f.width*f.height;!(a<=0||d.includes(e))&&function(a,b){let c=Math.min(a.x+a.width,b.x+b.width)-Math.max(a.x,b.x),d=Math.min(a.y+a.height,b.y+b.height)-Math.max(a.y,b.y);return c>0&&d>0?c*d:0}(f,b)/a>=c&&d.push(e)}return d}(b,g),region:g});return}let f=O(a,e),g=function(a,b,c){let d=null;for(let e of a){let{box:a}=e;b<a.x||c<a.y||b>a.x+a.width||c>a.y+a.height||(!d||a.width*a.height<d.box.width*d.box.height)&&(d=e)}return d?.focus??null}(b,f.x,f.y);if(g)return m?.({elements:[g]});if("touch"===c.pointerType)return;let h=28/(a.scale||1);m?.({elements:[],region:{x:f.x-h,y:f.y-h,width:2*h,height:2*h}})},onPointerCancel:()=>{t.current=null,v(null)}})]})}function bX({size:a=16,children:b,...c}){return(0,h.jsx)("svg",{width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",className:"slc-icon",...c,children:b})}function bY(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("rect",{x:"9",y:"3",width:"6",height:"11",rx:"3"}),(0,h.jsx)("path",{d:"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21M8.5 21h7"})]})}function bZ(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("path",{d:"M4 9.5h3.5L12 5.5v13l-4.5-4H4z"}),(0,h.jsx)("path",{d:"M15.5 9a4 4 0 0 1 0 6M18 6.5a7.5 7.5 0 0 1 0 11"})]})}function b$(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("path",{d:"M4 9.5h3.5L12 5.5v13l-4.5-4H4z"}),(0,h.jsx)("path",{d:"M16 10l4 4M20 10l-4 4"})]})}function b_(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("path",{d:"M5 5h14a1.5 1.5 0 0 1 1.5 1.5v8A1.5 1.5 0 0 1 19 16h-7l-4.5 3.5V16H5a1.5 1.5 0 0 1-1.5-1.5v-8A1.5 1.5 0 0 1 5 5z"})})}function b0(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("path",{d:"M8 5.5v13l10-6.5z",fill:"currentColor"})})}function b1(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("path",{d:"M8.5 5.5v13M15.5 5.5v13",strokeWidth:2.6})})}function b2(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("rect",{x:"7",y:"7",width:"10",height:"10",rx:"1.5",fill:"currentColor"})})}function b3(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("path",{d:"M17 5.5v13L8 12z"}),(0,h.jsx)("path",{d:"M6.5 5.5v13"})]})}function b4(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("path",{d:"M7 5.5v13l9-6.5z"}),(0,h.jsx)("path",{d:"M17.5 5.5v13"})]})}function b5(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("path",{d:"M7.5 10.5v9H4.5v-9zM7.5 10.5l3.5-6.5a2 2 0 0 1 2.5 2.2l-.6 3.3h5.4a2 2 0 0 1 2 2.4l-1.3 6.2a2 2 0 0 1-2 1.4H7.5"})})}function b6(a){return(0,h.jsx)(bX,{...a,style:{transform:"scaleY(-1)",...a.style},children:(0,h.jsx)("path",{d:"M7.5 10.5v9H4.5v-9zM7.5 10.5l3.5-6.5a2 2 0 0 1 2.5 2.2l-.6 3.3h5.4a2 2 0 0 1 2 2.4l-1.3 6.2a2 2 0 0 1-2 1.4H7.5"})})}function b7(a){return(0,h.jsx)(bX,{...a,children:(0,h.jsx)("path",{d:"M6.5 6.5l11 11M17.5 6.5l-11 11"})})}function b8(a){return(0,h.jsxs)(bX,{...a,children:[(0,h.jsx)("path",{d:"M4.5 19.5l1-4.2L15.8 5a1.8 1.8 0 0 1 2.5 0l.7.7a1.8 1.8 0 0 1 0 2.5L8.7 18.5z"}),(0,h.jsx)("path",{d:"M13.8 7l3.2 3.2"})]})}function b9({shown:a,playing:b=!1,speaking:c=!1,voice:d,onToggleVoice:e,onPlay:f,onPause:g,onNext:i,onPrev:j,onGoto:k,onClose:l,onAnswer:m,theme:n,className:o,style:p}){if(!a)return null;let{step:q,index:r,count:s,title:t,origin:u}=a,v=null!==r&&null!==s,w=[t,q.title].filter(Boolean).join(" · ");return(0,h.jsxs)("section",{className:`slc-stage-caption${o?` ${o}`:""}`,style:{...bB(n),...p},role:"region","aria-label":"What the agent is showing","aria-live":"polite",children:[(0,h.jsxs)("header",{className:"slc-stage-caption-head",children:[u&&(0,h.jsx)("span",{className:"slc-stage-caption-origin",children:u}),w&&(0,h.jsx)("span",{className:"slc-stage-caption-title",children:w}),v&&(0,h.jsxs)("span",{className:"slc-stage-caption-count",children:[r+1," / ",s]}),c&&(0,h.jsx)("span",{className:"slc-stage-caption-speaking","aria-label":"speaking"}),l&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:l,"aria-label":"Close",title:"Close",children:(0,h.jsx)(b7,{})})]}),(0,h.jsx)("p",{className:"slc-stage-caption-say",children:q.say}),v&&s<=24&&s>1&&(0,h.jsx)("nav",{className:"slc-stage-dots","aria-label":"Steps",children:Array.from({length:s},(a,b)=>(0,h.jsx)("button",{type:"button",className:`slc-stage-dot${b===r?" slc-stage-dot--current":b<r?" slc-stage-dot--seen":""}`,onClick:()=>k?.(b),"aria-label":`Step ${b+1}`,"aria-current":b===r?"step":void 0},b))}),(0,h.jsxs)("footer",{className:"slc-stage-caption-controls",children:[v&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:j,disabled:0===r,"aria-label":"Previous step",title:"Previous step",children:(0,h.jsx)(b3,{})}),b?(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:g,"aria-label":"Pause",title:"Pause",children:(0,h.jsx)(b1,{})}):(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:f,"aria-label":"Play",title:"Play",children:(0,h.jsx)(b0,{})}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:i,disabled:r===s-1,"aria-label":"Next step",title:"Next step",children:(0,h.jsx)(b4,{})})]}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),void 0!==d&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${d?" slc-stage-btn--on":""}`,onClick:e,"aria-pressed":d,title:d?"Voice on — the steps are read aloud":"Voice off — the steps are read on screen",children:d?(0,h.jsx)(bZ,{}):(0,h.jsx)(b$,{})}),m&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--answer",onClick:m,title:"Answer — mark what is lit and say something about it",children:"Answer"})]})]})}let ca={comment:"Comment",question:"Question",looks_good:"Looks good",delete:"Should go"};function cb(a,b){let[c,d]=(0,i.useState)(!1),e=(0,i.useRef)("");return(0,i.useEffect)(()=>()=>a?.stop(),[a]),{listening:c,toggle:f=>{if(a){if(c){a.stop(),d(!1);return}e.current=f?`${f.trimEnd()} `:"",d(!0),a.start(a=>b(e.current+a),()=>d(!1))}}}}function cc({elements:a,region:b}){return a?.length||b?(0,h.jsxs)(h.Fragment,{children:[a?.map(a=>(0,h.jsx)("span",{className:"slc-stage-chip",children:a},a)),b&&!a?.length&&(0,h.jsx)("span",{className:"slc-stage-chip slc-stage-chip--quiet",children:"an area"})]}):(0,h.jsx)("span",{className:"slc-stage-chip slc-stage-chip--quiet",children:"the drawing"})}function cd({children:a}){return null==a||!1===a||""===a?null:(0,h.jsx)("div",{className:"slc-stage-card-note",role:"status",children:a})}function ce({elements:a,region:b,author:c,onAuthorChange:d,onSubmit:e,onCancel:f,listener:g,listenAtOnce:j=!1,busy:k=!1,error:l,placeholder:m="What should the agent know about this?",note:n,theme:o,className:p,style:q}){let[r,s]=(0,i.useState)(""),[t,u]=(0,i.useState)("comment"),[v,w]=(0,i.useState)(c),{listening:x,toggle:y}=cb(g,s),z=(0,i.useRef)(null);(0,i.useEffect)(()=>{j&&g?y(""):(j||function(){try{return!1}catch{return!1}}())&&z.current?.focus()},[]);let A=a=>{if(a?.preventDefault(),!r.trim()||k)return;x&&g?.stop();let b=c||v.trim();!c&&b&&d?.(b),e({text:r.trim(),kind:t,author:b})};return(0,h.jsxs)("form",{className:`slc-stage-card slc-stage-composer${p?` ${p}`:""}`,style:{...bB(o),...q},onSubmit:A,onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-anchor",children:[(0,h.jsx)("span",{className:"slc-stage-card-label",children:"On"}),(0,h.jsx)(cc,{elements:a,region:b})]}),(0,h.jsx)("textarea",{ref:z,className:"slc-stage-input slc-stage-textarea",value:r,placeholder:x?"Listening…":m,onChange:a=>s(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&A(),"Escape"===a.key&&f()},rows:3}),!c&&(0,h.jsx)("input",{className:"slc-stage-input",value:v,placeholder:"Your name (signs your marks)",onChange:a=>w(a.target.value)}),(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("select",{className:"slc-stage-input slc-stage-select",value:t,onChange:a=>u(a.target.value),"aria-label":"Kind of mark",children:bi.map(a=>(0,h.jsx)("option",{value:a,children:ca[a]},a))}),g&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${x?" slc-stage-btn--live":""}`,onClick:()=>y(r),"aria-pressed":x,title:x?"Stop listening":"Speak instead of typing",children:(0,h.jsx)(bY,{})}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:f,children:"Cancel"}),(0,h.jsx)("button",{type:"submit",className:"slc-stage-btn slc-stage-btn--main",disabled:!r.trim()||k||!c&&!v.trim(),children:k?"Saving…":"Mark"})]}),(0,h.jsx)(cd,{children:n}),l&&(0,h.jsx)("div",{className:"slc-stage-card-error",children:l})]})}function cf({mark:a,number:b,onReply:c,onResolve:d,onReopen:e,onRemove:f,onClose:g,listener:j,busy:k=!1,error:l,note:m,theme:n,className:o,style:p}){let[q,r]=(0,i.useState)(""),{listening:s,toggle:t}=cb(j,r);return(0,h.jsxs)("div",{className:`slc-stage-card slc-stage-thread${o?` ${o}`:""}`,style:{...bB(n),...p},onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[void 0!==b&&(0,h.jsx)("span",{className:`slc-stage-pin slc-stage-pin--inline slc-stage-pin--${"resolved"===a.status?"resolved":a.status}`,children:b}),(0,h.jsxs)("span",{className:"slc-stage-card-label",children:[ca[a.kind]," · ",a.status]}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:g,"aria-label":"Close",children:(0,h.jsx)(b7,{})})]}),(0,h.jsx)("div",{className:"slc-stage-card-anchor",children:(0,h.jsx)(cc,{elements:a.elements,region:a.region})}),(0,h.jsxs)("ol",{className:"slc-stage-thread-list",children:[(0,h.jsxs)("li",{className:`slc-stage-said slc-stage-said--${a.author.role}`,children:[(0,h.jsx)("span",{className:"slc-stage-said-who",children:a.author.name}),(0,h.jsx)("span",{className:"slc-stage-said-text",children:a.text})]}),(a.replies??[]).map((a,b)=>(0,h.jsxs)("li",{className:`slc-stage-said slc-stage-said--${a.author.role}`,children:[(0,h.jsx)("span",{className:"slc-stage-said-who",children:a.author.name}),(0,h.jsx)("span",{className:"slc-stage-said-text",children:a.text})]},b))]}),"resolved"!==a.status&&"person"===bp(a)&&(0,h.jsx)(cd,{children:m}),c&&(0,h.jsxs)("form",{className:"slc-stage-card-row",onSubmit:a=>{a?.preventDefault(),q.trim()&&!k&&(s&&j?.stop(),c?.(q.trim()),r(""))},children:[(0,h.jsx)("input",{className:"slc-stage-input slc-stage-grow",value:q,placeholder:s?"Listening…":"Reply…",onChange:a=>r(a.target.value)}),j&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${s?" slc-stage-btn--live":""}`,onClick:()=>t(q),"aria-pressed":s,title:"Speak the reply",children:(0,h.jsx)(bY,{})}),(0,h.jsx)("button",{type:"submit",className:"slc-stage-btn slc-stage-btn--main",disabled:!q.trim()||k,children:"Reply"})]}),(0,h.jsxs)("div",{className:"slc-stage-card-row",children:["resolved"===a.status?e&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:e,children:"Reopen"}):d&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:d,children:"Resolve"}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),f&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--danger",onClick:f,children:"Remove"})]}),l&&(0,h.jsx)("div",{className:"slc-stage-card-error",children:l})]})}function cg({marks:a,selected:b,onSelect:c,onCopy:d,copied:e,onClose:f,note:g,unread:j,theme:k,className:l,style:m}){let[n,o]=(0,i.useState)(!1),p=new Set(j??[]),q=a.map((a,b)=>({m:a,n:b+1})),r=[...q.filter(({m:a})=>p.has(a.id)),...q.filter(({m:a})=>!p.has(a.id))],s=n?r:r.filter(({m:a})=>"resolved"!==a.status),t=a.filter(a=>"resolved"!==a.status).length;return(0,h.jsxs)("div",{className:`slc-stage-card slc-stage-panel${l?` ${l}`:""}`,style:{...bB(k),...m},onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("span",{className:"slc-stage-card-label",children:"Marks on this drawing"}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsxs)("span",{className:"slc-stage-segment",role:"group","aria-label":"Which marks to list",children:[(0,h.jsxs)("button",{type:"button",className:`slc-stage-segment-btn${n?"":" slc-stage-segment-btn--on"}`,"aria-pressed":!n,onClick:()=>o(!1),children:["Open ",t]}),(0,h.jsxs)("button",{type:"button",className:`slc-stage-segment-btn${n?" slc-stage-segment-btn--on":""}`,"aria-pressed":n,onClick:()=>o(!0),children:["All ",a.length]})]}),f&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:f,"aria-label":"Close",children:(0,h.jsx)(b7,{})})]}),0===s.length&&(0,h.jsx)("div",{className:"slc-stage-empty",children:a.length?"Every mark is resolved.":"No marks yet. Turn on marking (✎) and tap or draw around what you mean."}),(0,h.jsx)("ul",{className:"slc-stage-panel-list",children:s.map(({m:a,n:d})=>(0,h.jsx)("li",{children:(0,h.jsxs)("button",{type:"button",className:`slc-stage-panel-item${a.id===b?" slc-stage-panel-item--selected":""}`,onClick:()=>c(a.id),children:[(0,h.jsx)("span",{className:`slc-stage-pin slc-stage-pin--inline slc-stage-pin--${"resolved"===a.status?"resolved":"agent"===a.author.role&&"open"===a.status?"question":a.status}${p.has(a.id)?" slc-stage-pin--new":""}`,children:d}),(0,h.jsxs)("span",{className:"slc-stage-panel-text",children:[(0,h.jsx)("span",{className:"slc-stage-panel-said",children:a.text}),(0,h.jsxs)("span",{className:"slc-stage-panel-meta",children:[p.has(a.id)&&(0,h.jsx)("span",{className:"slc-stage-new",children:"new"}),a.author.name," · ",br(a),a.replies?.length?` \xb7 ${a.replies.length} repl${1===a.replies.length?"y":"ies"}`:""]})]})]})},a.id))}),(0,h.jsx)(cd,{children:g}),d&&(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:d,title:"Copy what is on screen and the waiting marks, to paste into any agent",children:e?"Copied":"Copy for the agent"})]})]})}function ch({children:a,onOpen:b,onDismiss:c,theme:d,className:e,style:f}){return(0,h.jsxs)("div",{className:`slc-stage-notice${e?` ${e}`:""}`,style:{...bB(d),...f},role:"status","aria-live":"polite",onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("button",{type:"button",className:"slc-stage-notice-open",onClick:b,title:"Open the thread",children:[(0,h.jsx)("span",{className:"slc-stage-notice-dot","aria-hidden":"true"}),(0,h.jsx)("span",{className:"slc-stage-notice-text",children:a})]}),c&&(0,h.jsx)("button",{type:"button",className:"slc-stage-notice-close",onClick:c,"aria-label":"Dismiss",children:(0,h.jsx)(b7,{})})]})}function ci(a){return`stateloom.marks.read.v1:${a}`}function cj(a){try{let b=window.localStorage.getItem(ci(a)),c=b?JSON.parse(b):null;if(!c||"object"!=typeof c||Array.isArray(c))return{};let d={};for(let[a,b]of Object.entries(c))"number"==typeof b&&Number.isFinite(b)&&b>=0&&(d[a]=b);return d}catch{return{}}}let ck=a=>`${Math.floor(a/60)}:${String(a%60).padStart(2,"0")}`,cl=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},cm=a=>(a?a.split("/").pop()??a:"").replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,"");function cn(a){let b=(a.spotlight?.length?a.spotlight:a.focus?[a.focus]:[]).map(a=>a.startsWith("message:")?`#${a.slice(8)}`:a.slice(a.indexOf(":")+1));return b.length?b.length<=2?b.join(", "):`${b.slice(0,2).join(", ")} +${b.length-2}`:""}let co={idle:"● Record",starting:"Opening the mic…",recording:"■ Stop & send",sending:"Sending…",retry:"Send again"};function cp({open:a,onOpenChange:b,who:c="Mia",episode:d,episodes:e,onEpisode:f,presence:g,recorder:i,onRecord:j,items:k,unheard:l=[],playing:m=null,playingStep:n=null,onPlay:o,onStop:p,onFeedback:q,autoplay:r,onAutoplay:s,waiting:t,notice:u,error:v,theme:w,className:x,style:y}){let z="recording"===i.state,A="starting"===i.state||"sending"===i.state,B=l.length;if(!a)return(0,h.jsx)("div",{className:`slc-talk${x?` ${x}`:""}`,style:{...bB(w),...y},children:(0,h.jsxs)("button",{type:"button",className:`slc-talk-fab${z?" slc-talk-fab--live":""}${!z&&m?" slc-talk-fab--speaking":""}`,onClick:()=>z?j():b(!0),"aria-label":z?`Stop and send (${ck(i.seconds)})`:m?`${c} is speaking. Open the conversation`:`Talk with ${c}${B?`, ${B} new`:""}`,title:z?"Stop and send your take":m?`${c} is walking the diagram`:`Talk with ${c} about what is on the canvas`,children:[z?(0,h.jsx)("span",{className:"slc-talk-fab-clock",children:ck(i.seconds)}):m?(0,h.jsx)(bZ,{size:24}):(0,h.jsx)(bY,{size:24}),!z&&B>0&&(0,h.jsx)("span",{className:"slc-talk-fab-badge",children:B})]})});let C=function(a,b,c){if(!c)return{text:"Choose the episode you are speaking in.",away:!0};switch(b?.state){case"listening":return{text:`${a} is listening.`,away:!1};case"answering":return{text:`${a} is answering${b.takes?.length?` take ${b.takes.join(", ")}`:""}.`,away:!1};case"answered":return{text:`${a} has answered and is getting ready to listen again.`,away:!1};default:return{text:`Nobody is listening yet. A take waits in the episode until ${a} does.`,away:!0}}}(c,g,d),D=[...k].reverse();return(0,h.jsx)("div",{className:`slc-talk slc-talk--open${x?` ${x}`:""}`,style:{...bB(w),...y},children:(0,h.jsxs)("section",{className:"slc-talk-panel","aria-label":`Conversation with ${c}`,onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("header",{className:"slc-talk-head",children:[(0,h.jsxs)("span",{className:"slc-talk-title",children:[(0,h.jsx)(bY,{})," Talk with ",c]}),(0,h.jsx)("span",{className:`slc-talk-presence${C.away?" slc-talk-presence--away":""}`,title:C.text}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:()=>b(!1),"aria-label":"Close the conversation",children:(0,h.jsx)(b7,{})})]}),e?.length&&f?(0,h.jsxs)("select",{className:"slc-stage-input slc-talk-episode",value:d??"",onChange:a=>f(a.target.value),disabled:z||A,"aria-label":"The episode this conversation belongs to",children:[!d&&(0,h.jsx)("option",{value:"",children:"Choose the episode…"}),e.map(a=>(0,h.jsxs)("option",{value:a.path,children:[a.number?`${String(a.number).padStart(3,"0")} \xb7 `:"",a.path.replace(/^\d{4}-\d{2}-\d{2}-episode-\d+-/,"")]},a.path))]}):(0,h.jsx)("div",{className:"slc-talk-meta",children:d??"No episode chosen."}),(0,h.jsx)("div",{className:`slc-talk-meta${C.away?" slc-talk-meta--away":""}`,children:C.text}),(0,h.jsxs)("button",{type:"button",className:`slc-talk-record${z?" slc-talk-record--live":""}${"retry"===i.state?" slc-talk-record--retry":""}`,onClick:j,disabled:A||!!i.unavailable||!d,title:i.unavailable?`Cannot record: ${i.unavailable}`:z?"Stop and send your take":"Speak to the episode, about what is on the canvas",children:[co[i.state],z&&(0,h.jsx)("span",{className:"slc-talk-clock",children:ck(i.seconds)})]}),i.unavailable&&(0,h.jsxs)("div",{className:"slc-talk-meta slc-talk-meta--error",children:["Cannot record here: ",i.unavailable,"."]}),i.message&&(0,h.jsx)("div",{className:`slc-talk-meta${i.error?" slc-talk-meta--error":""}`,children:i.message}),t&&(0,h.jsxs)("div",{className:"slc-talk-meta",children:["Waiting for ",c,"… ",ck(t.seconds)]}),u&&(0,h.jsx)("div",{className:"slc-talk-notice",children:u}),v&&(0,h.jsx)("div",{className:"slc-talk-meta slc-talk-meta--error",children:v}),(0,h.jsxs)("label",{className:"slc-talk-toggle",children:[(0,h.jsx)("input",{type:"checkbox",checked:r,onChange:a=>s(a.target.checked)}),"Play ",c,"'s replies on the diagram as they arrive"]}),(0,h.jsxs)("ol",{className:"slc-talk-thread",children:[0===D.length&&(0,h.jsx)("li",{className:"slc-stage-empty",children:"Nothing said in this episode yet. Look at a drawing, press Record, and speak."}),D.map(a=>"take"===a.kind?(0,h.jsxs)("li",{className:"slc-talk-entry slc-talk-entry--take",children:[(0,h.jsxs)("div",{className:"slc-talk-who",children:[(0,h.jsx)("strong",{children:"You"}),(0,h.jsxs)("span",{children:["take ",a.take," · ",cl(a.at)]})]}),a.canvas?.doc&&(0,h.jsxs)("div",{className:"slc-talk-canvas",children:["on ",cm(a.canvas.doc),a.canvas.focus?` \xb7 ${a.canvas.focus.slice(a.canvas.focus.indexOf(":")+1)}`:"",a.canvas.step?.title?` \xb7 during “${a.canvas.step.title}”`:""]}),(0,h.jsx)("div",{className:"slc-talk-text",children:a.text||"(no transcript yet)"})]},`t${a.take}`):(0,h.jsxs)("li",{className:`slc-talk-entry slc-talk-entry--reply${l.includes(a.id)?" slc-talk-entry--new":""}`,children:[(0,h.jsxs)("div",{className:"slc-talk-who",children:[(0,h.jsx)("strong",{children:c}),(0,h.jsx)("span",{children:cl(a.at)}),(!a.unvoiced||(a.steps?.length??0)>0)&&(m===a.id?(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-talk-play slc-talk-play--on",onClick:p,"aria-label":"Stop",title:"Stop",children:(0,h.jsx)(b2,{})}):(0,h.jsxs)("button",{type:"button",className:"slc-stage-btn slc-talk-play",onClick:()=>o(a.id),disabled:z,title:a.unvoiced?`Walk the diagram with ${c}'s words (no voice)`:a.steps?.length?`Hear ${c} walk the diagram (${a.steps.length} steps)`:`Hear ${c}`,children:[(0,h.jsx)(b0,{}),(a.steps?.length??0)>0?(0,h.jsxs)("span",{children:["Walk ",a.steps.length," steps"]}):null,l.includes(a.id)?(0,h.jsx)("span",{className:"slc-talk-new",children:"New"}):null]})),q&&(0,h.jsx)("span",{className:"slc-talk-thumbs",children:["up","down"].map(b=>(0,h.jsx)("button",{type:"button",className:`slc-talk-thumb${a.feedback===b?" slc-talk-thumb--on":""}`,onClick:()=>q(a.id,a.feedback===b?"":b),"aria-label":"up"===b?"This reply worked":"This reply missed",children:"up"===b?(0,h.jsx)(b5,{size:15}):(0,h.jsx)(b6,{size:15})},b))})]}),(a.steps?.length??0)>0?(0,h.jsx)("ol",{className:"slc-talk-steps","aria-label":`${c}'s walk through the diagram`,children:a.steps.map((b,c)=>{let d=m===a.id&&n===c;return(0,h.jsx)("li",{children:(0,h.jsxs)("button",{type:"button",className:`slc-talk-step${d?" slc-talk-step--here":""}`,onClick:()=>o(a.id,c),disabled:z,"aria-current":d?"step":void 0,title:`Walk from step ${c+1}`,children:[(0,h.jsx)("span",{className:"slc-talk-step-n",children:c+1}),(0,h.jsxs)("span",{className:"slc-talk-step-body",children:[(b.title||b.doc)&&(0,h.jsxs)("span",{className:"slc-talk-step-head",children:[b.title&&(0,h.jsx)("strong",{children:b.title}),(b.doc||cn(b))&&(0,h.jsx)("span",{className:"slc-talk-step-where",children:[cm(b.doc),cn(b)].filter(Boolean).join(" · ")})]}),(0,h.jsx)("span",{className:"slc-talk-step-say",children:b.say})]})]})},c)})}):(0,h.jsx)("div",{className:"slc-talk-text",children:a.text}),a.unvoiced&&(0,h.jsx)("div",{className:"slc-talk-meta",children:a.unvoiced})]},`r${a.id}`))]})]})})}let cq=a=>{let b,c=new Set,d=(a,d)=>{let e="function"==typeof a?a(b):a;if(!Object.is(e,b)){let a=b;b=(null!=d?d:"object"!=typeof e||null===e)?e:Object.assign({},b,e),c.forEach(c=>c(b,a))}},e=()=>b,f={setState:d,getState:e,getInitialState:()=>g,subscribe:a=>(c.add(a),()=>c.delete(a))},g=b=a(d,e,f);return f},cr=a=>{let b=a?cq(a):cq,c=a=>(function(a,b=a=>a){let c=i.default.useSyncExternalStore(a.subscribe,i.default.useCallback(()=>b(a.getState()),[a,b]),i.default.useCallback(()=>b(a.getInitialState()),[a,b]));return i.default.useDebugValue(c),c})(b,a);return Object.assign(c,b),c};var cs=a.i(53681);let ct=Object.create(null);ct.open="0",ct.close="1",ct.ping="2",ct.pong="3",ct.message="4",ct.upgrade="5",ct.noop="6";let cu=Object.create(null);Object.keys(ct).forEach(a=>{cu[ct[a]]=a});let cv={type:"error",data:"parser error"},cw=({type:a,data:b},c,d)=>d(b instanceof ArrayBuffer||ArrayBuffer.isView(b)?c?b:"b"+cx(b,!0).toString("base64"):ct[a]+(b||"")),cx=(a,b)=>Buffer.isBuffer(a)||a instanceof Uint8Array&&!b?a:a instanceof ArrayBuffer?Buffer.from(a):Buffer.from(a.buffer,a.byteOffset,a.byteLength),cy=(a,b)=>{if("string"!=typeof a)return{type:"message",data:cz(a,b)};let c=a.charAt(0);return"b"===c?{type:"message",data:cz(Buffer.from(a.substring(1),"base64"),b)}:cu[c]?a.length>1?{type:cu[c],data:a.substring(1)}:{type:cu[c]}:cv},cz=(a,b)=>"arraybuffer"===b?a instanceof ArrayBuffer?a:Buffer.isBuffer(a)?a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength):a.buffer:Buffer.isBuffer(a)?a:Buffer.from(a);function cA(a){return a.reduce((a,b)=>a+b.length,0)}function cB(a,b){if(a[0].length===b)return a.shift();let c=new Uint8Array(b),d=0;for(let e=0;e<b;e++)c[e]=a[0][d++],d===a[0].length&&(a.shift(),d=0);return a.length&&d<a[0].length&&(a[0]=a[0].slice(d)),c}function cC(a){if(a){var b=a;for(var c in cC.prototype)b[c]=cC.prototype[c];return b}}cC.prototype.on=cC.prototype.addEventListener=function(a,b){return this._callbacks=this._callbacks||{},(this._callbacks["$"+a]=this._callbacks["$"+a]||[]).push(b),this},cC.prototype.once=function(a,b){function c(){this.off(a,c),b.apply(this,arguments)}return c.fn=b,this.on(a,c),this},cC.prototype.off=cC.prototype.removeListener=cC.prototype.removeAllListeners=cC.prototype.removeEventListener=function(a,b){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var c,d=this._callbacks["$"+a];if(!d)return this;if(1==arguments.length)return delete this._callbacks["$"+a],this;for(var e=0;e<d.length;e++)if((c=d[e])===b||c.fn===b){d.splice(e,1);break}return 0===d.length&&delete this._callbacks["$"+a],this},cC.prototype.emit=function(a){this._callbacks=this._callbacks||{};for(var b=Array(arguments.length-1),c=this._callbacks["$"+a],d=1;d<arguments.length;d++)b[d-1]=arguments[d];if(c){c=c.slice(0);for(var d=0,e=c.length;d<e;++d)c[d].apply(this,b)}return this},cC.prototype.emitReserved=cC.prototype.emit,cC.prototype.listeners=function(a){return this._callbacks=this._callbacks||{},this._callbacks["$"+a]||[]},cC.prototype.hasListeners=function(a){return!!this.listeners(a).length};let cD=process.nextTick,cE=a.g;class cF{constructor(){this._cookies=new Map}parseCookies(a){a&&a.forEach(a=>{let b=function(a){let b=a.split("; "),c=b[0].indexOf("=");if(-1===c)return;let d=b[0].substring(0,c).trim();if(!d.length)return;let e=b[0].substring(c+1).trim();34===e.charCodeAt(0)&&(e=e.slice(1,-1));let f={name:d,value:e};for(let a=1;a<b.length;a++){let c=b[a].split("=");if(2!==c.length)continue;let d=c[0].trim(),e=c[1].trim();switch(d){case"Expires":f.expires=new Date(e);break;case"Max-Age":let g=new Date;g.setUTCSeconds(g.getUTCSeconds()+parseInt(e,10)),f.expires=g}}return f}(a);b&&this._cookies.set(b.name,b)})}get cookies(){let a=Date.now();return this._cookies.forEach((b,c)=>{var d;(null==(d=b.expires)?void 0:d.getTime())<a&&this._cookies.delete(c)}),this._cookies.entries()}addCookies(a){let b=[];for(let[a,c]of this.cookies)b.push(`${a}=${c.value}`);b.length&&(a.setDisableHeaderCheck(!0),a.setRequestHeader("cookie",b.join("; ")))}appendCookies(a){for(let[b,c]of this.cookies)a.append("cookie",`${b}=${c.value}`)}}function cG(a,...b){return b.reduce((b,c)=>(a.hasOwnProperty(c)&&(b[c]=a[c]),b),{})}let cH=cE.setTimeout,cI=cE.clearTimeout;function cJ(a,b){b.useNativeTimers?(a.setTimeoutFn=cH.bind(cE),a.clearTimeoutFn=cI.bind(cE)):(a.setTimeoutFn=cE.setTimeout.bind(cE),a.clearTimeoutFn=cE.clearTimeout.bind(cE))}function cK(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}var cL=a.i(72724);let cM=(0,cL.default)("engine.io-client:transport");class cN extends Error{constructor(a,b,c){super(a),this.description=b,this.context=c,this.type="TransportError"}}class cO extends cC{constructor(a){super(),this.writable=!1,cJ(this,a),this.opts=a,this.query=a.query,this.socket=a.socket,this.supportsBinary=!a.forceBase64}onError(a,b,c){return super.emitReserved("error",new cN(a,b,c)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return("opening"===this.readyState||"open"===this.readyState)&&(this.doClose(),this.onClose()),this}send(a){"open"===this.readyState?this.write(a):cM("transport is not open, discarding packets")}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(a){let b=cy(a,this.socket.binaryType);this.onPacket(b)}onPacket(a){super.emitReserved("packet",a)}onClose(a){this.readyState="closed",super.emitReserved("close",a)}pause(a){}createUri(a,b={}){return a+"://"+this._hostname()+this._port()+this.opts.path+this._query(b)}_hostname(){let a=this.opts.hostname;return -1===a.indexOf(":")?a:"["+a+"]"}_port(){return this.opts.port&&(this.opts.secure&&443!==Number(this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(a){let b=function(a){let b="";for(let c in a)a.hasOwnProperty(c)&&(b.length&&(b+="&"),b+=encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b}(a);return b.length?"?"+b:""}}let cP=(0,cL.default)("engine.io-client:polling");class cQ extends cO{constructor(){super(...arguments),this._polling=!1}get name(){return"polling"}doOpen(){this._poll()}pause(a){this.readyState="pausing";let b=()=>{cP("paused"),this.readyState="paused",a()};if(this._polling||!this.writable){let a=0;this._polling&&(cP("we are currently polling - waiting to pause"),a++,this.once("pollComplete",function(){cP("pre-pause polling complete"),--a||b()})),this.writable||(cP("we are currently writing - waiting to pause"),a++,this.once("drain",function(){cP("pre-pause writing complete"),--a||b()}))}else b()}_poll(){cP("polling"),this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(a){cP("polling got data %s",a);let b=a=>{if("opening"===this.readyState&&"open"===a.type&&this.onOpen(),"close"===a.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(a)};((a,b)=>{let c=a.split("\x1e"),d=[];for(let a=0;a<c.length;a++){let e=cy(c[a],b);if(d.push(e),"error"===e.type)break}return d})(a,this.socket.binaryType).forEach(b),"closed"!==this.readyState&&(this._polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState?this._poll():cP('ignoring poll - transport state "%s"',this.readyState))}doClose(){let a=()=>{cP("writing close packet"),this.write([{type:"close"}])};"open"===this.readyState?(cP("transport open - closing"),a()):(cP("transport not open - deferring close"),this.once("open",a))}write(a){var b;let c,d,e;this.writable=!1,b=a=>{this.doWrite(a,()=>{this.writable=!0,this.emitReserved("drain")})},d=Array(c=a.length),e=0,a.forEach((a,f)=>{cw(a,!1,a=>{d[f]=a,++e===c&&b(d.join("\x1e"))})})}uri(){let a=this.opts.secure?"https":"http",b=this.query||{};return!1!==this.opts.timestampRequests&&(b[this.opts.timestampParam]=cK()),this.supportsBinary||b.sid||(b.b64=1),this.createUri(a,b)}}let cR=!1;try{cR="u">typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(a){}let cS=cR,cT=(0,cL.default)("engine.io-client:polling");function cU(){}class cV extends cQ{constructor(a){if(super(a),"u">typeof location){const b="https:"===location.protocol;let c=location.port;c||(c=b?"443":"80"),this.xd="u">typeof location&&a.hostname!==location.hostname||c!==a.port}}doWrite(a,b){let c=this.request({method:"POST",data:a});c.on("success",b),c.on("error",(a,b)=>{this.onError("xhr post error",a,b)})}doPoll(){cT("xhr poll");let a=this.request();a.on("data",this.onData.bind(this)),a.on("error",(a,b)=>{this.onError("xhr poll error",a,b)}),this.pollXhr=a}}class cW extends cC{constructor(a,b,c){super(),this.createRequest=a,cJ(this,c),this._opts=c,this._method=c.method||"GET",this._uri=b,this._data=void 0!==c.data?c.data:null,this._create()}_create(){var a;let b=cG(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");b.xdomain=!!this._opts.xd;let c=this._xhr=this.createRequest(b);try{cT("xhr open %s: %s",this._method,this._uri),c.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders)for(let a in c.setDisableHeaderCheck&&c.setDisableHeaderCheck(!0),this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(a)&&c.setRequestHeader(a,this._opts.extraHeaders[a])}catch(a){}if("POST"===this._method)try{c.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(a){}try{c.setRequestHeader("Accept","*/*")}catch(a){}null==(a=this._opts.cookieJar)||a.addCookies(c),"withCredentials"in c&&(c.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(c.timeout=this._opts.requestTimeout),c.onreadystatechange=()=>{var a;3===c.readyState&&(null==(a=this._opts.cookieJar)||a.parseCookies(c.getResponseHeader("set-cookie"))),4===c.readyState&&(200===c.status||1223===c.status?this._onLoad():this.setTimeoutFn(()=>{this._onError("number"==typeof c.status?c.status:0)},0))},cT("xhr data %s",this._data),c.send(this._data)}catch(a){this.setTimeoutFn(()=>{this._onError(a)},0);return}"u">typeof document&&(this._index=cW.requestsCount++,cW.requests[this._index]=this)}_onError(a){this.emitReserved("error",a,this._xhr),this._cleanup(!0)}_cleanup(a){if(void 0!==this._xhr&&null!==this._xhr){if(this._xhr.onreadystatechange=cU,a)try{this._xhr.abort()}catch(a){}"u">typeof document&&delete cW.requests[this._index],this._xhr=null}}_onLoad(){let a=this._xhr.responseText;null!==a&&(this.emitReserved("data",a),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}function cX(){for(let a in cW.requests)cW.requests.hasOwnProperty(a)&&cW.requests[a].abort()}cW.requestsCount=0,cW.requests={},"u">typeof document&&("function"==typeof attachEvent?attachEvent("onunload",cX):"function"==typeof addEventListener&&addEventListener("onpagehide"in cE?"pagehide":"unload",cX,!1)),(d=function(a){let b=a.xdomain;try{if("u">typeof XMLHttpRequest&&(!b||cS))return new XMLHttpRequest}catch(a){}if(!b)try{return new cE[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch(a){}}({xdomain:!1}))&&d.responseType;let cY=cs.default||cs;a.i(31594),a.i(15251),a.i(31276),a.i(28719),a.i(63349),a.i(54129);var cZ=a.i(50842);a.i(36972),cZ.default;let c$=(0,cL.default)("engine.io-client:websocket"),c_="u">typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class c0 extends cO{get name(){return"websocket"}doOpen(){let a=this.uri(),b=this.opts.protocols,c=c_?{}:cG(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(c.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(a,b,c)}catch(a){return this.emitReserved("error",a)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=a=>this.onClose({description:"websocket connection closed",context:a}),this.ws.onmessage=a=>this.onData(a.data),this.ws.onerror=a=>this.onError("websocket error",a)}write(a){this.writable=!1;for(let b=0;b<a.length;b++){let c=a[b],d=b===a.length-1;cw(c,this.supportsBinary,a=>{try{this.doWrite(c,a)}catch(a){c$("websocket closed before onclose event")}d&&cD(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){void 0!==this.ws&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){let a=this.opts.secure?"wss":"ws",b=this.query||{};return this.opts.timestampRequests&&(b[this.opts.timestampParam]=cK()),this.supportsBinary||(b.b64=1),this.createUri(a,b)}}cE.WebSocket||cE.MozWebSocket;let c1=(0,cL.default)("engine.io-client:webtransport"),c2={websocket:class extends c0{createSocket(a,b,c){var d;if(null==(d=this.socket)?void 0:d._cookieJar)for(let[a,b]of(c.headers=c.headers||{},c.headers.cookie="string"==typeof c.headers.cookie?[c.headers.cookie]:c.headers.cookie||[],this.socket._cookieJar.cookies))c.headers.cookie.push(`${a}=${b.value}`);return new cZ.default(a,b,c)}doWrite(a,b){let c={};a.options&&(c.compress=a.options.compress),this.opts.perMessageDeflate&&("string"==typeof b?Buffer.byteLength(b):b.length)<this.opts.perMessageDeflate.threshold&&(c.compress=!1),this.ws.send(b,c)}},webtransport:class extends cO{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(a){return this.emitReserved("error",a)}this._transport.closed.then(()=>{c1("transport closed gracefully"),this.onClose()}).catch(a=>{c1("transport closed due to %s",a),this.onError("webtransport error",a)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(a=>{var d,e;let f,g,h,i,j=(d=Number.MAX_SAFE_INTEGER,e=this.socket.binaryType,c||(c=new TextDecoder),f=[],g=0,h=-1,i=!1,new TransformStream({transform(a,b){for(f.push(a);;){if(0===g){if(1>cA(f))break;let a=cB(f,1);i=(128&a[0])==128,g=(h=127&a[0])<126?3:126===h?1:2}else if(1===g){if(2>cA(f))break;let a=cB(f,2);h=new DataView(a.buffer,a.byteOffset,a.length).getUint16(0),g=3}else if(2===g){if(8>cA(f))break;let a=cB(f,8),c=new DataView(a.buffer,a.byteOffset,a.length),d=c.getUint32(0);if(d>2097151){b.enqueue(cv);break}h=0x100000000*d+c.getUint32(4),g=3}else{if(cA(f)<h)break;let a=cB(f,h);b.enqueue(cy(i?a:c.decode(a),e)),g=0}if(0===h||h>d){b.enqueue(cv);break}}}})),k=a.readable.pipeThrough(j).getReader(),l=new TransformStream({transform(a,c){!function(a,c){if(a.data instanceof ArrayBuffer||ArrayBuffer.isView(a.data))return c(cx(a.data,!1));cw(a,!0,a=>{b||(b=new TextEncoder),c(b.encode(a))})}(a,b=>{let d,e=b.length;if(e<126)new DataView((d=new Uint8Array(1)).buffer).setUint8(0,e);else if(e<65536){let a=new DataView((d=new Uint8Array(3)).buffer);a.setUint8(0,126),a.setUint16(1,e)}else{let a=new DataView((d=new Uint8Array(9)).buffer);a.setUint8(0,127),a.setBigUint64(1,BigInt(e))}a.data&&"string"!=typeof a.data&&(d[0]|=128),c.enqueue(d),c.enqueue(b)})}});l.readable.pipeTo(a.writable),this._writer=l.writable.getWriter();let m=()=>{k.read().then(({done:a,value:b})=>{a?c1("session is closed"):(c1("received chunk: %o",b),this.onPacket(b),m())}).catch(a=>{c1("an error occurred while reading: %s",a)})};m();let n={type:"open"};this.query.sid&&(n.data=`{"sid":"${this.query.sid}"}`),this._writer.write(n).then(()=>this.onOpen())})})}write(a){this.writable=!1;for(let b=0;b<a.length;b++){let c=a[b],d=b===a.length-1;this._writer.write(c).then(()=>{d&&cD(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var a;null==(a=this._transport)||a.close()}},polling:class extends cV{request(a={}){var b;return Object.assign(a,{xd:this.xd,cookieJar:null==(b=this.socket)?void 0:b._cookieJar},this.opts),new cW(a=>new cY(a),this.uri(),a)}}},c3=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,c4=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function c5(a){var b,c;let d,e;if(a.length>8e3)throw"URI too long";let f=a,g=a.indexOf("["),h=a.indexOf("]");-1!=g&&-1!=h&&(a=a.substring(0,g)+a.substring(g,h).replace(/:/g,";")+a.substring(h,a.length));let i=c3.exec(a||""),j={},k=14;for(;k--;)j[c4[k]]=i[k]||"";return -1!=g&&-1!=h&&(j.source=f,j.host=j.host.substring(1,j.host.length-1).replace(/;/g,":"),j.authority=j.authority.replace("[","").replace("]","").replace(/;/g,":"),j.ipv6uri=!0),d=(b=j.path).replace(/\/{2,9}/g,"/").split("/"),("/"==b.slice(0,1)||0===b.length)&&d.splice(0,1),"/"==b.slice(-1)&&d.splice(d.length-1,1),j.pathNames=d,c=j.query,e={},c.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(a,b,c){b&&(e[b]=c)}),j.queryKey=e,j}let c6=(0,cL.default)("engine.io-client:socket"),c7="function"==typeof addEventListener&&"function"==typeof removeEventListener,c8=[];c7&&addEventListener("offline",()=>{c6("closing %d connection(s) because the network was lost",c8.length),c8.forEach(a=>a())},!1);class c9 extends cC{constructor(a,b){if(super(),this.binaryType="nodebuffer",this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,a&&"object"==typeof a&&(b=a,a=null),a){const c=c5(a);b.hostname=c.host,b.secure="https"===c.protocol||"wss"===c.protocol,b.port=c.port,c.query&&(b.query=c.query)}else b.host&&(b.hostname=c5(b.host).host);cJ(this,b),this.secure=null!=b.secure?b.secure:"u">typeof location&&"https:"===location.protocol,b.hostname&&!b.port&&(b.port=this.secure?"443":"80"),this.hostname=b.hostname||("u">typeof location?location.hostname:"localhost"),this.port=b.port||("u">typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},b.transports.forEach(a=>{let b=a.prototype.name;this.transports.push(b),this._transportsByName[b]=a}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},b),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(a){let b={},c=a.split("&");for(let a=0,d=c.length;a<d;a++){let d=c[a].split("=");b[decodeURIComponent(d[0])]=decodeURIComponent(d[1])}return b}(this.opts.query)),c7&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(c6("adding listener for the 'offline' event"),this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},c8.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=new cF),this._open()}createTransport(a){c6('creating transport "%s"',a);let b=Object.assign({},this.opts.query);b.EIO=4,b.transport=a,this.id&&(b.sid=this.id);let c=Object.assign({},this.opts,{query:b,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[a]);return c6("options: %j",c),new this._transportsByName[a](c)}_open(){if(0===this.transports.length)return void this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);let a=this.opts.rememberUpgrade&&c9.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket")?"websocket":this.transports[0];this.readyState="opening";let b=this.createTransport(a);b.open(),this.setTransport(b)}setTransport(a){c6("setting transport %s",a.name),this.transport&&(c6("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=a,a.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",a=>this._onClose("transport close",a))}onOpen(){c6("socket open"),this.readyState="open",c9.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush()}_onPacket(a){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(c6('socket receive: type "%s", data "%s"',a.type,a.data),this.emitReserved("packet",a),this.emitReserved("heartbeat"),a.type){case"open":this.onHandshake(JSON.parse(a.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":let b=Error("server error");b.code=a.data,this._onError(b);break;case"message":this.emitReserved("data",a.data),this.emitReserved("message",a.data)}else c6('packet received with socket readyState "%s"',this.readyState)}onHandshake(a){this.emitReserved("handshake",a),this.id=a.sid,this.transport.query.sid=a.sid,this._pingInterval=a.pingInterval,this._pingTimeout=a.pingTimeout,this._maxPayload=a.maxPayload,this.onOpen(),"closed"!==this.readyState&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);let a=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+a,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},a),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){let a=this._getWritablePackets();c6("flushing %d packets in socket",a.length),this.transport.send(a),this._prevBufferLen=a.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let a=1;for(let b=0;b<this.writeBuffer.length;b++){let c=this.writeBuffer[b].data;if(c&&(a+="string"==typeof c?function(a){let b=0,c=0;for(let d=0,e=a.length;d<e;d++)(b=a.charCodeAt(d))<128?c+=1:b<2048?c+=2:b<55296||b>=57344?c+=3:(d++,c+=4);return c}(c):Math.ceil(1.33*(c.byteLength||c.size))),b>0&&a>this._maxPayload)return c6("only send %d out of %d packets",b,this.writeBuffer.length),this.writeBuffer.slice(0,b);a+=2}return c6("payload size is %d (max: %d)",a,this._maxPayload),this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;let a=Date.now()>this._pingTimeoutTime;return a&&(c6("throttled timer detected, scheduling connection close"),this._pingTimeoutTime=0,cD(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),a}write(a,b,c){return this._sendPacket("message",a,b,c),this}send(a,b,c){return this._sendPacket("message",a,b,c),this}_sendPacket(a,b,c,d){if("function"==typeof b&&(d=b,b=void 0),"function"==typeof c&&(d=c,c=null),"closing"===this.readyState||"closed"===this.readyState)return;(c=c||{}).compress=!1!==c.compress;let e={type:a,data:b,options:c};this.emitReserved("packetCreate",e),this.writeBuffer.push(e),d&&this.once("flush",d),this.flush()}close(){let a=()=>{this._onClose("forced close"),c6("socket closing - telling transport to close"),this.transport.close()},b=()=>{this.off("upgrade",b),this.off("upgradeError",b),a()},c=()=>{this.once("upgrade",b),this.once("upgradeError",b)};return("opening"===this.readyState||"open"===this.readyState)&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?c():a()}):this.upgrading?c():a()),this}_onError(a){if(c6("socket error %j",a),c9.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&"opening"===this.readyState)return c6("trying next transport"),this.transports.shift(),this._open();this.emitReserved("error",a),this._onClose("transport error",a)}_onClose(a,b){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){if(c6('socket close with reason: "%s"',a),this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),c7&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){let a=c8.indexOf(this._offlineEventListener);-1!==a&&(c6("removing listener for the 'offline' event"),c8.splice(a,1))}this.readyState="closed",this.id=null,this.emitReserved("close",a,b),this.writeBuffer=[],this._prevBufferLen=0}}}c9.protocol=4;class da extends c9{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),"open"===this.readyState&&this.opts.upgrade){c6("starting upgrade probes");for(let a=0;a<this._upgrades.length;a++)this._probe(this._upgrades[a])}}_probe(a){c6('probing transport "%s"',a);let b=this.createTransport(a),c=!1;c9.priorWebsocketSuccess=!1;let d=()=>{c||(c6('probe transport "%s" opened',a),b.send([{type:"ping",data:"probe"}]),b.once("packet",d=>{if(!c)if("pong"===d.type&&"probe"===d.data){if(c6('probe transport "%s" pong',a),this.upgrading=!0,this.emitReserved("upgrading",b),!b)return;c9.priorWebsocketSuccess="websocket"===b.name,c6('pausing current transport "%s"',this.transport.name),this.transport.pause(()=>{c||"closed"!==this.readyState&&(c6("changing transport and sending upgrade packet"),j(),this.setTransport(b),b.send([{type:"upgrade"}]),this.emitReserved("upgrade",b),b=null,this.upgrading=!1,this.flush())})}else{c6('probe transport "%s" failed',a);let c=Error("probe error");c.transport=b.name,this.emitReserved("upgradeError",c)}}))};function e(){c||(c=!0,j(),b.close(),b=null)}let f=c=>{let d=Error("probe error: "+c);d.transport=b.name,e(),c6('probe transport "%s" failed because of error: %s',a,c),this.emitReserved("upgradeError",d)};function g(){f("transport closed")}function h(){f("socket closed")}function i(a){b&&a.name!==b.name&&(c6('"%s" works - aborting "%s"',a.name,b.name),e())}let j=()=>{b.removeListener("open",d),b.removeListener("error",f),b.removeListener("close",g),this.off("close",h),this.off("upgrading",i)};b.once("open",d),b.once("error",f),b.once("close",g),this.once("close",h),this.once("upgrading",i),-1!==this._upgrades.indexOf("webtransport")&&"webtransport"!==a?this.setTimeoutFn(()=>{c||b.open()},200):b.open()}onHandshake(a){this._upgrades=this._filterUpgrades(a.upgrades),super.onHandshake(a)}_filterUpgrades(a){let b=[];for(let c=0;c<a.length;c++)~this.transports.indexOf(a[c])&&b.push(a[c]);return b}}class db extends da{constructor(a,b={}){const c="object"==typeof a,d=c?{...a}:{...b};(!d.transports||d.transports&&"string"==typeof d.transports[0])&&(d.transports=(d.transports||["polling","websocket","webtransport"]).map(a=>c2[a]).filter(a=>!!a)),super(c?d:a,d)}}db.protocol;let dc=(0,cL.default)("socket.io-client:url"),dd="function"==typeof ArrayBuffer,de=Object.prototype.toString,df="function"==typeof Blob||"u">typeof Blob&&"[object BlobConstructor]"===de.call(Blob),dg="function"==typeof File||"u">typeof File&&"[object FileConstructor]"===de.call(File);function dh(a){return dd&&(a instanceof ArrayBuffer||("function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(a):a.buffer instanceof ArrayBuffer))||df&&a instanceof Blob||dg&&a instanceof File}let di=(0,cL.default)("socket.io-parser"),dj=["connect","connect_error","disconnect","disconnecting","newListener","removeListener"];(f=g||(g={}))[f.CONNECT=0]="CONNECT",f[f.DISCONNECT=1]="DISCONNECT",f[f.EVENT=2]="EVENT",f[f.ACK=3]="ACK",f[f.CONNECT_ERROR=4]="CONNECT_ERROR",f[f.BINARY_EVENT=5]="BINARY_EVENT",f[f.BINARY_ACK=6]="BINARY_ACK";class dk{constructor(a){this.replacer=a}encode(a){return(di("encoding packet %j",a),(a.type===g.EVENT||a.type===g.ACK)&&function a(b,c){if(!b||"object"!=typeof b)return!1;if(Array.isArray(b)){for(let c=0,d=b.length;c<d;c++)if(a(b[c]))return!0;return!1}if(dh(b))return!0;if(b.toJSON&&"function"==typeof b.toJSON&&1==arguments.length)return a(b.toJSON(),!0);for(let c in b)if(Object.prototype.hasOwnProperty.call(b,c)&&a(b[c]))return!0;return!1}(a))?this.encodeAsBinary({type:a.type===g.EVENT?g.BINARY_EVENT:g.BINARY_ACK,nsp:a.nsp,data:a.data,id:a.id}):[this.encodeAsString(a)]}encodeAsString(a){let b=""+a.type;return(a.type===g.BINARY_EVENT||a.type===g.BINARY_ACK)&&(b+=a.attachments+"-"),a.nsp&&"/"!==a.nsp&&(b+=a.nsp+","),null!=a.id&&(b+=a.id),null!=a.data&&(b+=JSON.stringify(a.data,this.replacer)),di("encoded %j as %s",a,b),b}encodeAsBinary(a){let b,c,d=(b=[],c=a.data,a.data=function a(b,c,d){if(!b)return b;if(dh(b)){let a={_placeholder:!0,num:c.length};return c.push(b),a}if(Array.isArray(b)){let d=Array(b.length);for(let e=0;e<b.length;e++)d[e]=a(b[e],c);return d}if("object"==typeof b&&!(b instanceof Date)){if(b.toJSON&&"function"==typeof b.toJSON&&!d)return a(b.toJSON(),c,!0);let e={};for(let d in b)Object.prototype.hasOwnProperty.call(b,d)&&(e[d]=a(b[d],c));return e}return b}(c,b),a.attachments=b.length,{packet:a,buffers:b}),e=this.encodeAsString(d.packet),f=d.buffers;return f.unshift(e),f}}class dl extends cC{constructor(a){super(),this.opts=Object.assign({reviver:void 0,maxAttachments:10},"function"==typeof a?{reviver:a}:a)}add(a){let b;if("string"==typeof a){if(this.reconstructor)throw Error("got plaintext data when reconstructing a packet");let c=(b=this.decodeString(a)).type===g.BINARY_EVENT;c||b.type===g.BINARY_ACK?(b.type=c?g.EVENT:g.ACK,this.reconstructor=new dm(b)):super.emitReserved("decoded",b)}else if(dh(a)||a.base64)if(this.reconstructor)(b=this.reconstructor.takeBinaryData(a))&&(this.reconstructor=null,super.emitReserved("decoded",b));else throw Error("got binary data when not reconstructing a packet");else throw Error("Unknown type: "+a)}decodeString(a){let b=0,c={type:Number(a.charAt(0))};if(void 0===g[c.type])throw Error("unknown packet type "+c.type);if(c.type===g.BINARY_EVENT||c.type===g.BINARY_ACK){let d=b+1;for(;"-"!==a.charAt(++b)&&b!=a.length;);let e=a.substring(d,b);if(e!=Number(e)||"-"!==a.charAt(b))throw Error("Illegal attachments");let f=Number(e);if(!dn(f)||f<1)throw Error("Illegal attachments");if(f>this.opts.maxAttachments)throw Error("too many attachments");c.attachments=f}if("/"===a.charAt(b+1)){let d=b+1;for(;++b&&","!==a.charAt(b)&&b!==a.length;);c.nsp=a.substring(d,b)}else c.nsp="/";let d=a.charAt(b+1);if(""!==d&&Number(d)==d){let d=b+1;for(;++b;){let c=a.charAt(b);if(null==c||Number(c)!=c){--b;break}if(b===a.length)break}c.id=Number(a.substring(d,b+1))}if(a.charAt(++b)){let d=this.tryParse(a.substr(b));if(dl.isPayloadValid(c.type,d))c.data=d;else throw Error("invalid payload")}return di("decoded %s as %j",a,c),c}tryParse(a){try{return JSON.parse(a,this.opts.reviver)}catch(a){return!1}}static isPayloadValid(a,b){switch(a){case g.CONNECT:return dp(b);case g.DISCONNECT:return void 0===b;case g.CONNECT_ERROR:return"string"==typeof b||dp(b);case g.EVENT:case g.BINARY_EVENT:return Array.isArray(b)&&("number"==typeof b[0]||"string"==typeof b[0]&&-1===dj.indexOf(b[0]));case g.ACK:case g.BINARY_ACK:return Array.isArray(b)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}class dm{constructor(a){this.packet=a,this.buffers=[],this.reconPack=a}takeBinaryData(a){if(this.buffers.push(a),this.buffers.length===this.reconPack.attachments){var b,c;let a=(b=this.reconPack,c=this.buffers,b.data=function a(b,c){if(!b)return b;if(b&&!0===b._placeholder){if("number"==typeof b.num&&b.num>=0&&b.num<c.length)return c[b.num];throw Error("illegal attachments")}if(Array.isArray(b))for(let d=0;d<b.length;d++)b[d]=a(b[d],c);else if("object"==typeof b)for(let d in b)Object.prototype.hasOwnProperty.call(b,d)&&(b[d]=a(b[d],c));return b}(b.data,c),delete b.attachments,b);return this.finishedReconstruction(),a}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}let dn=Number.isInteger||function(a){return"number"==typeof a&&isFinite(a)&&Math.floor(a)===a};function dp(a){return"[object Object]"===Object.prototype.toString.call(a)}function dq(a){var b;return"string"==typeof a.nsp&&(void 0===(b=a.id)||dn(b))&&function(a,b){switch(a){case g.CONNECT:return void 0===b||dp(b);case g.DISCONNECT:return void 0===b;case g.EVENT:return Array.isArray(b)&&("number"==typeof b[0]||"string"==typeof b[0]&&-1===dj.indexOf(b[0]));case g.ACK:return Array.isArray(b);case g.CONNECT_ERROR:return"string"==typeof b||dp(b);default:return!1}}(a.type,a.data)}function dr(a,b,c){return a.on(b,c),function(){a.off(b,c)}}a.s(["Decoder",()=>dl,"Encoder",()=>dk,"PacketType",()=>g,"isPacketValid",()=>dq,"protocol",0,5],10419);let ds=(0,cL.default)("socket.io-client:socket"),dt=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class du extends cC{constructor(a,b,c){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=a,this.nsp=b,c&&c.auth&&(this.auth=c.auth),this._opts=Object.assign({},c),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;let a=this.io;this.subs=[dr(a,"open",this.onopen.bind(this)),dr(a,"packet",this.onpacket.bind(this)),dr(a,"error",this.onerror.bind(this)),dr(a,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}open(){return this.connect()}send(...a){return a.unshift("message"),this.emit.apply(this,a),this}emit(a,...b){var c,d,e;if(dt.hasOwnProperty(a))throw Error('"'+a.toString()+'" is a reserved event name');if(b.unshift(a),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(b),this;let f={type:g.EVENT,data:b};if(f.options={},f.options.compress=!1!==this.flags.compress,"function"==typeof b[b.length-1]){let a=this.ids++;ds("emitting packet with ack id %d",a);let c=b.pop();this._registerAckCallback(a,c),f.id=a}let h=null==(d=null==(c=this.io.engine)?void 0:c.transport)?void 0:d.writable,i=this.connected&&!(null==(e=this.io.engine)?void 0:e._hasPingExpired());return this.flags.volatile&&!h?ds("discard packet as the transport is not currently writable"):i?(this.notifyOutgoingListeners(f),this.packet(f)):this.sendBuffer.push(f),this.flags={},this}_registerAckCallback(a,b){var c;let d=null!=(c=this.flags.timeout)?c:this._opts.ackTimeout;if(void 0===d){this.acks[a]=b;return}let e=this.io.setTimeoutFn(()=>{delete this.acks[a];for(let b=0;b<this.sendBuffer.length;b++)this.sendBuffer[b].id===a&&(ds("removing packet with ack id %d from the buffer",a),this.sendBuffer.splice(b,1));ds("event with ack id %d has timed out after %d ms",a,d),b.call(this,Error("operation has timed out"))},d),f=(...a)=>{this.io.clearTimeoutFn(e),b.apply(this,a)};f.withError=!0,this.acks[a]=f}emitWithAck(a,...b){return new Promise((c,d)=>{let e=(a,b)=>a?d(a):c(b);e.withError=!0,b.push(e),this.emit(a,...b)})}_addToQueue(a){let b;"function"==typeof a[a.length-1]&&(b=a.pop());let c={id:this._queueSeq++,tryCount:0,pending:!1,args:a,flags:Object.assign({fromQueue:!0},this.flags)};a.push((a,...d)=>c!==this._queue[0]?ds("packet [%d] already acknowledged",c.id):(null!==a?c.tryCount>this._opts.retries&&(ds("packet [%d] is discarded after %d tries",c.id,c.tryCount),this._queue.shift(),b&&b(a)):(ds("packet [%d] was successfully sent",c.id),this._queue.shift(),b&&b(null,...d)),c.pending=!1,this._drainQueue())),this._queue.push(c),this._drainQueue()}_drainQueue(a=!1){if(ds("draining queue"),!this.connected||0===this._queue.length)return;let b=this._queue[0];b.pending&&!a?ds("packet [%d] has already been sent and is waiting for an ack",b.id):(b.pending=!0,b.tryCount++,ds("sending packet [%d] (try n°%d)",b.id,b.tryCount),this.flags=b.flags,this.emit.apply(this,b.args))}packet(a){a.nsp=this.nsp,this.io._packet(a)}onopen(){ds("transport is open - connecting"),"function"==typeof this.auth?this.auth(a=>{this._sendConnectPacket(a)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(a){this.packet({type:g.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},a):a})}onerror(a){this.connected||this.emitReserved("connect_error",a)}onclose(a,b){ds("close (%s)",a),this.connected=!1,delete this.id,this.emitReserved("disconnect",a,b),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(a=>{if(!this.sendBuffer.some(b=>String(b.id)===a)){let b=this.acks[a];delete this.acks[a],b.withError&&b.call(this,Error("socket has been disconnected"))}})}onpacket(a){if(a.nsp===this.nsp)switch(a.type){case g.CONNECT:a.data&&a.data.sid?this.onconnect(a.data.sid,a.data.pid):this.emitReserved("connect_error",Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case g.EVENT:case g.BINARY_EVENT:this.onevent(a);break;case g.ACK:case g.BINARY_ACK:this.onack(a);break;case g.DISCONNECT:this.ondisconnect();break;case g.CONNECT_ERROR:this.destroy();let b=Error(a.data.message);b.data=a.data.data,this.emitReserved("connect_error",b)}}onevent(a){let b=a.data||[];ds("emitting event %j",b),null!=a.id&&(ds("attaching ack callback to event"),b.push(this.ack(a.id))),this.connected?this.emitEvent(b):this.receiveBuffer.push(Object.freeze(b))}emitEvent(a){if(this._anyListeners&&this._anyListeners.length)for(let b of this._anyListeners.slice())b.apply(this,a);super.emit.apply(this,a),this._pid&&a.length&&"string"==typeof a[a.length-1]&&(this._lastOffset=a[a.length-1])}ack(a){let b=this,c=!1;return function(...d){c||(c=!0,ds("sending ack %j",d),b.packet({type:g.ACK,id:a,data:d}))}}onack(a){let b=this.acks[a.id];"function"!=typeof b?ds("bad ack %s",a.id):(delete this.acks[a.id],ds("calling ack %s with %j",a.id,a.data),b.withError&&a.data.unshift(null),b.apply(this,a.data))}onconnect(a,b){ds("socket connected with id %s",a),this.id=a,this.recovered=b&&this._pid===b,this._pid=b,this.connected=!0,this.emitBuffered(),this._drainQueue(!0),this.emitReserved("connect")}emitBuffered(){this.receiveBuffer.forEach(a=>this.emitEvent(a)),this.receiveBuffer=[],this.sendBuffer.forEach(a=>{this.notifyOutgoingListeners(a),this.packet(a)}),this.sendBuffer=[]}ondisconnect(){ds("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(a=>a()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&(ds("performing disconnect (%s)",this.nsp),this.packet({type:g.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(a){return this.flags.compress=a,this}get volatile(){return this.flags.volatile=!0,this}timeout(a){return this.flags.timeout=a,this}onAny(a){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(a),this}prependAny(a){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(a),this}offAny(a){if(!this._anyListeners)return this;if(a){let b=this._anyListeners;for(let c=0;c<b.length;c++)if(a===b[c]){b.splice(c,1);break}}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(a){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(a),this}prependAnyOutgoing(a){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(a),this}offAnyOutgoing(a){if(!this._anyOutgoingListeners)return this;if(a){let b=this._anyOutgoingListeners;for(let c=0;c<b.length;c++)if(a===b[c]){b.splice(c,1);break}}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(a){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length)for(let b of this._anyOutgoingListeners.slice())b.apply(this,a.data)}}var dv=a.i(10419);function dw(a){a=a||{},this.ms=a.min||100,this.max=a.max||1e4,this.factor=a.factor||2,this.jitter=a.jitter>0&&a.jitter<=1?a.jitter:0,this.attempts=0}dw.prototype.duration=function(){var a=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var b=Math.random(),c=Math.floor(b*this.jitter*a);a=(1&Math.floor(10*b))==0?a-c:a+c}return 0|Math.min(a,this.max)},dw.prototype.reset=function(){this.attempts=0},dw.prototype.setMin=function(a){this.ms=a},dw.prototype.setMax=function(a){this.max=a},dw.prototype.setJitter=function(a){this.jitter=a};let dx=(0,cL.default)("socket.io-client:manager");class dy extends cC{constructor(a,b){var c;super(),this.nsps={},this.subs=[],a&&"object"==typeof a&&(b=a,a=void 0),(b=b||{}).path=b.path||"/socket.io",this.opts=b,cJ(this,b),this.reconnection(!1!==b.reconnection),this.reconnectionAttempts(b.reconnectionAttempts||1/0),this.reconnectionDelay(b.reconnectionDelay||1e3),this.reconnectionDelayMax(b.reconnectionDelayMax||5e3),this.randomizationFactor(null!=(c=b.randomizationFactor)?c:.5),this.backoff=new dw({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==b.timeout?2e4:b.timeout),this._readyState="closed",this.uri=a;const d=b.parser||dv;this.encoder=new d.Encoder,this.decoder=new d.Decoder,this._autoConnect=!1!==b.autoConnect,this._autoConnect&&this.open()}reconnection(a){return arguments.length?(this._reconnection=!!a,a||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(a){return void 0===a?this._reconnectionAttempts:(this._reconnectionAttempts=a,this)}reconnectionDelay(a){var b;return void 0===a?this._reconnectionDelay:(this._reconnectionDelay=a,null==(b=this.backoff)||b.setMin(a),this)}randomizationFactor(a){var b;return void 0===a?this._randomizationFactor:(this._randomizationFactor=a,null==(b=this.backoff)||b.setJitter(a),this)}reconnectionDelayMax(a){var b;return void 0===a?this._reconnectionDelayMax:(this._reconnectionDelayMax=a,null==(b=this.backoff)||b.setMax(a),this)}timeout(a){return arguments.length?(this._timeout=a,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(a){if(dx("readyState %s",this._readyState),~this._readyState.indexOf("open"))return this;dx("opening %s",this.uri),this.engine=new db(this.uri,this.opts);let b=this.engine,c=this;this._readyState="opening",this.skipReconnect=!1;let d=dr(b,"open",function(){c.onopen(),a&&a()}),e=b=>{dx("error"),this.cleanup(),this._readyState="closed",this.emitReserved("error",b),a?a(b):this.maybeReconnectOnOpen()},f=dr(b,"error",e);if(!1!==this._timeout){let a=this._timeout;dx("connect attempt will timeout after %d",a);let c=this.setTimeoutFn(()=>{dx("connect attempt timed out after %d",a),d(),e(Error("timeout")),b.close()},a);this.opts.autoUnref&&c.unref(),this.subs.push(()=>{this.clearTimeoutFn(c)})}return this.subs.push(d),this.subs.push(f),this}connect(a){return this.open(a)}onopen(){dx("open"),this.cleanup(),this._readyState="open",this.emitReserved("open");let a=this.engine;this.subs.push(dr(a,"ping",this.onping.bind(this)),dr(a,"data",this.ondata.bind(this)),dr(a,"error",this.onerror.bind(this)),dr(a,"close",this.onclose.bind(this)),dr(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(a){try{this.decoder.add(a)}catch(a){this.onclose("parse error",a)}}ondecoded(a){cD(()=>{this.emitReserved("packet",a)},this.setTimeoutFn)}onerror(a){dx("error",a),this.emitReserved("error",a)}socket(a,b){let c=this.nsps[a];return c?this._autoConnect&&!c.active&&c.connect():(c=new du(this,a,b),this.nsps[a]=c),c}_destroy(a){for(let a of Object.keys(this.nsps))if(this.nsps[a].active)return void dx("socket %s is still active, skipping close",a);this._close()}_packet(a){dx("writing packet %j",a);let b=this.encoder.encode(a);for(let c=0;c<b.length;c++)this.engine.write(b[c],a.options)}cleanup(){dx("cleanup"),this.subs.forEach(a=>a()),this.subs.length=0,this.decoder.destroy()}_close(){dx("disconnect"),this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(a,b){var c;dx("closed due to %s",a),this.cleanup(),null==(c=this.engine)||c.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",a,b),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;let a=this;if(this.backoff.attempts>=this._reconnectionAttempts)dx("reconnect failed"),this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{let b=this.backoff.duration();dx("will wait %dms before reconnect attempt",b),this._reconnecting=!0;let c=this.setTimeoutFn(()=>{a.skipReconnect||(dx("attempting reconnect"),this.emitReserved("reconnect_attempt",a.backoff.attempts),a.skipReconnect||a.open(b=>{b?(dx("reconnect attempt error"),a._reconnecting=!1,a.reconnect(),this.emitReserved("reconnect_error",b)):(dx("reconnect success"),a.onreconnect())}))},b);this.opts.autoUnref&&c.unref(),this.subs.push(()=>{this.clearTimeoutFn(c)})}}onreconnect(){let a=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",a)}}let dz=(0,cL.default)("socket.io-client"),dA={};function dB(a,b){let c;"object"==typeof a&&(b=a,a=void 0);let d=function(a,b="",c){let d=a;c=c||"u">typeof location&&location,null==a&&(a=c.protocol+"//"+c.host),"string"==typeof a&&("/"===a.charAt(0)&&(a="/"===a.charAt(1)?c.protocol+a:c.host+a),/^(https?|wss?):\/\//.test(a)||(dc("protocol-less url %s",a),a=void 0!==c?c.protocol+"//"+a:"https://"+a),dc("parse %s",a),d=c5(a)),!d.port&&(/^(http|ws)$/.test(d.protocol)?d.port="80":/^(http|ws)s$/.test(d.protocol)&&(d.port="443")),d.path=d.path||"/";let e=-1!==d.host.indexOf(":")?"["+d.host+"]":d.host;return d.id=d.protocol+"://"+e+":"+d.port+b,d.href=d.protocol+"://"+e+(c&&c.port===d.port?"":":"+d.port),d}(a,(b=b||{}).path||"/socket.io"),e=d.source,f=d.id,g=d.path,h=dA[f]&&g in dA[f].nsps;return b.forceNew||b["force new connection"]||!1===b.multiplex||h?(dz("ignoring socket cache for %s",e),c=new dy(e,b)):(dA[f]||(dz("new io instance for %s",e),dA[f]=new dy(e,b)),c=dA[f]),d.query&&!b.query&&(b.query=d.queryKey),c.socket(d.path,b)}function dC(a){if(a&&"object"==typeof a&&"clientId"in a){let b=a.clientId;if("string"==typeof b)return b}}function dD(a){let{url:b,role:c,docId:d,name:e,token:f}=a,g=!1!==a.autoResync,h=dB(b,{auth:{token:f},autoConnect:!1}),i="disconnected",j=0,k="",l=[],m={patch:new Set,full:new Set,ack:new Set,presence:new Set,error:new Set,status:new Set,view:new Set,"stage-step":new Set,"stage-load":new Set,"stage-control":new Set,"stage-context":new Set,marks:new Set};function n(a,b){for(let c of[...m[a]])c(b)}function o(a){i!==a&&(i=a,n("status",a))}function p(a){h.emit("def:request",{docId:d,sinceSeq:a})}function q(a){"number"==typeof a&&(g&&a>j+1&&p(j),j=Math.max(j,a))}function r(){n("presence",[...l])}function s(){return h.connected?Promise.resolve():new Promise((a,b)=>{o("connecting");let c=()=>{e(),a()},d=a=>{e(),b(a)},e=()=>{h.off("connect",c),h.off("connect_error",d)};h.once("connect",c),h.once("connect_error",d),h.connect()})}async function t(){return await s(),new Promise((a,b)=>{h.emit("bridge:join",{docId:d,role:c,name:e},c=>{if(!c||c.error){let a=c?.error??{code:"join_failed",message:"no join ack"};n("error",a),b(Error(`${a.code}: ${a.message}`));return}k=c.selfId,l=c.presence?[...c.presence]:[],j=c.snapshot?.seq??0,r(),a({selfId:k,snapshot:c.snapshot,presence:[...l]})})})}async function u(a){await s(),h.emit("view:show",{...a,docId:a.docId??d,origin:a.origin??(e||c)})}async function v(a){return await s(),new Promise((b,c)=>{h.emit("stage:join",{stage:a},a=>{if(!a||a.error||!a.state){let b=a?.error??{code:"stage_join_failed",message:"no stage join ack"};n("error",b),c(Error(`${b.code}: ${b.message}`));return}a.selfId&&(k=a.selfId),b({selfId:a.selfId??k,state:a.state})})})}async function w(a){await s(),h.emit("stage:step",{...a,origin:a.origin??(e||c)})}async function x(a){await s(),h.emit("stage:load",{...a,origin:a.origin??(e||c)})}async function y(a){await s(),h.emit("stage:control",{...a,origin:a.origin??(e||c)})}async function z(a){await s(),h.emit("marks:changed",{...a,origin:a.origin??(e||c)})}return h.on("connect",()=>o("connected")),h.on("disconnect",()=>o("disconnected")),h.on("connect_error",a=>{o("error"),n("error",{code:"connect_error",message:a?.message??String(a)})}),h.on("def:patch",a=>{q(a?.seq),a?.origin&&a.origin===k||n("patch",a)}),h.on("def:full",a=>{q(a?.seq),a?.origin&&a.origin===k||n("full",a)}),h.on("def:ack",a=>{n("ack",a)}),h.on("view:show",a=>{n("view",a)}),h.on("stage:step",a=>n("stage-step",a)),h.on("stage:load",a=>n("stage-load",a)),h.on("stage:control",a=>n("stage-control",a)),h.on("stage:context",a=>n("stage-context",a)),h.on("marks:changed",a=>n("marks",a)),h.on("bridge:error",a=>{n("error",{code:a?.code??"error",message:a?.message??""})}),h.on("presence:list",a=>{l=Array.isArray(a)?[...a]:[],r()}),h.on("presence:join",a=>{let b=dC(a);b&&(l=[...l.filter(a=>a.clientId!==b),a],r())}),h.on("presence:leave",a=>{let b=dC(a);b&&(l=l.filter(a=>a.clientId!==b),r())}),h.on("presence:update",a=>{let b=dC(a);if(!b)return;let c=l.findIndex(a=>a.clientId===b);if(-1===c)l=[...l,a];else{let b={...l[c],...a};l=l.map((a,d)=>d===c?b:a)}r()}),{connect:s,join:t,emitPatch:function(a,b,c){h.emit("def:patch",{docId:d,ops:a,origin:k,baseSeq:c,mtime:b})},emitFull:function(a,b){h.emit("def:full",{docId:d,def:a,origin:k,mtime:b})},request:p,updatePresence:function(a){h.emit("presence:update",{docId:d,clientId:k,cursor:a.cursor,selection:a.selection})},emitView:u,joinStage:v,leaveStage:function(a){h.connected&&h.emit("stage:leave",{stage:a})},emitStep:w,emitLoad:x,emitControl:y,emitContext:function(a){h.connected&&h.emit("stage:context",{...a,at:a.at??new Date().toISOString()})},emitMarks:z,on:function(a,b){let c=m[a];return c.add(b),()=>c.delete(b)},disconnect:function(){h.connected&&k&&h.emit("bridge:leave",{docId:d,clientId:k}),h.disconnect(),o("disconnected")},get status(){return i},get lastSeq(){return j},get presence(){return[...l]}}}function dE(a){return"runtime.enter"===a.op||"runtime.exit"===a.op}function dF(a){let{onFull:b,onPatch:c,onPresence:d,...e}=a,f=dD(e),g=null,h=0,i=[],j=[],k={status:f.status,def:null,seq:0,presence:[],activeStates:[]},l=new Set;function m(){for(let a of(k={status:f.status,def:g,seq:h,presence:i,activeStates:j},[...l]))a()}return f.on("status",()=>m()),f.on("full",a=>{g=a.def,"number"==typeof a.seq&&(h=a.seq),b?.(a),m()}),f.on("patch",a=>{"number"==typeof a.seq&&(h=a.seq);let b=a.ops??[],d=b.filter(dE),e=b.filter(a=>!dE(a));e.length>0&&g&&(g=n(g,e));for(let a of d)"runtime.enter"===a.op?j.includes(a.state)||(j=[...j,a.state]):"runtime.exit"===a.op&&j.includes(a.state)&&(j=j.filter(b=>b!==a.state));c?.(a),m()}),f.on("presence",a=>{i=a,d?.(a),m()}),{getSnapshot:function(){return k},subscribe:function(a){return l.add(a),()=>{l.delete(a)}},emitPatch:function(a){f.emitPatch(a)},emitFull:function(a){f.emitFull(a)},enter:function(a,b,c){let d={op:"runtime.enter",state:a,...void 0!==b?{from:b}:{},...void 0!==c?{eventId:c}:{}};f.emitPatch([d])},exit:function(a){f.emitPatch([{op:"runtime.exit",state:a}])},connect:function(){f.join().then(a=>{g=a.snapshot.def,h=a.snapshot.seq,i=a.presence,null!==g&&b?.({docId:a.snapshot.docId,def:g,seq:h,mtime:a.snapshot.mtime,origin:"join"}),m()}).catch(()=>{m()})},disconnect:function(){f.disconnect()}}}function dG(a={}){return null}Object.assign(dB,{Manager:dy,Socket:du,io:dB,connect:dB});function dH(a,b){let c=new DataView(new ArrayBuffer(44)),d=(a,b)=>[...b].forEach((b,d)=>c.setUint8(a+d,b.charCodeAt(0)));return d(0,"RIFF"),c.setUint32(4,36+a,!0),d(8,"WAVE"),d(12,"fmt "),c.setUint32(16,16,!0),c.setUint16(20,1,!0),c.setUint16(22,1,!0),c.setUint32(24,b,!0),c.setUint32(28,2*b,!0),c.setUint16(32,2,!0),c.setUint16(34,16,!0),d(36,"data"),c.setUint32(40,a,!0),c.buffer}let dI=a=>a>=1048576?`${(a/1048576).toFixed(1)} MB`:`${Math.max(1,Math.round(a/1024))} KB`;function dJ(){return{settings:{namespace:"MyApp",name:"MyStateMachine",asynchronous:!1},events:[{name:"Internal",events:[]}],state:{name:"Root",states:[{name:"Idle",kind:"normal"},{name:"End",kind:"final"}]}}}function dK(){return{positions:{}}}function dL(a,b){if(a.name===b)return a;for(let c of a.states??[]){let a=dL(c,b);if(a)return a}return null}function dM(a,b,c){return a.name===b?c(a)??a:{...a,states:a.states?.map(a=>dM(a,b,c))}}function dN(a,b){return{...a,states:a.states?.filter(a=>a.name!==b).map(a=>dN(a,b))}}function dO(a){let b=[a.name];for(let c of a.states??[])b.push(...dO(c));return b}function dP(a){return a.events.flatMap(a=>(a.events??[]).map(a=>a.id))}function dQ(a){let b=[],c=dO(a.state),d=dP(a);0===d.length&&b.push({ruleId:"V001",message:"No events defined"});let e=new Set;for(let a of c)e.has(a)&&b.push({ruleId:"V002",message:`Duplicate state name: ${a}`,element:a}),e.add(a);!function a(e){for(let a of e.transitions??[])d.includes(a.event)||b.push({ruleId:"V003",message:`Transition in '${e.name}' references unknown event '${a.event}'`,element:e.name}),a.nextState&&!c.includes(a.nextState)&&b.push({ruleId:"V004",message:`Transition in '${e.name}' targets unknown state '${a.nextState}'`,element:e.name});for(let c of("final"===e.kind&&(e.transitions?.length??0)>0&&b.push({ruleId:"V007",message:`Final state '${e.name}' must not have outgoing transitions`,element:e.name}),"final"===e.kind&&(e.states?.length??0)>0&&b.push({ruleId:"V008",message:`Final state '${e.name}' must not have child states`,element:e.name}),e.states??[]))a(c)}(a.state),a.state.states&&0!==a.state.states.length||b.push({ruleId:"V005",message:"Root state must have at least one child state",element:a.state.name});let f=new Set;for(let a of d)f.has(a)&&b.push({ruleId:"V003",message:`Duplicate event ID: ${a}`,element:a}),f.add(a);return b}function dR(a,b){return{positions:{...x(a),...b.positions}}}let dS=!1,dT=(e=(a,b)=>({definition:dJ(),layout:dR(dJ(),dK()),viewport:{...M},fileName:null,docPath:null,dirty:!1,remoteMtime:null,remoteStatus:"idle",remoteMessage:null,activeStates:[],presence:[],_applyingRemote:!1,selection:{kind:null,id:null},drawMode:"select",drawSource:null,contextMenu:{visible:!1,x:0,y:0,target:null},undoStack:[],redoStack:[],activeTab:"properties",errors:[],showCodePreview:!1,generatedCode:null,navigationPath:["Root"],currentParent:"Root",_pushHistory:()=>{let{definition:c,layout:d,undoStack:e}=b(),f={definition:JSON.parse(JSON.stringify(c)),layout:JSON.parse(JSON.stringify(d))};a({undoStack:[...e.slice(-50),f],redoStack:[]})},setDefinition:c=>{b()._pushHistory();let d=dR(c,b().layout);a({definition:c,layout:d,dirty:!0,errors:dQ(c)})},updateSettings:c=>{b()._pushHistory(),a({definition:{...b().definition,settings:{...b().definition.settings,...c}},dirty:!0})},addState:(c,d)=>{b()._pushHistory();let e={...b().definition},f=c??e.state.name;e.state=dM(e.state,f,a=>({...a,states:[...a.states??[],d]}));let g=dR(e,b().layout);a({definition:e,layout:g,dirty:!0,errors:dQ(e)})},updateState:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dM(e.state,c,a=>({...a,...d})),a({definition:e,dirty:!0,errors:dQ(e)})},removeState:c=>{b()._pushHistory();let d={...b().definition};d.state=dN(d.state,c);let e={positions:{...b().layout.positions}};delete e.positions[c],a({definition:d,layout:e,dirty:!0,errors:dQ(d)})},nestState:(c,d)=>{b()._pushHistory();let e={...b().definition},f=dL(e.state,c);if(!f||c===d)return;let g=JSON.parse(JSON.stringify(f));e.state=dN(e.state,c),e.state=dM(e.state,d,a=>({...a,states:[...a.states??[],g]})),a({definition:e,dirty:!0,errors:dQ(e)})},addEventSource:c=>{b()._pushHistory(),a({definition:{...b().definition,events:[...b().definition.events,c]},dirty:!0})},updateEventSource:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map((a,b)=>b===c?{...a,...d}:a),a({definition:e,dirty:!0})},removeEventSource:c=>{b()._pushHistory();let d={...b().definition};d.events=d.events.filter((a,b)=>b!==c),a({definition:d,dirty:!0,errors:dQ(d)})},addEvent:(c,d=0)=>{b()._pushHistory();let e={...b().definition},f=e.events[d]??{name:"Internal",events:[]};f.events=[...f.events??[],c],e.events=e.events.map((a,b)=>b===d?f:a),a({definition:e,dirty:!0,errors:dQ(e)})},updateEvent:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,...d}:a)})),a({definition:e,dirty:!0})},removeEvent:c=>{b()._pushHistory();let d={...b().definition};d.events=d.events.map(a=>({...a,events:a.events?.filter(a=>a.id!==c)})),a({definition:d,dirty:!0,errors:dQ(d)})},addParameter:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:[...a.parameters??[],d]}:a)})),a({definition:e,dirty:!0})},removeParameter:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:a.parameters?.filter((a,b)=>b!==d)}:a)})),a({definition:e,dirty:!0})},updateParameter:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.events=f.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:a.parameters?.map((a,b)=>b===d?{...a,...e}:a)}:a)})),a({definition:f,dirty:!0})},addAction:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dM(f.state,c,a=>{let b=a[d]??{actions:[]};return{...a,[d]:{actions:[...b.actions,e]}}}),a({definition:f,dirty:!0})},removeAction:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dM(f.state,c,a=>{let b=a[d];return b?{...a,[d]:{actions:b.actions.filter((a,b)=>b!==e)}}:a}),a({definition:f,dirty:!0})},updateAction:(c,d,e,f)=>{b()._pushHistory();let g={...b().definition};g.state=dM(g.state,c,a=>{let b=a[d];return b?{...a,[d]:{actions:b.actions.map((a,b)=>b===e?f:a)}}:a}),a({definition:g,dirty:!0})},addTransition:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dM(e.state,c,a=>({...a,transitions:[...a.transitions??[],d]})),a({definition:e,dirty:!0,errors:dQ(e)})},updateTransition:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dM(f.state,c,a=>({...a,transitions:a.transitions?.map((a,b)=>b===d?{...a,...e}:a)})),a({definition:f,dirty:!0})},removeTransition:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dM(e.state,c,a=>({...a,transitions:a.transitions?.filter((a,b)=>b!==d)})),a({definition:e,dirty:!0,errors:dQ(e)})},setStatePosition:(c,d)=>{a({layout:{positions:{...b().layout.positions,[c]:d}}})},arrangeLayout:()=>{b()._pushHistory(),a({layout:{positions:x(b().definition)}})},hydrateLayout:(c,d)=>{a({layout:{positions:{...b().layout.positions,...c}},...d?{viewport:d}:{}})},setViewport:b=>a({viewport:b}),select:(b,c)=>a({selection:{kind:b,id:c}}),clearSelection:()=>a({selection:{kind:null,id:null}}),setDrawMode:b=>a({drawMode:b,drawSource:null}),setDrawSource:b=>a({drawSource:b}),showContextMenu:(b,c,d)=>a({contextMenu:{visible:!0,x:b,y:c,target:d}}),hideContextMenu:()=>a({contextMenu:{visible:!1,x:0,y:0,target:null}}),undo:()=>{let{undoStack:c,definition:d,layout:e}=b();if(0===c.length)return;let f=c[c.length-1],g={definition:JSON.parse(JSON.stringify(d)),layout:JSON.parse(JSON.stringify(e))};a({definition:f.definition,layout:f.layout,undoStack:c.slice(0,-1),redoStack:[...b().redoStack,g],dirty:!0,errors:dQ(f.definition)})},redo:()=>{let{redoStack:c,definition:d,layout:e}=b();if(0===c.length)return;let f=c[c.length-1],g={definition:JSON.parse(JSON.stringify(d)),layout:JSON.parse(JSON.stringify(e))};a({definition:f.definition,layout:f.layout,undoStack:[...b().undoStack,g],redoStack:c.slice(0,-1),dirty:!0,errors:dQ(f.definition)})},canUndo:()=>b().undoStack.length>0,canRedo:()=>b().redoStack.length>0,setActiveTab:b=>a({activeTab:b}),loadFromJson:(b,c)=>{try{let d=JSON.parse(b),e=aq(d.stateMachine??d.StateMachine??d);dS=!!d&&"object"==typeof d&&"state"in d&&!("stateMachine"in d)&&!("StateMachine"in d);let f=dR(e,dK()),g=e.state?.name??"Root";a({definition:e,layout:f,fileName:c??null,dirty:!1,errors:dQ(e),selection:{kind:null,id:null},undoStack:[],redoStack:[],navigationPath:[g],currentParent:g})}catch(a){console.error("Failed to parse definition:",a)}},exportJson:()=>{let{definition:a}=b();return JSON.stringify(dS?a:{stateMachine:a},null,2)},applyRemote:(c,d,e)=>{try{let f=JSON.parse(c),g=aq(f.stateMachine??f.StateMachine??f);dS=!!f&&"object"==typeof f&&"state"in f&&!("stateMachine"in f)&&!("StateMachine"in f);let h=dR(g,b().layout),i=g.state?.name??"Root",j=b(),k=new Set(dO(g.state)),l=j.navigationPath.filter(a=>k.has(a)),m=l.length?l:[i],n=m[m.length-1],o=j.selection,p=("state"===o.kind?!!o.id&&k.has(o.id):"transition"===o.kind?!!o.id&&k.has(o.id.split(":")[0]):"event"===o.kind&&!!o.id&&dP(g).includes(o.id))?o:{kind:null,id:null};a({definition:g,layout:h,fileName:e??b().fileName,dirty:!1,remoteMtime:d,remoteStatus:"synced",remoteMessage:null,errors:dQ(g),selection:p,navigationPath:m,currentParent:n})}catch(b){a({remoteStatus:"error",remoteMessage:String(b)})}},setRemoteStatus:(b,c=null)=>a({remoteStatus:b,remoteMessage:c}),setRemoteMtime:b=>a({remoteMtime:b}),setDocPath:b=>a({docPath:b||null}),enterState:c=>{let d=b().activeStates;d.includes(c)||a({activeStates:[...d,c]})},exitState:c=>{let d=b().activeStates;d.includes(c)&&a({activeStates:d.filter(a=>a!==c)})},setPresence:b=>a({presence:b}),applyRemoteOps:(c,d,e)=>{a({_applyingRemote:!0});try{let e=b(),f=c.filter(a=>"runtime.enter"!==a.op&&"runtime.exit"!==a.op),g=f.length?n(e.definition,f):e.definition,h=e.activeStates;for(let a of c)"runtime.enter"===a.op?h.includes(a.state)||(h=[...h,a.state]):"runtime.exit"===a.op&&h.includes(a.state)&&(h=h.filter(b=>b!==a.state));let i=dR(g,e.layout),j=g.state?.name??"Root",k=new Set(dO(g.state)),l=e.navigationPath.filter(a=>k.has(a)),m=l.length?l:[j],o=m[m.length-1],p=e.selection,q=("state"===p.kind?!!p.id&&k.has(p.id):"transition"===p.kind?!!p.id&&k.has(p.id.split(":")[0]):"event"===p.kind&&!!p.id&&dP(g).includes(p.id))?p:{kind:null,id:null};a({definition:g,layout:i,activeStates:h,dirty:!1,remoteMtime:d,remoteStatus:"synced",remoteMessage:null,errors:dQ(g),selection:q,navigationPath:m,currentParent:o})}catch(b){a({remoteStatus:"error",remoteMessage:String(b)})}finally{a({_applyingRemote:!1})}},validate:()=>{let c=dQ(b().definition);return a({errors:c}),c},setGeneratedCode:b=>a({generatedCode:b}),setShowCodePreview:b=>a({showCodePreview:b}),navigateInto:c=>{let{definition:d,navigationPath:e}=b(),f=dL(d.state,c);f&&(f.states?.length??0)>0&&a({navigationPath:[...e,c],currentParent:c,selection:{kind:null,id:null}})},navigateUp:c=>{let{navigationPath:d}=b();if(d.length<=1)return;let e=c??d.length-2,f=d.slice(0,e+1);a({navigationPath:f,currentParent:f[f.length-1],selection:{kind:null,id:null}})},getCurrentChildren:()=>{let{definition:a,currentParent:c}=b(),d=dL(a.state,c);return d?.states??[]}}))?cr(e):cr,dU="canvas",dV=`[data-pinch-owner="${dU}"]`;function dW(a){return!!a&&"function"==typeof a.closest&&null!==a.closest(dV)}let dX="stateloom-canvas",dY="#030712",dZ=["png","jpeg","svg","mermaid","markdown"],d$={png:"PNG",jpeg:"JPEG",svg:"SVG",mermaid:"Mermaid",markdown:"Markdown"},d_={png:"image/png",jpeg:"image/jpeg",svg:"image/svg+xml",mermaid:"text/vnd.mermaid",markdown:"text/markdown"},d0={png:"png",jpeg:"jpg",svg:"svg",mermaid:"mmd",markdown:"md"};async function d1(a,b,c={}){var d,e,f;let g;if("mermaid"===a||"markdown"===a){let c,f;g=new Blob([(d=b.definition,e="markdown"===a,c=["stateDiagram-v2"],d.state&&function a(b,c,d){let e=U(b);if(0===e.length)return;let f=" ".repeat(c+1),g=new Set,h=e.find(a=>"history"!==a.kind);for(let a of(h&&(d.push(`${f}[*] --> ${h.name}`),g.add(h.name)),e))for(let b of a.transitions??[]){let c=b.condition?`${b.event} [${b.condition}]`:b.event;if(!b.nextState){d.push(`${f}${a.name} --> ${a.name} : ${c} (stays)`),g.add(a.name);continue}d.push(`${f}${a.name} --> ${b.nextState} : ${c}`),g.add(a.name),g.add(b.nextState)}for(let a of e)"final"===a.kind&&(d.push(`${f}${a.name} --> [*]`),g.add(a.name));for(let a of e)g.has(a.name)||d.push(`${f}${a.name}`);for(let b of e)0!==U(b).length&&(d.push(`${f}state ${b.name} {`),a(b,c+1,d),d.push(`${f}}`))}(d.state,0,c),f=c.join("\n"),e?`\`\`\`mermaid
2
+ `+Object.keys(d).map(a=>`${a}: ${d[a]}`).join("\r\n")+"\r\n\r\n"+c)}function s(a,b,c,d,e,f){if(a.listenerCount("wsClientError")){let d=Error(e);Error.captureStackTrace(d,s),a.emit("wsClientError",d,c,b)}else r(c,d,e,f)}b.exports=class extends d{constructor(a,b){if(super(),null==(a={allowSynchronousEvents:!0,autoPong:!0,maxBufferedChunks:262144,maxFragments:16384,maxPayload:0x6400000,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:l,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:k,...a}).port&&!a.server&&!a.noServer||null!=a.port&&(a.server||a.noServer)||a.server&&a.noServer)throw TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=a.port?(this._server=e.createServer((a,b)=>{let c=e.STATUS_CODES[426];b.writeHead(426,{"Content-Length":c.length,"Content-Type":"text/plain"}),b.end(c)}),this._server.listen(a.port,a.host,a.backlog,b)):a.server&&(this._server=a.server),this._server){const a=this.emit.bind(this,"connection");this._removeListeners=function(a,b){for(let c of Object.keys(b))a.on(c,b[c]);return function(){for(let c of Object.keys(b))a.removeListener(c,b[c])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(b,c,d)=>{this.handleUpgrade(b,c,d,a)}})}!0===a.perMessageDeflate&&(a.perMessageDeflate={}),a.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=a,this._state=0}address(){if(this.options.noServer)throw Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(a){if(2===this._state){a&&this.once("close",()=>{a(Error("The server is not running"))}),process.nextTick(p,this);return}if(a&&this.once("close",a),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(p,this);else{let a=this._server;this._removeListeners(),this._removeListeners=this._server=null,a.close(()=>{p(this)})}}shouldHandle(a){if(this.options.path){let b=a.url.indexOf("?");if((-1!==b?a.url.slice(0,b):a.url)!==this.options.path)return!1}return!0}handleUpgrade(a,b,c,d){b.on("error",q);let e=a.headers["sec-websocket-key"],f=a.headers.upgrade,g=+a.headers["sec-websocket-version"];if("GET"!==a.method)return void s(this,a,b,405,"Invalid HTTP method");if(void 0===f||"websocket"!==f.toLowerCase())return void s(this,a,b,400,"Invalid Upgrade header");if(void 0===e||!o.test(e))return void s(this,a,b,400,"Missing or invalid Sec-WebSocket-Key header");if(13!==g&&8!==g)return void s(this,a,b,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});if(!this.shouldHandle(a))return void r(b,400);let k=a.headers["sec-websocket-protocol"],l=new Set;if(void 0!==k)try{l=j.parse(k)}catch(c){s(this,a,b,400,"Invalid Sec-WebSocket-Protocol header");return}let m=a.headers["sec-websocket-extensions"],n={};if(this.options.perMessageDeflate&&void 0!==m){let c=new i({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let a=h.parse(m);a[i.extensionName]&&(c.accept(a[i.extensionName]),n[i.extensionName]=c)}catch(c){s(this,a,b,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let f={origin:a.headers[`${8===g?"sec-websocket-origin":"origin"}`],secure:!!(a.socket.authorized||a.socket.encrypted),req:a};if(2===this.options.verifyClient.length)return void this.options.verifyClient(f,(f,g,h,i)=>{if(!f)return r(b,g||401,h,i);this.completeUpgrade(n,e,l,a,b,c,d)});if(!this.options.verifyClient(f))return r(b,401)}this.completeUpgrade(n,e,l,a,b,c,d)}completeUpgrade(a,b,c,d,e,f,j){if(!e.readable||!e.writable)return e.destroy();if(e[n])throw Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return r(e,503);let k=g("sha1").update(b+m).digest("base64"),l=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${k}`],o=new this.options.WebSocket(null,void 0,this.options);if(c.size){let a=this.options.handleProtocols?this.options.handleProtocols(c,d):c.values().next().value;a&&(l.push(`Sec-WebSocket-Protocol: ${a}`),o._protocol=a)}if(a[i.extensionName]){let b=a[i.extensionName].params,c=h.format({[i.extensionName]:[b]});l.push(`Sec-WebSocket-Extensions: ${c}`),o._extensions=a}this.emit("headers",l,d),e.write(l.concat("\r\n").join("\r\n")),e.removeListener("error",q),o.setSocket(e,f,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxBufferedChunks:this.options.maxBufferedChunks,maxFragments:this.options.maxFragments,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(o),o.on("close",()=>{this.clients.delete(o),this._shouldEmitClose&&!this.clients.size&&process.nextTick(p,this)})),j(o,d)}}},95421,a=>{"use strict";let b,c,d,e;var f,g,h=a.i(56856),i=a.i(55132);function j(a){return JSON.parse(JSON.stringify(a))}function k(a,b){for(let c of a.states??[]){if(c.name===b)return a;let d=k(c,b);if(d)return d}return null}function l(a,b,c){let d=function a(b,c){if(b.name===c)return b;for(let d of b.states??[]){let b=a(d,c);if(b)return b}return null}(a,b);if(!d)throw Error(`applyPatchOps: ${c} references missing state "${b}"`);return d}function m(a,b,c){let d=function(a,b){for(let c of a.events){let a=c.events??[];for(let d=0;d<a.length;d++)if(a[d].id===b)return{source:c,event:a[d],index:d}}return null}(a,b);if(!d)throw Error(`applyPatchOps: ${c} references missing event "${b}"`);return d}function n(a,b){let c=j(a);for(let a of(Array.isArray(c.events)||(c.events=[]),b))switch(a.op){case"settings.update":c.settings={...c.settings,...a.patch},""===c.settings.notes&&delete c.settings.notes;break;case"state.add":{let b=null===a.parent?c.state:l(c.state,a.parent,"state.add");b.states||(b.states=[]);let d=a.index??b.states.length;b.states.splice(d,0,j(a.state));break}case"state.update":{let b=l(c.state,a.name,"state.update");Object.assign(b,a.patch),""===b.notes&&delete b.notes,""===b.prompt&&delete b.prompt;break}case"state.remove":{if(c.state.name===a.name)throw Error(`applyPatchOps: cannot remove root state "${a.name}"`);let b=k(c.state,a.name);if(!b||!b.states)throw Error(`applyPatchOps: state.remove references missing state "${a.name}"`);let d=b.states.findIndex(b=>b.name===a.name);if(d<0)throw Error(`applyPatchOps: state.remove references missing state "${a.name}"`);b.states.splice(d,1),0===b.states.length&&delete b.states;break}case"state.nest":{let b=l(c.state,a.child,"state.nest"),d=l(c.state,a.newParent,"state.nest"),e=k(c.state,a.child);if(!e||!e.states)throw Error(`applyPatchOps: state.nest cannot detach root or missing state "${a.child}"`);let f=e.states.findIndex(b=>b.name===a.child),[g]=e.states.splice(f,1);0===e.states.length&&delete e.states,d.states||(d.states=[]),d.states.push(g??j(b));break}case"eventSource.add":{let b=a.index??c.events.length;c.events.splice(b,0,j(a.source));break}case"eventSource.update":{let b=c.events[a.index];if(!b)throw Error(`applyPatchOps: eventSource.update index ${a.index} out of range`);c.events[a.index]={...b,...a.patch};break}case"eventSource.remove":if(!c.events[a.index])throw Error(`applyPatchOps: eventSource.remove index ${a.index} out of range`);c.events.splice(a.index,1);break;case"event.add":{let b=c.events[a.sourceIndex];if(!b)throw Error(`applyPatchOps: event.add sourceIndex ${a.sourceIndex} out of range`);b.events||(b.events=[]);let d=a.index??b.events.length;b.events.splice(d,0,j(a.event));break}case"event.update":Object.assign(m(c,a.id,"event.update").event,a.patch);break;case"event.remove":{let b=m(c,a.id,"event.remove");b.source.events.splice(b.index,1),0===b.source.events.length&&delete b.source.events;break}case"parameter.add":{let b=m(c,a.eventId,"parameter.add");b.event.parameters||(b.event.parameters=[]);let d=a.index??b.event.parameters.length;b.event.parameters.splice(d,0,j(a.parameter));break}case"parameter.update":{let b=m(c,a.eventId,"parameter.update").event.parameters??[];if(!b[a.index])throw Error(`applyPatchOps: parameter.update index ${a.index} out of range for event "${a.eventId}"`);b[a.index]={...b[a.index],...a.patch};break}case"parameter.remove":{let b=m(c,a.eventId,"parameter.remove"),d=b.event.parameters;if(!d||!d[a.index])throw Error(`applyPatchOps: parameter.remove index ${a.index} out of range for event "${a.eventId}"`);d.splice(a.index,1),0===d.length&&delete b.event.parameters;break}case"transition.add":{let b=l(c.state,a.state,"transition.add");b.transitions||(b.transitions=[]);let d=a.index??b.transitions.length;b.transitions.splice(d,0,j(a.transition));break}case"transition.update":{let b=l(c.state,a.state,"transition.update").transitions??[];if(!b[a.index])throw Error(`applyPatchOps: transition.update index ${a.index} out of range for state "${a.state}"`);b[a.index]={...b[a.index],...a.patch};break}case"transition.remove":{let b=l(c.state,a.state,"transition.remove"),d=b.transitions;if(!d||!d[a.index])throw Error(`applyPatchOps: transition.remove index ${a.index} out of range for state "${a.state}"`);d.splice(a.index,1),0===d.length&&delete b.transitions;break}case"action.add":{let b=l(c.state,a.state,"action.add"),d=b[a.hook]??(b[a.hook]={actions:[]}),e=a.index??d.actions.length;d.actions.splice(e,0,j(a.action));break}case"action.update":{let b=l(c.state,a.state,"action.update")[a.hook];if(!b||!b.actions[a.index])throw Error(`applyPatchOps: action.update index ${a.index} out of range for state "${a.state}" ${a.hook}`);b.actions[a.index]=j(a.action);break}case"action.remove":{let b=l(c.state,a.state,"action.remove"),d=b[a.hook];if(!d||!d.actions[a.index])throw Error(`applyPatchOps: action.remove index ${a.index} out of range for state "${a.state}" ${a.hook}`);d.actions.splice(a.index,1),0===d.actions.length&&delete b[a.hook];break}case"runtime.enter":case"runtime.exit":break;default:throw Error(`applyPatchOps: unknown op ${JSON.stringify(a)}`)}return c}function o(a){let b=[a];for(let c of a.states??[])b.push(...o(c));return b}function p(a){let b=new Map;b.set(a.name,null);let c=a=>{for(let d of a.states??[])b.set(d.name,a.name),c(d)};return c(a),b}function q(a,b){return JSON.stringify(a)===JSON.stringify(b)}function r(a,b,c,d,e){let f=Math.min(c.length,d.length);for(let g=0;g<f;g++)q(c[g],d[g])||e.push({op:"action.update",state:a,hook:b,index:g,action:d[g]});for(let c=f;c<d.length;c++)e.push({op:"action.add",state:a,hook:b,action:d[c],index:c});for(let f=c.length-1;f>=d.length;f--)e.push({op:"action.remove",state:a,hook:b,index:f})}function s(a){let b=0;for(let c=0;c<a.length;c++)b=Math.imul(b,31)+a.charCodeAt(c)|0;let c=(b%360+360)%360;return`hsl(${c}, 65%, 55%)`}let t={hSpacing:220,vSpacing:140,nodeWidth:160,nodeHeight:60,compositeWidth:300,compositeHeight:200,originX:100,originY:120,sweeps:2,includeRoot:!0},u=(a,b)=>`${a}\u0000${b}`;function v(a){let b=new Set,c=[];for(let d of a.states??[])b.has(d.name)||(b.add(d.name),c.push(d));return c}function w(a,b){let c=new Map(a.map(a=>[a,[]]));for(let a of b)c.get(a.from).push(a.to);return c}function x(a,b={}){let c={...t,...b},d="state"in a?a.state:a,e={};if(!d)return e;if(!function a(b,c,d,e,f){let g=v(b);if(0===g.length)return;let h=g.map(a=>a.name),i=new Map(g.map(a=>[a.name,a])),j=function(a){let b=new Set,c=[];for(let d of a)for(let e of d.transitions??[]){let f=e.nextState?function(a,b){for(let c of a){if(c.name===b)return c.name;let a=[...c.states??[],...c.parallel?.states??[]];for(;a.length;){let d=a.pop();if(d.name===b)return c.name;a.push(...d.states??[],...d.parallel?.states??[])}}}(a,e.nextState):void 0;if(!f||f===d.name)continue;let g=u(d.name,f);b.has(g)||(b.add(g),c.push({from:d.name,to:f}))}return c}(g),k=function(a,b){let c=w(a,b),d=new Map(a.map(a=>[a,0])),e=new Set;for(let b of a){if(0!==d.get(b))continue;d.set(b,1);let a=[{node:b,i:0}];for(;a.length>0;){let b=a[a.length-1],f=c.get(b.node);if(b.i<f.length){let c=f[b.i++],g=d.get(c);1===g?e.add(u(b.node,c)):0===g&&(d.set(c,1),a.push({node:c,i:0}))}else d.set(b.node,2),a.pop()}}return e}(h,j),l=j.filter(a=>!k.has(u(a.from,a.to))),m=function(a,b){let c=w(a,b),d=new Map(a.map(a=>[a,0]));for(let a of b)d.set(a.to,(d.get(a.to)??0)+1);let e=new Map(a.map(a=>[a,0])),f=a.filter(a=>0===d.get(a));for(let a=0;a<f.length;a++){let b=f[a];for(let a of c.get(b)){e.set(a,Math.max(e.get(a),e.get(b)+1));let c=d.get(a)-1;d.set(a,c),0===c&&f.push(a)}}return e}(h,l),n=function(a,b,c){let d=new Map(a.map(a=>[a,[]]));for(let a of b)d.get(a.from).push(a.to),d.get(a.to).push(a.from);let e=new Set([c]),f=[c];for(;f.length>0;){let a=f.pop();for(let b of d.get(a)??[])e.has(b)||(e.add(b),f.push(b))}return e}(h,j,h[0]),o=0;for(let a of h)n.has(a)&&(o=Math.max(o,m.get(a)));for(let a of h)n.has(a)||m.set(a,m.get(a)+o+1);let p=Array.from({length:Math.max(...h.map(a=>m.get(a)))+1},()=>[]);for(let a of h)p[m.get(a)].push(a);!function(a,b,c){let d=new Map,e=new Map,f=(a,b,c)=>{let d=a.get(b);d?d.push(c):a.set(b,[c])};for(let a of b)f(d,a.to,a.from),f(e,a.from,a.to);let g=new Map,h=()=>{a.forEach(a=>a.forEach((a,b)=>g.set(a,b)))};h();let i=(a,b)=>{let c=a.map((a,c)=>{let d=(b.get(a)??[]).filter(a=>g.has(a));return{name:a,key:d.length?d.reduce((a,b)=>a+g.get(b),0)/d.length:c,i:c}});c.sort((a,b)=>a.key===b.key?a.i-b.i:a.key-b.key);for(let b=0;b<c.length;b++)a[b]=c[b].name};for(let b=0;b<c;b++){for(let b=1;b<a.length;b++)i(a[b],d),h();for(let b=a.length-2;b>=0;b--)i(a[b],e),h()}}(p,l,e.sweeps);let q=e.hSpacing-e.nodeWidth,r=e.vSpacing-e.nodeHeight,s=a=>Math.max(e.hSpacing,a+q),t=new Map(h.map(a=>{var b;return[a,(b=i.get(a),(b.states?.length??0)>0?{width:e.compositeWidth,height:e.compositeHeight}:{width:e.nodeWidth,height:e.nodeHeight})]})),x=p.map(a=>a.reduce((a,b)=>a+s(t.get(b).width),0)),y=c+Math.max(...x,0)/2,z=d;for(let b of(p.forEach((a,b)=>{let c=y-x[b]/2,d=e.nodeHeight;for(let b of a){let a=t.get(b),e=s(a.width);f[b]={x:Math.round(c+(e-a.width)/2),y:Math.round(z),width:a.width,height:a.height},c+=e,d=Math.max(d,a.height)}z+=d+r}),g)){if((b.states?.length??0)===0)continue;let c=f[b.name];a(b,c.x+20,c.y+40,e,f)}}(d,c.originX,c.originY,c,e),c.includeRoot){let a=v(d).map(a=>e[a.name]).filter(Boolean);if(0===a.length)e[d.name]={x:20,y:20,width:400,height:350};else{let b=Math.min(...a.map(a=>a.x)),c=Math.min(...a.map(a=>a.y)),f=Math.max(...a.map(a=>a.x+a.width)),g=Math.max(...a.map(a=>a.y+a.height));e[d.name]={x:Math.round(b-40),y:Math.round(c-40),width:Math.round(f-b+80),height:Math.round(g-c+80)}}}return e}let y=(a,b)=>a.length*b*.55,z=a=>`[${a.length>32?`${a.slice(0,31).trimEnd()}…`:a}]`,A=a=>({width:Math.max(56,Math.max(y(a.event,11),a.condition?y(z(a.condition),9):0)+16)+16*!!a.glyph,height:a.condition?28:18}),B=a=>({x:a.x+5,y:a.cy-12-3}),C=(a,b)=>a.x<b.x+b.width&&b.x<a.x+a.width&&a.y<b.y+b.height&&b.y<a.y+a.height,D={along:[.5,.36,.64,.24,.76,.14,.86],aside:[0,.6,-.6],across:[0,-1.3,1.3,-2.6,2.6]};function E(a,b,c={}){let{along:d,aside:e,across:f}={...D,...c},g=a.map((a,b)=>({label:a,i:b,width:A(a).width})).sort((a,b)=>a.width===b.width?a.i-b.i:b.width-a.width),h=[];for(let{label:a}of g){let{width:c,height:g}=A(a),i=8*!!a.glyph,j=null,k=1/0;a:for(let l of f)for(let f of e)for(let e of d){let d=a.at(e),m=d.x+f*c,n=d.y+l*g,o={x:m-c/2,y:n-18,width:c,height:g},p=[...h,...b].filter(a=>C(o,a)).length,q={...o,cx:m+i,cy:n,label:a};if(0===p){j=q;break a}p<k&&(k=p,j=q)}j&&h.push(j)}return h}let F=(a,b,c=2.2,d)=>({id:a,paths:b,strokeWidth:c,circles:d}),G=F("signal",["M3 12h10","m13 6 6 6-6 6Z"]),H=[{glyph:F("confirm",["m4 13 5.5 5.5L20 6"],2.4),words:["confirm","approve","accept","commit"]},{glyph:F("complete",["m8 12 3 3 5-6"],2.2,[{cx:12,cy:12,r:8.5}]),words:["complete","finish","done","close"]},{glyph:F("skip",["M4 17c0-6 4.5-9 9-9h6","m15 4 4.5 4-4.5 4"]),words:["skip","ignore","bypass"]},{glyph:F("flag",["M6 21V4","M6 4h12l-3 4.5 3 4.5H6Z"]),words:["flag","mark","revisit","review"]},{glyph:F("advance",["M4 6l8 6-8 6Z","M13 6l7 6-7 6Z"]),words:["advance","next","forward","step"]},{glyph:F("pause",["M9 5v14M15 5v14"],2.6),words:["pause","hold","suspend","stop"]},{glyph:F("play",["M7 4.5 19 12 7 19.5Z"]),words:["resume","start","begin","play","run"]},{glyph:F("clock",["M12 7.5V12l3.5 2.5"],2.2,[{cx:12,cy:12,r:8.5}]),words:["timeout","expire","tick","delay","after","elapse"]},{glyph:F("change",["M3 14c3-6 6-6 9 0s6 6 9 0"]),words:["change","update","edit","modify","set"]}];[...H.map(a=>a.glyph)];let I=a=>Math.round(100*a)/100;function J(a,b,c,d){return{p0:a,p1:b,p2:c,p3:d,path:`M ${I(a.x)} ${I(a.y)} C ${I(b.x)} ${I(b.y)}, ${I(c.x)} ${I(c.y)}, ${I(d.x)} ${I(d.y)}`,at:e=>{let f=1-e,g=f*f*f,h=3*f*f*e,i=3*f*e*e,j=e*e*e;return{x:g*a.x+h*b.x+i*c.x+j*d.x,y:g*a.y+h*b.y+i*c.y+j*d.y}}}}function K(a,b){let c=a.map(({from:a,to:c})=>{var d,e;return a===c?null:(d=b(a),(e=b(c)).y>=d.y+d.height?["bottom","top"]:e.y+e.height<=d.y?["top","bottom"]:e.x>=d.x+d.width?["right","left"]:e.x+e.width<=d.x?["left","right"]:["bottom","top"])}),d=new Map,e=(a,b,c)=>{let e=`${a}\0${b}`,f=d.get(e);f?f.push(c):d.set(e,[c])},f=(a,b)=>"top"===b||"bottom"===b?a.x+a.width/2:a.y+a.height/2;a.forEach((a,d)=>{let g=c[d];if(!g)return;let[h,i]=g;e(a.from,h,{edge:d,toward:f(b(a.to),h),role:"out"}),e(a.to,i,{edge:d,toward:f(b(a.from),i),role:"in"})});let g=new Map;for(let[a,c]of d){let[d,e]=a.split("\0"),f=b(d),h=[...c].sort((a,b)=>a.toward===b.toward?a.edge-b.edge:a.toward-b.toward);h.forEach((a,b)=>{g.set(`${a.edge}\0${a.role}`,function(a,b,c,d){let e="top"===b||"bottom"===b,f=e?a.width:a.height,g=e?a.x+a.width/2:a.y+a.height/2,h=d>1?Math.min(.72*f,40*(d-1)):0,i=d>1?g-h/2+h*c/(d-1):g;return"top"===b?{x:i,y:a.y}:"bottom"===b?{x:i,y:a.y+a.height}:"left"===b?{x:a.x,y:i}:{x:a.x+a.width,y:i}}(f,e,b,h.length))})}return a.map((a,d)=>{let e=c[d];if(!e){var f;let c,d,e;return c=(f=b(a.from)).x+f.width,d=f.y+.35*f.height,J({x:c,y:d},{x:c+44,y:d-12},{x:c+44,y:(e=f.y+.65*f.height)+12},{x:c,y:e})}let h=g.get(`${d}\0out`),i=g.get(`${d}\0in`);var j=e[0];if("top"===j||"bottom"===j){let a=(h.y+i.y)/2;return J(h,{x:h.x,y:a},{x:i.x,y:a},i)}let k=(h.x+i.x)/2;return J(h,{x:k,y:h.y},{x:k,y:i.y},i)})}let L={min:.2,max:2.5},M={x:0,y:0,scale:1};function N(a,b=L){return Number.isFinite(a)?Math.min(b.max,Math.max(b.min,a)):1}function O(a,b){return{x:(b.x-a.x)/a.scale,y:(b.y-a.y)/a.scale}}function P(a,b,c){return{x:a.x+b,y:a.y+c,scale:a.scale}}function Q(a,b,c,d=L){return R(a,a.scale*b,c,d)}function R(a,b,c,d=L){let e=N(b,d);if(e===a.scale)return a;let f=O(a,c);return{x:c.x-f.x*e,y:c.y-f.y*e,scale:e}}function S(a,b,c,d={}){let e=d.padding??48,f=d.maxScale??1,g=d.limits??L;if(0===a.length||b<=0||c<=0)return{...M};let h=1/0,i=1/0,j=-1/0,k=-1/0;for(let b of a)h=Math.min(h,b.x),i=Math.min(i,b.y),j=Math.max(j,b.x+b.width),k=Math.max(k,b.y+b.height);let l=Math.max(1,j-h),m=Math.max(1,k-i),n=N(Math.min(f,Math.min(Math.max(1,b-2*e)/l,Math.max(1,c-2*e)/m)),g);return{x:(b-l*n)/2-h*n,y:(c-m*n)/2-i*n,scale:n}}function T(a){return`translate(${a.x} ${a.y}) scale(${a.scale})`}function U(a){let b=new Set,c=[];for(let d of a.states??[])b.has(d.name)||(b.add(d.name),c.push(d));return c}function V(a){return a.stateOf?Array.isArray(a.stateOf)?a.stateOf:[a.stateOf]:[]}let W=["1:1","1:N","N:1","N:M"];function X(a){return!!a&&"object"==typeof a&&Array.isArray(a.entities)&&!("state"in a)}function Y(a){let b=[],c=function(a){let b=new Map;for(let c of a.entities??[])c?.name&&!b.has(c.name)&&b.set(c.name,c);return b}(a),d=new Set;for(let[e,f]of(a.entities??[]).entries()){if(!f?.name){b.push({ruleId:"E001",message:`Entity at index ${e} has no name`,element:`entities[${e}]`});continue}d.has(f.name)&&b.push({ruleId:"E001",message:`Duplicate entity name "${f.name}"`,element:f.name}),d.add(f.name);let a=new Set;for(let[d,e]of(f.attributes??[]).entries()){if(!e?.name){b.push({ruleId:"E002",message:`Attribute at index ${d} of "${f.name}" has no name`,element:`${f.name}[${d}]`});continue}let g=`${f.name}.${e.name}`;if(a.has(e.name)&&b.push({ruleId:"E002",message:`Duplicate attribute "${g}"`,element:g}),a.add(e.name),e.references){let a=function(a){let b=a.indexOf(".");return b<0?{entity:a}:{entity:a.slice(0,b),attribute:a.slice(b+1)}}(e.references),d=c.get(a.entity);d?a.attribute&&!(d.attributes??[]).some(b=>b?.name===a.attribute)&&b.push({ruleId:"E005",message:`"${g}" references undefined attribute "${e.references}"`,element:g}):b.push({ruleId:"E005",message:`"${g}" references undefined entity "${a.entity}"`,element:g})}}}for(let[d,e]of(a.relationships??[]).entries()){let a=`relationships[${d}]`;for(let f of["from","to"]){let g=e?.[f];g&&c.has(g)||b.push({ruleId:"E003",message:`Relationship ${d} ${f} names undefined entity "${g??""}"`,element:a})}W.includes(e?.cardinality)||b.push({ruleId:"E004",message:`Relationship ${d} cardinality "${e?.cardinality??""}" is not one of ${W.join(", ")}`,element:a})}return b}function Z(a,b){let c=RegExp(`(?<![\\w.])${b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.([A-Za-z_]\\w*)\\b(?!\\s*\\()`,"g"),d=[];for(let b of a.matchAll(c))d.includes(b[1])||d.push(b[1]);return d}function $(a,b){let c=[],d=new Map;for(let a of b.entities??[])a?.name&&!d.has(a.name)&&d.set(a.name,a);let e=a.settings?.name??"",f=a.settings?.objects??[],g=a.state?function a(b){let c=[b];for(let d of b.states??[])c.push(...a(d));for(let d of b.parallel?.states??[])c.push(...a(d));return c}(a.state):[],h=g.flatMap(a=>(a.transitions??[]).map(a=>a.condition??"")),i=new Map;for(let a of f){let e=d.get(a.class);if(e){i.set(a.instance,e);continue}h.some(b=>Z(b,a.instance).length>0)&&c.push({ruleId:"L001",message:`Object "${a.instance}" has class "${a.class}", which is not an entity in "${b.settings?.name??""}", and a guard reads its fields`,element:a.instance})}for(let a of g)for(let b of a.transitions??[])if(b.condition)for(let[d,e]of i)for(let f of Z(b.condition,d))(e.attributes??[]).some(a=>a?.name===f)||c.push({ruleId:"L002",message:`Guard on ${a.name} [${b.event}] reads "${d}.${f}", which is not an attribute of "${e.name}"`,element:a.name});if(e){let a=new Set([...i.values()].map(a=>a.name));for(let d of b.entities??[])for(let b of d?.attributes??[])b&&V(b).includes(e)&&(a.has(d.name)||c.push({ruleId:"L003",message:`"${d.name}.${b.name}" stores the state of "${e}", but "${d.name}" is not the class of any of that machine's objects`,element:`${d.name}.${b.name}`}))}return c}function _(a,b){let c=[];for(let d of a.entities??[])for(let a of d?.attributes??[])if(a)for(let e of V(a))b.includes(e)||c.push({ruleId:"L004",message:`"${d.name}.${a.name}" stores the state of "${e}", which is not among the machines checked (${b.join(", ")||"none"})`,element:`${d.name}.${a.name}`});return c}let aa=a=>({settings:{...a.settings},entities:(a.entities??[]).map(a=>({...a,attributes:(a.attributes??[]).map(a=>({...a}))})),relationships:(a.relationships??[]).map(a=>({...a}))});function ab(a,b){let c=a.entities.find(a=>a.name===b);if(!c){let c=a.entities.map(a=>a.name).join(", ")||"none";throw Error(`Entity '${b}' not found. Entities: ${c}.`)}return c}function ac(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a))}function ad(a,b){if(!b.name?.trim())throw Error("An entity needs a name.");let c=aa(a);if(c.entities.some(a=>a.name===b.name))throw Error(`Entity '${b.name}' already exists.`);return c.entities.push(ac({...b,attributes:b.attributes??[]})),c}function ae(a,b,c){let d=aa(a),e=ab(d,b);return void 0!==c.notes&&(c.notes.trim()?e.notes=c.notes:delete e.notes),void 0!==c.description&&(c.description?e.description=c.description:delete e.description),void 0!==c.weak&&(c.weak?e.weak=!0:delete e.weak),d}let af=a=>(a.attributes??[]).filter(a=>a?.name);function ag(a){return Math.max(110,Math.ceil(8.4*(a.name??"").length+36))}function ah(a){return Math.max(38,Math.ceil(3.5*Math.max(0,...a.map(a=>a.name.length))+14))}let ai=a=>Math.ceil(a/2);function aj(a){let b=af(a),c=ag(a);return 0===b.length?{width:c,height:40}:{width:c+2*(34+2*ah(b)),height:Math.max(40,32*ai(b.length))}}let ak={"1:1":"||--||","1:N":"||--o{","N:1":"}o--||","N:M":"}o--o{"},al=/^[A-Za-z_][A-Za-z0-9_-]*$/,am=a=>al.test(a)?a:`"${a.replace(/"/g,"'")}"`,an=(a,b)=>{let c=a.trim().replace(/[^A-Za-z0-9_()[\]-]+/g,"_").replace(/^_+|_+$/g,"");return/^[A-Za-z_]/.test(c)?c:c?`_${c}`:b},ao=a=>`"${a.replace(/"/g,"'")}"`,ap=["settings","states","parallel","entities","participants","messages","fragments","members","state"];function aq(a){let b=!1,c=a=>{if(Array.isArray(a)){let b=!1,d=a.map(a=>{let d=c(a);return d!==a&&(b=!0),d});return b?d:a}if(!a||"object"!=typeof a)return a;let d=null;if("notes"in a&&"string"!=typeof a.notes&&void 0!==a.notes){d={...a};let c=function(a){if(null!=a)return"string"==typeof a?a:Array.isArray(a)?a.map(a=>"string"==typeof a?a:JSON.stringify(a)).join("\n\n"):JSON.stringify(a)}(a.notes);void 0!==c&&c.trim()?d.notes=c:delete d.notes,b=!0}for(let b of ap){if(!(b in a))continue;let e=(d??a)[b],f=c(e);f!==e&&((d??={...a})[b]=f)}return d??a},d=c(a);return b?d:a}function ar(a){return`${a.name} : ${a.type}`}function as(a){let b=(a.attributes??[]).filter(a=>a?.name);return{width:Math.min(340,Math.max(170,Math.ceil(6.6*Math.max(1.15*(a.name??"").length,...b.map(a=>ar(a).length+6.96969696969697))+28))),height:30+20*Math.max(1,b.length)+8}}function at(a){return a.trim().replace(/[\s_]+/g,"-").replace(/[^A-Za-z0-9.-]/g,"").replace(/-{2,}/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,60)}let au=["alt","opt","loop"];function av(a){return!!a&&"object"==typeof a&&Array.isArray(a.participants)&&Array.isArray(a.messages)&&!("state"in a)&&!("entities"in a)}function aw(a,b,c){return{settings:c?{namespace:a,name:b,description:c}:{namespace:a,name:b},participants:[],messages:[]}}function ax(a,b){return null===a?String(b+1):`f${a+1}.${b+1}`}function ay(a,b){if(/^\d+$/.exec(b)){let c=Number(b)-1,d=a.messages?.[c];return d?{fragment:null,index:c,message:d}:null}let c=/^f(\d+)\.(\d+)$/.exec(b);if(!c)return null;let d=Number(c[1])-1,e=Number(c[2])-1,f=a.fragments?.[d]?.messages?.[e];return f?{fragment:d,index:e,message:f}:null}function az(a){let b=[];return(a.messages??[]).forEach((a,c)=>b.push({ref:ax(null,c),message:a,fragment:null})),(a.fragments??[]).forEach((a,c)=>(a?.messages??[]).forEach((a,d)=>b.push({ref:ax(c,d),message:a,fragment:c}))),b}function aA(a){let b=[];a?.settings?.name||b.push({ruleId:"S001",message:"The sequence has no settings.name",element:"settings"});let c=new Set;for(let[d,e]of(a.participants??[]).entries()){if(!e?.name){b.push({ruleId:"S002",message:`Participant at index ${d} has no name`,element:`participants[${d}]`});continue}c.has(e.name)&&b.push({ruleId:"S002",message:`Duplicate participant "${e.name}"`,element:e.name}),c.add(e.name)}let d=(a,d)=>{if(!a)return void b.push({ruleId:"S003",message:`Message ${d} is empty`,element:`message:${d}`});for(let e of["from","to"])a[e]&&c.has(a[e])||b.push({ruleId:"S003",message:`Message ${d} ${"from"===e?"comes from":"goes to"} "${a[e]??""}", which is not a participant`,element:`message:${d}`});a.label?.trim()||b.push({ruleId:"S004",message:`Message ${d} has no label`,element:`message:${d}`})};(a.messages??[]).forEach((a,b)=>d(a,ax(null,b)));let e=(a.messages??[]).length;for(let[c,f]of(a.fragments??[]).entries()){let a=`fragment:${c+1}`;if(!f||!au.includes(f.kind)){b.push({ruleId:"S005",message:`Fragment ${c+1} has kind "${f?.kind??""}"; expected one of ${au.join(", ")}`,element:a});continue}(!Number.isInteger(f.after)||f.after<0||f.after>e)&&b.push({ruleId:"S005",message:`Fragment ${c+1} branches after message ${f.after}, but the main sequence has messages 1 to ${e}`,element:a}),f.messages?.length||b.push({ruleId:"S006",message:`Fragment ${c+1} (${f.kind}) holds no message`,element:a}),(f.messages??[]).forEach((a,b)=>d(a,ax(c,b)))}return b}let aB=a=>{let b={settings:{...a.settings},participants:(a.participants??[]).map(a=>({...a,...a.holds?{holds:[...a.holds]}:{}})),messages:(a.messages??[]).map(a=>({...a}))};return a.fragments&&(b.fragments=a.fragments.map(a=>({...a,messages:(a.messages??[]).map(a=>({...a}))}))),b};function aC(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a&&""!==a&&!(Array.isArray(a)&&0===a.length)))}function aD(a,b){let c=a.participants.find(a=>a.name===b);if(!c){let c=a.participants.map(a=>a.name).join(", ")||"none";throw Error(`Participant '${b}' not found. Participants: ${c}.`)}return c}function aE(a,b){if(aD(a,b.from),aD(a,b.to),!b.label?.trim())throw Error("A message needs a label: what is said or done, in a few words.")}function aF(a,b){let c=a.fragments?.[b];if(c&&!Array.isArray(c.messages)&&(c.messages=[]),!c)throw Error(`Fragment ${b+1} not found. The sequence has ${a.fragments?.length??0} fragment(s).`);return c}function aG(a,b,c){let d=aB(a),e=aD(d,b),f=aC({...e,...c});return d.participants[d.participants.indexOf(e)]=f,d}function aH(a,b,c){let d=aB(a);aE(d,b);let e=void 0===c?d.messages.length:Math.max(0,Math.min(c,d.messages.length));if(d.messages.splice(e,0,aC({...b})),d.fragments)for(let a of d.fragments)a.after>e&&(a.after+=1);return d}function aI(a,b,c,d=null){let e=aB(a),f=null===d?e.messages:aF(e,d).messages,g=f[b];if(!g)throw Error(`Message ${b+1} not found${null===d?"":` in fragment ${d+1}`}.`);let h=aC({...g,...c});return aE(e,h),f[b]=h,e}function aJ(a,b,c){let d=aB(a);if(!d.messages[b])throw Error(`Message ${b+1} not found.`);let e=Math.max(0,Math.min(c,d.messages.length-1)),f=(d.fragments??[]).map(a=>a.after>0?d.messages[a.after-1]:null),[g]=d.messages.splice(b,1);return d.messages.splice(e,0,g),(d.fragments??[]).forEach((a,b)=>{let c=f[b];c&&(a.after=d.messages.indexOf(c)+1)}),d}let aK={columnGap:150,rowHeight:34,headerHeight:34,topGap:30,fragmentPad:30,margin:24,fontSize:12};function aL(a,b={}){let c={...aK,...b},d=(Array.isArray(a.participants)?a.participants:[]).map(a=>({...a,name:"string"==typeof a?.name?a.name:""})),e=(Array.isArray(a.messages)?a.messages:[]).filter(a=>!!a&&"object"==typeof a),f=a=>Math.max(90,y(a,c.fontSize)+28),g=[],h=c.margin;d.forEach((b,i)=>{let j=f(b.name);if(0===i)g.push(h+j/2);else{let h=f(d[i-1].name),k=function(a,b,c,d,e){let f=0;for(let g of[...a,...(Array.isArray(b.fragments)?b.fragments:[]).flatMap(a=>(Array.isArray(a?.messages)?a.messages:[]).filter(a=>!!a&&"object"==typeof a))])(g.from===c&&g.to===d||g.from===d&&g.to===c)&&(f=Math.max(f,y("string"==typeof g.label?g.label:"",e)+30));return f}(e,a,d[i-1].name,b.name,c.fontSize),l=Math.max(c.columnGap,(h+j)/2+20,k+24);g.push(g[i-1]+l)}});let i=new Map(d.map((a,b)=>[a.name,g[b]])),j=d.map((a,b)=>{let d=f(a.name);return{name:a.name,x:g[b],left:g[b]-d/2,top:c.margin,width:d,height:c.headerHeight}}),k=[],l=c.margin+c.headerHeight+c.topGap,m=0,n=(a,b,d,e,f)=>{let g=i.get(d)??c.margin,h=i.get(e)??c.margin,j=d===e;j&&(m=Math.max(m,g+44+y("string"==typeof f?f:"",c.fontSize))),k.push({ref:ax(a,b),fragment:a,index:b,y:l,fromX:g,toX:h,self:j}),l+=c.rowHeight};(Array.isArray(a.messages)?a.messages:[]).forEach((a,b)=>{a&&"object"==typeof a&&n(null,b,a.from,a.to,a.label)});let o=c.margin/2,p=Math.max(g.length?g[g.length-1]+f(d[d.length-1].name)/2:c.margin,m)+c.margin/2,q=[];(Array.isArray(a.fragments)?a.fragments:[]).forEach((a,b)=>{if(!a||"object"!=typeof a)return;let d=(l+=c.rowHeight/2)-c.rowHeight/2;l+=c.fragmentPad-c.rowHeight/2+6,(Array.isArray(a.messages)?a.messages:[]).forEach((a,c)=>{a&&"object"==typeof a&&n(b,c,a.from,a.to,a.label)});let e=l-d+c.fragmentPad/2-c.rowHeight/2;q.push({index:b,left:o,top:d,width:p-o,height:e,headingY:d+16}),l=d+e+c.rowHeight/2});let r=c.margin+c.headerHeight,s=l;return{participants:j,rows:k,fragments:q,lifelineTop:r,lifelineBottom:s,width:Math.max(p+c.margin/2,2*c.margin+200),height:s+c.margin}}let aM=a=>a.replace(/[;#\n\r]+/g," ").replace(/\s+/g," ").trim(),aN=["propose","auto"];function aO(a,b){return"auto"===b||"propose"===b?b:a?.settings?.reconcile==="auto"?"auto":"propose"}let aP=["person","agent","service","external"];function aQ(a){return a.toLowerCase().endsWith(".sysdf.json")}function aR(a){return!!a&&"object"==typeof a&&Array.isArray(a.members)&&!("state"in a)&&!("entities"in a)&&!("participants"in a)}function aS(a){return a.toLowerCase().endsWith(".erdf.json")?"erd":a.toLowerCase().endsWith(".sqdf.json")?"sequence":aQ(a)?"system":"machine"}function aT(a){return a&&"object"==typeof a?X(a)?"erd":av(a)?"sequence":aR(a)?"system":"state"in a?"machine":null:null}let aU=["erd","machine","sequence"];function aV(a,b){return b.startsWith("/")?aW(b):aW((a.slice(0,a.lastIndexOf("/")+1)||"./")+b)}function aW(a){let b=a.startsWith("/"),c=[];for(let d of a.split("/"))if(d&&"."!==d){if(".."===d){c.length&&".."!==c[c.length-1]?c.pop():b||c.push("..");continue}c.push(d)}return(b?"/":"")+c.join("/")}let aX=a=>({settings:{...a.settings},members:(a.members??[]).map(a=>({...a})),actors:(a.actors??[]).map(a=>({...a}))});function aY(a){return Object.fromEntries(Object.entries(a).filter(([,a])=>void 0!==a&&""!==a))}function aZ(a,b){let c=aX(a);return c.settings=aY({...c.settings,...b}),c}let a$=["refused","unknown-event","ended","state-mismatch"];function a_(a,b=0){return a.settings?.name||a.state?.name||`machine ${b+1}`}function a0(a){let b=a.map((a,b)=>a_(a,b));return b.map((a,c)=>b.indexOf(a)===c&&b.lastIndexOf(a)===c?a:`${a} #${c+1}`)}function a1(a,b){let c=a.states.get(b);for(;c&&c.states?.length;){let a=c.states.find(a=>"history"!==a.kind);if(!a)return null;c=a}return c?.name??null}function a2(a,b,c){let d=b;for(;d;){if(d===c)return!0;d=a.parent.get(d)}return!1}let a3=(a,b)=>a.states.get(b)?.kind==="final";function a4(a,b){let c,d,e=a0(b),f=b.map((a,b)=>(function(a,b,c){let d=new Map,e=new Map,f=(a,b)=>{if(a?.name){for(let c of(d.has(a.name)||(d.set(a.name,a),e.set(a.name,b)),a.states??[]))f(c,a.name);for(let b of a.parallel?.states??[])f(b,a.name)}};a.state&&f(a.state,null);let g=new Set;for(let b of a.events??[])for(let a of b?.events??[])a?.id&&g.add(a.id);for(let b of a.events??[])for(let a of b?.timers??[])a?.id&&g.add(a.id);let h={name:c,def:a,states:d,parent:e,events:g,initial:null};return h.initial=a.state?a1(h,a.state.name):null,h})(a,0,e[b])),g=(d=[{name:"main",kind:"main",items:c=(a.messages??[]).map((a,b)=>({ref:ax(null,b),message:a}))}],c.some(a=>a.message?.optional)&&d.push({name:"main without optional messages",kind:"without-optional",items:c.filter(a=>!a.message?.optional)}),(a.fragments??[]).forEach((a,b)=>{if(!a)return;let e=(a.messages??[]).map((a,c)=>({ref:ax(b,c),message:a})),f=Math.max(0,Math.min(a.after??0,c.length)),g=c.slice(0,f),h=c.slice(f),i=`${a.kind} ${b+1} \xb7 ${a.label??""}`.trim();"alt"===a.kind?d.push({name:i,kind:"alt",fragment:b,items:[...g,...e]}):"opt"===a.kind?d.push({name:i,kind:"opt",fragment:b,items:[...g,...e,...h]}):"loop"===a.kind&&d.push({name:i,kind:"loop",fragment:b,items:[...g,...e,...e,...h]})}),d).map(a=>(function(a,b){let c=new Map;for(let a of b){let b=a.initial&&a3(a,a.initial)?a.initial:null;c.set(a.name,{states:a.initial?[a.initial]:[],ended:b})}let d=[],e=new Map;for(let a of b){let b=a_(a.def);e.set(b,e.has(b)?null:a),a.name!==b&&e.set(a.name,a)}for(let{ref:f,message:g}of a.items){if(!g)continue;let a=g.label??"";if(!g.event){let e={ref:f,label:a,from:[],to:[],result:"data"};g.state&&function(a,b,c,d){let e=c.filter(a=>b.machine?a.name===b.machine:a.states.has(b.state));if(!e.length){a.result="state-mismatch",a.note=b.machine?`no member machine is named "${b.machine}"`:`no member machine has a state "${b.state}"`;return}for(let c of e){let e=d.get(c.name),f=e.states.filter(a=>a2(c,a,b.state));if(f.length){e.states=f;continue}a.machine=c.name,a.from=a.to=[...e.states],a.result="state-mismatch",a.note=`the scenario says ${c.name} is in ${b.state}; the walk has it in ${e.states.join(" or ")||"no state"}`;return}}(e,g,b,c),d.push(e);continue}let h=g.event,i=b.filter(a=>a.events.has(h));if(g.machine){let b=e.get(g.machine);if(!b){let c=null===b?`two member machines are named "${g.machine}"`:`no member machine is named "${g.machine}"`;d.push({ref:f,label:a,event:h,from:[],to:[],result:"unknown-event",note:c});continue}if(!(i=i.filter(a=>a===b)).length){d.push({ref:f,label:a,event:h,machine:b.name,from:[],to:[],result:"unknown-event",note:`"${b.name}" does not define the event "${h}"`});continue}}if(!i.length){d.push({ref:f,label:a,event:h,from:[],to:[],result:"unknown-event",note:`no member machine defines the event "${h}"`});continue}for(let b of i){let e=c.get(b.name),i=[...e.states];if(e.ended){d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"ended",note:`${b.name} ended in ${e.ended} before this message`});continue}let j=i.filter(a=>!a3(b,a));if(!j.length){d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"ended",note:`${b.name} ended in ${i.join(" or ")} before this message`});continue}let k=new Set,l=new Map,m=new Set,n=[];for(let a of j)for(let c of function(a,b,c){let d=[],e=b;for(;e;){for(let b of a.states.get(e)?.transitions??[])if(b?.event===c&&(d.push(b),!b.condition))return d;e=a.parent.get(e)}return d}(b,a,h)){let d=c.nextState?a1(b,c.nextState):a;if(!d){n.push(c.nextState);continue}k.add(d),d!==a&&m.add(d),c.condition&&l.set(d,(l.get(d)??new Set).add(c.condition))}if(!k.size){let c=n.length?`${b.name}'s transition for "${h}" from ${j.join(" or ")} leads to ${[...new Set(n)].join(", ")}, which cannot be entered`:`${b.name} has no transition for "${h}" from ${j.join(" or ")}`;d.push({ref:f,label:a,event:h,machine:b.name,from:i,to:i,result:"refused",note:c});continue}let o=[...k],p={ref:f,label:a,event:h,machine:b.name,from:i,to:o,result:"moved"};if(g.state&&(!g.machine||g.machine===b.name)){let a=b.states.has(g.state);if(a||g.machine===b.name){let c=o.filter(a=>a2(b,a,g.state));c.length?o=c:(p.result="state-mismatch",p.note=a?`the scenario says ${b.name} is in ${g.state}; the walk has it in ${o.join(" or ")}`:`${b.name} has no state "${g.state}"`)}}p.to=o,"moved"!==p.result||o.some(a=>m.has(a))||(p.result="stayed");let q=new Set(o.flatMap(a=>[...l.get(a)??[]]));q.size&&(p.guards=[...q]),e.states=o;let r=o.filter(a=>a3(b,a));r.length&&r.length===o.length&&(e.ended=r[0]),d.push(p)}}let f={};for(let[a,b]of c)f[a]=b.states;return{name:a.name,kind:a.kind,...void 0===a.fragment?{}:{fragment:a.fragment},steps:d,accepted:!d.some(a=>a$.includes(a.result)),end:f}})(a,f));return{scenario:a.settings?.name??"",machines:f.map(a=>a.name),paths:g,accepted:g.every(a=>a.accepted)}}function a5(a){let b={machines:[],erds:[],sequences:[]};for(let c of a)c.def&&!c.error&&aT(c.def)===c.kind&&("machine"===c.kind&&b.machines.push({member:c.path,def:c.def}),"erd"===c.kind&&b.erds.push({member:c.path,def:c.def}),"sequence"===c.kind&&b.sequences.push({member:c.path,def:c.def}));return b}function a6(a,b){let c=[],d=(a,b,d,e)=>{c.push({ruleId:a,message:b,severity:"error",...d?{member:d}:{},...e?{element:e}:{}})},e=(a,b,d,e)=>{c.push({ruleId:a,message:b,severity:"warning",...d?{member:d}:{},...e?{element:e}:{}})};if(a){a.settings?.name||d("Y001","The system has no settings.name"),a.settings?.namespace||d("Y001","The system has no settings.namespace");let b=new Set;for(let[c,e]of(a.members??[]).entries()){if(!e?.path){d("Y002",`Member at index ${c} has no path`,void 0,`members[${c}]`);continue}b.has(e.path)&&d("Y002",`"${e.path}" is listed twice`,e.path),b.add(e.path),aU.includes(aS(e.path))&&e.path.endsWith(".json")||d("Y002",`"${e.path}" is not a document a system holds (.erdf.json, .smdf.json, .sqdf.json)`,e.path)}let c=new Set;for(let[b,e]of(a.actors??[]).entries()){if(!e?.name){d("Y004",`Actor at index ${b} has no name`,void 0,`actors[${b}]`);continue}c.has(e.name)&&d("Y004",`Duplicate actor "${e.name}"`,void 0,e.name),c.add(e.name),aP.includes(e.kind)||d("Y004",`Actor "${e.name}" has kind "${e.kind??""}"; expected one of ${aP.join(", ")}`,void 0,e.name)}}for(let a of b)a.error||!a.def?d("Y003",`"${a.path}" cannot be read: ${a.error??"no content"}`,a.path):aT(a.def)!==a.kind&&d("Y003",`"${a.path}" is named as a ${a.kind} but holds ${aT(a.def)??"something else"}`,a.path);let{machines:f,erds:g,sequences:h}=a5(b),i=new Map;for(let{member:a,def:b}of f){let c=a_(b),e=i.get(c);e?d("Y005",`"${a}" and "${e}" are both machines named "${c}"; a message cannot say which`,a):i.set(c,a)}for(let{member:a,def:b}of g)for(let c of Y(b))d(c.ruleId,c.message,a,c.element);for(let{member:a,def:b}of h)for(let c of aA(b))d(c.ruleId,c.message,a,c.element);let j=function(a){if(!a.length)return null;let b=new Set,c=a.flatMap(({def:a})=>a.entities??[]).filter(a=>a?.name&&!b.has(a.name)&&b.add(a.name));return{settings:{namespace:a[0].def.settings?.namespace??"",name:a.map(a=>a.def.settings?.name).join(" + ")},entities:c,relationships:a.flatMap(({def:a})=>a.relationships??[])}}(g);if(j){for(let{member:a,def:b}of f)for(let c of $(b,j))d(c.ruleId,c.message,a,c.element);let a=f.map(({def:a},b)=>a_(a,b));for(let{member:b,def:c}of g)for(let e of _(c,a))d(e.ruleId,e.message,b,e.element)}for(let{member:a,def:b}of f){let c=(d,f)=>{if(!d)return;let g=f||(d.transitions??[]).length>0,h=d.states??[];for(let f of(h.length||d.parallel||d===b.state||"final"===d.kind||"history"===d.kind||g||e("L009",`${a_(b)}: ${d.name} has no way out and is not final; say how the machine leaves it, or mark it final`,a,`state:${d.name}`),h))c(f,g)};c(b.state,!1)}let k=f.map(a=>a.def),l=new Set(k.map((a,b)=>a_(a,b))),m=new Map,n=new Set,o=new Set;k.forEach((a,b)=>{let c=new Set;for(let b of a.events??[]){for(let a of b?.events??[])a?.id&&c.add(a.id);for(let a of b?.timers??[])a?.id&&c.add(a.id)}m.set(a_(a,b),c);let d=a=>{a&&(n.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};for(let b of(d(a.state),a.settings?.objects??[]))b?.instance&&o.add(b.instance)});let p=new Set((j?.entities??[]).map(a=>a.name)),q=new Set((a?.actors??[]).map(a=>a.name)),r=[];for(let{member:b,def:c}of h){let f=!1,g=a=>!!j||(f||e("L006",`${a} name entities, but the system has no ERD to hold them`,b),f=!0,!1);for(let e of c.participants??[]){if(!e?.name)continue;let c=`participant:${e.name}`;if(e.actor&&a&&!q.has(e.actor)&&d("L006",`Participant "${e.name}" is the actor "${e.actor}", which the system does not list`,b,c),e.object&&!o.has(e.object)&&d("L006",`Participant "${e.name}" is the object "${e.object}", which no member machine declares`,b,c),e.holds?.length&&g("Participants' holds"))for(let a of e.holds)p.has(a)||d("L006",`Participant "${e.name}" holds "${a}", which is not an entity`,b,c)}for(let{ref:a,message:f}of az(c)){if(!f)continue;let c=`message:${a}`;f.machine&&!l.has(f.machine)?d("L005",`Message ${a} names the machine "${f.machine}", which is not a member`,b,c):f.event&&((f.machine?m.get(f.machine)?.has(f.event):[...m.values()].some(a=>a.has(f.event)))||d("L005",`Message ${a} fires "${f.event}", which ${f.machine?`"${f.machine}" does not define`:"no member machine defines"}`,b,c)),f.carries&&g("Messages' carries")&&!p.has(f.carries)&&d("L007",`Message ${a} carries "${f.carries}", which is not an entity`,b,c),f.state&&!n.has(f.state)&&e("L008",`Message ${a} says the machine is then in "${f.state}", which no member machine has`,b,c)}let h=a4(c,k);for(let a of(r.push({member:b,report:h}),h.paths)){let c=a.steps.filter(a=>"refused"===a.result||"ended"===a.result||"state-mismatch"===a.result);for(let d of[...new Set(c.map(a=>a.machine??""))]){let f=c.filter(a=>(a.machine??"")===d),g=f[0],h=f.length>1?` (${f.length-1} later message${f.length>2?"s stop":" stops"} too)`:"",i="without-optional"===a.kind?" — a message the rest depends on may not be optional":"";e("L008",`${a.name}, message ${g.ref}: ${g.note??g.result}${h}${i}`,b,`message:${g.ref}`)}}}return{issues:c,replays:r}}function a7(a){return`${a.kind}:${a.name}`}function a8(a){let b=a.indexOf(":");if(b<=0)return null;let c=a.slice(0,b);return["entity","attribute","machine","object","event","state","participant","message"].includes(c)?{kind:c,name:a.slice(b+1)}:null}function a9(a){let{machines:b,erds:c,sequences:d}=a5(a),e=[],f=new Map;for(let{member:a,def:b}of c)for(let c of b.entities??[])c?.name&&!f.has(c.name)&&f.set(c.name,a);let g=new Map;for(let{def:a}of c)for(let b of a.entities??[])g.set(b.name,new Set((b.attributes??[]).map(a=>a.name)));let h=new Map,i=new Map;b.forEach(({member:a,def:b},c)=>{let d=a_(b,c);for(let c of b.events??[])for(let b of[...c?.events??[],...c?.timers??[]]){if(!b?.id)continue;let c=h.get(b.id)??[];c.push({member:a,machine:d}),h.set(b.id,c)}for(let c of b.settings?.objects??[]){if(!c?.instance)continue;i.has(c.instance)||i.set(c.instance,{member:a,className:c.class});let b=f.get(c.class);b&&e.push({from:{member:a,kind:"object",name:c.instance},to:{member:b,kind:"entity",name:c.class},rule:"L001",text:`is constructed as the entity ${c.class}`,back:`is the class of ${d}'s object ${c.instance}`})}let j=c=>{if(c){for(let d of c.transitions??[])if(d?.condition)for(let h of b.settings?.objects??[]){let b=f.get(h.class);if(b)for(let f of Z(d.condition,h.instance))g.get(h.class)?.has(f)&&e.push({from:{member:a,kind:"event",name:d.event},to:{member:b,kind:"attribute",name:`${h.class}.${f}`},rule:"L002",text:`its guard on ${c.name} reads ${h.class}.${f}`,back:`is read by the ${d.event} guard on ${c.name}`})}(c.states??[]).forEach(j)}};j(b.state)});let j=a0(b.map(a=>a.def)),k=new Map(b.map(({member:a},b)=>[j[b],a]));for(let{member:a,def:d}of c)for(let c of d.entities??[])for(let d of c.attributes??[])for(let f of V(d)){let g=k.get(f)??b.find(({def:a})=>a_(a)===f)?.member;g&&e.push({from:{member:a,kind:"attribute",name:`${c.name}.${d.name}`},to:{member:g,kind:"machine",name:f},rule:"L003",text:`stores the state of ${f}`,back:`keeps its state in ${c.name}.${d.name}`})}for(let{member:a,def:c}of d){for(let b of c.participants??[]){if(!b?.name)continue;let c={member:a,kind:"participant",name:b.name},d=b.object?i.get(b.object):void 0;for(let a of(d&&e.push({from:c,to:{member:d.member,kind:"object",name:b.object},rule:"L006",text:`is the object ${b.object}`,back:`is the participant ${b.name}`}),b.holds??[])){let d=f.get(a);d&&e.push({from:c,to:{member:d,kind:"entity",name:a},rule:"L006",text:`holds ${a}`,back:`is held by ${b.name}`})}}for(let{ref:b,message:d}of az(c)){if(!d)continue;let g={member:a,kind:"message",name:b};if(d.event)for(let a of h.get(d.event)??[])d.machine&&d.machine!==a.machine||e.push({from:g,to:{member:a.member,kind:"event",name:d.event},rule:"L005",text:`fires ${d.event}`,back:`is fired by message ${b} of ${c.settings?.name??"the scenario"}`});if(d.carries){let a=f.get(d.carries);a&&e.push({from:g,to:{member:a,kind:"entity",name:d.carries},rule:"L007",text:`carries ${d.carries}`,back:`is carried by message ${b}`})}}let d=a4(c,b.map(a=>a.def)).paths.find(a=>"main"===a.kind);for(let b of d?.steps??[]){if("moved"!==b.result||!b.machine)continue;let c=k.get(b.machine);if(c)for(let d of b.to)e.push({from:{member:a,kind:"message",name:b.ref},to:{member:c,kind:"state",name:d},rule:"L008",text:`moves ${b.machine} to ${d}`,back:`is entered on message ${b.ref}`})}}return e}let ba=a=>{let b=a.replace(/[^A-Za-z0-9]+(.)?/g,(a,b)=>b?b.toUpperCase():"").replace(/^[^A-Za-z]+/,"");return b?b.charAt(0).toUpperCase()+b.slice(1):"Scenario"};function bb(a,b){let c=a=>!!a&&(a.name===b||(a.states??[]).some(c)||(a.parallel?.states??[]).some(c));return c(a.state)}let bc=(a,b)=>b?"service":/\b(agent|bot|assistant)\b/i.test(a)?"agent":"person";function bd(a,b){let{machines:c,erds:d,sequences:e}=a5(b),f=[],g=a=>{f.includes(a)||f.push(a)},h=a,i=[];if(h)for(let{def:a}of e)for(let b of a.participants??[]){if(!b?.actor||(h.actors??[]).some(a=>a.name===b.actor))continue;let c=bc(b.actor,b.service);h=function(a,b){if(!b.name?.trim())throw Error("An actor needs a name.");if(!aP.includes(b.kind))throw Error(`An actor is one of ${aP.join(", ")}; got '${b.kind}'.`);let c=aX(a);if((c.actors??[]).some(a=>a.name===b.name))throw Error(`Actor '${b.name}' already exists.`);return(c.actors??=[]).push(aY({...b})),c}(h,{name:b.actor,kind:c}),i.push(`the system gains the ${c} "${b.actor}", who takes part in ${a.settings?.name??"a scenario"}`)}let j=d.map(a=>({member:a.member,def:a.def,reasons:[]})),k=new Set(j.flatMap(a=>(a.def.entities??[]).map(a=>a.name)));for(let{def:a}of e){let b=[];for(let c of a.participants??[])for(let d of c?.holds??[])d?.trim()&&b.push({name:d.trim(),why:`${c.name} holds it in ${a.settings?.name??"a scenario"}`});for(let{ref:c,message:d}of az(a))d?.carries?.trim()&&b.push({name:d.carries,why:`message ${c} of ${a.settings?.name??"a scenario"} carries it`});for(let a of b){if(k.has(a.name))continue;if(!j.length){g(`"${a.name}" is named as data (${a.why}), but the system has no ERD to hold it; add a .erdf.json member`);continue}let b=j[0];b.def=ad(b.def,{name:a.name,notes:`Added from the scenario: ${a.why}.`}),b.reasons.push(`${b.def.settings?.name??b.member} gains the entity ${a.name}, because ${a.why}`),k.add(a.name)}}let l=c.map(a=>a.def),m=a0(l),o=l.map(()=>[]),p=l.map(()=>[]),q=(a,b,c)=>{l=l.map((c,d)=>d===a?n(c,b):c),o[a].push(...b),p[a].push(c)},r=a=>a.charAt(0).toLowerCase()+a.slice(1);for(let{def:a}of j)for(let b of a.entities??[])for(let a of b.attributes??[])for(let c of a?.stateOf===void 0?[]:Array.isArray(a.stateOf)?a.stateOf:[a.stateOf]){let d=m.findIndex((a,b)=>a===c||a_(l[b])===c);if(d<0)continue;let e=l[d].settings?.objects??[];if(e.some(a=>a.class===b.name))continue;let f=r(b.name);for(;e.some(a=>a.instance===f);)f+="_";q(d,[{op:"settings.update",patch:{objects:[...e,{instance:f,class:b.name}]}}],`${m[d]} is constructed with the object ${f} : ${b.name}, because ${b.name}.${a.name} stores its state`)}for(let{def:a}of e){for(let b of a.participants??[]){if(!b?.object||l.some(a=>(a.settings?.objects??[]).some(a=>a.instance===b.object)))continue;let a=(b.holds??[]).filter(a=>a?.trim()),c=1===a.length?a[0].trim():null;1===l.length&&c?q(0,[{op:"settings.update",patch:{objects:[...l[0].settings?.objects??[],{instance:b.object,class:c}]}}],`${m[0]} is constructed with the object ${b.object} : ${c}, because ${b.name} is it`):g(`${b.name} is the object "${b.object}", which no machine declares; ${1===l.length?"say which entity it is by holding exactly one":"declare it on the machine it belongs to"}`)}let b=function(a,b,c={}){let d=c.maxRounds??100,e=b.map(a=>a),f=a0(e),g=new Map,h=[],i=new Set,j=a4(a,e),k=new Set,l="",m=(a,b,c)=>{k.add(`${a}|${JSON.stringify(b)}`),e=e.map((c,d)=>d===a?n(c,b):c);let d=g.get(a)??{machine:f[a],index:a,ops:[],reasons:[]};d.ops.push(...b),d.reasons.push(c),g.set(a,d)},o=!0;for(let b=0;b<d;b++){let b=(function(a){let b=[];for(let c of a.paths)for(let a of c.steps)("refused"===a.result||"unknown-event"===a.result||"ended"===a.result||"state-mismatch"===a.result)&&b.push({path:c,step:a});return b})(a4(a,e)).find(({path:a,step:b})=>!i.has(`${b.ref}|${b.machine??""}|${b.result}|${a.name}`)&&!i.has(`${a.name}|${b.machine??""}`));if(!b){o=!1;break}let{path:c,step:d}=b,g=`${d.ref}|${d.machine??""}|${d.result}|${c.name}`,j=`${g}|${d.from.join("|")}`,n=j===l;l=j;let p=ay(a,d.ref)?.message,q=`message ${d.ref} (${c.name})`,r=(a,b)=>{i.add(g),i.add(`${c.name}|${d.machine??""}`),h.includes(b)||h.push(b)};if("without-optional"===c.kind){let b=(a.messages??[]).map((a,b)=>a?.optional?String(b+1):"").filter(Boolean);r(g,`${q}: without its optional message${b.length>1?"s":""} ${b.join(", ")} the scenario stops (${d.note??d.result}); if the rest depends on ${b.length>1?"them, they are":"it, it is"} not optional`);continue}if(!p){r(g,`${q}: cannot be read back from the sequence`);continue}if(n){r(g,`${q}: the change proposed for it did not let the walk through (${d.note??d.result}); a person has to look at ${d.machine??"the machine"}`);continue}let s=(a,b,c)=>{k.has(`${a}|${JSON.stringify(b)}`)?r(g,`${q}: the change it needs was already proposed and did not take effect (${d.note??d.result})`):m(a,b,c)};if("unknown-event"===d.result){let a=p.machine?e.map((a,b)=>f[b]===p.machine||(a.settings?.name??"")===p.machine?b:-1).filter(a=>a>=0):1===e.length?[0]:[];if(a.length>1){r(g,`${q}: ${a.length} member machines are named "${p.machine}"; rename one so the message can say which`);continue}let b=a.length?a[0]:-1;if(b<0){r(g,p.machine?`${q}: fires "${p.event}" for "${p.machine}", which is not a member machine`:`${q}: fires "${p.event}", which no machine defines; set the message's machine to say which one should`);continue}let c=e[b],d=`${ba(p.from)}Events`,h=ba(p.from),i=(c.events??[]).findIndex(a=>a?.name===d||a?.name===h||a?.name===p.from||a?.feeder===p.from),j=i>=0?c.events[i].name:d,k={id:p.event,...p.label?.trim()?{description:p.label.trim()}:{}};s(b,i>=0?[{op:"event.add",sourceIndex:i,event:k}]:[{op:"eventSource.add",source:{name:d,events:[k]}}],`${f[b]} defines "${p.event}" in ${j}, because ${q} fires it`);continue}if("refused"===d.result){let a=f.indexOf(d.machine??"");if(!p.state){r(g,`${q}: ${d.machine} refuses "${p.event}" from ${d.from.join(" or ")}; give the message a state to say where it leads, and reconcile can add the transition`);continue}if(1!==d.from.length){r(g,`${q}: ${d.machine} could be in ${d.from.join(" or ")}; choose which state "${p.event}" leaves from`);continue}let b=e[a],c=d.from[0],h=bb(b,p.state);if(!h&&!p.machine){let b=f.filter((b,c)=>c!==a&&bb(e[c],p.state)),c=e.filter(a=>(function(a){let b=new Set;for(let c of a.events??[])for(let a of[...c?.events??[],...c?.timers??[]])a?.id&&b.add(a.id);return b})(a).has(p.event)).length;if(b.length||c>1){r(g,`${q}: "${p.state}" ${b.length?"is a state of another machine":"is claimed while several machines hear the event"}; set the message's machine to say which machine it is about`);continue}}if(!function(a,b){let c=a=>!!a&&(a.name===b||(a.states??[]).some(c));return c(a.state)}(b,c)){r(g,`${q}: ${d.machine} is in ${c}, inside a parallel region, which reconcile does not edit`);continue}let i=[],j=[],k=c===b.state?.name&&!(b.state?.states??[]).length;if(h||(i.push({op:"state.add",parent:null,state:{name:p.state,...p.label?.trim()?{description:`Reached when: ${p.label.trim()}`}:{},transitions:[]}}),j.push(k?`gains its first state, ${p.state}`:`adds the state ${p.state}`)),k){s(a,i,`${f[a]} ${j.join(" and ")}, because ${q} says the machine is there`);continue}let l=p.label?.trim()?{description:p.label.trim()}:{};i.push(c===p.state?{op:"transition.add",state:c,transition:{event:p.event,...l}}:{op:"transition.add",state:c,transition:{event:p.event,nextState:p.state,...l}}),j.push(c===p.state?`handles "${p.event}" in ${c} without leaving it`:`goes from ${c} to ${p.state} on "${p.event}"`),s(a,i,`${f[a]} ${j.join(" and ")}, because ${q} says so`);continue}if("state-mismatch"===d.result){r(g,`${q}: ${d.note??"the scenario and the machine disagree"}; one of them has to change, and that is a person's call`);continue}r(g,`${q}: ${d.note??d.result}`)}return o&&h.push(`reconcile stopped after ${d} rounds; what it proposed so far is kept, and the rest needs a person`),{proposals:[...g.values()].sort((a,b)=>a.index-b.index),unresolved:h,before:j,after:a4(a,e),machines:e}}(a,l);for(let a of b.proposals)o[a.index].push(...a.ops),p[a.index].push(...a.reasons);for(let c of(l=b.machines,b.unresolved))g(`${a.settings?.name??"scenario"}: ${c}`)}let s=c.map((a,b)=>({member:a.member,index:b,machine:m[b],ops:o[b],reasons:p[b],def:l[b]})).filter(a=>a.ops.length),t=j.filter(a=>a.reasons.length);return{machines:s,erds:t,system:h&&i.length?{def:h,reasons:i}:null,unresolved:f,count:s.reduce((a,b)=>a+b.reasons.length,0)+t.reduce((a,b)=>a+b.reasons.length,0)+i.length}}function be(a,b){if(!a.count&&!a.unresolved.length)return"auto"===b?"auto: the drawings already agree":"the drawings agree";let c=[...a.machines.map(a=>`${a.machine} +${a.reasons.length}`),...a.erds.map(a=>`${a.def.settings?.name??a.member} +${a.reasons.length}`),...a.system?[`system +${a.system.reasons.length}`]:[]],d=c.length?c.join(", "):"no change",e=a.unresolved.length?`; ${a.unresolved.length} left open`:"";return"auto"===b?`auto: ${d}${e}`:`${a.count} change${1===a.count?"":"s"} proposed (${d})${e}`}let bf="default",bg=/^[A-Za-z0-9._-]{1,64}$/;function bh(a){return"string"==typeof a&&bg.test(a)}let bi=["comment","question","looks_good","delete"],bj=["open","answered","resolved"],bk=a=>"string"==typeof a?a:"";function bl(a){let b=a&&"object"==typeof a?a:{},c="agent"===b.role?"agent":"person",d=bk(b.name)||bk(b.id)||("agent"===c?"agent":"someone");return{id:bk(b.id)||d,name:d,role:c}}function bm(a){let b=a&&"object"==typeof a?a:{},c=bk(b.text).trim();return c?{author:bl(b.author),text:c,at:bk(b.at)}:null}function bn(a){if(!a||"object"!=typeof a)return null;let b=bk(a.id),c=bk(a.text).trim();if(!b||!c)return null;let d=Array.isArray(a.elements)?a.elements.filter(a=>"string"==typeof a&&a.length>0):[],e=function(a){if(!a||"object"!=typeof a)return;let b=b=>"number"==typeof a[b]&&Number.isFinite(a[b])?a[b]:NaN,c={x:b("x"),y:b("y"),width:b("width"),height:b("height")};if(!Object.values(c).some(Number.isNaN)&&!(c.width<=0)&&!(c.height<=0))return c}(a.region),f=Array.isArray(a.replies)?a.replies.map(bm).filter(a=>null!==a):[];return{id:b,kind:bi.includes(a.kind)?a.kind:"comment",...d.length?{elements:d}:{},...e?{region:e}:{},...bk(a.level)?{level:bk(a.level)}:{},text:c,author:bl(a.author),at:bk(a.at),status:bj.includes(a.status)?a.status:"open",...f.length?{replies:f}:{}}}function bo(a,b){return a.filter(a=>"open"===a.status&&a.author.role!==b||"answered"===a.status&&a.author.role===b)}function bp(a){return a.replies?.length?a.replies[a.replies.length-1].author.role:a.author.role}function bq(a,b={}){return a.filter(a=>(function(a,b={}){if("resolved"===a.status||"agent"!==bp(a))return!1;let c=b[a.id];return"number"!=typeof c||c<(a.replies?.length??0)})(a,b))}function br(a){if(!a.length)return null;let b=1/0,c=1/0,d=-1/0,e=-1/0;for(let f of a)b=Math.min(b,f.x),c=Math.min(c,f.y),d=Math.max(d,f.x+f.width),e=Math.max(e,f.y+f.height);return{x:b,y:c,width:d-b,height:e-c}}function bs(a,b){return{x:a.x-b,y:a.y-b,width:a.width+2*b,height:a.height+2*b}}function bt(a,b){let c=new Set(b);return a.filter(a=>c.has(a.focus)).map(a=>a.box)}let bu=a=>a.split("/").pop()||a;function bv(a){return a.replace(/\s+/g," ").trim()}function bw(a){return a.parallel?a.parallel.states:a.states??[]}function bx(a,b){return bw(a).find(a=>a.name===b)??null}function by(a,b){return bw(function(a,b){let c=a;for(let a of b){let b=bx(c,a);if(!b)break;c=b}return c}(a,b))}let bz={surface:"--slc-surface",nodeFill:"--slc-node-fill",nodeStroke:"--slc-node-stroke",compositeFill:"--slc-composite-fill",finalFill:"--slc-final-fill",accent:"--slc-accent",accentFill:"--slc-accent-fill",accentInk:"--slc-accent-ink",danger:"--slc-danger",drawSource:"--slc-draw-source",edge:"--slc-edge",chipFill:"--slc-chip-fill",chipStroke:"--slc-chip-stroke",label:"--slc-label",muted:"--slc-muted",faint:"--slc-faint",entry:"--slc-entry",exit:"--slc-exit",composite:"--slc-composite",active:"--slc-active",panelBg:"--slc-panel-bg",panelBorder:"--slc-panel-border",panelHover:"--slc-panel-hover"};function bA(a){let b={};if(!a)return b;for(let[c,d]of Object.entries(a)){let a=bz[c];a&&"string"==typeof d&&(b[a]=d)}return b}let bB={x:100,y:100,width:160,height:60};function bC(a,b){return 1===b?16*a:2===b?400*a:a}function bD(a){return!!a&&"string"==typeof a.tagName&&(!!a.isContentEditable||["INPUT","TEXTAREA","SELECT","BUTTON","OPTION"].includes(a.tagName))}function bE(a){return(a.states?.length??0)>0||(a.parallel?.states.length??0)>0}function bF({mark:a,x:b,y:c,selected:d}){return(0,h.jsxs)("g",{transform:`translate(${b} ${c}) scale(0.5)`,strokeWidth:a.strokeWidth,className:`slc-glyph${d?" slc-glyph--selected":""}`,children:[(a.circles??[]).map((a,b)=>(0,h.jsx)("circle",{cx:a.cx,cy:a.cy,r:a.r,className:a.filled?"slc-glyph-dot":void 0},`c${b}`)),a.paths.map((a,b)=>(0,h.jsx)("path",{d:a},`p${b}`))]})}let bG={kind:null,id:null},bH=(0,i.forwardRef)(function(a,b){let{definition:c,positions:d,path:e=[],rootLabel:f,viewport:g,onViewportChange:j,selection:k=bG,activeStates:l,errorElements:m,drawMode:n="select",drawSource:o=null,readOnly:p=!1,showBreadcrumb:q=!0,showHud:r=!0,fitKey:s,onSelect:t,onClearSelection:u,onStateMove:v,onNavigateInto:w,onNavigateTo:x,onContextMenu:y,onCreateTransition:A,onCancelDraw:C,onDeleteState:D,onUndo:F,onRedo:I,hudExtras:J,emptyHint:N,theme:O,className:U,style:V,svgId:W,pinchOwner:X="canvas"}=a,Y=(0,i.useRef)(null),Z=(0,i.useId)().replace(/:/g,""),$=(0,i.useRef)(g);$.current=g;let[_,aa]=(0,i.useState)(null),ab=(0,i.useRef)(null),ac=(0,i.useCallback)(a=>{ab.current=a,aa(a)},[]),[ad,ae]=(0,i.useState)(null),af=(0,i.useRef)(!1),[ag,ah]=(0,i.useState)(!1),ai=(0,i.useRef)(null),[aj,ak]=(0,i.useState)(!1),al=(0,i.useRef)(!1),am=(0,i.useRef)(new Map),an=(0,i.useRef)(new Map),ao=(0,i.useRef)(null),[ap,aq]=(0,i.useState)(!1),ar=(0,i.useRef)(null),as=(0,i.useRef)(!1),[at,au]=(0,i.useState)(!1),av=c.state,aw=(0,i.useMemo)(()=>{let a=function(a,b){let c=[],d=a;for(let a of b){let b=bx(d,a);if(!b)break;c.push(a),d=b}return c}(av,e);return[f??av?.name??"Root",...a]},[av,e,f]),ax=(0,i.useMemo)(()=>av?by(av,e):[],[av,e]),ay=aw[aw.length-1],az=(0,i.useMemo)(()=>(function(a){let b=new Set,c=[];for(let d of a.events??[])for(let a of d.events??[])b.has(a.id)||(b.add(a.id),c.push(a.id));return c})(c),[c]),aA=(0,i.useMemo)(()=>new Set(l??[]),[l]),aB=(0,i.useMemo)(()=>new Set(m??[]),[m]),aC=(0,i.useCallback)((a,b)=>{let c=Y.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]),aD=(0,i.useCallback)(a=>{let b=am.current.get(a);am.current.delete(a),b?.hasPointerCapture?.(a)&&b.releasePointerCapture?.(a)},[]),aE=(0,i.useCallback)(a=>{let b=ar.current;b&&(void 0===a||b.pointerId===a)&&(clearTimeout(b.timer),ar.current=null)},[]),aF=(0,i.useCallback)((a,b)=>{if("touch"!==a.pointerType||!y)return;aE();let{pointerId:c,clientX:d,clientY:e}=a,f=setTimeout(()=>{ar.current=null,ac(null),ai.current=null,ak(!1),as.current=!0,navigator.vibrate?.(10),y(d,e,b)},500);ar.current={pointerId:c,x:d,y:e,target:b,timer:f}},[aE,y,ac]);(0,i.useEffect)(()=>{},[]),(0,i.useEffect)(()=>{let a=a=>{an.current.delete(a.pointerId)};return window.addEventListener("pointerup",a),window.addEventListener("pointercancel",a),()=>{window.removeEventListener("pointerup",a),window.removeEventListener("pointercancel",a)}},[]),(0,i.useEffect)(()=>()=>aE(),[aE]);let aG=(0,i.useRef)(new Set),aH=(0,i.useRef)(new Map),aI=(0,i.useRef)(ay),aJ=(0,i.useRef)(new Set),[aK,aL]=(0,i.useState)(new Set),[aM,aN]=(0,i.useState)(new Set),[aO,aP]=(0,i.useState)(new Map),aQ=at?10/g.scale:0,aR=at?28/g.scale:0,aS=(0,i.useCallback)(a=>d[a]??bB,[d]);(0,i.useEffect)(()=>{let a=a=>{(a.ctrlKey||a.metaKey)&&"z"===a.key&&F&&(a.preventDefault(),F()),(a.ctrlKey||a.metaKey)&&("y"===a.key||a.shiftKey&&"z"===a.key)&&I&&(a.preventDefault(),I()),"Escape"===a.key&&(ae(null),C?.()),"Delete"===a.key&&"state"===k.kind&&k.id&&D&&D(k.id)};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[F,I,C,D,k]);let aT=(0,i.useCallback)(a=>{let b=$.current;ai.current={pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,origX:b.x,origY:b.y},al.current=!1,ak(!0);let c=Y.current;c&&(am.current.set(a.pointerId,c),c.setPointerCapture(a.pointerId))},[]),aU=(0,i.useCallback)(()=>{let a=[...an.current.entries()];if(a.length<2)return;let[[b,c],[d,e]]=a;aE(),ac(null),ai.current=null;let f=Math.max(1,Math.hypot(e.x-c.x,e.y-c.y)),g=aC((c.x+e.x)/2,(c.y+e.y)/2);ao.current={a:b,b:d,startDist:f,startMidX:g.x,startMidY:g.y,start:$.current},al.current=!0,aq(!0);let h=Y.current;if(h){for(let a of[b,d])if(!am.current.has(a))try{h.setPointerCapture(a),am.current.set(a,h)}catch{}}},[aE,aC,ac]),aV=(0,i.useCallback)(a=>{if(as.current=!1,"touch"!==a.pointerType)return;au(!0),an.current.set(a.pointerId,{x:a.clientX,y:a.clientY});let b=an.current.size;b<2||(a.stopPropagation(),2===b&&aU())},[aU]),aW=(0,i.useCallback)((a,b)=>{if(0!==a.button||af.current)return;if(a.stopPropagation(),aF(a,{kind:"state",id:b}),!p&&"transition"===n)return void(o?o!==b&&ae({stateName:o,targetName:b,x:a.clientX,y:a.clientY}):t?.("state",b));if(t?.("state",b),p||!v)return;let c=aS(b);ac({name:b,pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,origX:c.x,origY:c.y});let d=a.currentTarget;am.current.set(a.pointerId,d),d.setPointerCapture?.(a.pointerId)},[t,aS,n,o,aF,ac,p,v]),aX=(0,i.useCallback)(a=>{if("touch"===a.pointerType){aF(a,{kind:"canvas"}),aT(a);return}(1===a.button||0===a.button&&af.current)&&(a.preventDefault(),aT(a))},[aF,aT]),aY=(0,i.useCallback)(a=>{an.current.has(a.pointerId)&&an.current.set(a.pointerId,{x:a.clientX,y:a.clientY});let b=ar.current;b&&b.pointerId===a.pointerId&&Math.hypot(a.clientX-b.x,a.clientY-b.y)>8&&aE(a.pointerId);let c=ao.current;if(c){if(a.pointerId!==c.a&&a.pointerId!==c.b)return;let b=an.current.get(c.a),d=an.current.get(c.b);if(!b||!d)return;let e=Math.hypot(d.x-b.x,d.y-b.y),f=aC((b.x+d.x)/2,(b.y+d.y)/2);j(P(R(c.start,c.start.scale*(e/c.startDist),{x:c.startMidX,y:c.startMidY}),f.x-c.startMidX,f.y-c.startMidY));return}let d=ai.current;if(d){if(d.pointerId!==a.pointerId)return;let b=a.clientX-d.startX,c=a.clientY-d.startY,e=8*("touch"===a.pointerType);(Math.abs(b)>e||Math.abs(c)>e)&&(al.current=!0),j({x:d.origX+b,y:d.origY+c,scale:$.current.scale});return}if(!_||_.pointerId!==a.pointerId||!v)return;let e=$.current.scale,f=(a.clientX-_.startX)/e,g=(a.clientY-_.startY)/e,h=aS(_.name);v(_.name,{...h,x:Math.max(0,_.origX+f),y:Math.max(0,_.origY+g)})},[_,aS,v,j,aE,aC]),aZ=(0,i.useCallback)(a=>{an.current.delete(a.pointerId),aE(a.pointerId),aD(a.pointerId);let b=ao.current;if(b&&(b.a===a.pointerId||b.b===a.pointerId)){ao.current=null,aq(!1);let c=b.a===a.pointerId?b.b:b.a,d=an.current.get(c);if(d){let a=$.current;ai.current={pointerId:c,startX:d.x,startY:d.y,origX:a.x,origY:a.y},al.current=!0,ak(!0)}}ai.current?.pointerId===a.pointerId&&(ai.current=null),ab.current?.pointerId===a.pointerId&&ac(null),ai.current||ak(!1),ao.current||aq(!1)},[aE,aD,ac]);(0,i.useEffect)(()=>{let a=Y.current;if(!a)return;let b=a=>{a.preventDefault();let b=$.current,c=bC(a.deltaX,a.deltaMode),d=bC(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey){let c=Q(b,Math.exp(-(.0025*d)),aC(a.clientX,a.clientY));c!==b&&j(c);return}let e=a.shiftKey?-(c||d):-c,f=a.shiftKey?0:-d;(0!==e||0!==f)&&j(P(b,e,f))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[j,aC]),(0,i.useEffect)(()=>{let a=a=>{"Space"!==a.code||a.repeat||bD(a.target)||bD(document.activeElement)||(a.preventDefault(),af.current=!0,ah(!0))},b=a=>{"Space"===a.code&&(af.current=!1,ah(!1))},c=()=>{af.current=!1,ah(!1)};return window.addEventListener("keydown",a),window.addEventListener("keyup",b),window.addEventListener("blur",c),()=>{window.removeEventListener("keydown",a),window.removeEventListener("keyup",b),window.removeEventListener("blur",c)}},[]);let a$=(0,i.useCallback)(a=>{let b=Y.current?.getBoundingClientRect(),c={x:(b?.width??0)/2,y:(b?.height??0)/2},d=$.current,e=Q(d,a,c);e!==d&&j(e)},[j]),a_=(0,i.useCallback)(()=>{let a=Y.current?.getBoundingClientRect(),b={x:(a?.width??0)/2,y:(a?.height??0)/2};j(R($.current,1,b))},[j]),a0=(0,i.useCallback)(()=>{let a=Y.current?.getBoundingClientRect();if(!a)return;let b=ax.map(a=>aS(a.name));j(b.length?S(b,a.width,a.height):{...M})},[ax,aS,j]);(0,i.useImperativeHandle)(b,()=>({fit:a0,zoomIn:()=>a$(1.25),zoomOut:()=>a$(.8),resetZoom:a_,element:()=>Y.current}),[a0,a$,a_]);let a1=(0,i.useRef)(a0);a1.current=a0,(0,i.useEffect)(()=>{if(void 0===s)return;let a=requestAnimationFrame(()=>a1.current());return()=>cancelAnimationFrame(a)},[s]);let a2=(0,i.useCallback)((a,b)=>{y&&(a.preventDefault(),a.stopPropagation(),y(a.clientX,a.clientY,b?{kind:"state",id:b}:{kind:"canvas"}))},[y]),a3=(0,i.useMemo)(()=>{let a=new Set(ax.map(a=>a.name)),b=[];for(let c of ax)for(let[d,e]of(c.transitions??[]).entries())e.nextState&&a.has(e.nextState)&&b.push({from:c.name,to:e.nextState,event:e.event,stateName:c.name,index:d,condition:e.condition});return b},[ax]),a4=(0,i.useMemo)(()=>{let a=K(a3,aS),b=new Map(E(a3.map((b,c)=>{let d=aS(b.from);return{id:`${b.stateName}:${b.index}`,event:b.event,condition:b.condition,glyph:!0,at:b.from===b.to?()=>({x:d.x+d.width+44+30,y:d.y+d.height/2+4}):a[c].at}}),ax.map(a=>aS(a.name))).map(a=>[a.label.id,a]));return a3.flatMap((c,d)=>{let e=`${c.stateName}:${c.index}`,f=b.get(e);return f?[{arrow:c,id:e,curve:a[d],spot:f}]:[]})},[a3,ax,aS]);(0,i.useEffect)(()=>{let a=new Set(ax.map(a=>a.name)),b=new Set(a3.map(a=>`${a.stateName}:${a.index}`)),c=aI.current===ay,d=[...a].filter(a=>!aG.current.has(a));d.length&&aL(a=>{let b=new Set(a);return d.forEach(a=>b.add(a)),b});let e=[...b].filter(a=>!aJ.current.has(a));e.length&&aN(a=>{let b=new Set(a);return e.forEach(a=>b.add(a)),b}),aL(b=>{let c=!1,d=new Set(b);return b.forEach(b=>{a.has(b)||(d.delete(b),c=!0)}),c?d:b}),aN(a=>{let c=!1,d=new Set(a);return a.forEach(a=>{b.has(a)||(d.delete(a),c=!0)}),c?d:a}),c?aP(b=>{let c=new Map(b),d=!1;return aH.current.forEach((b,e)=>{a.has(e)||c.has(e)||(c.set(e,b),d=!0)}),a.forEach(a=>{c.delete(a)&&(d=!0)}),d?c:b}):aP(a=>a.size?new Map:a),aG.current=a,aH.current=new Map(ax.map(a=>[a.name,{state:a,pos:aS(a.name)}])),aJ.current=b,aI.current=ay},[ax,ay,a3,aS]);let a5={...bA(O),...V},a6=at?" slc-hud--coarse":"";return(0,h.jsxs)("div",{className:`slc-pane${U?` ${U}`:""}`,style:a5,"data-pinch-owner":X,children:[q&&aw.length>1&&(0,h.jsx)("div",{className:"slc-crumbs",children:aw.map((a,b)=>(0,h.jsxs)("span",{className:"slc-crumb-item",children:[b>0&&(0,h.jsx)("span",{className:"slc-crumb-sep",children:"›"}),(0,h.jsx)("button",{type:"button",className:`slc-crumb${b===aw.length-1?" slc-crumb--current":""}`,onClick:()=>x?.(b),children:a})]},`${a}-${b}`))}),(0,h.jsxs)("svg",{ref:Y,id:W,className:"slc-surface",style:{cursor:aj?"grabbing":ag?"grab":void 0,touchAction:"none",...at?{WebkitUserSelect:"none",userSelect:"none",WebkitTouchCallout:"none"}:{}},onPointerDownCapture:aV,onPointerDown:aX,onPointerMove:aY,onPointerUp:aZ,onPointerCancel:aZ,onAuxClick:a=>a.preventDefault(),onClick:a=>{if(as.current){as.current=!1,a.stopPropagation();return}if(al.current){al.current=!1;return}a.target?.tagName==="svg"&&(u?.(),ae(null))},onContextMenu:a=>a2(a),children:[(0,h.jsxs)("defs",{children:[(0,h.jsx)("marker",{id:`slc-arrow-${Z}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,h.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead"})}),(0,h.jsx)("marker",{id:`slc-arrow-sel-${Z}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,h.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead slc-arrowhead--selected"})})]}),"transition"===n&&o&&(0,h.jsxs)("text",{x:"50%",y:"30",textAnchor:"middle",className:"slc-draw-hint",children:['Click target state to create transition from "',o,'"']}),(0,h.jsxs)("g",{transform:T(g),style:aj||ap?{pointerEvents:"none"}:void 0,children:[a4.map(({arrow:a,id:b,curve:c,spot:d})=>{let e="transition"===k.kind&&k.id===b,f=aM.has(b),g=c.at(.5),i=Math.hypot(g.x-d.cx,g.y-d.cy)>4;return(0,h.jsxs)("g",{children:[at&&(0,h.jsx)("path",{d:c.path,fill:"none",stroke:"transparent",strokeWidth:aR,strokeLinecap:"round",pointerEvents:"stroke",onClick:a=>{a.stopPropagation(),t?.("transition",b)}}),(0,h.jsx)("path",{d:c.path,pathLength:1,markerEnd:`url(#slc-arrow${e?"-sel":""}-${Z})`,className:`slc-edge${e?" slc-edge--selected":""}${f?" slc-edge-enter":""}`,onClick:a=>{a.stopPropagation(),t?.("transition",b)}}),(0,h.jsxs)("g",{className:"slc-chip",onClick:a=>{a.stopPropagation(),t?.("transition",b)},children:[i&&(0,h.jsx)("line",{x1:g.x,y1:g.y,x2:d.cx,y2:d.cy-5,className:`slc-chip-leader${e?" slc-chip-leader--selected":""}`}),at&&(0,h.jsx)("rect",{x:d.x-aQ,y:d.y-aQ,width:d.width+2*aQ,height:d.height+2*aQ,fill:"transparent",pointerEvents:"all"}),(0,h.jsx)("rect",{x:d.x,y:d.y,width:d.width,height:d.height,rx:4,className:`slc-chip-plate${e?" slc-chip-plate--selected":""}`}),(0,h.jsx)(bF,{mark:function(a){let b=a.toLowerCase();for(let{glyph:a,words:c}of H)if(c.some(a=>b.includes(a)))return a;return G}(a.event),x:B(d).x,y:B(d).y,selected:e}),(0,h.jsx)("text",{x:d.cx,y:d.cy-5,textAnchor:"middle",className:`slc-chip-text${e?" slc-chip-text--selected":""}`,children:a.event}),a.condition&&(0,h.jsxs)("text",{x:d.cx,y:d.cy+7,textAnchor:"middle",className:"slc-chip-guard",children:[(0,h.jsx)("title",{children:a.condition}),z(a.condition)]})]})]},`arrow-${b}`)}),ax.map(a=>{let b=aS(a.name),c="state"===k.kind&&k.id===a.name,d="final"===a.kind,e="history"===a.kind,f=bE(a),g=o===a.name,i=aB.has(a.name),j=(a.onEntry?.actions?.length??0)>0,l=(a.onExit?.actions?.length??0)>0,m=aA.has(a.name),q=aK.has(a.name),r=ag?void 0:"transition"!==n||p?f?"slc-node--drillable":p||!v?"slc-node--static":"slc-node--draggable":"slc-node--drawing";return(0,h.jsxs)("g",{className:r,onPointerDown:b=>aW(b,a.name),onDoubleClick:b=>{b.stopPropagation(),f&&w?.(a.name)},onContextMenu:b=>a2(b,a.name),children:[at&&(0,h.jsx)("rect",{x:b.x-aQ,y:b.y-aQ,width:b.width+2*aQ,height:b.height+2*aQ,rx:12,fill:"transparent",pointerEvents:"all"}),(0,h.jsxs)("g",{className:q?"slc-node-enter":void 0,children:[(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:e?30:d?4:8,strokeDasharray:d?"6 3":f?"4 2":void 0,className:["slc-node",d?"slc-node--final":f?"slc-node--composite":"",g?"slc-node--source":"",i?"slc-node--error":"",c?"slc-node--selected":"",m?"slc-node--active":""].filter(Boolean).join(" ")}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+(j||l?b.height/2:b.height/2+5),textAnchor:"middle",className:"slc-node-name",children:a.name}),a.kind&&"normal"!==a.kind&&(0,h.jsx)("text",{x:b.x+b.width-8,y:b.y+14,textAnchor:"end",className:"slc-node-kind",children:a.kind}),j&&(0,h.jsx)("text",{x:b.x+6,y:b.y+b.height-6,className:"slc-node-entry",children:"▸entry"}),l&&(0,h.jsx)("text",{x:b.x+b.width-6,y:b.y+b.height-6,textAnchor:"end",className:"slc-node-exit",children:"exit◂"}),i&&(0,h.jsx)("path",{d:`M ${b.x+6} ${b.y+15} l 5.5 -9.5 l 5.5 9.5 Z M ${b.x+11.5} ${b.y+9.5} v 2.6`,className:"slc-node-warn-mark"}),a.notes?.trim()&&(0,h.jsxs)("g",{children:[(0,h.jsx)("title",{children:`Notes: ${a.notes}`}),(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"})]}),f&&(0,h.jsxs)("text",{x:b.x+b.width/2,y:b.y+b.height-6,textAnchor:"middle",className:"slc-node-drill",children:["▼ ",(a.states?.length??0)+(a.parallel?.states.length??0)," children — ",at?"double-tap":"double-click"," to enter"]})]})]},a.name)}),Array.from(aO.entries()).map(([a,{state:b,pos:c}])=>{let d="final"===b.kind,e=bE(b);return(0,h.jsxs)("g",{className:"slc-node-exit-group",onAnimationEnd:b=>{"slc-node-out"===b.animationName&&aP(b=>{if(!b.has(a))return b;let c=new Map(b);return c.delete(a),c})},children:[(0,h.jsx)("rect",{x:c.x,y:c.y,width:c.width,height:c.height,rx:"history"===b.kind?30:d?4:8,strokeDasharray:d?"6 3":e?"4 2":void 0,className:`slc-node${d?" slc-node--final":e?" slc-node--composite":""}`}),(0,h.jsx)("text",{x:c.x+c.width/2,y:c.y+c.height/2+5,textAnchor:"middle",className:"slc-node-name",children:a})]},`exit-${a}`)})]}),0===ax.length&&(0,h.jsx)("text",{x:"50%",y:"50%",textAnchor:"middle",className:"slc-empty",children:N??"This level has no states."})]}),r&&(0,h.jsxs)("div",{className:`slc-hud${a6}`,children:[(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom out (Ctrl + wheel down, or pinch in)",disabled:g.scale<=L.min,onClick:()=>a$(.8),children:"−"}),(0,h.jsxs)("button",{type:"button",className:"slc-hud-btn slc-hud-btn--scale",title:"Reset zoom to 100%",onClick:a_,children:[Math.round(100*g.scale),"%"]}),(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom in (Ctrl + wheel up, or pinch out)",disabled:g.scale>=L.max,onClick:()=>a$(1.25),children:"+"}),(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,h.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Fit the whole machine in view",onClick:a0,children:"⤢ Fit"}),J&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),J]}),(0,h.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,h.jsx)("span",{className:"slc-hud-hint",title:at?"Drag to pan · pinch with two fingers to zoom · press and hold for the menu · double-tap a composite to enter it":"Wheel scrolls · Shift+wheel scrolls sideways · Ctrl+wheel zooms at the cursor · middle-drag or Space+drag pans",children:ap?"pinching":aj?"panning":at?"drag · pinch · hold":ag?"space to pan":"wheel · ⌃wheel · space"})]}),ad&&(0,h.jsxs)("div",{className:"slc-picker",style:{left:ad.x,top:ad.y-80},onClick:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-picker-title",children:[ad.stateName," → ",ad.targetName]}),(0,h.jsx)("div",{className:"slc-picker-sub",children:"Select event:"}),0===az.length?(0,h.jsx)("div",{className:"slc-picker-empty",children:"No events defined. Add events first."}):az.map(a=>(0,h.jsx)("button",{type:"button",className:"slc-picker-item",onClick:()=>{ad&&(A?.(ad.stateName,ad.targetName,a),ae(null),C?.())},children:a},a)),(0,h.jsx)("button",{type:"button",className:"slc-picker-cancel",onClick:()=>{ae(null),C?.()},children:"Cancel"})]})]})});function bI(a,b){return 1===b?16*a:2===b?400*a:a}let bJ={"1:1":["one","one"],"1:N":["one","many"],"N:1":["many","one"],"N:M":["many","many"]};function bK(a,b,c){let d=b.x-a.x,e=b.y-a.y,f=Math.hypot(d,e)||1,g=d/f,h=e/f,i=-h,j=(b,c)=>`${(a.x+g*b+i*c).toFixed(1)} ${(a.y+h*b+g*c).toFixed(1)}`;return"one"===c?`M ${j(9,6)} L ${j(9,-6)}`:`M ${j(13,0)} L ${j(0,7)} M ${j(13,0)} L ${j(0,-7)} M ${j(13,0)} L ${j(0,0)}`}function bL(a){return[a.description??"",a.notes?.trim()?`Notes: ${a.notes}`:""].filter(Boolean).join("\n\n")}function bM(a,b){if(!a)return"";let c=Math.min(a.x+a.width,Math.max(a.x,b.x)),d=Math.min(a.y+a.height,Math.max(a.y,b.y));return c===b.x&&d===b.y?"":`M ${b.x} ${b.y} L ${c} ${d}`}function bN({definition:a,notation:b="crowsfoot",positions:c,viewport:d,onViewportChange:e,selection:f=null,errorElements:g,readOnly:j=!1,fitKey:k,onSelect:l,onClearSelection:m,onEntityMove:n,onOpenMachine:o,onContextMenu:p,emptyHint:q,theme:r,className:s,style:t,svgId:u}){let v=(0,i.useRef)(null),w=(0,i.useRef)(d);w.current=d;let x=(0,i.useRef)(null),y=(0,i.useRef)(new Map),z=(0,i.useRef)(null),A=(0,i.useMemo)(()=>{let b=new Set;return(a.entities??[]).filter(a=>!(!a?.name||b.has(a.name))&&!!c[a.name]&&(b.add(a.name),!0))},[a.entities,c]),B="chen"===b,C=(0,i.useMemo)(()=>new Map(B?A.map(a=>{var b;let d,e,f,g,h,i,j;return[a.name,(b=c[a.name],d=af(a),e=ag(a),f={x:b.x+(b.width-e)/2,y:b.y+(b.height-40)/2,width:e,height:40},g=ah(d),h=f.y+f.height/2,i=ai(d.length),j=d.map((a,b)=>{let c=b<i,e=c?i:d.length-i,j=h+((c?b:b-i)-(e-1)/2)*32,k=c?f.x-34-g:f.x+f.width+34+g;return{attribute:a,cx:k,cy:j,rx:g,ry:13,from:{x:c?f.x:f.x+f.width,y:h},to:{x:c?k+g:k-g,y:j}}}),{rect:f,ovals:j,routingBox:{x:f.x,y:b.y,width:f.width,height:b.height}})]}):[]),[B,A,c]),D=(0,i.useMemo)(()=>{let b=new Map(A.map((a,b)=>[a.name,`e${b}`])),d=(a.relationships??[]).filter(a=>a&&b.has(a.from)&&b.has(a.to)),e=K(d.map(a=>({from:b.get(a.from),to:b.get(a.to)})),a=>{let b=A[Number(a.slice(1))].name;return C.get(b)?.routingBox??c[b]});return d.map((a,b)=>({rel:a,curve:e[b]}))},[a.relationships,A,c,C]),F=(0,i.useMemo)(()=>E(D.filter(({rel:a})=>B||a.label).map(({rel:a,curve:b})=>({event:a.label||" ",at:b.at,rel:a})),A.map(a=>c[a.name])),[B,D,A,c]),G=(0,i.useCallback)((a,b)=>{let c=v.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]);(0,i.useEffect)(()=>{if(void 0===k)return;let a=v.current?.getBoundingClientRect(),b=Object.values(c);a&&0!==b.length&&e(S(b,a.width,a.height))},[k]),(0,i.useEffect)(()=>{let a=v.current;if(!a)return;let b=a=>{a.preventDefault();let b=w.current,c=bI(a.deltaX,a.deltaMode),d=bI(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey)return void e(Q(b,Math.exp(-(.0025*d)),G(a.clientX,a.clientY)));let f=a.shiftKey?-(c||d):-c,g=a.shiftKey?0:-d;(0!==f||0!==g)&&e(P(b,f,g))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[e,G]);let H=()=>{let a=[...y.current.values()];if(a.length<2)return null;let[b,c]=a;return{distance:Math.hypot(c.x-b.x,c.y-b.y)||1,mid:{x:(b.x+c.x)/2,y:(b.y+c.y)/2}}},I=(a,b)=>{if(0!==a.button&&"mouse"===a.pointerType)return;if(a.stopPropagation(),v.current?.setPointerCapture(a.pointerId),y.current.set(a.pointerId,G(a.clientX,a.clientY)),y.current.size>=2){x.current=null,z.current=H();return}let d=void 0!==b&&!j;x.current={kind:d?"move":"pan",pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,lastX:a.clientX,lastY:a.clientY,name:b,origin:d?c[b]:void 0,moved:!1}},J=a=>{if(y.current.delete(a.pointerId),z.current){y.current.size<2&&(z.current=null);return}let b=x.current;!b||b.pointerId!==a.pointerId||(x.current=null,b.moved||(b.name?l?.(b.name):m?.()))},L=new Set(g??[]);return(0,h.jsxs)("div",{className:`slc-pane${s?` ${s}`:""}`,style:{...bA(r),...t},children:[(0,h.jsx)("svg",{ref:v,id:u,className:"slc-surface",onPointerDown:a=>I(a),onPointerMove:a=>{if(y.current.has(a.pointerId)&&y.current.set(a.pointerId,G(a.clientX,a.clientY)),z.current){let a=H();if(!a)return;let b=z.current;e(Q(P(w.current,a.mid.x-b.mid.x,a.mid.y-b.mid.y),a.distance/b.distance,a.mid)),z.current=a;return}let b=x.current;if(b&&b.pointerId===a.pointerId&&!(!b.moved&&4>Math.hypot(a.clientX-b.startX,a.clientY-b.startY))){if(b.moved=!0,"pan"===b.kind)e(P(w.current,a.clientX-b.lastX,a.clientY-b.lastY));else if(b.name&&b.origin){var c,d,f;let e=(c=w.current,d=a.clientX-b.startX,f=a.clientY-b.startY,{x:d/c.scale,y:f/c.scale});n?.(b.name,{...b.origin,x:b.origin.x+e.x,y:b.origin.y+e.y})}b.lastX=a.clientX,b.lastY=a.clientY}},onPointerUp:J,onPointerCancel:J,onContextMenu:a=>{p&&(a.preventDefault(),p(a.clientX,a.clientY,{kind:"canvas"}))},children:(0,h.jsxs)("g",{transform:T(d),children:[D.map(({rel:a,curve:b},c)=>{if(B){let[d,e]=function(a){switch(a){case"1:1":return["1","1"];case"N:1":return["N","1"];case"N:M":return["M","N"];default:return["1","N"]}}(a.cardinality),f=b.at(.12),g=b.at(.88);return(0,h.jsxs)("g",{className:"slc-erd-rel",children:[(0,h.jsx)("path",{d:bM(C.get(a.from)?.rect,b.p0),className:"slc-erd-line"}),(0,h.jsx)("path",{d:bM(C.get(a.to)?.rect,b.p3),className:"slc-erd-line"}),(0,h.jsx)("path",{d:b.path,className:"slc-erd-line"}),(0,h.jsx)("text",{x:f.x+9,y:f.y+4,className:"slc-erd-card",children:d}),(0,h.jsx)("text",{x:g.x+9,y:g.y+4,className:"slc-erd-card",children:e})]},`r${c}`)}let[d,e]=bJ[a.cardinality]??bJ["1:N"];return(0,h.jsxs)("g",{className:"slc-erd-rel",children:[(0,h.jsx)("path",{d:b.path,className:"slc-erd-line"}),(0,h.jsx)("path",{d:bK(b.p0,b.p1,d),className:"slc-erd-mark"}),(0,h.jsx)("path",{d:bK(b.p3,b.p2,e),className:"slc-erd-mark"})]},`r${c}`)}),A.map(a=>{let b=c[a.name],d=(a.attributes??[]).filter(a=>a?.name),e=["slc-node",f===a.name?"slc-node--selected":"",L.has(a.name)?"slc-node--error":""].filter(Boolean).join(" "),g=C.get(a.name);if(g){let{rect:b,ovals:c}=g;return(0,h.jsxs)("g",{className:j?"slc-node--static":"slc-node--draggable",onPointerDown:b=>I(b,a.name),onContextMenu:b=>{p&&(b.preventDefault(),b.stopPropagation(),p(b.clientX,b.clientY,{kind:"entity",id:a.name}))},children:[c.map(a=>(0,h.jsx)("path",{d:`M ${a.from.x} ${a.from.y} L ${a.to.x} ${a.to.y}`,className:"slc-erd-attr-line"},`l-${a.attribute.name}`)),c.map(a=>{var b;let c,d=V(a.attribute),e=d.length>0&&!!o;return(0,h.jsxs)("g",{className:e?"slc-erd-state":void 0,onPointerDown:e?a=>a.stopPropagation():void 0,onClick:e?()=>o(d[0]):void 0,children:[(0,h.jsx)("title",{children:(c=V(b=a.attribute),[`${ar(b)}${b.nullable?" ?":""}`,"pk"===b.key?"primary key":"uk"===b.key?"unique":"",b.references?`references ${b.references}`:"",c.length?`stores the state of ${c.join(", ")}`:"",b.description??""].filter(Boolean).join(" — "))}),(0,h.jsx)("ellipse",{cx:a.cx,cy:a.cy,rx:a.rx,ry:a.ry,className:"slc-erd-oval"}),(0,h.jsxs)("text",{x:a.cx,y:a.cy+4,textAnchor:"middle",className:`slc-erd-oval-text${"pk"===a.attribute.key?" slc-erd-oval-text--pk":""}${d.length?" slc-erd-row--state":""}`,children:[d.length?"◉ ":"",a.attribute.name]})]},a.attribute.name)}),bL(a)&&(0,h.jsx)("title",{children:bL(a)}),(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:2,className:e}),a.notes?.trim()&&(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),a.weak&&(0,h.jsx)("rect",{x:b.x+4,y:b.y+4,width:b.width-8,height:b.height-8,rx:1,className:"slc-erd-weak"}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+b.height/2+5,textAnchor:"middle",className:"slc-node-name",children:a.name})]},a.name)}return(0,h.jsxs)("g",{className:j?"slc-node--static":"slc-node--draggable",onPointerDown:b=>I(b,a.name),onContextMenu:b=>{p&&(b.preventDefault(),b.stopPropagation(),p(b.clientX,b.clientY,{kind:"entity",id:a.name}))},children:[bL(a)&&(0,h.jsx)("title",{children:bL(a)}),(0,h.jsx)("rect",{x:b.x,y:b.y,width:b.width,height:b.height,rx:6,className:e}),a.notes?.trim()&&(0,h.jsx)("rect",{x:b.x+b.width-24,y:b.y-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),(0,h.jsx)("path",{d:`M ${b.x} ${b.y+30} h ${b.width}`,className:"slc-erd-rule"}),(0,h.jsx)("text",{x:b.x+b.width/2,y:b.y+15+5,textAnchor:"middle",className:"slc-node-name",children:a.name}),0===d.length&&(0,h.jsx)("text",{x:b.x+14,y:b.y+30+15,className:"slc-erd-row slc-erd-row--empty",children:"no attributes"}),d.map((a,c)=>{let d=b.y+30+20*c+15,e=V(a),f=["pk"===a.key?"PK":"uk"===a.key?"UK":"",a.references?"FK":""].filter(Boolean).join(" ");return(0,h.jsxs)("g",{className:e.length&&o?"slc-erd-state":void 0,onPointerDown:e.length&&o?a=>a.stopPropagation():void 0,onClick:e.length&&o?()=>o(e[0]):void 0,children:[(e.length>0||a.description)&&(0,h.jsx)("title",{children:[e.length?`stores the state of ${e.join(", ")}`:"",a.description??""].filter(Boolean).join(" — ")}),(0,h.jsxs)("text",{x:b.x+14,y:d,className:`slc-erd-row${e.length?" slc-erd-row--state":""}${"pk"===a.key?" slc-erd-row--pk":""}`,children:[e.length?"◉ ":"",ar(a),a.nullable?" ?":""]}),f&&(0,h.jsx)("text",{x:b.x+b.width-14,y:d,textAnchor:"end",className:"slc-erd-badge",children:f})]},a.name)})]},a.name)}),F.map((a,b)=>{if(!B)return null;let c=a.x+a.width/2,d=a.y+a.height/2,e=Math.max(34,Math.ceil(3.7*(a.label.rel.label??"").length+18));return(0,h.jsxs)("g",{pointerEvents:"none",children:[(0,h.jsx)("path",{d:`M ${c-e} ${d} L ${c} ${d-18} L ${c+e} ${d} L ${c} ${d+18} Z`,className:"slc-erd-diamond"}),(0,h.jsx)("text",{x:c,y:d+4,textAnchor:"middle",className:"slc-erd-rel-label",children:a.label.rel.label??""})]},`d${b}`)}),!B&&F.map((a,b)=>(0,h.jsxs)("g",{pointerEvents:"none",children:[(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:4,className:"slc-chip-plate"}),(0,h.jsx)("text",{x:a.cx,y:a.cy-5,textAnchor:"middle",className:"slc-erd-rel-label",children:a.label.event})]},`l${b}`))]})}),0===A.length&&q&&(0,h.jsx)("div",{className:"slc-erd-empty",children:q})]})}function bO(a,b){return 1===b?16*a:2===b?400*a:a}function bP(a,b,c,d){let e=a-9*c;return d?`M ${e} ${b-4.5} L ${a} ${b} L ${e} ${b+4.5}`:`M ${e} ${b-4.5} L ${a} ${b} L ${e} ${b+4.5} Z`}function bQ(a){return[a.actor?`actor ${a.actor}`:a.object?`object ${a.object}`:a.service?`service ${a.service}`:"",a.holds?.length?`holds ${a.holds.join(", ")}`:"",a.description??"",a.notes?.trim()?`Notes: ${a.notes}`:""].filter(Boolean).join("\n")}let bR=a=>"string"==typeof a?a:null==a?"":String(a);function bS(a){let b=a&&"object"==typeof a?a:{};return{from:bR(b.from),to:bR(b.to),label:bR(b.label),event:bR(b.event)||void 0,machine:bR(b.machine)||void 0,carries:bR(b.carries)||void 0,state:bR(b.state)||void 0,description:bR(b.description)||void 0,notes:bR(b.notes)||void 0,optional:!0===b.optional||void 0,reply:!0===b.reply||void 0}}function bT(a){let b=a&&"object"==typeof a?a:{},c=a=>Array.isArray(a)?a:[],d=b.settings&&"object"==typeof b.settings?b.settings:{};return{settings:{namespace:bR(d.namespace),name:bR(d.name),notes:bR(d.notes)||void 0},participants:c(b.participants).map(a=>{let b=a&&"object"==typeof a?a:{};return{name:bR(b.name),description:bR(b.description)||void 0,notes:bR(b.notes)||void 0,actor:bR(b.actor)||void 0,service:bR(b.service)||void 0,object:bR(b.object)||void 0,holds:Array.isArray(b.holds)?b.holds.map(bR):"string"==typeof b.holds?[b.holds]:void 0}}),messages:c(b.messages).map(bS),...Array.isArray(b.fragments)?{fragments:b.fragments.map(a=>{let b=a&&"object"==typeof a?a:{};return{kind:bR(b.kind),label:bR(b.label),after:"number"==typeof b.after&&Number.isFinite(b.after)?b.after:0,notes:bR(b.notes)||void 0,messages:c(b.messages).map(bS)}})}:{}}}function bU({definition:a,layout:b,viewport:c,onViewportChange:d,selection:e=null,errorElements:f,warningElements:g,fitKey:j,onSelect:k,onClearSelection:l,onContextMenu:m,emptyHint:n,theme:o,className:p,style:q,svgId:r}){let s=(0,i.useRef)(null),t=(0,i.useRef)(c);t.current=c;let u=(0,i.useRef)(null),v=(0,i.useRef)(new Map),w=(0,i.useRef)(null),x=(0,i.useMemo)(()=>bT(a),[a]),z=(0,i.useMemo)(()=>b??aL(x),[b,x]),A=(0,i.useRef)(new Map),[B,C]=(0,i.useState)({}),D=a=>b=>{b?A.current.set(a,b):A.current.delete(a)};(0,i.useLayoutEffect)(()=>{let a={},b=!1;for(let[c,d]of A.current){let e="function"==typeof d.getComputedTextLength?d.getComputedTextLength():0;e&&(a[c]=e,Math.abs((B[c]??-1)-e)>.5&&(b=!0))}b&&C(a)},[z,x]);let E=(0,i.useMemo)(()=>new Map(az(x).map(a=>[a.ref,a.message])),[x]),F=(0,i.useMemo)(()=>new Map(x.participants.filter(a=>a.name).map(a=>[a.name,a])),[x.participants]),G=(0,i.useCallback)((a,b)=>{let c=s.current?.getBoundingClientRect();return{x:a-(c?.left??0),y:b-(c?.top??0)}},[]);(0,i.useEffect)(()=>{if(void 0===j)return;let a=s.current?.getBoundingClientRect();a&&0!==z.participants.length&&d(S([{x:0,y:0,width:z.width,height:z.height}],a.width,a.height,{padding:16}))},[j]),(0,i.useEffect)(()=>{let a=s.current;if(!a)return;let b=a=>{a.preventDefault();let b=t.current,c=bO(a.deltaX,a.deltaMode),e=bO(a.deltaY,a.deltaMode);if(a.ctrlKey||a.metaKey)return void d(Q(b,Math.exp(-(.0025*e)),G(a.clientX,a.clientY)));let f=a.shiftKey?-(c||e):-c,g=a.shiftKey?0:-e;(0!==f||0!==g)&&d(P(b,f,g))};return a.addEventListener("wheel",b,{passive:!1}),()=>a.removeEventListener("wheel",b)},[d,G]);let H=()=>{let a=[...v.current.values()];if(a.length<2)return null;let[b,c]=a;return{distance:Math.hypot(c.x-b.x,c.y-b.y)||1,mid:{x:(b.x+c.x)/2,y:(b.y+c.y)/2}}},I=(a,b)=>{if(0===a.button||"mouse"!==a.pointerType){if(a.stopPropagation(),s.current?.setPointerCapture(a.pointerId),v.current.set(a.pointerId,G(a.clientX,a.clientY)),v.current.size>=2){u.current=null,w.current=H();return}u.current={pointerId:a.pointerId,startX:a.clientX,startY:a.clientY,lastX:a.clientX,lastY:a.clientY,target:b,moved:!1}}},J=a=>{if(v.current.delete(a.pointerId),w.current){v.current.size<2&&(w.current=null);return}let b=u.current;!b||b.pointerId!==a.pointerId||(u.current=null,b.moved||(b.target?k?.(b.target.kind,b.target.id):l?.()))},K=a=>b=>{m&&(b.preventDefault(),b.stopPropagation(),m(b.clientX,b.clientY,a))},L=new Set(f??[]),M=new Set(g??[]),N=(a,b)=>e?.kind===a&&e.id===b,O=e?.kind==="message"?E.get(e.id):void 0;return(0,h.jsxs)("div",{className:`slc-pane${p?` ${p}`:""}`,style:{...bA(o),...q},children:[(0,h.jsx)("svg",{ref:s,id:r,className:"slc-surface",onPointerDown:a=>I(a),onPointerMove:a=>{if(v.current.has(a.pointerId)&&v.current.set(a.pointerId,G(a.clientX,a.clientY)),w.current){let a=H();if(!a)return;let b=w.current;d(Q(P(t.current,a.mid.x-b.mid.x,a.mid.y-b.mid.y),a.distance/b.distance,a.mid)),w.current=a;return}let b=u.current;!b||b.pointerId!==a.pointerId||!b.moved&&4>Math.hypot(a.clientX-b.startX,a.clientY-b.startY)||(b.moved=!0,d(P(t.current,a.clientX-b.lastX,a.clientY-b.lastY)),b.lastX=a.clientX,b.lastY=a.clientY)},onPointerUp:J,onPointerCancel:J,onContextMenu:K({kind:"canvas"}),children:(0,h.jsxs)("g",{transform:T(c),children:[z.fragments.map(a=>{let b=x.fragments?.[a.index];if(!b)return null;let c=y(`${b.kind} \xb7 after ${b.after} \xb7 ${b.label}`,11)+18,d=a.top;return(0,h.jsxs)("g",{className:"slc-sqd-fragment",children:[b.notes?.trim()&&(0,h.jsx)("title",{children:`Notes: ${b.notes}`}),(0,h.jsx)("rect",{x:a.left,y:d,width:a.width,height:a.height,rx:3,className:"slc-sqd-frame"}),(0,h.jsx)("path",{d:`M ${a.left} ${d+22} L ${a.left} ${d} L ${a.left+c} ${d} L ${a.left+c} ${d+15} L ${a.left+c-7} ${d+22} Z`,className:"slc-sqd-frame-tab"}),(0,h.jsxs)("text",{x:a.left+8,y:d+15,className:"slc-sqd-frame-heading",children:[(0,h.jsx)("tspan",{className:"slc-sqd-frame-kind",children:b.kind}),` \xb7 after ${b.after} \xb7 ${b.label}`]}),b.notes?.trim()&&(0,h.jsx)("rect",{x:a.left+c+6,y:d+7,width:13,height:5,rx:1.5,className:"slc-note-mark"})]},`f${a.index}`)}),z.participants.map(a=>{let b=N("participant",a.name);return(0,h.jsxs)("g",{onPointerDown:b=>I(b,{kind:"participant",id:a.name}),children:[(0,h.jsx)("path",{d:`M ${a.x} ${z.lifelineTop} V ${z.lifelineBottom}`,className:"slc-sqd-hit"}),(0,h.jsx)("path",{d:`M ${a.x} ${z.lifelineTop} V ${z.lifelineBottom}`,className:`slc-sqd-lifeline${b?" slc-sqd-lifeline--selected":""}`})]},`l-${a.name}`)}),z.fragments.map(a=>{let b=x.fragments?.[a.index],c=b&&b.after>0?z.rows.find(a=>null===a.fragment&&a.index===b.after-1):void 0;if(!c)return null;let d=a.left+4;return(0,h.jsx)("path",{d:`M ${Math.min(c.fromX,c.toX)-14} ${c.y} H ${d} V ${a.top}`,className:"slc-sqd-branch"},`fa${a.index}`)}),z.rows.map(a=>{var b;let c,d,e,f,g=E.get(a.ref);if(!g)return null;let i=`message:${a.ref}`,j=N("message",a.ref),k=L.has(i),l=!k&&M.has(i),m=["slc-sqd-line",g.reply?"slc-sqd-line--reply":"",g.optional?"slc-sqd-line--optional":"",k?"slc-sqd-line--error":l?"slc-sqd-line--warn":"",j?"slc-sqd-line--selected":""].filter(Boolean).join(" "),n=`slc-sqd-head${g.reply?" slc-sqd-head--open":""}${j?" slc-sqd-head--selected":k?" slc-sqd-head--error":""}`,o=a.ref,p=y(o,10)+8,q=B[`${a.ref}:label`]??y(g.label??"",11),r=g.optional?y("opt",10)+8:0,s=g.event?(B[`${a.ref}:event`]??6.1*g.event.length)+12:0,t=g.state?`→ ${g.state}`:"",u=g.state?B[`${a.ref}:state`]??y(t,11):0,v=p+5+q+(r?5+r:0)+(s?5+s:0)+(u?5+u:0);if(a.self){let b=a.fromX,i=a.y-7-2,j=i+14;e=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:`M ${b} ${i} H ${b+30} V ${j} H ${b+2}`,className:m}),(0,h.jsx)("path",{d:bP(b+1,j,-1,!!g.reply),className:n})]}),c=b+30+8,d=a.y+2,f={x:b-6,y:i-8,w:44+v,h:30}}else{let b=a.toX>=a.fromX?1:-1,i=a.toX-b;e=(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:`M ${a.fromX} ${a.y} H ${i}`,className:m}),(0,h.jsx)("path",{d:bP(i,a.y,b,!!g.reply),className:n})]}),c=(a.fromX+a.toX)/2-v/2,d=a.y-6;let j=Math.min(a.fromX,a.toX,c),k=Math.max(a.fromX,a.toX,c+v);f={x:j-4,y:a.y-22,w:k-j+8,h:30}}let w=c,x=a=>{let b=w;return w+=a+5,b},z=x(p),A=x(q),C=r?x(r):0,F=s?x(s):0,G=u?x(u):0;return(0,h.jsxs)("g",{className:"slc-sqd-message",onPointerDown:b=>I(b,{kind:"message",id:a.ref}),onContextMenu:K({kind:"message",id:a.ref}),children:[(0,h.jsx)("title",{children:(b=a.ref,[`${b}. ${g.from} → ${g.to}: ${g.label}`,g.event?`fires ${g.event}${g.machine?` on ${g.machine}`:""}`:"",g.carries?`carries ${g.carries}`:"",g.state?`then ${g.state}`:"",g.optional?"optional":"",g.reply?"reply":"",g.description??"",g.notes?.trim()?`Notes: ${g.notes}`:""].filter(Boolean).join("\n"))}),(0,h.jsx)("rect",{x:f.x,y:f.y,width:f.w,height:f.h,className:"slc-sqd-hitbox"}),j&&(0,h.jsx)("rect",{x:f.x,y:f.y,width:f.w,height:f.h,rx:4,className:"slc-sqd-selected-plate"}),e,(0,h.jsx)("rect",{x:z,y:d-10,width:p-2,height:13,rx:6.5,className:`slc-sqd-ref-plate${j?" slc-sqd-ref-plate--selected":""}`}),(0,h.jsx)("text",{x:z+(p-2)/2,y:d,textAnchor:"middle",className:"slc-sqd-ref",children:o}),(0,h.jsx)("text",{ref:D(`${a.ref}:label`),x:A,y:d,className:`slc-sqd-label${j?" slc-sqd-label--selected":""}${k?" slc-sqd-label--error":""}`,children:g.label}),r>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:C,y:d-10,width:r,height:13,rx:3,className:"slc-sqd-opt"}),(0,h.jsx)("text",{x:C+r/2,y:d-.5,textAnchor:"middle",className:"slc-sqd-opt-text",children:"opt"})]}),s>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:F,y:d-10.5,width:s,height:14,rx:7,className:"slc-sqd-event"}),(0,h.jsx)("text",{ref:D(`${a.ref}:event`),x:F+s/2,y:d-.5,textAnchor:"middle",className:"slc-sqd-event-text",children:g.event})]}),u>0&&(0,h.jsx)("text",{ref:D(`${a.ref}:state`),x:G,y:d,className:"slc-sqd-state",children:t}),g.notes?.trim()&&(0,h.jsx)("rect",{x:w-5+3,y:d-9,width:5,height:11,rx:1.5,className:"slc-note-mark"})]},`m-${a.ref}`)}),z.participants.map(a=>{let b=F.get(a.name);if(!b)return null;let c=`participant:${a.name}`,d=N("participant",a.name)||!!O&&(O.from===a.name||O.to===a.name),e=["slc-node","slc-sqd-header",N("participant",a.name)?"slc-node--selected":d?"slc-sqd-header--involved":"",L.has(c)?"slc-node--error":""].filter(Boolean).join(" "),f=b.actor?"actor":b.object?"object":b.service?"service":"";return(0,h.jsxs)("g",{className:"slc-node--static slc-sqd-participant",onPointerDown:b=>I(b,{kind:"participant",id:a.name}),onContextMenu:K({kind:"participant",id:a.name}),children:[bQ(b)&&(0,h.jsx)("title",{children:bQ(b)}),(0,h.jsx)("rect",{x:a.left,y:a.top,width:a.width,height:a.height,rx:b.actor?a.height/2:4,className:e}),b.notes?.trim()&&(0,h.jsx)("rect",{x:a.left+a.width-24,y:a.top-5,width:13,height:5,rx:1.5,className:"slc-note-mark"}),(0,h.jsx)("text",{x:a.x,y:a.top+a.height/2+(f?1:4),textAnchor:"middle",className:`slc-node-name slc-sqd-name${b.object?" slc-sqd-name--object":""}`,children:a.name}),f&&(0,h.jsxs)("text",{x:a.x,y:a.top+a.height-4,textAnchor:"middle",className:"slc-sqd-kind",children:["object"===f?`:${b.object}`:"service"===f?"service":"actor",b.holds?.length?` \xb7 holds ${b.holds.length}`:""]})]},`p-${a.name}`)})]})}),0===z.participants.length&&n&&(0,h.jsx)("div",{className:"slc-erd-empty",children:n})]})}function bV(a,b){return br(a.elements?.length?bt(b,a.elements):[])??a.region??null}function bW({viewport:a,boxes:b,spotlight:c,region:d,marks:e,selectedMark:f=null,onSelectMark:g,unread:j,hideResolved:k=!0,marking:l=!1,onDraft:m,draft:n=null,avoid:o,theme:p,className:q,style:r}){let s=`slc-stage-mask-${(0,i.useId)().replace(/[^a-zA-Z0-9_-]/g,"")}`,t=(0,i.useRef)(null),u=(0,i.useRef)(null),[v,w]=(0,i.useState)(null),[x,y]=(0,i.useState)(null),[z,A]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=t.current;if(!a)return;let b=()=>{let b=a.getBoundingClientRect();y(a=>a&&a.w===b.width&&a.h===b.height?a:{w:b.width,h:b.height})};b();try{A(window.matchMedia("(pointer: coarse)").matches)}catch{}if("u"<typeof ResizeObserver)return;let c=new ResizeObserver(b);return c.observe(a),()=>c.disconnect()},[]);let B=(0,i.useMemo)(()=>c?.length?bt(b,c).map(a=>bs(a,8)):[],[b,c]),C=T(a),D=e?.find(a=>a.id===f)??null,E=(0,i.useMemo)(()=>new Set(j??[]),[j]),F=(0,i.useMemo)(()=>{let a=[];return D?.elements?.length&&a.push(...bt(b,D.elements)),n?.elements.length&&a.push(...bt(b,n.elements)),a.map(a=>bs(a,4))},[b,D,n]),G=[D?.region,n?.region].filter(a=>!!a),H=(e??[]).map((a,b)=>({mark:a,n:b+1})).filter(({mark:a})=>!(k&&"resolved"===a.status&&a.id!==f)).map(({mark:c,n:d})=>{var e;let f=bV(c,b);if(!f)return null;let g={x:(e={x:f.x+f.width,y:f.y}).x*a.scale+a.x,y:e.y*a.scale+a.y};return{mark:c,n:d,x:g.x,y:g.y}}).filter(a=>null!==a),I=x?.w?function(a,b){let c=b.size??22,d=b.spacing??c+4,e=b.inset??8,f=b.avoid??[],g=e+.4*c,h=b.width-e-.6*c,i=e+.6*c,j=b.height-e-.4*c,k=(a,b,c)=>c<b?(b+c)/2:Math.min(c,Math.max(b,a)),l=(a,b)=>f.find(d=>(function(a,b,c=0){return a.x<b.x+b.width+c&&b.x<a.x+a.width+c&&a.y<b.y+b.height+c&&b.y<a.y+a.height+c})({x:a-.4*c,y:b-.6*c,width:c,height:c},d,4)),m=[],n=(a,b)=>m.some(d=>Math.abs(d.x-a)<c&&Math.abs(d.y-b)<c),o=a.length+f.length+2,p=(a,b)=>{for(let e=0;e<o;e++){let e=l(a,b);if(e)b=e.y+e.height+4+.6*c;else if(n(a,b))b+=d;else break}return b},q=(a,b)=>{for(let e=0;e<o;e++){let e=l(a,b);if(e)b=e.y-4-.4*c;else if(n(a,b))b-=d;else break}return b};for(let b of a){let a=k(b.x,g,h),c=k(b.y,i,j),d=p(a,c);d>j&&(d=Math.max(i,q(a,c))),m.push({x:a,y:d})}return m}(H,{width:x.w,height:x.h,size:z?30:22,avoid:o}):H,J=H.map((a,b)=>({...a,x:I[b].x,y:I[b].y})),K=a=>{let b=t.current?.getBoundingClientRect();return{x:a.clientX-(b?.left??0),y:a.clientY-(b?.top??0)}};return(0,h.jsxs)("div",{ref:t,className:`slc-stage${l?" slc-stage--marking":""}${q?` ${q}`:""}`,style:{...bA(p),...r},children:[(0,h.jsxs)("svg",{className:"slc-stage-svg","aria-hidden":"true",children:[B.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("defs",{children:(0,h.jsxs)("mask",{id:s,maskUnits:"userSpaceOnUse",x:"0",y:"0",width:"100%",height:"100%",children:[(0,h.jsx)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"}),(0,h.jsx)("g",{transform:C,children:B.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:10,fill:"black"},b))})]})}),(0,h.jsx)("rect",{x:"0",y:"0",width:"100%",height:"100%",className:"slc-stage-scrim",mask:`url(#${s})`}),(0,h.jsx)("g",{transform:C,children:B.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:10,className:"slc-stage-ring",vectorEffect:"non-scaling-stroke"},b))})]}),(0,h.jsxs)("g",{transform:C,children:[d&&(0,h.jsx)("rect",{x:d.x,y:d.y,width:d.width,height:d.height,rx:6,className:"slc-stage-region",vectorEffect:"non-scaling-stroke"}),F.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:8,className:"slc-stage-mark-ring",vectorEffect:"non-scaling-stroke"},`r${b}`)),G.map((a,b)=>(0,h.jsx)("rect",{x:a.x,y:a.y,width:a.width,height:a.height,rx:4,className:"slc-stage-mark-area",vectorEffect:"non-scaling-stroke"},`f${b}`))]}),v&&(0,h.jsx)("rect",{x:v.x,y:v.y,width:v.w,height:v.h,rx:4,className:"slc-stage-drag"})]}),J.map(({mark:a,n:b,x:c,y:d})=>(0,h.jsxs)("button",{type:"button",className:`slc-stage-pin slc-stage-pin--${"resolved"===a.status?"resolved":"agent"===a.author.role?"answered"===a.status?"answered":"question":"answered"===a.status?"answered":"open"}${E.has(a.id)?" slc-stage-pin--new":""}${a.id===f?" slc-stage-pin--selected":""}`,style:{left:c,top:d},title:`${a.author.name}: ${a.text}${a.replies?.length?` (${a.replies.length} repl${1===a.replies.length?"y":"ies"})`:""}${E.has(a.id)?" · new":""}`,"aria-label":`Mark ${b}, ${a.status}${E.has(a.id)?", new":""}: ${a.text}`,onPointerDown:a=>a.stopPropagation(),onClick:b=>{b.stopPropagation(),g?.(a.id)},children:[b,(a.replies?.length??0)>0&&(0,h.jsx)("span",{className:"slc-stage-pin-count",children:a.replies.length})]},a.id)),l&&(0,h.jsx)("div",{className:"slc-stage-catch",onPointerDown:a=>{if(0!==a.button&&"mouse"===a.pointerType)return;a.currentTarget.setPointerCapture(a.pointerId);let b=K(a);u.current={id:a.pointerId,x:b.x,y:b.y,moved:!1}},onPointerMove:a=>{let b=u.current;if(!b||b.id!==a.pointerId)return;let c=K(a);!b.moved&&6>Math.hypot(c.x-b.x,c.y-b.y)||(b.moved=!0,w({x:Math.min(b.x,c.x),y:Math.min(b.y,c.y),w:Math.abs(c.x-b.x),h:Math.abs(c.y-b.y)}))},onPointerUp:c=>{let d=u.current;if(!d||d.id!==c.pointerId)return;u.current=null,w(null);let e=K(c);if(d.moved){let c=O(a,{x:Math.min(d.x,e.x),y:Math.min(d.y,e.y)}),f=O(a,{x:Math.max(d.x,e.x),y:Math.max(d.y,e.y)}),g={x:c.x,y:c.y,width:Math.max(1,f.x-c.x),height:Math.max(1,f.y-c.y)};m?.({elements:function(a,b,c=1/3){let d=[];for(let{focus:e,box:f}of a){let a=f.width*f.height;!(a<=0||d.includes(e))&&function(a,b){let c=Math.min(a.x+a.width,b.x+b.width)-Math.max(a.x,b.x),d=Math.min(a.y+a.height,b.y+b.height)-Math.max(a.y,b.y);return c>0&&d>0?c*d:0}(f,b)/a>=c&&d.push(e)}return d}(b,g),region:g});return}let f=O(a,e),g=function(a,b,c){let d=null;for(let e of a){let{box:a}=e;b<a.x||c<a.y||b>a.x+a.width||c>a.y+a.height||(!d||a.width*a.height<d.box.width*d.box.height)&&(d=e)}return d?.focus??null}(b,f.x,f.y);if(g)return m?.({elements:[g]});if("touch"===c.pointerType)return;let h=28/(a.scale||1);m?.({elements:[],region:{x:f.x-h,y:f.y-h,width:2*h,height:2*h}})},onPointerCancel:()=>{u.current=null,w(null)}})]})}function bX(a,b){let c=b?.[a];if(c)return c;let d=a.indexOf(":");if(d<=0)return a;let e=a.slice(0,d),f=a.slice(d+1);if("message"===e)return`message ${f}`;if("attribute"===e){let a=f.indexOf(".");return a>0?`${f.slice(a+1)} in ${f.slice(0,a)}`:f}return f}function bY(a,b){var c;let d,e,f=(c=a.elements,e=new Set(d=c??[]),d.filter(a=>{let b=/^attribute:([^.]+)\./.exec(a);return!b||!e.has(`entity:${b[1]}`)}).map(a=>bX(a,b)));return f.length?f.length<=1?f[0]??"":f.length<=3?`${f.slice(0,-1).join(", ")} and ${f[f.length-1]}`:`${f.slice(0,2).join(", ")} and ${f.length-2} more`:a.region?a.level&&"Root"!==a.level?`an area inside ${a.level}`:"an area":"the drawing"}function bZ(a,b){return b||(a?a.split("/").pop()??a:"").replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,"")||"the drawing"}function b$(a){if("resolved"===a.status)return"resolved";let b=a.author?.role==="agent";return"answered"===a.status?b?"waits for agent":"answered":b?"waits for you":"waits for agent"}function b_({size:a=16,children:b,...c}){return(0,h.jsx)("svg",{width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.8,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",className:"slc-icon",...c,children:b})}function b0(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("rect",{x:"9",y:"3",width:"6",height:"11",rx:"3"}),(0,h.jsx)("path",{d:"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21M8.5 21h7"})]})}function b1(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M4 9.5h3.5L12 5.5v13l-4.5-4H4z"}),(0,h.jsx)("path",{d:"M15.5 9a4 4 0 0 1 0 6M18 6.5a7.5 7.5 0 0 1 0 11"})]})}function b2(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M4 9.5h3.5L12 5.5v13l-4.5-4H4z"}),(0,h.jsx)("path",{d:"M16 10l4 4M20 10l-4 4"})]})}function b3(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("path",{d:"M5 5h14a1.5 1.5 0 0 1 1.5 1.5v8A1.5 1.5 0 0 1 19 16h-7l-4.5 3.5V16H5a1.5 1.5 0 0 1-1.5-1.5v-8A1.5 1.5 0 0 1 5 5z"})})}function b4(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("path",{d:"M8 5.5v13l10-6.5z",fill:"currentColor"})})}function b5(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("path",{d:"M8.5 5.5v13M15.5 5.5v13",strokeWidth:2.6})})}function b6(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("rect",{x:"7",y:"7",width:"10",height:"10",rx:"1.5",fill:"currentColor"})})}function b7(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M17 5.5v13L8 12z"}),(0,h.jsx)("path",{d:"M6.5 5.5v13"})]})}function b8(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M7 5.5v13l9-6.5z"}),(0,h.jsx)("path",{d:"M17.5 5.5v13"})]})}function b9(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("path",{d:"M7.5 10.5v9H4.5v-9zM7.5 10.5l3.5-6.5a2 2 0 0 1 2.5 2.2l-.6 3.3h5.4a2 2 0 0 1 2 2.4l-1.3 6.2a2 2 0 0 1-2 1.4H7.5"})})}function ca(a){return(0,h.jsx)(b_,{...a,style:{transform:"scaleY(-1)",...a.style},children:(0,h.jsx)("path",{d:"M7.5 10.5v9H4.5v-9zM7.5 10.5l3.5-6.5a2 2 0 0 1 2.5 2.2l-.6 3.3h5.4a2 2 0 0 1 2 2.4l-1.3 6.2a2 2 0 0 1-2 1.4H7.5"})})}function cb(a){return(0,h.jsx)(b_,{...a,children:(0,h.jsx)("path",{d:"M6.5 6.5l11 11M17.5 6.5l-11 11"})})}function cc(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M4.5 19.5l1-4.2L15.8 5a1.8 1.8 0 0 1 2.5 0l.7.7a1.8 1.8 0 0 1 0 2.5L8.7 18.5z"}),(0,h.jsx)("path",{d:"M13.8 7l3.2 3.2"})]})}function cd(a){return(0,h.jsxs)(b_,{...a,children:[(0,h.jsx)("path",{d:"M12 21s-6.5-6.2-6.5-11.2a6.5 6.5 0 0 1 13 0C18.5 14.8 12 21 12 21z"}),(0,h.jsx)("circle",{cx:"12",cy:"9.8",r:"2.3"})]})}function ce({shown:a,playing:b=!1,speaking:c=!1,voice:d,onToggleVoice:e,onPlay:f,onPause:g,onNext:i,onPrev:j,onGoto:k,onClose:l,onAnswer:m,held:n=null,theme:o,className:p,style:q}){if(!a)return null;let{step:r,index:s,count:t,title:u,origin:v}=a,w=null!==s&&null!==t,x=r.title||u||"",y=[w?`${s+1} / ${t}`:"",r.title?u:""].filter(Boolean).join(" · "),z=w&&t>7;return(0,h.jsxs)("section",{className:`slc-stage-caption${p?` ${p}`:""}`,style:{...bA(o),...q},role:"region","aria-label":"What the agent is showing","aria-live":"polite",children:[(0,h.jsxs)("header",{className:"slc-stage-caption-head",children:[v&&(0,h.jsx)("span",{className:"slc-stage-caption-origin",children:v}),(0,h.jsxs)("span",{className:"slc-stage-caption-heading",children:[x&&(0,h.jsx)("span",{className:"slc-stage-caption-title",children:x}),y&&(0,h.jsx)("span",{className:"slc-stage-caption-count",children:y})]}),c&&(0,h.jsx)("span",{className:"slc-stage-caption-speaking","aria-label":"speaking"}),l&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:l,"aria-label":"Close",title:"Close",children:(0,h.jsx)(cb,{})})]}),n&&(0,h.jsxs)("p",{className:"slc-stage-caption-held",children:["About ",(0,h.jsx)("strong",{children:n.drawing}),", not the drawing open here."]}),(0,h.jsx)("p",{className:"slc-stage-caption-say",children:r.say}),w&&t<=24&&t>1&&(0,h.jsx)("nav",{className:`slc-stage-dots${z?" slc-stage-dots--many":""}`,"aria-label":"Steps",children:Array.from({length:t},(a,b)=>(0,h.jsx)("button",{type:"button",className:`slc-stage-dot${b===s?" slc-stage-dot--current":b<s?" slc-stage-dot--seen":""}`,onClick:()=>k?.(b),"aria-label":`Step ${b+1}`,"aria-current":b===s?"step":void 0},b))}),(0,h.jsxs)("footer",{className:"slc-stage-caption-controls",children:[w&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:j,disabled:0===s,"aria-label":"Previous step",title:"Previous step",children:(0,h.jsx)(b7,{})}),n?(0,h.jsxs)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:n.onOpen,title:`Open ${n.drawing} and play from this step`,children:[(0,h.jsx)(b4,{}),n.label??"Open and play"]}):b?(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:g,"aria-label":"Pause",title:"Pause",children:(0,h.jsx)(b5,{})}):(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:f,"aria-label":"Play",title:"Play",children:(0,h.jsx)(b4,{})}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:i,disabled:s===t-1,"aria-label":"Next step",title:"Next step",children:(0,h.jsx)(b8,{})})]}),!w&&n&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--main",onClick:n.onOpen,title:`Open ${n.drawing}`,children:n.label??"Open the drawing"}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),void 0!==d&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${d?" slc-stage-btn--on":""}`,onClick:e,"aria-pressed":d,title:d?"Voice on — the steps are read aloud":"Voice off — the steps are read on screen",children:d?(0,h.jsx)(b1,{}):(0,h.jsx)(b2,{})}),m&&!n&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--answer",onClick:m,title:"Answer — mark what is lit and say something about it",children:"Answer"})]})]})}let cf={comment:"Comment",question:"Question",looks_good:"Looks good",delete:"Should go"};function cg(a,b){let[c,d]=(0,i.useState)(!1),e=(0,i.useRef)("");return(0,i.useEffect)(()=>()=>a?.stop(),[a]),{listening:c,toggle:f=>{if(a){if(c){a.stop(),d(!1);return}e.current=f?`${f.trimEnd()} `:"",d(!0),a.start(a=>b(e.current+a),()=>d(!1))}}}}function ch({elements:a,region:b,labels:c}){if(!a?.length&&!b)return(0,h.jsx)("span",{className:"slc-stage-chip slc-stage-chip--quiet",children:"the drawing"});let d=new Set(a??[]),e=(a??[]).filter(a=>{let b=/^attribute:([^.]+)\./.exec(a);return!b||!d.has(`entity:${b[1]}`)});return(0,h.jsxs)(h.Fragment,{children:[e.map(a=>(0,h.jsx)("span",{className:"slc-stage-chip",title:a,children:bX(a,c)},a)),b&&!a?.length&&(0,h.jsx)("span",{className:"slc-stage-chip slc-stage-chip--quiet",children:"an area"})]})}function ci({children:a}){return null==a||!1===a||""===a?null:(0,h.jsx)("div",{className:"slc-stage-card-note",role:"status",children:a})}function cj({elements:a,region:b,author:c,onAuthorChange:d,onSubmit:e,onCancel:f,listener:g,listenAtOnce:j=!1,busy:k=!1,error:l,placeholder:m="What should the agent know about this?",note:n,labels:o,theme:p,className:q,style:r}){let[s,t]=(0,i.useState)(""),[u,v]=(0,i.useState)("comment"),[w,x]=(0,i.useState)(c),{listening:y,toggle:z}=cg(g,t),A=(0,i.useRef)(null);(0,i.useEffect)(()=>{j&&g?z(""):(j||function(){try{return!1}catch{return!1}}())&&A.current?.focus()},[]);let B=a=>{if(a?.preventDefault(),!s.trim()||k)return;y&&g?.stop();let b=c||w.trim();!c&&b&&d?.(b),e({text:s.trim(),kind:u,author:b})};return(0,h.jsxs)("form",{className:`slc-stage-card slc-stage-composer${q?` ${q}`:""}`,style:{...bA(p),...r},onSubmit:B,onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-anchor",children:[(0,h.jsx)("span",{className:"slc-stage-card-label",children:"On"}),(0,h.jsx)(ch,{elements:a,region:b,labels:o})]}),(0,h.jsx)("textarea",{ref:A,className:"slc-stage-input slc-stage-textarea",value:s,placeholder:y?"Listening…":m,onChange:a=>t(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&B(),"Escape"===a.key&&f()},rows:3}),!c&&(0,h.jsx)("input",{className:"slc-stage-input",value:w,placeholder:"Your name (signs your marks)",onChange:a=>x(a.target.value)}),(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("select",{className:"slc-stage-input slc-stage-select",value:u,onChange:a=>v(a.target.value),"aria-label":"Kind of mark",children:bi.map(a=>(0,h.jsx)("option",{value:a,children:cf[a]},a))}),g&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${y?" slc-stage-btn--live":""}`,onClick:()=>z(s),"aria-pressed":y,title:y?"Stop listening":"Speak instead of typing",children:(0,h.jsx)(b0,{})}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:f,children:"Cancel"}),(0,h.jsx)("button",{type:"submit",className:"slc-stage-btn slc-stage-btn--main",disabled:!s.trim()||k||!c&&!w.trim(),children:k?"Saving…":"Mark"})]}),(0,h.jsx)(ci,{children:n}),l&&(0,h.jsx)("div",{className:"slc-stage-card-error",children:l})]})}function ck({mark:a,number:b,onReply:c,onResolve:d,onReopen:e,onRemove:f,onClose:g,listener:j,busy:k=!1,error:l,note:m,labels:n,theme:o,className:p,style:q}){let[r,s]=(0,i.useState)(""),{listening:t,toggle:u}=cg(j,s);return(0,h.jsxs)("div",{className:`slc-stage-card slc-stage-thread${p?` ${p}`:""}`,style:{...bA(o),...q},onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[void 0!==b&&(0,h.jsx)("span",{className:`slc-stage-pin slc-stage-pin--inline slc-stage-pin--${"resolved"===a.status?"resolved":a.status}`,children:b}),(0,h.jsxs)("span",{className:"slc-stage-card-label",children:[cf[a.kind]," · ",a.status]}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:g,"aria-label":"Close",children:(0,h.jsx)(cb,{})})]}),(0,h.jsx)("div",{className:"slc-stage-card-anchor",children:(0,h.jsx)(ch,{elements:a.elements,region:a.region,labels:n})}),(0,h.jsxs)("ol",{className:"slc-stage-thread-list",children:[(0,h.jsxs)("li",{className:`slc-stage-said slc-stage-said--${a.author.role}`,children:[(0,h.jsx)("span",{className:"slc-stage-said-who",children:a.author.name}),(0,h.jsx)("span",{className:"slc-stage-said-text",children:a.text})]}),(a.replies??[]).map((a,b)=>(0,h.jsxs)("li",{className:`slc-stage-said slc-stage-said--${a.author.role}`,children:[(0,h.jsx)("span",{className:"slc-stage-said-who",children:a.author.name}),(0,h.jsx)("span",{className:"slc-stage-said-text",children:a.text})]},b))]}),"resolved"!==a.status&&"person"===bp(a)&&(0,h.jsx)(ci,{children:m}),c&&(0,h.jsxs)("form",{className:"slc-stage-card-row",onSubmit:a=>{a?.preventDefault(),r.trim()&&!k&&(t&&j?.stop(),c?.(r.trim()),s(""))},children:[(0,h.jsx)("input",{className:"slc-stage-input slc-stage-grow",value:r,placeholder:t?"Listening…":"Reply…",onChange:a=>s(a.target.value)}),j&&(0,h.jsx)("button",{type:"button",className:`slc-stage-btn${t?" slc-stage-btn--live":""}`,onClick:()=>u(r),"aria-pressed":t,title:"Speak the reply",children:(0,h.jsx)(b0,{})}),(0,h.jsx)("button",{type:"submit",className:"slc-stage-btn slc-stage-btn--main",disabled:!r.trim()||k,children:"Reply"})]}),(0,h.jsxs)("div",{className:"slc-stage-card-row",children:["resolved"===a.status?e&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:e,children:"Reopen"}):d&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:d,children:"Resolve"}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),f&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--danger",onClick:f,children:"Remove"})]}),l&&(0,h.jsx)("div",{className:"slc-stage-card-error",children:l})]})}function cl({marks:a,selected:b,onSelect:c,onCopy:d,copied:e,onClose:f,note:g,unread:j,labels:k,theme:l,className:m,style:n}){let[o,p]=(0,i.useState)(!1),q=new Set(j??[]),r=a.map((a,b)=>({m:a,n:b+1})),s=[...r.filter(({m:a})=>q.has(a.id)),...r.filter(({m:a})=>!q.has(a.id))],t=o?s:s.filter(({m:a})=>"resolved"!==a.status),u=a.filter(a=>"resolved"!==a.status).length;return(0,h.jsxs)("div",{className:`slc-stage-card slc-stage-panel${m?` ${m}`:""}`,style:{...bA(l),...n},onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("span",{className:"slc-stage-card-label",children:"Marks on this drawing"}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsxs)("span",{className:"slc-stage-segment",role:"group","aria-label":"Which marks to list",children:[(0,h.jsxs)("button",{type:"button",className:`slc-stage-segment-btn${o?"":" slc-stage-segment-btn--on"}`,"aria-pressed":!o,onClick:()=>p(!1),children:["Open ",u]}),(0,h.jsxs)("button",{type:"button",className:`slc-stage-segment-btn${o?" slc-stage-segment-btn--on":""}`,"aria-pressed":o,onClick:()=>p(!0),children:["All ",a.length]})]}),f&&(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:f,"aria-label":"Close",children:(0,h.jsx)(cb,{})})]}),0===t.length&&(0,h.jsx)("div",{className:"slc-stage-empty",children:a.length?"Every mark is resolved.":"No marks yet. Turn on marking (✎) and tap or draw around what you mean."}),(0,h.jsx)("ul",{className:"slc-stage-panel-list",children:t.map(({m:a,n:d})=>(0,h.jsx)("li",{children:(0,h.jsxs)("button",{type:"button",className:`slc-stage-panel-item${a.id===b?" slc-stage-panel-item--selected":""}`,onClick:()=>c(a.id),children:[(0,h.jsx)("span",{className:`slc-stage-pin slc-stage-pin--inline slc-stage-pin--${"resolved"===a.status?"resolved":"agent"===a.author.role&&"open"===a.status?"question":a.status}${q.has(a.id)?" slc-stage-pin--new":""}`,children:d}),(0,h.jsxs)("span",{className:"slc-stage-panel-text",children:[(0,h.jsx)("span",{className:"slc-stage-panel-said",children:a.text}),(0,h.jsxs)("span",{className:"slc-stage-panel-meta",children:[q.has(a.id)&&(0,h.jsx)("span",{className:"slc-stage-new",children:"new"}),a.author.name," · ",bY(a,k),a.replies?.length?` \xb7 ${a.replies.length} repl${1===a.replies.length?"y":"ies"}`:""]})]})]})},a.id))}),(0,h.jsx)(ci,{children:g}),d&&(0,h.jsxs)("div",{className:"slc-stage-card-row",children:[(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn",onClick:d,title:"Copy what is on screen and the waiting marks, to paste into any agent",children:e?"Copied":"Copy for the agent"})]})]})}function cm({children:a,onOpen:b,onDismiss:c,theme:d,className:e,style:f}){return(0,h.jsxs)("div",{className:`slc-stage-notice${e?` ${e}`:""}`,style:{...bA(d),...f},role:"status","aria-live":"polite",onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("button",{type:"button",className:"slc-stage-notice-open",onClick:b,title:"Open the thread",children:[(0,h.jsx)("span",{className:"slc-stage-notice-dot","aria-hidden":"true"}),(0,h.jsx)("span",{className:"slc-stage-notice-text",children:a})]}),c&&(0,h.jsx)("button",{type:"button",className:"slc-stage-notice-close",onClick:c,"aria-label":"Dismiss",children:(0,h.jsx)(cb,{})})]})}function cn(a){return`stateloom.marks.read.v1:${a}`}function co(a){try{let b=window.localStorage.getItem(cn(a)),c=b?JSON.parse(b):null;if(!c||"object"!=typeof c||Array.isArray(c))return{};let d={};for(let[a,b]of Object.entries(c))"number"==typeof b&&Number.isFinite(b)&&b>=0&&(d[a]=b);return d}catch{return{}}}let cp=a=>`${Math.floor(a/60)}:${String(a%60).padStart(2,"0")}`,cq=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},cr=a=>(a?a.split("/").pop()??a:"").replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,"");function cs(a){let b=(a.spotlight?.length?a.spotlight:a.focus?[a.focus]:[]).map(a=>a.startsWith("message:")?`#${a.slice(8)}`:a.slice(a.indexOf(":")+1));return b.length?b.length<=2?b.join(", "):`${b.slice(0,2).join(", ")} +${b.length-2}`:""}let ct=(a,b)=>"agent"===a.role?a.name||b:"You",cu={idle:"● Record",starting:"Opening the mic…",recording:"■ Stop & send",sending:"Sending…",retry:"Send again"};function cv({open:a,onOpenChange:b,variant:c="fab",onOpenMark:d,who:e="Mia",episode:f,episodes:g,onEpisode:i,presence:j,recorder:k,onRecord:l,items:m,unheard:n=[],playing:o=null,playingStep:p=null,onPlay:q,onStop:r,onFeedback:s,autoplay:t,onAutoplay:u,waiting:v,notice:w,error:x,theme:y,className:z,style:A}){let B="recording"===k.state,C="starting"===k.state||"sending"===k.state,D=n.length,E=function(a,b,c){if(!c)return{text:"Choose the episode you are speaking in.",word:"no episode",away:!0};switch(b?.state){case"listening":return{text:`${a} is listening.`,word:"listening",away:!1};case"answering":{let c=b.takes?.length?` take ${b.takes.join(", ")}`:"";return{text:`${a} is answering${c}.`,word:`answering${c}`,away:!1}}case"answered":return{text:`${a} has answered and is getting ready to listen again.`,word:"answered",away:!1};default:return{text:`Nobody is listening yet. A take waits in the episode until ${a} does.`,word:"away",away:!0}}}(e,j,f);if(!a&&"bar"===c)return(0,h.jsx)("div",{className:`slc-talk slc-talk--bar${z?` ${z}`:""}`,style:{...bA(y),...A},children:(0,h.jsxs)("button",{type:"button",className:`slc-talk-bar${B?" slc-talk-bar--live":""}${!B&&o?" slc-talk-bar--speaking":""}`,onClick:()=>B?l():b(!0),"aria-label":B?`Stop and send (${cp(k.seconds)})`:`Talk with ${e}: ${E.word}${D?`, ${D} new`:""}. Open the conversation`,title:B?"Stop and send your take":`Talk with ${e} about what is on the canvas`,children:[B?(0,h.jsx)(b6,{}):o?(0,h.jsx)(b1,{}):(0,h.jsx)(b0,{}),(0,h.jsx)("span",{className:"slc-talk-bar-title",children:B?"Stop and send":o?`${e} is speaking`:`Talk with ${e}`}),B?(0,h.jsx)("span",{className:"slc-talk-clock",children:cp(k.seconds)}):!o&&(0,h.jsx)("span",{className:`slc-talk-state${E.away?" slc-talk-state--away":""}`,children:E.word}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),!B&&D>0&&(0,h.jsxs)("span",{className:"slc-talk-new",children:[D," new"]})]})});if(!a)return(0,h.jsx)("div",{className:`slc-talk${z?` ${z}`:""}`,style:{...bA(y),...A},children:(0,h.jsxs)("button",{type:"button",className:`slc-talk-fab${B?" slc-talk-fab--live":""}${!B&&o?" slc-talk-fab--speaking":""}`,onClick:()=>B?l():b(!0),"aria-label":B?`Stop and send (${cp(k.seconds)})`:o?`${e} is speaking. Open the conversation`:`Talk with ${e}${D?`, ${D} new`:""}`,title:B?"Stop and send your take":o?`${e} is walking the diagram`:`Talk with ${e} about what is on the canvas`,children:[B?(0,h.jsx)("span",{className:"slc-talk-fab-clock",children:cp(k.seconds)}):o?(0,h.jsx)(b1,{size:24}):(0,h.jsx)(b0,{size:24}),!B&&D>0&&(0,h.jsx)("span",{className:"slc-talk-fab-badge",children:D})]})});let F=[...m].reverse(),G=m.filter(a=>"mark"===a.kind),H=new Map(G.map(a=>[a.id,a])),I=m.some(a=>"take"===a.kind||"reply"===a.kind),J={"waits for agent":`waits for ${e}`,"waits for you":"waits for you",answered:"answered",resolved:"resolved"},K=a=>`${bY(a)} on ${bZ(a.doc??a.drawing,a.title)}`;return(0,h.jsx)("div",{className:`slc-talk slc-talk--open${z?` ${z}`:""}`,style:{...bA(y),...A},children:(0,h.jsxs)("section",{className:"slc-talk-panel","aria-label":`Conversation with ${e}`,onPointerDown:a=>a.stopPropagation(),children:[(0,h.jsxs)("header",{className:"slc-talk-head",children:[(0,h.jsxs)("span",{className:"slc-talk-title",children:[(0,h.jsx)(b0,{})," Talk with ",e]}),(0,h.jsx)("span",{className:`slc-talk-state${E.away?" slc-talk-state--away":""}`,title:E.text,children:E.word}),(0,h.jsx)("span",{className:"slc-stage-spacer"}),(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-stage-btn--quiet",onClick:()=>b(!1),"aria-label":"Close the conversation",children:(0,h.jsx)(cb,{})})]}),g?.length&&i?(0,h.jsxs)("select",{className:"slc-stage-input slc-talk-episode",value:f??"",onChange:a=>i(a.target.value),disabled:B||C,"aria-label":"The episode this conversation belongs to",children:[!f&&(0,h.jsx)("option",{value:"",children:"Choose the episode…"}),g.map(a=>(0,h.jsxs)("option",{value:a.path,children:[a.number?`${String(a.number).padStart(3,"0")} \xb7 `:"",a.path.replace(/^\d{4}-\d{2}-\d{2}-episode-\d+-/,"")]},a.path))]}):(0,h.jsx)("div",{className:"slc-talk-meta",children:f??"No episode chosen."}),(0,h.jsx)("div",{className:`slc-talk-meta${E.away?" slc-talk-meta--away":""}`,children:E.text}),(0,h.jsxs)("button",{type:"button",className:`slc-talk-record${B?" slc-talk-record--live":""}${"retry"===k.state?" slc-talk-record--retry":""}`,onClick:l,disabled:C||!!k.unavailable||!f,title:k.unavailable?`Cannot record: ${k.unavailable}`:B?"Stop and send your take":"Speak to the episode, about what is on the canvas",children:[cu[k.state],B&&(0,h.jsx)("span",{className:"slc-talk-clock",children:cp(k.seconds)})]}),k.unavailable&&(0,h.jsxs)("div",{className:"slc-talk-meta slc-talk-meta--error",children:["Cannot record here: ",k.unavailable,"."]}),k.message&&(0,h.jsx)("div",{className:`slc-talk-meta${k.error?" slc-talk-meta--error":""}`,children:k.message}),v&&(0,h.jsxs)("div",{className:"slc-talk-meta",children:["Waiting for ",e,"… ",cp(v.seconds)]}),w&&(0,h.jsx)("div",{className:"slc-talk-notice",children:w}),x&&(0,h.jsx)("div",{className:"slc-talk-meta slc-talk-meta--error",children:x}),(0,h.jsxs)("label",{className:"slc-talk-toggle",children:[(0,h.jsx)("input",{type:"checkbox",checked:t,onChange:a=>u(a.target.checked)}),"Play ",e,"'s replies on the diagram as they arrive"]}),(0,h.jsxs)("ol",{className:"slc-talk-thread",children:[0===F.length&&(0,h.jsx)("li",{className:"slc-stage-empty",children:"Nothing said or marked in this episode yet. Look at a drawing, press Record, and speak, or mark it."}),!I&&G.length>0&&(0,h.jsxs)("li",{className:"slc-stage-empty",children:[function(a,b="the agent"){let c=new Map;for(let b of a){let a=bZ(b.doc??b.drawing,b.title);c.set(a,[...c.get(a)??[],b])}return[...c.entries()].sort((a,b)=>b[1].length-a[1].length).map(([a,c])=>{let d=a=>c.filter(b=>b$(b)===a).length,e=[`${c.length} mark${1===c.length?"":"s"} on ${a}`];return d("answered")&&e.push(`${d("answered")} answered`),d("waits for agent")&&e.push(`${d("waits for agent")} waiting on ${b}`),d("waits for you")&&e.push(`${d("waits for you")} waiting on you`),d("resolved")&&e.push(`${d("resolved")} resolved`),e.join(", ")}).join("; ")}(G,e),". Nothing said by voice yet."]}),F.map(a=>"mark"===a.kind?(0,h.jsx)("li",{className:`slc-talk-entry slc-talk-entry--mark${"waits for agent"===b$(a)?" slc-talk-entry--waits":""}`,children:(0,h.jsxs)("button",{type:"button",className:"slc-talk-mark",onClick:()=>d?.(a),disabled:!d,title:`Open ${bZ(a.doc??a.drawing,a.title)} at this mark`,children:[(0,h.jsxs)("span",{className:"slc-talk-who",children:[(0,h.jsx)(cd,{size:14}),(0,h.jsxs)("span",{className:"slc-talk-mark-head",children:[(0,h.jsx)("strong",{children:ct(a.author,e)})," marked ",K(a)]}),(0,h.jsx)("span",{children:cq(a.at)})]}),(0,h.jsx)("span",{className:"slc-talk-text",children:a.text}),a.replies.length>0&&(0,h.jsx)("span",{className:"slc-talk-mark-replies",children:a.replies.map((a,b)=>(0,h.jsxs)("span",{className:`slc-talk-mark-reply slc-talk-mark-reply--${a.author.role}`,children:[(0,h.jsxs)("span",{className:"slc-talk-mark-by",children:[ct(a.author,e),a.at?` \xb7 ${cq(a.at)}`:""]}),(0,h.jsx)("span",{className:"slc-talk-text",children:a.text})]},b))}),(0,h.jsx)("span",{className:`slc-talk-mark-state${"waits for agent"===b$(a)?" slc-talk-mark-state--waits":""}`,children:J[b$(a)]})]})},`m${a.id}`):"take"===a.kind?(0,h.jsxs)("li",{className:"slc-talk-entry slc-talk-entry--take",children:[(0,h.jsxs)("div",{className:"slc-talk-who",children:[(0,h.jsx)("strong",{children:"You"}),(0,h.jsxs)("span",{children:["take ",a.take," · ",cq(a.at)]})]}),a.canvas?.doc&&(0,h.jsxs)("div",{className:"slc-talk-canvas",children:["on ",cr(a.canvas.doc),a.canvas.focus?` \xb7 ${a.canvas.focus.slice(a.canvas.focus.indexOf(":")+1)}`:"",a.canvas.step?.title?` \xb7 during “${a.canvas.step.title}”`:""]}),(0,h.jsx)("div",{className:"slc-talk-text",children:a.text||"(no transcript yet)"})]},`t${a.take}`):(0,h.jsxs)("li",{className:`slc-talk-entry slc-talk-entry--reply${n.includes(a.id)?" slc-talk-entry--new":""}`,children:[(0,h.jsxs)("div",{className:"slc-talk-who",children:[(0,h.jsx)("strong",{children:e}),(0,h.jsx)("span",{children:cq(a.at)}),(!a.unvoiced||(a.steps?.length??0)>0)&&(o===a.id?(0,h.jsx)("button",{type:"button",className:"slc-stage-btn slc-talk-play slc-talk-play--on",onClick:r,"aria-label":"Stop",title:"Stop",children:(0,h.jsx)(b6,{})}):(0,h.jsxs)("button",{type:"button",className:"slc-stage-btn slc-talk-play",onClick:()=>q(a.id),disabled:B,title:a.unvoiced?`Walk the diagram with ${e}'s words (no voice)`:a.steps?.length?`Hear ${e} walk the diagram (${a.steps.length} steps)`:`Hear ${e}`,children:[(0,h.jsx)(b4,{}),(a.steps?.length??0)>0?(0,h.jsxs)("span",{children:["Walk ",a.steps.length," steps"]}):null,n.includes(a.id)?(0,h.jsx)("span",{className:"slc-talk-new",children:"New"}):null]})),s&&(0,h.jsx)("span",{className:"slc-talk-thumbs",children:["up","down"].map(b=>(0,h.jsx)("button",{type:"button",className:`slc-talk-thumb${a.feedback===b?" slc-talk-thumb--on":""}`,onClick:()=>s(a.id,a.feedback===b?"":b),"aria-label":"up"===b?"This reply worked":"This reply missed",children:"up"===b?(0,h.jsx)(b9,{size:15}):(0,h.jsx)(ca,{size:15})},b))})]}),a.mark&&(0,h.jsxs)("button",{type:"button",className:"slc-talk-answers",onClick:()=>{let b=H.get(a.mark.id);b&&d?.(b)},disabled:!d||!H.has(a.mark.id),children:[(0,h.jsx)(cd,{size:13}),"answers your mark on ",H.has(a.mark.id)?K(H.get(a.mark.id)):bZ(a.mark.doc)]}),(a.steps?.length??0)>0?(0,h.jsx)("ol",{className:"slc-talk-steps","aria-label":`${e}'s walk through the diagram`,children:a.steps.map((b,c)=>{let d=o===a.id&&p===c;return(0,h.jsx)("li",{children:(0,h.jsxs)("button",{type:"button",className:`slc-talk-step${d?" slc-talk-step--here":""}`,onClick:()=>q(a.id,c),disabled:B,"aria-current":d?"step":void 0,title:`Walk from step ${c+1}`,children:[(0,h.jsx)("span",{className:"slc-talk-step-n",children:c+1}),(0,h.jsxs)("span",{className:"slc-talk-step-body",children:[(b.title||b.doc)&&(0,h.jsxs)("span",{className:"slc-talk-step-head",children:[b.title&&(0,h.jsx)("strong",{children:b.title}),(b.doc||cs(b))&&(0,h.jsx)("span",{className:"slc-talk-step-where",children:[cr(b.doc),cs(b)].filter(Boolean).join(" · ")})]}),(0,h.jsx)("span",{className:"slc-talk-step-say",children:b.say})]})]})},c)})}):(0,h.jsx)("div",{className:"slc-talk-text",children:a.text}),a.unvoiced&&(0,h.jsx)("div",{className:"slc-talk-meta",children:a.unvoiced})]},`r${a.id}`))]})]})})}let cw=a=>{let b,c=new Set,d=(a,d)=>{let e="function"==typeof a?a(b):a;if(!Object.is(e,b)){let a=b;b=(null!=d?d:"object"!=typeof e||null===e)?e:Object.assign({},b,e),c.forEach(c=>c(b,a))}},e=()=>b,f={setState:d,getState:e,getInitialState:()=>g,subscribe:a=>(c.add(a),()=>c.delete(a))},g=b=a(d,e,f);return f},cx=a=>{let b=a?cw(a):cw,c=a=>(function(a,b=a=>a){let c=i.default.useSyncExternalStore(a.subscribe,i.default.useCallback(()=>b(a.getState()),[a,b]),i.default.useCallback(()=>b(a.getInitialState()),[a,b]));return i.default.useDebugValue(c),c})(b,a);return Object.assign(c,b),c};var cy=a.i(53681);let cz=Object.create(null);cz.open="0",cz.close="1",cz.ping="2",cz.pong="3",cz.message="4",cz.upgrade="5",cz.noop="6";let cA=Object.create(null);Object.keys(cz).forEach(a=>{cA[cz[a]]=a});let cB={type:"error",data:"parser error"},cC=({type:a,data:b},c,d)=>d(b instanceof ArrayBuffer||ArrayBuffer.isView(b)?c?b:"b"+cD(b,!0).toString("base64"):cz[a]+(b||"")),cD=(a,b)=>Buffer.isBuffer(a)||a instanceof Uint8Array&&!b?a:a instanceof ArrayBuffer?Buffer.from(a):Buffer.from(a.buffer,a.byteOffset,a.byteLength),cE=(a,b)=>{if("string"!=typeof a)return{type:"message",data:cF(a,b)};let c=a.charAt(0);return"b"===c?{type:"message",data:cF(Buffer.from(a.substring(1),"base64"),b)}:cA[c]?a.length>1?{type:cA[c],data:a.substring(1)}:{type:cA[c]}:cB},cF=(a,b)=>"arraybuffer"===b?a instanceof ArrayBuffer?a:Buffer.isBuffer(a)?a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength):a.buffer:Buffer.isBuffer(a)?a:Buffer.from(a);function cG(a){return a.reduce((a,b)=>a+b.length,0)}function cH(a,b){if(a[0].length===b)return a.shift();let c=new Uint8Array(b),d=0;for(let e=0;e<b;e++)c[e]=a[0][d++],d===a[0].length&&(a.shift(),d=0);return a.length&&d<a[0].length&&(a[0]=a[0].slice(d)),c}function cI(a){if(a){var b=a;for(var c in cI.prototype)b[c]=cI.prototype[c];return b}}cI.prototype.on=cI.prototype.addEventListener=function(a,b){return this._callbacks=this._callbacks||{},(this._callbacks["$"+a]=this._callbacks["$"+a]||[]).push(b),this},cI.prototype.once=function(a,b){function c(){this.off(a,c),b.apply(this,arguments)}return c.fn=b,this.on(a,c),this},cI.prototype.off=cI.prototype.removeListener=cI.prototype.removeAllListeners=cI.prototype.removeEventListener=function(a,b){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var c,d=this._callbacks["$"+a];if(!d)return this;if(1==arguments.length)return delete this._callbacks["$"+a],this;for(var e=0;e<d.length;e++)if((c=d[e])===b||c.fn===b){d.splice(e,1);break}return 0===d.length&&delete this._callbacks["$"+a],this},cI.prototype.emit=function(a){this._callbacks=this._callbacks||{};for(var b=Array(arguments.length-1),c=this._callbacks["$"+a],d=1;d<arguments.length;d++)b[d-1]=arguments[d];if(c){c=c.slice(0);for(var d=0,e=c.length;d<e;++d)c[d].apply(this,b)}return this},cI.prototype.emitReserved=cI.prototype.emit,cI.prototype.listeners=function(a){return this._callbacks=this._callbacks||{},this._callbacks["$"+a]||[]},cI.prototype.hasListeners=function(a){return!!this.listeners(a).length};let cJ=process.nextTick,cK=a.g;class cL{constructor(){this._cookies=new Map}parseCookies(a){a&&a.forEach(a=>{let b=function(a){let b=a.split("; "),c=b[0].indexOf("=");if(-1===c)return;let d=b[0].substring(0,c).trim();if(!d.length)return;let e=b[0].substring(c+1).trim();34===e.charCodeAt(0)&&(e=e.slice(1,-1));let f={name:d,value:e};for(let a=1;a<b.length;a++){let c=b[a].split("=");if(2!==c.length)continue;let d=c[0].trim(),e=c[1].trim();switch(d){case"Expires":f.expires=new Date(e);break;case"Max-Age":let g=new Date;g.setUTCSeconds(g.getUTCSeconds()+parseInt(e,10)),f.expires=g}}return f}(a);b&&this._cookies.set(b.name,b)})}get cookies(){let a=Date.now();return this._cookies.forEach((b,c)=>{var d;(null==(d=b.expires)?void 0:d.getTime())<a&&this._cookies.delete(c)}),this._cookies.entries()}addCookies(a){let b=[];for(let[a,c]of this.cookies)b.push(`${a}=${c.value}`);b.length&&(a.setDisableHeaderCheck(!0),a.setRequestHeader("cookie",b.join("; ")))}appendCookies(a){for(let[b,c]of this.cookies)a.append("cookie",`${b}=${c.value}`)}}function cM(a,...b){return b.reduce((b,c)=>(a.hasOwnProperty(c)&&(b[c]=a[c]),b),{})}let cN=cK.setTimeout,cO=cK.clearTimeout;function cP(a,b){b.useNativeTimers?(a.setTimeoutFn=cN.bind(cK),a.clearTimeoutFn=cO.bind(cK)):(a.setTimeoutFn=cK.setTimeout.bind(cK),a.clearTimeoutFn=cK.clearTimeout.bind(cK))}function cQ(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}var cR=a.i(72724);let cS=(0,cR.default)("engine.io-client:transport");class cT extends Error{constructor(a,b,c){super(a),this.description=b,this.context=c,this.type="TransportError"}}class cU extends cI{constructor(a){super(),this.writable=!1,cP(this,a),this.opts=a,this.query=a.query,this.socket=a.socket,this.supportsBinary=!a.forceBase64}onError(a,b,c){return super.emitReserved("error",new cT(a,b,c)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return("opening"===this.readyState||"open"===this.readyState)&&(this.doClose(),this.onClose()),this}send(a){"open"===this.readyState?this.write(a):cS("transport is not open, discarding packets")}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(a){let b=cE(a,this.socket.binaryType);this.onPacket(b)}onPacket(a){super.emitReserved("packet",a)}onClose(a){this.readyState="closed",super.emitReserved("close",a)}pause(a){}createUri(a,b={}){return a+"://"+this._hostname()+this._port()+this.opts.path+this._query(b)}_hostname(){let a=this.opts.hostname;return -1===a.indexOf(":")?a:"["+a+"]"}_port(){return this.opts.port&&(this.opts.secure&&443!==Number(this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(a){let b=function(a){let b="";for(let c in a)a.hasOwnProperty(c)&&(b.length&&(b+="&"),b+=encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b}(a);return b.length?"?"+b:""}}let cV=(0,cR.default)("engine.io-client:polling");class cW extends cU{constructor(){super(...arguments),this._polling=!1}get name(){return"polling"}doOpen(){this._poll()}pause(a){this.readyState="pausing";let b=()=>{cV("paused"),this.readyState="paused",a()};if(this._polling||!this.writable){let a=0;this._polling&&(cV("we are currently polling - waiting to pause"),a++,this.once("pollComplete",function(){cV("pre-pause polling complete"),--a||b()})),this.writable||(cV("we are currently writing - waiting to pause"),a++,this.once("drain",function(){cV("pre-pause writing complete"),--a||b()}))}else b()}_poll(){cV("polling"),this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(a){cV("polling got data %s",a);let b=a=>{if("opening"===this.readyState&&"open"===a.type&&this.onOpen(),"close"===a.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(a)};((a,b)=>{let c=a.split("\x1e"),d=[];for(let a=0;a<c.length;a++){let e=cE(c[a],b);if(d.push(e),"error"===e.type)break}return d})(a,this.socket.binaryType).forEach(b),"closed"!==this.readyState&&(this._polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState?this._poll():cV('ignoring poll - transport state "%s"',this.readyState))}doClose(){let a=()=>{cV("writing close packet"),this.write([{type:"close"}])};"open"===this.readyState?(cV("transport open - closing"),a()):(cV("transport not open - deferring close"),this.once("open",a))}write(a){var b;let c,d,e;this.writable=!1,b=a=>{this.doWrite(a,()=>{this.writable=!0,this.emitReserved("drain")})},d=Array(c=a.length),e=0,a.forEach((a,f)=>{cC(a,!1,a=>{d[f]=a,++e===c&&b(d.join("\x1e"))})})}uri(){let a=this.opts.secure?"https":"http",b=this.query||{};return!1!==this.opts.timestampRequests&&(b[this.opts.timestampParam]=cQ()),this.supportsBinary||b.sid||(b.b64=1),this.createUri(a,b)}}let cX=!1;try{cX="u">typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(a){}let cY=cX,cZ=(0,cR.default)("engine.io-client:polling");function c$(){}class c_ extends cW{constructor(a){if(super(a),"u">typeof location){const b="https:"===location.protocol;let c=location.port;c||(c=b?"443":"80"),this.xd="u">typeof location&&a.hostname!==location.hostname||c!==a.port}}doWrite(a,b){let c=this.request({method:"POST",data:a});c.on("success",b),c.on("error",(a,b)=>{this.onError("xhr post error",a,b)})}doPoll(){cZ("xhr poll");let a=this.request();a.on("data",this.onData.bind(this)),a.on("error",(a,b)=>{this.onError("xhr poll error",a,b)}),this.pollXhr=a}}class c0 extends cI{constructor(a,b,c){super(),this.createRequest=a,cP(this,c),this._opts=c,this._method=c.method||"GET",this._uri=b,this._data=void 0!==c.data?c.data:null,this._create()}_create(){var a;let b=cM(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");b.xdomain=!!this._opts.xd;let c=this._xhr=this.createRequest(b);try{cZ("xhr open %s: %s",this._method,this._uri),c.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders)for(let a in c.setDisableHeaderCheck&&c.setDisableHeaderCheck(!0),this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(a)&&c.setRequestHeader(a,this._opts.extraHeaders[a])}catch(a){}if("POST"===this._method)try{c.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(a){}try{c.setRequestHeader("Accept","*/*")}catch(a){}null==(a=this._opts.cookieJar)||a.addCookies(c),"withCredentials"in c&&(c.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(c.timeout=this._opts.requestTimeout),c.onreadystatechange=()=>{var a;3===c.readyState&&(null==(a=this._opts.cookieJar)||a.parseCookies(c.getResponseHeader("set-cookie"))),4===c.readyState&&(200===c.status||1223===c.status?this._onLoad():this.setTimeoutFn(()=>{this._onError("number"==typeof c.status?c.status:0)},0))},cZ("xhr data %s",this._data),c.send(this._data)}catch(a){this.setTimeoutFn(()=>{this._onError(a)},0);return}"u">typeof document&&(this._index=c0.requestsCount++,c0.requests[this._index]=this)}_onError(a){this.emitReserved("error",a,this._xhr),this._cleanup(!0)}_cleanup(a){if(void 0!==this._xhr&&null!==this._xhr){if(this._xhr.onreadystatechange=c$,a)try{this._xhr.abort()}catch(a){}"u">typeof document&&delete c0.requests[this._index],this._xhr=null}}_onLoad(){let a=this._xhr.responseText;null!==a&&(this.emitReserved("data",a),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}function c1(){for(let a in c0.requests)c0.requests.hasOwnProperty(a)&&c0.requests[a].abort()}c0.requestsCount=0,c0.requests={},"u">typeof document&&("function"==typeof attachEvent?attachEvent("onunload",c1):"function"==typeof addEventListener&&addEventListener("onpagehide"in cK?"pagehide":"unload",c1,!1)),(d=function(a){let b=a.xdomain;try{if("u">typeof XMLHttpRequest&&(!b||cY))return new XMLHttpRequest}catch(a){}if(!b)try{return new cK[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch(a){}}({xdomain:!1}))&&d.responseType;let c2=cy.default||cy;a.i(31594),a.i(15251),a.i(31276),a.i(28719),a.i(63349),a.i(54129);var c3=a.i(50842);a.i(36972),c3.default;let c4=(0,cR.default)("engine.io-client:websocket"),c5="u">typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class c6 extends cU{get name(){return"websocket"}doOpen(){let a=this.uri(),b=this.opts.protocols,c=c5?{}:cM(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(c.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(a,b,c)}catch(a){return this.emitReserved("error",a)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=a=>this.onClose({description:"websocket connection closed",context:a}),this.ws.onmessage=a=>this.onData(a.data),this.ws.onerror=a=>this.onError("websocket error",a)}write(a){this.writable=!1;for(let b=0;b<a.length;b++){let c=a[b],d=b===a.length-1;cC(c,this.supportsBinary,a=>{try{this.doWrite(c,a)}catch(a){c4("websocket closed before onclose event")}d&&cJ(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){void 0!==this.ws&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){let a=this.opts.secure?"wss":"ws",b=this.query||{};return this.opts.timestampRequests&&(b[this.opts.timestampParam]=cQ()),this.supportsBinary||(b.b64=1),this.createUri(a,b)}}cK.WebSocket||cK.MozWebSocket;let c7=(0,cR.default)("engine.io-client:webtransport"),c8={websocket:class extends c6{createSocket(a,b,c){var d;if(null==(d=this.socket)?void 0:d._cookieJar)for(let[a,b]of(c.headers=c.headers||{},c.headers.cookie="string"==typeof c.headers.cookie?[c.headers.cookie]:c.headers.cookie||[],this.socket._cookieJar.cookies))c.headers.cookie.push(`${a}=${b.value}`);return new c3.default(a,b,c)}doWrite(a,b){let c={};a.options&&(c.compress=a.options.compress),this.opts.perMessageDeflate&&("string"==typeof b?Buffer.byteLength(b):b.length)<this.opts.perMessageDeflate.threshold&&(c.compress=!1),this.ws.send(b,c)}},webtransport:class extends cU{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(a){return this.emitReserved("error",a)}this._transport.closed.then(()=>{c7("transport closed gracefully"),this.onClose()}).catch(a=>{c7("transport closed due to %s",a),this.onError("webtransport error",a)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(a=>{var d,e;let f,g,h,i,j=(d=Number.MAX_SAFE_INTEGER,e=this.socket.binaryType,c||(c=new TextDecoder),f=[],g=0,h=-1,i=!1,new TransformStream({transform(a,b){for(f.push(a);;){if(0===g){if(1>cG(f))break;let a=cH(f,1);i=(128&a[0])==128,g=(h=127&a[0])<126?3:126===h?1:2}else if(1===g){if(2>cG(f))break;let a=cH(f,2);h=new DataView(a.buffer,a.byteOffset,a.length).getUint16(0),g=3}else if(2===g){if(8>cG(f))break;let a=cH(f,8),c=new DataView(a.buffer,a.byteOffset,a.length),d=c.getUint32(0);if(d>2097151){b.enqueue(cB);break}h=0x100000000*d+c.getUint32(4),g=3}else{if(cG(f)<h)break;let a=cH(f,h);b.enqueue(cE(i?a:c.decode(a),e)),g=0}if(0===h||h>d){b.enqueue(cB);break}}}})),k=a.readable.pipeThrough(j).getReader(),l=new TransformStream({transform(a,c){!function(a,c){if(a.data instanceof ArrayBuffer||ArrayBuffer.isView(a.data))return c(cD(a.data,!1));cC(a,!0,a=>{b||(b=new TextEncoder),c(b.encode(a))})}(a,b=>{let d,e=b.length;if(e<126)new DataView((d=new Uint8Array(1)).buffer).setUint8(0,e);else if(e<65536){let a=new DataView((d=new Uint8Array(3)).buffer);a.setUint8(0,126),a.setUint16(1,e)}else{let a=new DataView((d=new Uint8Array(9)).buffer);a.setUint8(0,127),a.setBigUint64(1,BigInt(e))}a.data&&"string"!=typeof a.data&&(d[0]|=128),c.enqueue(d),c.enqueue(b)})}});l.readable.pipeTo(a.writable),this._writer=l.writable.getWriter();let m=()=>{k.read().then(({done:a,value:b})=>{a?c7("session is closed"):(c7("received chunk: %o",b),this.onPacket(b),m())}).catch(a=>{c7("an error occurred while reading: %s",a)})};m();let n={type:"open"};this.query.sid&&(n.data=`{"sid":"${this.query.sid}"}`),this._writer.write(n).then(()=>this.onOpen())})})}write(a){this.writable=!1;for(let b=0;b<a.length;b++){let c=a[b],d=b===a.length-1;this._writer.write(c).then(()=>{d&&cJ(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var a;null==(a=this._transport)||a.close()}},polling:class extends c_{request(a={}){var b;return Object.assign(a,{xd:this.xd,cookieJar:null==(b=this.socket)?void 0:b._cookieJar},this.opts),new c0(a=>new c2(a),this.uri(),a)}}},c9=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,da=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function db(a){var b,c;let d,e;if(a.length>8e3)throw"URI too long";let f=a,g=a.indexOf("["),h=a.indexOf("]");-1!=g&&-1!=h&&(a=a.substring(0,g)+a.substring(g,h).replace(/:/g,";")+a.substring(h,a.length));let i=c9.exec(a||""),j={},k=14;for(;k--;)j[da[k]]=i[k]||"";return -1!=g&&-1!=h&&(j.source=f,j.host=j.host.substring(1,j.host.length-1).replace(/;/g,":"),j.authority=j.authority.replace("[","").replace("]","").replace(/;/g,":"),j.ipv6uri=!0),d=(b=j.path).replace(/\/{2,9}/g,"/").split("/"),("/"==b.slice(0,1)||0===b.length)&&d.splice(0,1),"/"==b.slice(-1)&&d.splice(d.length-1,1),j.pathNames=d,c=j.query,e={},c.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(a,b,c){b&&(e[b]=c)}),j.queryKey=e,j}let dc=(0,cR.default)("engine.io-client:socket"),dd="function"==typeof addEventListener&&"function"==typeof removeEventListener,de=[];dd&&addEventListener("offline",()=>{dc("closing %d connection(s) because the network was lost",de.length),de.forEach(a=>a())},!1);class df extends cI{constructor(a,b){if(super(),this.binaryType="nodebuffer",this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,a&&"object"==typeof a&&(b=a,a=null),a){const c=db(a);b.hostname=c.host,b.secure="https"===c.protocol||"wss"===c.protocol,b.port=c.port,c.query&&(b.query=c.query)}else b.host&&(b.hostname=db(b.host).host);cP(this,b),this.secure=null!=b.secure?b.secure:"u">typeof location&&"https:"===location.protocol,b.hostname&&!b.port&&(b.port=this.secure?"443":"80"),this.hostname=b.hostname||("u">typeof location?location.hostname:"localhost"),this.port=b.port||("u">typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},b.transports.forEach(a=>{let b=a.prototype.name;this.transports.push(b),this._transportsByName[b]=a}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},b),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(a){let b={},c=a.split("&");for(let a=0,d=c.length;a<d;a++){let d=c[a].split("=");b[decodeURIComponent(d[0])]=decodeURIComponent(d[1])}return b}(this.opts.query)),dd&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(dc("adding listener for the 'offline' event"),this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},de.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=new cL),this._open()}createTransport(a){dc('creating transport "%s"',a);let b=Object.assign({},this.opts.query);b.EIO=4,b.transport=a,this.id&&(b.sid=this.id);let c=Object.assign({},this.opts,{query:b,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[a]);return dc("options: %j",c),new this._transportsByName[a](c)}_open(){if(0===this.transports.length)return void this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);let a=this.opts.rememberUpgrade&&df.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket")?"websocket":this.transports[0];this.readyState="opening";let b=this.createTransport(a);b.open(),this.setTransport(b)}setTransport(a){dc("setting transport %s",a.name),this.transport&&(dc("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=a,a.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",a=>this._onClose("transport close",a))}onOpen(){dc("socket open"),this.readyState="open",df.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush()}_onPacket(a){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(dc('socket receive: type "%s", data "%s"',a.type,a.data),this.emitReserved("packet",a),this.emitReserved("heartbeat"),a.type){case"open":this.onHandshake(JSON.parse(a.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":let b=Error("server error");b.code=a.data,this._onError(b);break;case"message":this.emitReserved("data",a.data),this.emitReserved("message",a.data)}else dc('packet received with socket readyState "%s"',this.readyState)}onHandshake(a){this.emitReserved("handshake",a),this.id=a.sid,this.transport.query.sid=a.sid,this._pingInterval=a.pingInterval,this._pingTimeout=a.pingTimeout,this._maxPayload=a.maxPayload,this.onOpen(),"closed"!==this.readyState&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);let a=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+a,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},a),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){let a=this._getWritablePackets();dc("flushing %d packets in socket",a.length),this.transport.send(a),this._prevBufferLen=a.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let a=1;for(let b=0;b<this.writeBuffer.length;b++){let c=this.writeBuffer[b].data;if(c&&(a+="string"==typeof c?function(a){let b=0,c=0;for(let d=0,e=a.length;d<e;d++)(b=a.charCodeAt(d))<128?c+=1:b<2048?c+=2:b<55296||b>=57344?c+=3:(d++,c+=4);return c}(c):Math.ceil(1.33*(c.byteLength||c.size))),b>0&&a>this._maxPayload)return dc("only send %d out of %d packets",b,this.writeBuffer.length),this.writeBuffer.slice(0,b);a+=2}return dc("payload size is %d (max: %d)",a,this._maxPayload),this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;let a=Date.now()>this._pingTimeoutTime;return a&&(dc("throttled timer detected, scheduling connection close"),this._pingTimeoutTime=0,cJ(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),a}write(a,b,c){return this._sendPacket("message",a,b,c),this}send(a,b,c){return this._sendPacket("message",a,b,c),this}_sendPacket(a,b,c,d){if("function"==typeof b&&(d=b,b=void 0),"function"==typeof c&&(d=c,c=null),"closing"===this.readyState||"closed"===this.readyState)return;(c=c||{}).compress=!1!==c.compress;let e={type:a,data:b,options:c};this.emitReserved("packetCreate",e),this.writeBuffer.push(e),d&&this.once("flush",d),this.flush()}close(){let a=()=>{this._onClose("forced close"),dc("socket closing - telling transport to close"),this.transport.close()},b=()=>{this.off("upgrade",b),this.off("upgradeError",b),a()},c=()=>{this.once("upgrade",b),this.once("upgradeError",b)};return("opening"===this.readyState||"open"===this.readyState)&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?c():a()}):this.upgrading?c():a()),this}_onError(a){if(dc("socket error %j",a),df.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&"opening"===this.readyState)return dc("trying next transport"),this.transports.shift(),this._open();this.emitReserved("error",a),this._onClose("transport error",a)}_onClose(a,b){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){if(dc('socket close with reason: "%s"',a),this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),dd&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){let a=de.indexOf(this._offlineEventListener);-1!==a&&(dc("removing listener for the 'offline' event"),de.splice(a,1))}this.readyState="closed",this.id=null,this.emitReserved("close",a,b),this.writeBuffer=[],this._prevBufferLen=0}}}df.protocol=4;class dg extends df{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),"open"===this.readyState&&this.opts.upgrade){dc("starting upgrade probes");for(let a=0;a<this._upgrades.length;a++)this._probe(this._upgrades[a])}}_probe(a){dc('probing transport "%s"',a);let b=this.createTransport(a),c=!1;df.priorWebsocketSuccess=!1;let d=()=>{c||(dc('probe transport "%s" opened',a),b.send([{type:"ping",data:"probe"}]),b.once("packet",d=>{if(!c)if("pong"===d.type&&"probe"===d.data){if(dc('probe transport "%s" pong',a),this.upgrading=!0,this.emitReserved("upgrading",b),!b)return;df.priorWebsocketSuccess="websocket"===b.name,dc('pausing current transport "%s"',this.transport.name),this.transport.pause(()=>{c||"closed"!==this.readyState&&(dc("changing transport and sending upgrade packet"),j(),this.setTransport(b),b.send([{type:"upgrade"}]),this.emitReserved("upgrade",b),b=null,this.upgrading=!1,this.flush())})}else{dc('probe transport "%s" failed',a);let c=Error("probe error");c.transport=b.name,this.emitReserved("upgradeError",c)}}))};function e(){c||(c=!0,j(),b.close(),b=null)}let f=c=>{let d=Error("probe error: "+c);d.transport=b.name,e(),dc('probe transport "%s" failed because of error: %s',a,c),this.emitReserved("upgradeError",d)};function g(){f("transport closed")}function h(){f("socket closed")}function i(a){b&&a.name!==b.name&&(dc('"%s" works - aborting "%s"',a.name,b.name),e())}let j=()=>{b.removeListener("open",d),b.removeListener("error",f),b.removeListener("close",g),this.off("close",h),this.off("upgrading",i)};b.once("open",d),b.once("error",f),b.once("close",g),this.once("close",h),this.once("upgrading",i),-1!==this._upgrades.indexOf("webtransport")&&"webtransport"!==a?this.setTimeoutFn(()=>{c||b.open()},200):b.open()}onHandshake(a){this._upgrades=this._filterUpgrades(a.upgrades),super.onHandshake(a)}_filterUpgrades(a){let b=[];for(let c=0;c<a.length;c++)~this.transports.indexOf(a[c])&&b.push(a[c]);return b}}class dh extends dg{constructor(a,b={}){const c="object"==typeof a,d=c?{...a}:{...b};(!d.transports||d.transports&&"string"==typeof d.transports[0])&&(d.transports=(d.transports||["polling","websocket","webtransport"]).map(a=>c8[a]).filter(a=>!!a)),super(c?d:a,d)}}dh.protocol;let di=(0,cR.default)("socket.io-client:url"),dj="function"==typeof ArrayBuffer,dk=Object.prototype.toString,dl="function"==typeof Blob||"u">typeof Blob&&"[object BlobConstructor]"===dk.call(Blob),dm="function"==typeof File||"u">typeof File&&"[object FileConstructor]"===dk.call(File);function dn(a){return dj&&(a instanceof ArrayBuffer||("function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(a):a.buffer instanceof ArrayBuffer))||dl&&a instanceof Blob||dm&&a instanceof File}let dp=(0,cR.default)("socket.io-parser"),dq=["connect","connect_error","disconnect","disconnecting","newListener","removeListener"];(f=g||(g={}))[f.CONNECT=0]="CONNECT",f[f.DISCONNECT=1]="DISCONNECT",f[f.EVENT=2]="EVENT",f[f.ACK=3]="ACK",f[f.CONNECT_ERROR=4]="CONNECT_ERROR",f[f.BINARY_EVENT=5]="BINARY_EVENT",f[f.BINARY_ACK=6]="BINARY_ACK";class dr{constructor(a){this.replacer=a}encode(a){return(dp("encoding packet %j",a),(a.type===g.EVENT||a.type===g.ACK)&&function a(b,c){if(!b||"object"!=typeof b)return!1;if(Array.isArray(b)){for(let c=0,d=b.length;c<d;c++)if(a(b[c]))return!0;return!1}if(dn(b))return!0;if(b.toJSON&&"function"==typeof b.toJSON&&1==arguments.length)return a(b.toJSON(),!0);for(let c in b)if(Object.prototype.hasOwnProperty.call(b,c)&&a(b[c]))return!0;return!1}(a))?this.encodeAsBinary({type:a.type===g.EVENT?g.BINARY_EVENT:g.BINARY_ACK,nsp:a.nsp,data:a.data,id:a.id}):[this.encodeAsString(a)]}encodeAsString(a){let b=""+a.type;return(a.type===g.BINARY_EVENT||a.type===g.BINARY_ACK)&&(b+=a.attachments+"-"),a.nsp&&"/"!==a.nsp&&(b+=a.nsp+","),null!=a.id&&(b+=a.id),null!=a.data&&(b+=JSON.stringify(a.data,this.replacer)),dp("encoded %j as %s",a,b),b}encodeAsBinary(a){let b,c,d=(b=[],c=a.data,a.data=function a(b,c,d){if(!b)return b;if(dn(b)){let a={_placeholder:!0,num:c.length};return c.push(b),a}if(Array.isArray(b)){let d=Array(b.length);for(let e=0;e<b.length;e++)d[e]=a(b[e],c);return d}if("object"==typeof b&&!(b instanceof Date)){if(b.toJSON&&"function"==typeof b.toJSON&&!d)return a(b.toJSON(),c,!0);let e={};for(let d in b)Object.prototype.hasOwnProperty.call(b,d)&&(e[d]=a(b[d],c));return e}return b}(c,b),a.attachments=b.length,{packet:a,buffers:b}),e=this.encodeAsString(d.packet),f=d.buffers;return f.unshift(e),f}}class ds extends cI{constructor(a){super(),this.opts=Object.assign({reviver:void 0,maxAttachments:10},"function"==typeof a?{reviver:a}:a)}add(a){let b;if("string"==typeof a){if(this.reconstructor)throw Error("got plaintext data when reconstructing a packet");let c=(b=this.decodeString(a)).type===g.BINARY_EVENT;c||b.type===g.BINARY_ACK?(b.type=c?g.EVENT:g.ACK,this.reconstructor=new dt(b)):super.emitReserved("decoded",b)}else if(dn(a)||a.base64)if(this.reconstructor)(b=this.reconstructor.takeBinaryData(a))&&(this.reconstructor=null,super.emitReserved("decoded",b));else throw Error("got binary data when not reconstructing a packet");else throw Error("Unknown type: "+a)}decodeString(a){let b=0,c={type:Number(a.charAt(0))};if(void 0===g[c.type])throw Error("unknown packet type "+c.type);if(c.type===g.BINARY_EVENT||c.type===g.BINARY_ACK){let d=b+1;for(;"-"!==a.charAt(++b)&&b!=a.length;);let e=a.substring(d,b);if(e!=Number(e)||"-"!==a.charAt(b))throw Error("Illegal attachments");let f=Number(e);if(!du(f)||f<1)throw Error("Illegal attachments");if(f>this.opts.maxAttachments)throw Error("too many attachments");c.attachments=f}if("/"===a.charAt(b+1)){let d=b+1;for(;++b&&","!==a.charAt(b)&&b!==a.length;);c.nsp=a.substring(d,b)}else c.nsp="/";let d=a.charAt(b+1);if(""!==d&&Number(d)==d){let d=b+1;for(;++b;){let c=a.charAt(b);if(null==c||Number(c)!=c){--b;break}if(b===a.length)break}c.id=Number(a.substring(d,b+1))}if(a.charAt(++b)){let d=this.tryParse(a.substr(b));if(ds.isPayloadValid(c.type,d))c.data=d;else throw Error("invalid payload")}return dp("decoded %s as %j",a,c),c}tryParse(a){try{return JSON.parse(a,this.opts.reviver)}catch(a){return!1}}static isPayloadValid(a,b){switch(a){case g.CONNECT:return dv(b);case g.DISCONNECT:return void 0===b;case g.CONNECT_ERROR:return"string"==typeof b||dv(b);case g.EVENT:case g.BINARY_EVENT:return Array.isArray(b)&&("number"==typeof b[0]||"string"==typeof b[0]&&-1===dq.indexOf(b[0]));case g.ACK:case g.BINARY_ACK:return Array.isArray(b)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}class dt{constructor(a){this.packet=a,this.buffers=[],this.reconPack=a}takeBinaryData(a){if(this.buffers.push(a),this.buffers.length===this.reconPack.attachments){var b,c;let a=(b=this.reconPack,c=this.buffers,b.data=function a(b,c){if(!b)return b;if(b&&!0===b._placeholder){if("number"==typeof b.num&&b.num>=0&&b.num<c.length)return c[b.num];throw Error("illegal attachments")}if(Array.isArray(b))for(let d=0;d<b.length;d++)b[d]=a(b[d],c);else if("object"==typeof b)for(let d in b)Object.prototype.hasOwnProperty.call(b,d)&&(b[d]=a(b[d],c));return b}(b.data,c),delete b.attachments,b);return this.finishedReconstruction(),a}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}let du=Number.isInteger||function(a){return"number"==typeof a&&isFinite(a)&&Math.floor(a)===a};function dv(a){return"[object Object]"===Object.prototype.toString.call(a)}function dw(a){var b;return"string"==typeof a.nsp&&(void 0===(b=a.id)||du(b))&&function(a,b){switch(a){case g.CONNECT:return void 0===b||dv(b);case g.DISCONNECT:return void 0===b;case g.EVENT:return Array.isArray(b)&&("number"==typeof b[0]||"string"==typeof b[0]&&-1===dq.indexOf(b[0]));case g.ACK:return Array.isArray(b);case g.CONNECT_ERROR:return"string"==typeof b||dv(b);default:return!1}}(a.type,a.data)}function dx(a,b,c){return a.on(b,c),function(){a.off(b,c)}}a.s(["Decoder",()=>ds,"Encoder",()=>dr,"PacketType",()=>g,"isPacketValid",()=>dw,"protocol",0,5],10419);let dy=(0,cR.default)("socket.io-client:socket"),dz=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class dA extends cI{constructor(a,b,c){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=a,this.nsp=b,c&&c.auth&&(this.auth=c.auth),this._opts=Object.assign({},c),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;let a=this.io;this.subs=[dx(a,"open",this.onopen.bind(this)),dx(a,"packet",this.onpacket.bind(this)),dx(a,"error",this.onerror.bind(this)),dx(a,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}open(){return this.connect()}send(...a){return a.unshift("message"),this.emit.apply(this,a),this}emit(a,...b){var c,d,e;if(dz.hasOwnProperty(a))throw Error('"'+a.toString()+'" is a reserved event name');if(b.unshift(a),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(b),this;let f={type:g.EVENT,data:b};if(f.options={},f.options.compress=!1!==this.flags.compress,"function"==typeof b[b.length-1]){let a=this.ids++;dy("emitting packet with ack id %d",a);let c=b.pop();this._registerAckCallback(a,c),f.id=a}let h=null==(d=null==(c=this.io.engine)?void 0:c.transport)?void 0:d.writable,i=this.connected&&!(null==(e=this.io.engine)?void 0:e._hasPingExpired());return this.flags.volatile&&!h?dy("discard packet as the transport is not currently writable"):i?(this.notifyOutgoingListeners(f),this.packet(f)):this.sendBuffer.push(f),this.flags={},this}_registerAckCallback(a,b){var c;let d=null!=(c=this.flags.timeout)?c:this._opts.ackTimeout;if(void 0===d){this.acks[a]=b;return}let e=this.io.setTimeoutFn(()=>{delete this.acks[a];for(let b=0;b<this.sendBuffer.length;b++)this.sendBuffer[b].id===a&&(dy("removing packet with ack id %d from the buffer",a),this.sendBuffer.splice(b,1));dy("event with ack id %d has timed out after %d ms",a,d),b.call(this,Error("operation has timed out"))},d),f=(...a)=>{this.io.clearTimeoutFn(e),b.apply(this,a)};f.withError=!0,this.acks[a]=f}emitWithAck(a,...b){return new Promise((c,d)=>{let e=(a,b)=>a?d(a):c(b);e.withError=!0,b.push(e),this.emit(a,...b)})}_addToQueue(a){let b;"function"==typeof a[a.length-1]&&(b=a.pop());let c={id:this._queueSeq++,tryCount:0,pending:!1,args:a,flags:Object.assign({fromQueue:!0},this.flags)};a.push((a,...d)=>c!==this._queue[0]?dy("packet [%d] already acknowledged",c.id):(null!==a?c.tryCount>this._opts.retries&&(dy("packet [%d] is discarded after %d tries",c.id,c.tryCount),this._queue.shift(),b&&b(a)):(dy("packet [%d] was successfully sent",c.id),this._queue.shift(),b&&b(null,...d)),c.pending=!1,this._drainQueue())),this._queue.push(c),this._drainQueue()}_drainQueue(a=!1){if(dy("draining queue"),!this.connected||0===this._queue.length)return;let b=this._queue[0];b.pending&&!a?dy("packet [%d] has already been sent and is waiting for an ack",b.id):(b.pending=!0,b.tryCount++,dy("sending packet [%d] (try n°%d)",b.id,b.tryCount),this.flags=b.flags,this.emit.apply(this,b.args))}packet(a){a.nsp=this.nsp,this.io._packet(a)}onopen(){dy("transport is open - connecting"),"function"==typeof this.auth?this.auth(a=>{this._sendConnectPacket(a)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(a){this.packet({type:g.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},a):a})}onerror(a){this.connected||this.emitReserved("connect_error",a)}onclose(a,b){dy("close (%s)",a),this.connected=!1,delete this.id,this.emitReserved("disconnect",a,b),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(a=>{if(!this.sendBuffer.some(b=>String(b.id)===a)){let b=this.acks[a];delete this.acks[a],b.withError&&b.call(this,Error("socket has been disconnected"))}})}onpacket(a){if(a.nsp===this.nsp)switch(a.type){case g.CONNECT:a.data&&a.data.sid?this.onconnect(a.data.sid,a.data.pid):this.emitReserved("connect_error",Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case g.EVENT:case g.BINARY_EVENT:this.onevent(a);break;case g.ACK:case g.BINARY_ACK:this.onack(a);break;case g.DISCONNECT:this.ondisconnect();break;case g.CONNECT_ERROR:this.destroy();let b=Error(a.data.message);b.data=a.data.data,this.emitReserved("connect_error",b)}}onevent(a){let b=a.data||[];dy("emitting event %j",b),null!=a.id&&(dy("attaching ack callback to event"),b.push(this.ack(a.id))),this.connected?this.emitEvent(b):this.receiveBuffer.push(Object.freeze(b))}emitEvent(a){if(this._anyListeners&&this._anyListeners.length)for(let b of this._anyListeners.slice())b.apply(this,a);super.emit.apply(this,a),this._pid&&a.length&&"string"==typeof a[a.length-1]&&(this._lastOffset=a[a.length-1])}ack(a){let b=this,c=!1;return function(...d){c||(c=!0,dy("sending ack %j",d),b.packet({type:g.ACK,id:a,data:d}))}}onack(a){let b=this.acks[a.id];"function"!=typeof b?dy("bad ack %s",a.id):(delete this.acks[a.id],dy("calling ack %s with %j",a.id,a.data),b.withError&&a.data.unshift(null),b.apply(this,a.data))}onconnect(a,b){dy("socket connected with id %s",a),this.id=a,this.recovered=b&&this._pid===b,this._pid=b,this.connected=!0,this.emitBuffered(),this._drainQueue(!0),this.emitReserved("connect")}emitBuffered(){this.receiveBuffer.forEach(a=>this.emitEvent(a)),this.receiveBuffer=[],this.sendBuffer.forEach(a=>{this.notifyOutgoingListeners(a),this.packet(a)}),this.sendBuffer=[]}ondisconnect(){dy("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(a=>a()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&(dy("performing disconnect (%s)",this.nsp),this.packet({type:g.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(a){return this.flags.compress=a,this}get volatile(){return this.flags.volatile=!0,this}timeout(a){return this.flags.timeout=a,this}onAny(a){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(a),this}prependAny(a){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(a),this}offAny(a){if(!this._anyListeners)return this;if(a){let b=this._anyListeners;for(let c=0;c<b.length;c++)if(a===b[c]){b.splice(c,1);break}}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(a){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(a),this}prependAnyOutgoing(a){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(a),this}offAnyOutgoing(a){if(!this._anyOutgoingListeners)return this;if(a){let b=this._anyOutgoingListeners;for(let c=0;c<b.length;c++)if(a===b[c]){b.splice(c,1);break}}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(a){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length)for(let b of this._anyOutgoingListeners.slice())b.apply(this,a.data)}}var dB=a.i(10419);function dC(a){a=a||{},this.ms=a.min||100,this.max=a.max||1e4,this.factor=a.factor||2,this.jitter=a.jitter>0&&a.jitter<=1?a.jitter:0,this.attempts=0}dC.prototype.duration=function(){var a=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var b=Math.random(),c=Math.floor(b*this.jitter*a);a=(1&Math.floor(10*b))==0?a-c:a+c}return 0|Math.min(a,this.max)},dC.prototype.reset=function(){this.attempts=0},dC.prototype.setMin=function(a){this.ms=a},dC.prototype.setMax=function(a){this.max=a},dC.prototype.setJitter=function(a){this.jitter=a};let dD=(0,cR.default)("socket.io-client:manager");class dE extends cI{constructor(a,b){var c;super(),this.nsps={},this.subs=[],a&&"object"==typeof a&&(b=a,a=void 0),(b=b||{}).path=b.path||"/socket.io",this.opts=b,cP(this,b),this.reconnection(!1!==b.reconnection),this.reconnectionAttempts(b.reconnectionAttempts||1/0),this.reconnectionDelay(b.reconnectionDelay||1e3),this.reconnectionDelayMax(b.reconnectionDelayMax||5e3),this.randomizationFactor(null!=(c=b.randomizationFactor)?c:.5),this.backoff=new dC({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==b.timeout?2e4:b.timeout),this._readyState="closed",this.uri=a;const d=b.parser||dB;this.encoder=new d.Encoder,this.decoder=new d.Decoder,this._autoConnect=!1!==b.autoConnect,this._autoConnect&&this.open()}reconnection(a){return arguments.length?(this._reconnection=!!a,a||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(a){return void 0===a?this._reconnectionAttempts:(this._reconnectionAttempts=a,this)}reconnectionDelay(a){var b;return void 0===a?this._reconnectionDelay:(this._reconnectionDelay=a,null==(b=this.backoff)||b.setMin(a),this)}randomizationFactor(a){var b;return void 0===a?this._randomizationFactor:(this._randomizationFactor=a,null==(b=this.backoff)||b.setJitter(a),this)}reconnectionDelayMax(a){var b;return void 0===a?this._reconnectionDelayMax:(this._reconnectionDelayMax=a,null==(b=this.backoff)||b.setMax(a),this)}timeout(a){return arguments.length?(this._timeout=a,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(a){if(dD("readyState %s",this._readyState),~this._readyState.indexOf("open"))return this;dD("opening %s",this.uri),this.engine=new dh(this.uri,this.opts);let b=this.engine,c=this;this._readyState="opening",this.skipReconnect=!1;let d=dx(b,"open",function(){c.onopen(),a&&a()}),e=b=>{dD("error"),this.cleanup(),this._readyState="closed",this.emitReserved("error",b),a?a(b):this.maybeReconnectOnOpen()},f=dx(b,"error",e);if(!1!==this._timeout){let a=this._timeout;dD("connect attempt will timeout after %d",a);let c=this.setTimeoutFn(()=>{dD("connect attempt timed out after %d",a),d(),e(Error("timeout")),b.close()},a);this.opts.autoUnref&&c.unref(),this.subs.push(()=>{this.clearTimeoutFn(c)})}return this.subs.push(d),this.subs.push(f),this}connect(a){return this.open(a)}onopen(){dD("open"),this.cleanup(),this._readyState="open",this.emitReserved("open");let a=this.engine;this.subs.push(dx(a,"ping",this.onping.bind(this)),dx(a,"data",this.ondata.bind(this)),dx(a,"error",this.onerror.bind(this)),dx(a,"close",this.onclose.bind(this)),dx(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(a){try{this.decoder.add(a)}catch(a){this.onclose("parse error",a)}}ondecoded(a){cJ(()=>{this.emitReserved("packet",a)},this.setTimeoutFn)}onerror(a){dD("error",a),this.emitReserved("error",a)}socket(a,b){let c=this.nsps[a];return c?this._autoConnect&&!c.active&&c.connect():(c=new dA(this,a,b),this.nsps[a]=c),c}_destroy(a){for(let a of Object.keys(this.nsps))if(this.nsps[a].active)return void dD("socket %s is still active, skipping close",a);this._close()}_packet(a){dD("writing packet %j",a);let b=this.encoder.encode(a);for(let c=0;c<b.length;c++)this.engine.write(b[c],a.options)}cleanup(){dD("cleanup"),this.subs.forEach(a=>a()),this.subs.length=0,this.decoder.destroy()}_close(){dD("disconnect"),this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(a,b){var c;dD("closed due to %s",a),this.cleanup(),null==(c=this.engine)||c.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",a,b),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;let a=this;if(this.backoff.attempts>=this._reconnectionAttempts)dD("reconnect failed"),this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{let b=this.backoff.duration();dD("will wait %dms before reconnect attempt",b),this._reconnecting=!0;let c=this.setTimeoutFn(()=>{a.skipReconnect||(dD("attempting reconnect"),this.emitReserved("reconnect_attempt",a.backoff.attempts),a.skipReconnect||a.open(b=>{b?(dD("reconnect attempt error"),a._reconnecting=!1,a.reconnect(),this.emitReserved("reconnect_error",b)):(dD("reconnect success"),a.onreconnect())}))},b);this.opts.autoUnref&&c.unref(),this.subs.push(()=>{this.clearTimeoutFn(c)})}}onreconnect(){let a=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",a)}}let dF=(0,cR.default)("socket.io-client"),dG={};function dH(a,b){let c;"object"==typeof a&&(b=a,a=void 0);let d=function(a,b="",c){let d=a;c=c||"u">typeof location&&location,null==a&&(a=c.protocol+"//"+c.host),"string"==typeof a&&("/"===a.charAt(0)&&(a="/"===a.charAt(1)?c.protocol+a:c.host+a),/^(https?|wss?):\/\//.test(a)||(di("protocol-less url %s",a),a=void 0!==c?c.protocol+"//"+a:"https://"+a),di("parse %s",a),d=db(a)),!d.port&&(/^(http|ws)$/.test(d.protocol)?d.port="80":/^(http|ws)s$/.test(d.protocol)&&(d.port="443")),d.path=d.path||"/";let e=-1!==d.host.indexOf(":")?"["+d.host+"]":d.host;return d.id=d.protocol+"://"+e+":"+d.port+b,d.href=d.protocol+"://"+e+(c&&c.port===d.port?"":":"+d.port),d}(a,(b=b||{}).path||"/socket.io"),e=d.source,f=d.id,g=d.path,h=dG[f]&&g in dG[f].nsps;return b.forceNew||b["force new connection"]||!1===b.multiplex||h?(dF("ignoring socket cache for %s",e),c=new dE(e,b)):(dG[f]||(dF("new io instance for %s",e),dG[f]=new dE(e,b)),c=dG[f]),d.query&&!b.query&&(b.query=d.queryKey),c.socket(d.path,b)}function dI(a){if(a&&"object"==typeof a&&"clientId"in a){let b=a.clientId;if("string"==typeof b)return b}}function dJ(a){let{url:b,role:c,docId:d,name:e,token:f}=a,g=!1!==a.autoResync,h=dH(b,{auth:{token:f},autoConnect:!1}),i="disconnected",j=0,k="",l=[],m={patch:new Set,full:new Set,ack:new Set,presence:new Set,error:new Set,status:new Set,view:new Set,"stage-step":new Set,"stage-load":new Set,"stage-control":new Set,"stage-context":new Set,marks:new Set};function n(a,b){for(let c of[...m[a]])c(b)}function o(a){i!==a&&(i=a,n("status",a))}function p(a){h.emit("def:request",{docId:d,sinceSeq:a})}function q(a){"number"==typeof a&&(g&&a>j+1&&p(j),j=Math.max(j,a))}function r(){n("presence",[...l])}function s(){return h.connected?Promise.resolve():new Promise((a,b)=>{o("connecting");let c=()=>{e(),a()},d=a=>{e(),b(a)},e=()=>{h.off("connect",c),h.off("connect_error",d)};h.once("connect",c),h.once("connect_error",d),h.connect()})}async function t(){return await s(),new Promise((a,b)=>{h.emit("bridge:join",{docId:d,role:c,name:e},c=>{if(!c||c.error){let a=c?.error??{code:"join_failed",message:"no join ack"};n("error",a),b(Error(`${a.code}: ${a.message}`));return}k=c.selfId,l=c.presence?[...c.presence]:[],j=c.snapshot?.seq??0,r(),a({selfId:k,snapshot:c.snapshot,presence:[...l]})})})}async function u(a){await s(),h.emit("view:show",{...a,docId:a.docId??d,origin:a.origin??(e||c)})}async function v(a){return await s(),new Promise((b,c)=>{h.emit("stage:join",{stage:a},a=>{if(!a||a.error||!a.state){let b=a?.error??{code:"stage_join_failed",message:"no stage join ack"};n("error",b),c(Error(`${b.code}: ${b.message}`));return}a.selfId&&(k=a.selfId),b({selfId:a.selfId??k,state:a.state})})})}async function w(a){await s(),h.emit("stage:step",{...a,origin:a.origin??(e||c)})}async function x(a){await s(),h.emit("stage:load",{...a,origin:a.origin??(e||c)})}async function y(a){await s(),h.emit("stage:control",{...a,origin:a.origin??(e||c)})}async function z(a){await s(),h.emit("marks:changed",{...a,origin:a.origin??(e||c)})}return h.on("connect",()=>o("connected")),h.on("disconnect",()=>o("disconnected")),h.on("connect_error",a=>{o("error"),n("error",{code:"connect_error",message:a?.message??String(a)})}),h.on("def:patch",a=>{q(a?.seq),a?.origin&&a.origin===k||n("patch",a)}),h.on("def:full",a=>{q(a?.seq),a?.origin&&a.origin===k||n("full",a)}),h.on("def:ack",a=>{n("ack",a)}),h.on("view:show",a=>{n("view",a)}),h.on("stage:step",a=>n("stage-step",a)),h.on("stage:load",a=>n("stage-load",a)),h.on("stage:control",a=>n("stage-control",a)),h.on("stage:context",a=>n("stage-context",a)),h.on("marks:changed",a=>n("marks",a)),h.on("bridge:error",a=>{n("error",{code:a?.code??"error",message:a?.message??""})}),h.on("presence:list",a=>{l=Array.isArray(a)?[...a]:[],r()}),h.on("presence:join",a=>{let b=dI(a);b&&(l=[...l.filter(a=>a.clientId!==b),a],r())}),h.on("presence:leave",a=>{let b=dI(a);b&&(l=l.filter(a=>a.clientId!==b),r())}),h.on("presence:update",a=>{let b=dI(a);if(!b)return;let c=l.findIndex(a=>a.clientId===b);if(-1===c)l=[...l,a];else{let b={...l[c],...a};l=l.map((a,d)=>d===c?b:a)}r()}),{connect:s,join:t,emitPatch:function(a,b,c){h.emit("def:patch",{docId:d,ops:a,origin:k,baseSeq:c,mtime:b})},emitFull:function(a,b){h.emit("def:full",{docId:d,def:a,origin:k,mtime:b})},request:p,updatePresence:function(a){h.emit("presence:update",{docId:d,clientId:k,cursor:a.cursor,selection:a.selection})},emitView:u,joinStage:v,leaveStage:function(a){h.connected&&h.emit("stage:leave",{stage:a})},emitStep:w,emitLoad:x,emitControl:y,emitContext:function(a){h.connected&&h.emit("stage:context",{...a,at:a.at??new Date().toISOString()})},emitMarks:z,on:function(a,b){let c=m[a];return c.add(b),()=>c.delete(b)},disconnect:function(){h.connected&&k&&h.emit("bridge:leave",{docId:d,clientId:k}),h.disconnect(),o("disconnected")},get status(){return i},get lastSeq(){return j},get presence(){return[...l]}}}function dK(a){return"runtime.enter"===a.op||"runtime.exit"===a.op}function dL(a){let{onFull:b,onPatch:c,onPresence:d,...e}=a,f=dJ(e),g=null,h=0,i=[],j=[],k={status:f.status,def:null,seq:0,presence:[],activeStates:[]},l=new Set;function m(){for(let a of(k={status:f.status,def:g,seq:h,presence:i,activeStates:j},[...l]))a()}return f.on("status",()=>m()),f.on("full",a=>{g=a.def,"number"==typeof a.seq&&(h=a.seq),b?.(a),m()}),f.on("patch",a=>{"number"==typeof a.seq&&(h=a.seq);let b=a.ops??[],d=b.filter(dK),e=b.filter(a=>!dK(a));e.length>0&&g&&(g=n(g,e));for(let a of d)"runtime.enter"===a.op?j.includes(a.state)||(j=[...j,a.state]):"runtime.exit"===a.op&&j.includes(a.state)&&(j=j.filter(b=>b!==a.state));c?.(a),m()}),f.on("presence",a=>{i=a,d?.(a),m()}),{getSnapshot:function(){return k},subscribe:function(a){return l.add(a),()=>{l.delete(a)}},emitPatch:function(a){f.emitPatch(a)},emitFull:function(a){f.emitFull(a)},enter:function(a,b,c){let d={op:"runtime.enter",state:a,...void 0!==b?{from:b}:{},...void 0!==c?{eventId:c}:{}};f.emitPatch([d])},exit:function(a){f.emitPatch([{op:"runtime.exit",state:a}])},connect:function(){f.join().then(a=>{g=a.snapshot.def,h=a.snapshot.seq,i=a.presence,null!==g&&b?.({docId:a.snapshot.docId,def:g,seq:h,mtime:a.snapshot.mtime,origin:"join"}),m()}).catch(()=>{m()})},disconnect:function(){f.disconnect()}}}function dM(a={}){return null}Object.assign(dH,{Manager:dE,Socket:dA,io:dH,connect:dH});let dN=a=>"string"==typeof a?a:"",dO=a=>{let b=a&&"object"==typeof a?a:{},c="agent"===b.role?"agent":"person";return{name:dN(b.name)||("agent"===c?"agent":"someone"),role:c}};function dP(a,b){let c=new DataView(new ArrayBuffer(44)),d=(a,b)=>[...b].forEach((b,d)=>c.setUint8(a+d,b.charCodeAt(0)));return d(0,"RIFF"),c.setUint32(4,36+a,!0),d(8,"WAVE"),d(12,"fmt "),c.setUint32(16,16,!0),c.setUint16(20,1,!0),c.setUint16(22,1,!0),c.setUint32(24,b,!0),c.setUint32(28,2*b,!0),c.setUint16(32,2,!0),c.setUint16(34,16,!0),d(36,"data"),c.setUint32(40,a,!0),c.buffer}let dQ=a=>a>=1048576?`${(a/1048576).toFixed(1)} MB`:`${Math.max(1,Math.round(a/1024))} KB`;function dR(){return{settings:{namespace:"MyApp",name:"MyStateMachine",asynchronous:!1},events:[{name:"Internal",events:[]}],state:{name:"Root",states:[{name:"Idle",kind:"normal"},{name:"End",kind:"final"}]}}}function dS(){return{positions:{}}}function dT(a,b){if(a.name===b)return a;for(let c of a.states??[]){let a=dT(c,b);if(a)return a}return null}function dU(a,b,c){return a.name===b?c(a)??a:{...a,states:a.states?.map(a=>dU(a,b,c))}}function dV(a,b){return{...a,states:a.states?.filter(a=>a.name!==b).map(a=>dV(a,b))}}function dW(a){let b=[a.name];for(let c of a.states??[])b.push(...dW(c));return b}function dX(a){return a.events.flatMap(a=>(a.events??[]).map(a=>a.id))}function dY(a){let b=[],c=dW(a.state),d=dX(a);0===d.length&&b.push({ruleId:"V001",message:"No events defined"});let e=new Set;for(let a of c)e.has(a)&&b.push({ruleId:"V002",message:`Duplicate state name: ${a}`,element:a}),e.add(a);!function a(e){for(let a of e.transitions??[])d.includes(a.event)||b.push({ruleId:"V003",message:`Transition in '${e.name}' references unknown event '${a.event}'`,element:e.name}),a.nextState&&!c.includes(a.nextState)&&b.push({ruleId:"V004",message:`Transition in '${e.name}' targets unknown state '${a.nextState}'`,element:e.name});for(let c of("final"===e.kind&&(e.transitions?.length??0)>0&&b.push({ruleId:"V007",message:`Final state '${e.name}' must not have outgoing transitions`,element:e.name}),"final"===e.kind&&(e.states?.length??0)>0&&b.push({ruleId:"V008",message:`Final state '${e.name}' must not have child states`,element:e.name}),e.states??[]))a(c)}(a.state),a.state.states&&0!==a.state.states.length||b.push({ruleId:"V005",message:"Root state must have at least one child state",element:a.state.name});let f=new Set;for(let a of d)f.has(a)&&b.push({ruleId:"V003",message:`Duplicate event ID: ${a}`,element:a}),f.add(a);return b}function dZ(a,b){return{positions:{...x(a),...b.positions}}}let d$=!1,d_=(e=(a,b)=>({definition:dR(),layout:dZ(dR(),dS()),viewport:{...M},fileName:null,docPath:null,dirty:!1,remoteMtime:null,remoteStatus:"idle",remoteMessage:null,activeStates:[],presence:[],_applyingRemote:!1,selection:{kind:null,id:null},drawMode:"select",drawSource:null,contextMenu:{visible:!1,x:0,y:0,target:null},undoStack:[],redoStack:[],activeTab:"properties",errors:[],showCodePreview:!1,generatedCode:null,navigationPath:["Root"],currentParent:"Root",_pushHistory:()=>{let{definition:c,layout:d,undoStack:e}=b(),f={definition:JSON.parse(JSON.stringify(c)),layout:JSON.parse(JSON.stringify(d))};a({undoStack:[...e.slice(-50),f],redoStack:[]})},setDefinition:c=>{b()._pushHistory();let d=dZ(c,b().layout);a({definition:c,layout:d,dirty:!0,errors:dY(c)})},updateSettings:c=>{b()._pushHistory(),a({definition:{...b().definition,settings:{...b().definition.settings,...c}},dirty:!0})},addState:(c,d)=>{b()._pushHistory();let e={...b().definition},f=c??e.state.name;e.state=dU(e.state,f,a=>({...a,states:[...a.states??[],d]}));let g=dZ(e,b().layout);a({definition:e,layout:g,dirty:!0,errors:dY(e)})},updateState:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dU(e.state,c,a=>({...a,...d})),a({definition:e,dirty:!0,errors:dY(e)})},removeState:c=>{b()._pushHistory();let d={...b().definition};d.state=dV(d.state,c);let e={positions:{...b().layout.positions}};delete e.positions[c],a({definition:d,layout:e,dirty:!0,errors:dY(d)})},nestState:(c,d)=>{b()._pushHistory();let e={...b().definition},f=dT(e.state,c);if(!f||c===d)return;let g=JSON.parse(JSON.stringify(f));e.state=dV(e.state,c),e.state=dU(e.state,d,a=>({...a,states:[...a.states??[],g]})),a({definition:e,dirty:!0,errors:dY(e)})},addEventSource:c=>{b()._pushHistory(),a({definition:{...b().definition,events:[...b().definition.events,c]},dirty:!0})},updateEventSource:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map((a,b)=>b===c?{...a,...d}:a),a({definition:e,dirty:!0})},removeEventSource:c=>{b()._pushHistory();let d={...b().definition};d.events=d.events.filter((a,b)=>b!==c),a({definition:d,dirty:!0,errors:dY(d)})},addEvent:(c,d=0)=>{b()._pushHistory();let e={...b().definition},f=e.events[d]??{name:"Internal",events:[]};f.events=[...f.events??[],c],e.events=e.events.map((a,b)=>b===d?f:a),a({definition:e,dirty:!0,errors:dY(e)})},updateEvent:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,...d}:a)})),a({definition:e,dirty:!0})},removeEvent:c=>{b()._pushHistory();let d={...b().definition};d.events=d.events.map(a=>({...a,events:a.events?.filter(a=>a.id!==c)})),a({definition:d,dirty:!0,errors:dY(d)})},addParameter:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:[...a.parameters??[],d]}:a)})),a({definition:e,dirty:!0})},removeParameter:(c,d)=>{b()._pushHistory();let e={...b().definition};e.events=e.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:a.parameters?.filter((a,b)=>b!==d)}:a)})),a({definition:e,dirty:!0})},updateParameter:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.events=f.events.map(a=>({...a,events:a.events?.map(a=>a.id===c?{...a,parameters:a.parameters?.map((a,b)=>b===d?{...a,...e}:a)}:a)})),a({definition:f,dirty:!0})},addAction:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dU(f.state,c,a=>{let b=a[d]??{actions:[]};return{...a,[d]:{actions:[...b.actions,e]}}}),a({definition:f,dirty:!0})},removeAction:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dU(f.state,c,a=>{let b=a[d];return b?{...a,[d]:{actions:b.actions.filter((a,b)=>b!==e)}}:a}),a({definition:f,dirty:!0})},updateAction:(c,d,e,f)=>{b()._pushHistory();let g={...b().definition};g.state=dU(g.state,c,a=>{let b=a[d];return b?{...a,[d]:{actions:b.actions.map((a,b)=>b===e?f:a)}}:a}),a({definition:g,dirty:!0})},addTransition:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dU(e.state,c,a=>({...a,transitions:[...a.transitions??[],d]})),a({definition:e,dirty:!0,errors:dY(e)})},updateTransition:(c,d,e)=>{b()._pushHistory();let f={...b().definition};f.state=dU(f.state,c,a=>({...a,transitions:a.transitions?.map((a,b)=>b===d?{...a,...e}:a)})),a({definition:f,dirty:!0})},removeTransition:(c,d)=>{b()._pushHistory();let e={...b().definition};e.state=dU(e.state,c,a=>({...a,transitions:a.transitions?.filter((a,b)=>b!==d)})),a({definition:e,dirty:!0,errors:dY(e)})},setStatePosition:(c,d)=>{a({layout:{positions:{...b().layout.positions,[c]:d}}})},arrangeLayout:()=>{b()._pushHistory(),a({layout:{positions:x(b().definition)}})},hydrateLayout:(c,d)=>{a({layout:{positions:{...b().layout.positions,...c}},...d?{viewport:d}:{}})},setViewport:b=>a({viewport:b}),select:(b,c)=>a({selection:{kind:b,id:c}}),clearSelection:()=>a({selection:{kind:null,id:null}}),setDrawMode:b=>a({drawMode:b,drawSource:null}),setDrawSource:b=>a({drawSource:b}),showContextMenu:(b,c,d)=>a({contextMenu:{visible:!0,x:b,y:c,target:d}}),hideContextMenu:()=>a({contextMenu:{visible:!1,x:0,y:0,target:null}}),undo:()=>{let{undoStack:c,definition:d,layout:e}=b();if(0===c.length)return;let f=c[c.length-1],g={definition:JSON.parse(JSON.stringify(d)),layout:JSON.parse(JSON.stringify(e))};a({definition:f.definition,layout:f.layout,undoStack:c.slice(0,-1),redoStack:[...b().redoStack,g],dirty:!0,errors:dY(f.definition)})},redo:()=>{let{redoStack:c,definition:d,layout:e}=b();if(0===c.length)return;let f=c[c.length-1],g={definition:JSON.parse(JSON.stringify(d)),layout:JSON.parse(JSON.stringify(e))};a({definition:f.definition,layout:f.layout,undoStack:[...b().undoStack,g],redoStack:c.slice(0,-1),dirty:!0,errors:dY(f.definition)})},canUndo:()=>b().undoStack.length>0,canRedo:()=>b().redoStack.length>0,setActiveTab:b=>a({activeTab:b}),loadFromJson:(b,c)=>{try{let d=JSON.parse(b),e=aq(d.stateMachine??d.StateMachine??d);d$=!!d&&"object"==typeof d&&"state"in d&&!("stateMachine"in d)&&!("StateMachine"in d);let f=dZ(e,dS()),g=e.state?.name??"Root";a({definition:e,layout:f,fileName:c??null,dirty:!1,errors:dY(e),selection:{kind:null,id:null},undoStack:[],redoStack:[],navigationPath:[g],currentParent:g})}catch(a){console.error("Failed to parse definition:",a)}},exportJson:()=>{let{definition:a}=b();return JSON.stringify(d$?a:{stateMachine:a},null,2)},applyRemote:(c,d,e)=>{try{let f=JSON.parse(c),g=aq(f.stateMachine??f.StateMachine??f);d$=!!f&&"object"==typeof f&&"state"in f&&!("stateMachine"in f)&&!("StateMachine"in f);let h=dZ(g,b().layout),i=g.state?.name??"Root",j=b(),k=new Set(dW(g.state)),l=j.navigationPath.filter(a=>k.has(a)),m=l.length?l:[i],n=m[m.length-1],o=j.selection,p=("state"===o.kind?!!o.id&&k.has(o.id):"transition"===o.kind?!!o.id&&k.has(o.id.split(":")[0]):"event"===o.kind&&!!o.id&&dX(g).includes(o.id))?o:{kind:null,id:null};a({definition:g,layout:h,fileName:e??b().fileName,dirty:!1,remoteMtime:d,remoteStatus:"synced",remoteMessage:null,errors:dY(g),selection:p,navigationPath:m,currentParent:n})}catch(b){a({remoteStatus:"error",remoteMessage:String(b)})}},setRemoteStatus:(b,c=null)=>a({remoteStatus:b,remoteMessage:c}),setRemoteMtime:b=>a({remoteMtime:b}),setDocPath:b=>a({docPath:b||null}),enterState:c=>{let d=b().activeStates;d.includes(c)||a({activeStates:[...d,c]})},exitState:c=>{let d=b().activeStates;d.includes(c)&&a({activeStates:d.filter(a=>a!==c)})},setPresence:b=>a({presence:b}),applyRemoteOps:(c,d,e)=>{a({_applyingRemote:!0});try{let e=b(),f=c.filter(a=>"runtime.enter"!==a.op&&"runtime.exit"!==a.op),g=f.length?n(e.definition,f):e.definition,h=e.activeStates;for(let a of c)"runtime.enter"===a.op?h.includes(a.state)||(h=[...h,a.state]):"runtime.exit"===a.op&&h.includes(a.state)&&(h=h.filter(b=>b!==a.state));let i=dZ(g,e.layout),j=g.state?.name??"Root",k=new Set(dW(g.state)),l=e.navigationPath.filter(a=>k.has(a)),m=l.length?l:[j],o=m[m.length-1],p=e.selection,q=("state"===p.kind?!!p.id&&k.has(p.id):"transition"===p.kind?!!p.id&&k.has(p.id.split(":")[0]):"event"===p.kind&&!!p.id&&dX(g).includes(p.id))?p:{kind:null,id:null};a({definition:g,layout:i,activeStates:h,dirty:!1,remoteMtime:d,remoteStatus:"synced",remoteMessage:null,errors:dY(g),selection:q,navigationPath:m,currentParent:o})}catch(b){a({remoteStatus:"error",remoteMessage:String(b)})}finally{a({_applyingRemote:!1})}},validate:()=>{let c=dY(b().definition);return a({errors:c}),c},setGeneratedCode:b=>a({generatedCode:b}),setShowCodePreview:b=>a({showCodePreview:b}),navigateInto:c=>{let{definition:d,navigationPath:e}=b(),f=dT(d.state,c);f&&(f.states?.length??0)>0&&a({navigationPath:[...e,c],currentParent:c,selection:{kind:null,id:null}})},navigateUp:c=>{let{navigationPath:d}=b();if(d.length<=1)return;let e=c??d.length-2,f=d.slice(0,e+1);a({navigationPath:f,currentParent:f[f.length-1],selection:{kind:null,id:null}})},getCurrentChildren:()=>{let{definition:a,currentParent:c}=b(),d=dT(a.state,c);return d?.states??[]}}))?cx(e):cx,d0="canvas",d1=`[data-pinch-owner="${d0}"]`;function d2(a){return!!a&&"function"==typeof a.closest&&null!==a.closest(d1)}let d3="stateloom-canvas",d4="#030712",d5=["png","jpeg","svg","mermaid","markdown"],d6={png:"PNG",jpeg:"JPEG",svg:"SVG",mermaid:"Mermaid",markdown:"Markdown"},d7={png:"image/png",jpeg:"image/jpeg",svg:"image/svg+xml",mermaid:"text/vnd.mermaid",markdown:"text/markdown"},d8={png:"png",jpeg:"jpg",svg:"svg",mermaid:"mmd",markdown:"md"};async function d9(a,b,c={}){var d,e,f;let g;if("mermaid"===a||"markdown"===a){let c,f;g=new Blob([(d=b.definition,e="markdown"===a,c=["stateDiagram-v2"],d.state&&function a(b,c,d){let e=U(b);if(0===e.length)return;let f=" ".repeat(c+1),g=new Set,h=e.find(a=>"history"!==a.kind);for(let a of(h&&(d.push(`${f}[*] --> ${h.name}`),g.add(h.name)),e))for(let b of a.transitions??[]){let c=b.condition?`${b.event} [${b.condition}]`:b.event;if(!b.nextState){d.push(`${f}${a.name} --> ${a.name} : ${c} (stays)`),g.add(a.name);continue}d.push(`${f}${a.name} --> ${b.nextState} : ${c}`),g.add(a.name),g.add(b.nextState)}for(let a of e)"final"===a.kind&&(d.push(`${f}${a.name} --> [*]`),g.add(a.name));for(let a of e)g.has(a.name)||d.push(`${f}${a.name}`);for(let b of e)0!==U(b).length&&(d.push(`${f}state ${b.name} {`),a(b,c+1,d),d.push(`${f}}`))}(d.state,0,c),f=c.join("\n"),e?`\`\`\`mermaid
3
3
  ${f}
4
4
  \`\`\`
5
5
  `:`${f}
6
- `)],{type:`${d_[a]};charset=utf-8`})}else{let b=function(a={}){let b="u"<typeof document?null:document.getElementById(dX);if(!b)return null;let c=function(a){let b=a.querySelector(":scope > g");if(!b)return null;try{let a=b.getBBox();return a.width>0&&a.height>0?a:null}catch{return null}}(b);if(!c)return null;let d=a.padding??48,e=a.background??dY,f=Math.round(c.x-d),g=Math.round(c.y-d),h=Math.round(c.width+2*d),i=Math.round(c.height+2*d),j=b.cloneNode(!0);j.removeAttribute("id"),j.removeAttribute("class"),j.removeAttribute("style"),j.setAttribute("xmlns","http://www.w3.org/2000/svg"),j.setAttribute("width",String(h)),j.setAttribute("height",String(i)),j.setAttribute("viewBox",`${f} ${g} ${h} ${i}`),j.setAttribute("font-family","ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif"),function a(b){for(let c of Array.from(b.children)){if("transparent"===c.getAttribute("fill")||"transparent"===c.getAttribute("stroke")){c.remove();continue}c.removeAttribute("class"),c.removeAttribute("style"),a(c)}}(j);let k=j.querySelector(":scope > g");k?.removeAttribute("transform");let l=document.createElementNS("http://www.w3.org/2000/svg","rect");return l.setAttribute("x",String(f)),l.setAttribute("y",String(g)),l.setAttribute("width",String(h)),l.setAttribute("height",String(i)),l.setAttribute("fill",e),j.insertBefore(l,j.firstChild),new XMLSerializer().serializeToString(j)}(c);if(!b)throw Error("nothing on the board to export yet");g="svg"===a?new Blob([b],{type:`${d_.svg};charset=utf-8`}):await (f=c.scale??2,new Promise((c,d)=>{let e=b.match(/width="(\d+)"\s+height="(\d+)"/),g=e?Number(e[1]):1200,h=e?Number(e[2]):800,i=URL.createObjectURL(new Blob([b],{type:"image/svg+xml;charset=utf-8"})),j=new Image;j.onload=()=>{URL.revokeObjectURL(i);let b=document.createElement("canvas");b.width=Math.max(1,Math.round(g*f)),b.height=Math.max(1,Math.round(h*f));let e=b.getContext("2d");e?(e.fillStyle=dY,e.fillRect(0,0,b.width,b.height),e.drawImage(j,0,0,b.width,b.height),b.toBlob(a=>a?c(a):d(Error("the canvas produced no image")),d_[a],"jpeg"===a?.92:void 0)):d(Error("this browser gave no 2d context to draw into"))},j.onerror=()=>{URL.revokeObjectURL(i),d(Error("the browser could not read the serialized board"))},j.src=i}))}let h=function({doc:a,machine:b,format:c,at:d}){let e,f,g=at(b??"")||at(a?(a.split(/[/\\]/).pop()??a).replace(/\.smdf\.json$/i,"").replace(/\.json$/i,""):"")||"statemachine",h=a&&(e=a.match(/(?:^|[/\\-])ep(?:isode)?-?(\d{2,4})(?:[/\\-]|$)/i))?`ep${e[1]}`:null,i=h?`${h}--`:"";return`${i}${g}--${(f=a=>String(a).padStart(2,"0"))(d.getFullYear()%100)+f(d.getMonth()+1)+f(d.getDate())+f(d.getHours())+f(d.getMinutes())+f(d.getSeconds())}.${c}`}({doc:b.docPath??b.fileName??null,machine:b.definition?.settings?.name??null,format:d0[a]??String(a),at:(void 0)??new Date}),i=URL.createObjectURL(g),j=document.createElement("a");return j.href=i,j.download=h,j.click(),URL.revokeObjectURL(i),h}let d2="stateloom.layout.v1:";async function d3(){try{let{requestedDoc:b,docQuery:c}=await a.A(65614),d=await fetch(`/api/file${c(b())}`,{cache:"no-store"});if(d.ok){let a=(await d.json())?.path;if("string"==typeof a&&a.length>0)return a}}catch{}return dT.getState().fileName??"untitled"}function d4(){let a,b,c=dT(a=>a.definition),d=dT(a=>a.layout),e=dT(a=>a.selection),f=dT(a=>a.select),g=dT(a=>a.clearSelection),j=dT(a=>a.setStatePosition),k=dT(a=>a.drawMode),l=dT(a=>a.drawSource),m=dT(a=>a.setDrawSource),n=dT(a=>a.setDrawMode),o=dT(a=>a.addTransition),p=dT(a=>a.showContextMenu),q=dT(a=>a.removeState),r=dT(a=>a.undo),s=dT(a=>a.redo),t=dT(a=>a.errors),u=dT(a=>a.navigationPath),v=dT(a=>a.navigateInto),w=dT(a=>a.navigateUp),y=dT(a=>a.activeStates),z=dT(a=>a.viewport),A=dT(a=>a.setViewport);a=(0,i.useRef)(!1),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=!1,d=null;(async()=>{let d=await d3();if(c)return;b.current=d;let e=null;e&&dT.getState().hydrateLayout(e.positions,e.viewport),a.current=!0})();let e=dT.subscribe((c,e)=>{a.current&&b.current&&(c.layout!==e.layout||c.viewport!==e.viewport)&&(d&&clearTimeout(d),d=setTimeout(()=>{let a=dT.getState();b.current,function(a,b){let c={};for(let[d,e]of Object.entries(a)){let a=b[d];a&&(e.x!==a.x||e.y!==a.y||e.width!==a.width||e.height!==a.height)&&(c[d]=e)};}(a.layout.positions,x(a.definition)),a.viewport},300))});return()=>{c=!0,d&&clearTimeout(d),e()}},[]);let B=u.slice(1);return(0,h.jsx)(bI,{definition:c,positions:d.positions,path:B,rootLabel:u[0],viewport:z,onViewportChange:A,selection:{kind:"state"===e.kind||"transition"===e.kind?e.kind:null,id:e.id},activeStates:y,errorElements:t.flatMap(a=>a.element?[a.element]:[]),drawMode:"transition"===k?"transition":"select",drawSource:l,svgId:dX,pinchOwner:dU,emptyHint:"Right-click to add a state, or load a .smdf.json file",onSelect:(a,b)=>{"state"!==a||"transition"!==k||l?f(a,b):m(b)},onClearSelection:g,onStateMove:j,onNavigateInto:v,onNavigateTo:a=>w(a),onContextMenu:(a,b,c)=>p(a,b,"state"===c.kind?{kind:"state",id:c.id}:{kind:"canvas"}),onCreateTransition:(a,b,c)=>{o(a,{event:c,nextState:b}),m(null),n("select")},onCancelDraw:()=>{n("select"),m(null)},onDeleteState:a=>{q(a),g()},onUndo:r,onRedo:s})}function d5({label:a,actions:b,onChange:c}){let d=(a,d)=>c(b.map((b,c)=>c===a?{...b,...d}:b));return(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:"flex items-center justify-between",children:[(0,h.jsx)("span",{className:"text-xs font-medium text-gray-500",children:a}),(0,h.jsx)("button",{onClick:()=>c([...b,{action:"code",code:""}]),className:"text-xs text-blue-500 hover:text-blue-400",children:"+ action"})]}),b.map((a,e)=>(0,h.jsxs)("div",{className:"flex items-start gap-1 mt-1",children:[(0,h.jsxs)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:a.action,onChange:a=>d(e,{action:a.target.value}),children:[(0,h.jsx)("option",{value:"code",children:"Code"}),(0,h.jsx)("option",{value:"timerStart",children:"Timer Start"}),(0,h.jsx)("option",{value:"timerStop",children:"Timer Stop"})]}),"code"===a.action?(0,h.jsx)("textarea",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200 h-10 font-mono",value:a.code??"",placeholder:"// action code...",onChange:a=>d(e,{code:a.target.value})}):(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:a.name??"",placeholder:"Timer name",onChange:a=>d(e,{name:a.target.value})}),(0,h.jsx)("button",{onClick:()=>c(b.filter((a,b)=>b!==e)),className:"text-red-600 hover:text-red-400 text-xs mt-0.5",children:"✕"})]},e)),0===b.length&&(0,h.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]})}function d6(){let a=dT(a=>a.definition),b=dT(a=>a.selection),c=dT(a=>a.updateState),d=dT(a=>a.removeState);dT(a=>a.addAction),dT(a=>a.removeAction);let e=dT(a=>a.updateTransition),f=dT(a=>a.removeTransition);if(!b.kind||!b.id)return(0,h.jsx)("div",{className:"p-3 text-xs text-gray-500",children:"Select a state or transition to edit its properties."});let g=(a,b)=>{if(a.name===b)return a;for(let c of a.states??[]){let a=g(c,b);if(a)return a}return null};if("state"===b.kind){let e=g(a.state,b.id);if(!e)return(0,h.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"State not found"});let i=e.onEntry?.actions??[],j=e.onExit?.actions??[];return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm md:overflow-y-auto md:max-h-[calc(100vh-160px)]",children:[(0,h.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["State: ",e.name]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.name,onChange:a=>c(b.id,{name:a.target.value})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Kind"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.kind??"normal",onChange:a=>c(b.id,{kind:a.target.value}),children:[(0,h.jsx)("option",{value:"normal",children:"Normal"}),(0,h.jsx)("option",{value:"final",children:"Final"}),(0,h.jsx)("option",{value:"history",children:"History"})]})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:e.description??"",onChange:a=>c(b.id,{description:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Prompt for the agent in this state"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-20",placeholder:"What the agent resolves here, and how it opens…",value:e.prompt??"",onChange:a=>c(b.id,{prompt:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Notes"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-20",placeholder:"An open question, a decision, something to tell the agent…",value:e.notes??"",onChange:a=>c(b.id,{notes:a.target.value||void 0})})]}),(0,h.jsx)(d5,{label:"▸ onEntry Actions",actions:i,onChange:a=>c(b.id,{onEntry:{actions:a}})}),(0,h.jsx)(d5,{label:"◂ onExit Actions",actions:j,onChange:a=>c(b.id,{onExit:{actions:a}})}),(0,h.jsxs)("div",{children:[(0,h.jsx)("span",{className:"text-xs font-medium text-gray-500",children:"Transitions"}),(e.transitions??[]).map((a,c)=>(0,h.jsxs)("div",{className:"flex items-center gap-1 text-xs text-gray-400 py-1 border-b border-gray-800/50",children:[(0,h.jsxs)("span",{className:"flex-1",children:[a.event," → ",a.nextState??"(internal)"]}),a.condition&&(0,h.jsxs)("span",{className:"text-gray-600",children:["[",a.condition,"]"]}),(0,h.jsx)("button",{onClick:()=>f(b.id,c),className:"text-red-600 hover:text-red-400",children:"✕"})]},c)),(e.transitions?.length??0)===0&&(0,h.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]}),(0,h.jsx)("button",{onClick:()=>d(b.id),className:"text-red-500 hover:text-red-400 text-xs mt-2",children:"🗑 Delete State"})]})}if("transition"===b.kind){let[c,d]=b.id.split(":"),i=parseInt(d,10),j=g(a.state,c),k=j?.transitions?.[i];if(!k)return(0,h.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"Transition not found"});let l=dP(a),m=(function a(b){let c=[b];for(let d of b.states??[])c.push(...a(d));return c})(a.state).map(a=>a.name).filter(a=>"Root"!==a);return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,h.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Transition"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Event"}),(0,h.jsx)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:k.event,onChange:a=>e(c,i,{event:a.target.value}),children:l.map(a=>(0,h.jsx)("option",{value:a,children:a},a))})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Target State"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:k.nextState??"",onChange:a=>e(c,i,{nextState:a.target.value||void 0}),children:[(0,h.jsx)("option",{value:"",children:"(internal transition)"}),m.map(a=>(0,h.jsx)("option",{value:a,children:a},a))]})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Condition (guard)"}),(0,h.jsx)("textarea",{rows:3,className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200 resize-y leading-snug",value:k.condition??"",onChange:a=>e(c,i,{condition:a.target.value||void 0})})]}),(0,h.jsx)("button",{onClick:()=>f(c,i),className:"text-red-500 hover:text-red-400 text-xs",children:"🗑 Delete Transition"})]})}return null}let d7=["string","int","float","bool","object"];function d8(){let a=dT(a=>a.definition),b=dT(a=>a.addEvent),c=dT(a=>a.updateEvent),d=dT(a=>a.removeEvent),e=dT(a=>a.addParameter),f=dT(a=>a.removeParameter),g=dT(a=>a.updateParameter),j=dT(a=>a.updateEventSource),k=dT(a=>a.select),l=dT(a=>a.selection),[m,n]=(0,i.useState)(""),[o,p]=(0,i.useState)(null),[q,r]=(0,i.useState)(null);return(0,h.jsxs)("div",{className:"p-3 text-sm",children:[a.events.map((a,b)=>(0,h.jsxs)("div",{className:"mb-3",children:[(0,h.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,h.jsx)("span",{className:"text-xs font-semibold text-gray-500",children:"Source:"}),(0,h.jsx)("input",{className:"flex-1 bg-transparent border-b border-gray-700 text-xs text-gray-300 px-1 py-0.5 focus:border-blue-500 outline-none",value:a.name,onChange:a=>j(b,{name:a.target.value})}),void 0!==a.feeder&&(0,h.jsx)("input",{className:"w-24 bg-transparent border-b border-gray-700 text-xs text-gray-400 px-1 py-0.5 focus:border-blue-500 outline-none",value:a.feeder??"",placeholder:"Feeder...",onChange:a=>j(b,{feeder:a.target.value||void 0})}),void 0===a.feeder&&(0,h.jsx)("button",{className:"text-xs text-gray-600 hover:text-gray-400",title:"Add feeder class",onClick:()=>j(b,{feeder:`${a.name}Feeder`}),children:"+feeder"})]}),(0,h.jsx)("div",{className:"-mx-1 overflow-x-auto px-1",children:(0,h.jsxs)("table",{className:"w-full text-xs",children:[(0,h.jsx)("thead",{children:(0,h.jsxs)("tr",{className:"text-gray-600 border-b border-gray-800",children:[(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"ID"}),(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"Description"}),(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"Params"}),(0,h.jsx)("th",{className:"w-6"})]})}),(0,h.jsx)("tbody",{children:(a.events??[]).map(a=>(0,h.jsxs)(i.Fragment,{children:[(0,h.jsxs)("tr",{className:`border-b border-gray-800/50 hover:bg-gray-800/30 cursor-pointer ${"event"===l.kind&&l.id===a.id?"bg-blue-900/30":""}`,onClick:()=>{k("event",a.id),p(o===a.id?null:a.id)},children:[(0,h.jsx)("td",{className:"py-1 pr-1",children:q===a.id?(0,h.jsx)("input",{autoFocus:!0,className:"w-full bg-gray-800 border border-gray-700 rounded px-1 text-gray-200",value:a.id,onChange:b=>c(a.id,{id:b.target.value}),onBlur:()=>r(null),onKeyDown:a=>"Enter"===a.key&&r(null),onClick:a=>a.stopPropagation()}):(0,h.jsx)("span",{className:"text-gray-300",onDoubleClick:b=>{b.stopPropagation(),r(a.id)},children:a.id})}),(0,h.jsx)("td",{className:"py-1 pr-1 text-gray-500 truncate max-w-[80px]",children:a.description??"—"}),(0,h.jsx)("td",{className:"py-1 text-gray-500",children:(a.parameters?.length??0)>0?a.parameters.map(a=>`${a.name}:${a.type}`).join(", "):"—"}),(0,h.jsx)("td",{className:"py-1",children:(0,h.jsx)("button",{onClick:b=>{b.stopPropagation(),d(a.id)},className:"text-red-600 hover:text-red-400",children:"✕"})})]}),o===a.id&&(0,h.jsx)("tr",{children:(0,h.jsx)("td",{colSpan:4,className:"py-2 px-1 bg-gray-900/50",children:(0,h.jsxs)("div",{className:"space-y-2",children:[(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Description"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-gray-200 mt-0.5",value:a.description??"",onChange:b=>c(a.id,{description:b.target.value||void 0})})]}),(0,h.jsxs)("div",{children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Parameters"}),(a.parameters??[]).map((b,c)=>(0,h.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:b.name,placeholder:"name",onChange:b=>g(a.id,c,{name:b.target.value})}),(0,h.jsx)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:b.type,onChange:b=>g(a.id,c,{type:b.target.value}),children:d7.map(a=>(0,h.jsx)("option",{value:a,children:a},a))}),(0,h.jsx)("button",{onClick:()=>f(a.id,c),className:"text-red-600 hover:text-red-400",children:"✕"})]},c)),(0,h.jsx)("button",{className:"text-blue-500 hover:text-blue-400 mt-1",onClick:()=>e(a.id,{name:"param",type:"string"}),children:"+ parameter"})]}),(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Generated method:"}),(0,h.jsxs)("code",{className:"block bg-gray-800 rounded px-2 py-1 text-green-400 mt-0.5 font-mono",children:["on_",a.id.toLowerCase(),"(context",(a.parameters??[]).map(a=>`, ${a.name}: ${a.type}`).join(""),")"]})]})]})})})]},a.id))})]})})]},b)),(0,h.jsxs)("div",{className:"flex gap-1 mt-2",children:[(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-2 py-1 text-gray-200",placeholder:"New event ID...",value:m,onChange:a=>n(a.target.value),onKeyDown:a=>{"Enter"===a.key&&m.trim()&&(b({id:m.trim()}),n(""))}}),(0,h.jsx)("button",{onClick:()=>{m.trim()&&(b({id:m.trim()}),n(""))},className:"bg-blue-600 hover:bg-blue-500 text-white px-2 py-1 rounded",children:"+"})]})]})}function d9(){let a=dT(a=>a.definition.settings),b=dT(a=>a.definition.settings.context),c=dT(a=>a.updateSettings);return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,h.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Machine Settings"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Namespace"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:a.namespace,onChange:a=>c({namespace:a.target.value})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:a.name??"",onChange:a=>c({name:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:a.description??"",onChange:a=>c({description:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Notes on this diagram"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-24",placeholder:"What was discussed, what is still open, what to tell the agent…",value:a.notes??"",onChange:a=>c({notes:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"flex items-center gap-2 text-sm text-gray-300",children:[(0,h.jsx)("input",{type:"checkbox",checked:a.asynchronous,onChange:a=>c({asynchronous:a.target.checked}),className:"rounded bg-gray-800 border-gray-600"}),"Asynchronous"]}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Context"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Context Class"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:b?.class??"",placeholder:"e.g. MyStateMachineContext",onChange:a=>c({context:{...b,class:a.target.value||void 0}})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Base Class"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:b?.baseClass??"",placeholder:"e.g. Context",onChange:a=>c({context:{...b,baseClass:a.target.value||void 0}})})]}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Imports"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-16 font-mono",value:(a.imports??[]).join("\n"),placeholder:"One import per line",onChange:a=>c({imports:a.target.value?a.target.value.split("\n"):[]})}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Object References"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12 font-mono",value:(a.objects??[]).map(a=>`${a.instance}: ${a.class}`).join("\n"),placeholder:"instance: Class (one per line)",onChange:a=>{c({objects:a.target.value.split("\n").filter(a=>a.includes(":")).map(a=>{let[b,c]=a.split(":").map(a=>a.trim());return{instance:b,class:c}})})}}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Code Generation"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Target Language"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:a.targetLanguage??"python",onChange:a=>c({targetLanguage:a.target.value}),children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"}),(0,h.jsx)("option",{value:"csharp",children:"C#"})]})]})]})}function ea(){let a=dT(a=>a.errors),b=dT(a=>a.validate),c=dT(a=>a.select);return(0,h.jsxs)("div",{className:"p-3",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,h.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["Validation ",a.length>0&&(0,h.jsxs)("span",{className:"text-red-500",children:["(",a.length,")"]})]}),(0,h.jsx)("button",{onClick:()=>b(),className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-2 py-0.5 rounded",children:"Re-check"})]}),0===a.length?(0,h.jsxs)("div",{className:"flex items-center gap-2 text-green-500 text-xs",children:[(0,h.jsx)("span",{children:"✓"}),(0,h.jsx)("span",{children:"Definition is valid"})]}):(0,h.jsx)("div",{className:"space-y-0.5",children:a.map((a,b)=>(0,h.jsxs)("div",{className:`flex items-start gap-1.5 text-[13px] py-2.5 border-b border-gray-800/50 md:text-xs md:py-1 ${a.element?"cursor-pointer hover:bg-gray-800/30":""}`,onClick:()=>{a.element&&c("state",a.element)},title:a.element?`Click to select "${a.element}"`:void 0,children:[(0,h.jsx)("span",{className:`font-mono text-[10px] mt-0.5 ${"error"===a.severity?"text-red-600":"text-yellow-600"}`,children:a.ruleId}),(0,h.jsx)("span",{className:`flex-1 ${"error"===a.severity?"text-red-400":"text-yellow-400"}`,children:a.message}),a.element&&(0,h.jsxs)("span",{className:"text-gray-600 text-[10px]",children:["→ ",a.element]})]},b))})]})}var eb=a.i(41455);function ec(){let a=(0,eb.useRequestedDoc)(),[b,c]=(0,i.useState)(!1),[d,e]=(0,i.useState)(""),[f,g]=(0,i.useState)(null),[j,k]=(0,i.useState)([]),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)(null);(0,i.useEffect)(()=>{if(!b)return;let a=!0;return o(null),fetch("/api/docs",{cache:"no-store"}).then(a=>a.ok?a.json():Promise.reject(Error(`HTTP ${a.status}`))).then(b=>{a&&(g(b.docs??[]),k(b.roots??[]),m(b.current??null))}).catch(b=>{a&&(g([]),o(b.message))}),()=>{a=!1}},[b]);let p=a=>{c(!1),e(""),(0,eb.navigateToDoc)(a)},q=new Set((f??[]).map(a=>a.path)),r=b?(function(){try{let a=[];for(let b=0;b<window.localStorage.length;b++){let c=window.localStorage.key(b);c?.startsWith(d2)&&a.push(c.slice(d2.length))}return a.sort()}catch{return[]}})().filter(b=>b.startsWith("/")&&b!==a&&!q.has(b)):[],s=a??l,t=(f??[]).filter(a=>a.path!==s),u=d.trim().toLowerCase(),v=u?t.filter(a=>a.path.toLowerCase().includes(u)):t,w="block w-full truncate rounded px-1.5 py-1 text-left text-xs text-gray-300 hover:bg-gray-800";return(0,h.jsxs)("span",{className:"relative inline-flex",children:[(0,h.jsx)("button",{onClick:()=>c(a=>!a),className:"toolbar-btn",title:a?`Document: ${a}`:"Switch document",children:"⇄"}),b&&(0,h.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 w-80 rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,h.jsx)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:"switch document"}),(0,h.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=d.trim();if(b){if(1===v.length)return p(v[0].path);if(b.startsWith("/"))return p(b)}},className:"mb-1 flex gap-1",children:[(0,h.jsx)("input",{value:d,onChange:a=>e(a.target.value),placeholder:null===f?"loading…":"filter, or /absolute/path.json",className:"min-w-0 flex-1 rounded border border-gray-700 bg-gray-950 px-1.5 py-1 text-xs text-gray-200 placeholder:text-gray-600"}),(0,h.jsx)("button",{type:"submit",className:"toolbar-btn",title:"Open",children:"→"})]}),(0,h.jsxs)("div",{className:"max-h-64 overflow-y-auto",children:[a&&(0,h.jsx)("button",{onClick:()=>p(null),className:w,title:"Return to the default project file",children:"⌂ default document"}),v.map(a=>(0,h.jsxs)("button",{onClick:()=>p(a.path),className:w,title:a.path,children:[a.name,(0,h.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:a.dir})]},a.path)),r.length>0&&(0,h.jsxs)("div",{className:"mt-1 border-t border-gray-800 pt-1",children:[(0,h.jsx)("div",{className:"px-1.5 pb-0.5 text-[10px] uppercase tracking-wide text-gray-600",children:"recent"}),r.map(a=>(0,h.jsxs)("button",{onClick:()=>p(a),className:w,title:a,children:[a.split("/").pop(),(0,h.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:a})]},a))]}),null!==f&&0===v.length&&0===r.length&&(0,h.jsx)("div",{className:"px-1.5 py-1 text-[11px] text-gray-500",children:u?"nothing matches":"no other documents here"})]}),j.length>0&&(0,h.jsxs)("div",{className:"mt-1 truncate border-t border-gray-800 pt-1 text-[10px] text-gray-600",children:["paths are as the server sees them: ",j.join(", ")]}),n&&(0,h.jsxs)("div",{className:"mt-1 text-[10px] text-gray-600",children:["this server does not list documents (",n,") — type a path"]})]})]})}function ed(){let a=dT(a=>a.presence),[b,c]=(0,i.useState)(!1);if(0===a.length)return null;let d=new Map;for(let b of a)d.set(b.role,(d.get(b.role)??0)+1);let e=[...d].map(([a,b])=>b>1?`${a} \xd7${b}`:a).join(" · ");return(0,h.jsxs)("span",{className:"relative inline-flex",children:[(0,h.jsxs)("button",{onClick:()=>c(a=>!a),className:"toolbar-btn inline-flex items-center gap-1.5",title:`Connected: ${e}`,"aria-expanded":b,"aria-label":`${a.length} connected: ${e}`,children:[(0,h.jsx)("span",{className:"flex -space-x-1",children:a.slice(0,4).map(a=>(0,h.jsx)("span",{className:"inline-block h-2 w-2 rounded-full ring-1 ring-gray-900",style:{backgroundColor:a.color??s(a.clientId)}},a.clientId))}),(0,h.jsx)("span",{className:"tabular-nums",children:a.length})]}),b&&(0,h.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 max-h-64 w-56 overflow-y-auto rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,h.jsxs)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:["connected · ",e]}),a.map(a=>(0,h.jsxs)("div",{className:"flex items-center gap-1.5 rounded px-1 py-1 text-xs text-gray-300",title:a.clientId,children:[(0,h.jsx)("span",{className:"inline-block h-2 w-2 shrink-0 rounded-full",style:{backgroundColor:a.color??s(a.clientId)}}),(0,h.jsx)("span",{className:"shrink-0",children:a.role}),a.name&&(0,h.jsx)("span",{className:"truncate text-gray-500",children:a.name})]},a.clientId))]})]})}function ee(){let a=dT(a=>a.definition),b=dT(a=>a.fileName),c=dT(a=>a.docPath),d=dT(a=>a.dirty),e=dT(a=>a.loadFromJson),f=dT(a=>a.exportJson),g=dT(a=>a.addState),j=dT(a=>a.validate),k=dT(a=>a.showCodePreview),l=dT(a=>a.setShowCodePreview),m=dT(a=>a.setGeneratedCode),n=dT(a=>a.drawMode),o=dT(a=>a.setDrawMode),p=dT(a=>a.arrangeLayout),q=dT(a=>a.undo),r=dT(a=>a.redo),s=dT(a=>a.undoStack),t=dT(a=>a.redoStack),u=dT(a=>a.remoteStatus),v=dT(a=>a.remoteMessage),w=dT(a=>a.setRemoteStatus),x=dT(a=>a.setRemoteMtime),y=dT(a=>a.applyRemote),z=(0,eb.useRequestedDoc)(),A=(0,i.useRef)(null),[B,C]=(0,i.useState)(!1),[D,E]=(0,i.useState)(""),[F,G]=(0,i.useState)(!1),[H,I]=(0,i.useState)("png"),[J,K]=(0,i.useState)(!1),[L,M]=(0,i.useState)(null),[N,O]=(0,i.useState)(null),P=async()=>{let a=f();G(!0);try{let b=await fetch(`/api/file${(0,eb.docQuery)(z)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:a})});if(b.ok){let a=await b.json();x(a.mtime),dT.setState({dirty:!1}),w("synced",null)}else{let a=await b.json().catch(()=>({error:"unknown"}));w("error",`Save failed: ${a.error??b.statusText}`)}}catch(a){w("error",`Save failed: ${a}`)}finally{G(!1)}},Q=async()=>{K(!0),M(null);try{let d=await d1(H,{definition:a,docPath:c,fileName:b});O(d)}catch(a){M(a instanceof Error?a.message:String(a))}finally{K(!1)}},R=async()=>{try{let a=await fetch(`/api/file${(0,eb.docQuery)(z)}`,{cache:"no-store"});if(!a.ok)return void w("error","Reload failed");let b=await a.json();b.exists&&b.content?y(b.content,b.mtime,b.path.split("/").pop()):w("idle",`No file at ${b.path}`)}catch(a){w("error",`Reload failed: ${a}`)}},S=()=>{D.trim()&&(g(null,{name:D.trim(),kind:"normal"}),E(""),C(!1))},[T,U]=(0,i.useState)("python"),V=async()=>{try{let a=await fetch("/api/rispec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(a.ok){let b=await a.json();m(b.rispec)}else{let b=await a.json().catch(()=>({error:"Unknown"}));m(`# RISE rispec generation failed
6
+ `)],{type:`${d7[a]};charset=utf-8`})}else{let b=function(a={}){let b="u"<typeof document?null:document.getElementById(d3);if(!b)return null;let c=function(a){let b=a.querySelector(":scope > g");if(!b)return null;try{let a=b.getBBox();return a.width>0&&a.height>0?a:null}catch{return null}}(b);if(!c)return null;let d=a.padding??48,e=a.background??d4,f=Math.round(c.x-d),g=Math.round(c.y-d),h=Math.round(c.width+2*d),i=Math.round(c.height+2*d),j=b.cloneNode(!0);j.removeAttribute("id"),j.removeAttribute("class"),j.removeAttribute("style"),j.setAttribute("xmlns","http://www.w3.org/2000/svg"),j.setAttribute("width",String(h)),j.setAttribute("height",String(i)),j.setAttribute("viewBox",`${f} ${g} ${h} ${i}`),j.setAttribute("font-family","ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif"),function a(b){for(let c of Array.from(b.children)){if("transparent"===c.getAttribute("fill")||"transparent"===c.getAttribute("stroke")){c.remove();continue}c.removeAttribute("class"),c.removeAttribute("style"),a(c)}}(j);let k=j.querySelector(":scope > g");k?.removeAttribute("transform");let l=document.createElementNS("http://www.w3.org/2000/svg","rect");return l.setAttribute("x",String(f)),l.setAttribute("y",String(g)),l.setAttribute("width",String(h)),l.setAttribute("height",String(i)),l.setAttribute("fill",e),j.insertBefore(l,j.firstChild),new XMLSerializer().serializeToString(j)}(c);if(!b)throw Error("nothing on the board to export yet");g="svg"===a?new Blob([b],{type:`${d7.svg};charset=utf-8`}):await (f=c.scale??2,new Promise((c,d)=>{let e=b.match(/width="(\d+)"\s+height="(\d+)"/),g=e?Number(e[1]):1200,h=e?Number(e[2]):800,i=URL.createObjectURL(new Blob([b],{type:"image/svg+xml;charset=utf-8"})),j=new Image;j.onload=()=>{URL.revokeObjectURL(i);let b=document.createElement("canvas");b.width=Math.max(1,Math.round(g*f)),b.height=Math.max(1,Math.round(h*f));let e=b.getContext("2d");e?(e.fillStyle=d4,e.fillRect(0,0,b.width,b.height),e.drawImage(j,0,0,b.width,b.height),b.toBlob(a=>a?c(a):d(Error("the canvas produced no image")),d7[a],"jpeg"===a?.92:void 0)):d(Error("this browser gave no 2d context to draw into"))},j.onerror=()=>{URL.revokeObjectURL(i),d(Error("the browser could not read the serialized board"))},j.src=i}))}let h=function({doc:a,machine:b,format:c,at:d}){let e,f,g=at(b??"")||at(a?(a.split(/[/\\]/).pop()??a).replace(/\.smdf\.json$/i,"").replace(/\.json$/i,""):"")||"statemachine",h=a&&(e=a.match(/(?:^|[/\\-])ep(?:isode)?-?(\d{2,4})(?:[/\\-]|$)/i))?`ep${e[1]}`:null,i=h?`${h}--`:"";return`${i}${g}--${(f=a=>String(a).padStart(2,"0"))(d.getFullYear()%100)+f(d.getMonth()+1)+f(d.getDate())+f(d.getHours())+f(d.getMinutes())+f(d.getSeconds())}.${c}`}({doc:b.docPath??b.fileName??null,machine:b.definition?.settings?.name??null,format:d8[a]??String(a),at:(void 0)??new Date}),i=URL.createObjectURL(g),j=document.createElement("a");return j.href=i,j.download=h,j.click(),URL.revokeObjectURL(i),h}let ea="stateloom.layout.v1:";async function eb(){try{let{requestedDoc:b,docQuery:c}=await a.A(65614),d=await fetch(`/api/file${c(b())}`,{cache:"no-store"});if(d.ok){let a=(await d.json())?.path;if("string"==typeof a&&a.length>0)return a}}catch{}return d_.getState().fileName??"untitled"}function ec(){let a,b,c=d_(a=>a.definition),d=d_(a=>a.layout),e=d_(a=>a.selection),f=d_(a=>a.select),g=d_(a=>a.clearSelection),j=d_(a=>a.setStatePosition),k=d_(a=>a.drawMode),l=d_(a=>a.drawSource),m=d_(a=>a.setDrawSource),n=d_(a=>a.setDrawMode),o=d_(a=>a.addTransition),p=d_(a=>a.showContextMenu),q=d_(a=>a.removeState),r=d_(a=>a.undo),s=d_(a=>a.redo),t=d_(a=>a.errors),u=d_(a=>a.navigationPath),v=d_(a=>a.navigateInto),w=d_(a=>a.navigateUp),y=d_(a=>a.activeStates),z=d_(a=>a.viewport),A=d_(a=>a.setViewport);a=(0,i.useRef)(!1),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=!1,d=null;(async()=>{let d=await eb();if(c)return;b.current=d;let e=null;e&&d_.getState().hydrateLayout(e.positions,e.viewport),a.current=!0})();let e=d_.subscribe((c,e)=>{a.current&&b.current&&(c.layout!==e.layout||c.viewport!==e.viewport)&&(d&&clearTimeout(d),d=setTimeout(()=>{let a=d_.getState();b.current,function(a,b){let c={};for(let[d,e]of Object.entries(a)){let a=b[d];a&&(e.x!==a.x||e.y!==a.y||e.width!==a.width||e.height!==a.height)&&(c[d]=e)};}(a.layout.positions,x(a.definition)),a.viewport},300))});return()=>{c=!0,d&&clearTimeout(d),e()}},[]);let B=u.slice(1);return(0,h.jsx)(bH,{definition:c,positions:d.positions,path:B,rootLabel:u[0],viewport:z,onViewportChange:A,selection:{kind:"state"===e.kind||"transition"===e.kind?e.kind:null,id:e.id},activeStates:y,errorElements:t.flatMap(a=>a.element?[a.element]:[]),drawMode:"transition"===k?"transition":"select",drawSource:l,svgId:d3,pinchOwner:d0,emptyHint:"Right-click to add a state, or load a .smdf.json file",onSelect:(a,b)=>{"state"!==a||"transition"!==k||l?f(a,b):m(b)},onClearSelection:g,onStateMove:j,onNavigateInto:v,onNavigateTo:a=>w(a),onContextMenu:(a,b,c)=>p(a,b,"state"===c.kind?{kind:"state",id:c.id}:{kind:"canvas"}),onCreateTransition:(a,b,c)=>{o(a,{event:c,nextState:b}),m(null),n("select")},onCancelDraw:()=>{n("select"),m(null)},onDeleteState:a=>{q(a),g()},onUndo:r,onRedo:s})}function ed({name:a,size:b=14}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",className:"inline-block shrink-0 align-[-2px]",children:["undo"===a&&(0,h.jsx)("path",{d:"M9 7 4.5 11.5 9 16M5 11.5h9.5a5 5 0 0 1 0 10H12"}),"redo"===a&&(0,h.jsx)("path",{d:"M15 7l4.5 4.5L15 16M19 11.5H9.5a5 5 0 0 0 0 10H12"}),"arrange"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"8.5",y:"3",width:"7",height:"5",rx:"1.5"}),(0,h.jsx)("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1.5"}),(0,h.jsx)("rect",{x:"14",y:"16",width:"7",height:"5",rx:"1.5"}),(0,h.jsx)("path",{d:"M12 8v4M6.5 16v-2a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v2"})]}),"draw"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"5.5",cy:"18.5",r:"2"}),(0,h.jsx)("path",{d:"M7 17 18.5 5.5M11.5 5.5h7v7"})]}),"open"===a&&(0,h.jsx)("path",{d:"M3.5 7.5V18a1.5 1.5 0 0 0 1.5 1.5h14a1.5 1.5 0 0 0 1.5-1.5V9.5A1.5 1.5 0 0 0 19 8h-7l-2-2.5H5A1.5 1.5 0 0 0 3.5 7z"}),"save"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M5 4h11l3.5 3.5V19a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"}),(0,h.jsx)("path",{d:"M8 4v5h7V4M8 20v-6h8v6"})]}),"reload"===a&&(0,h.jsx)("path",{d:"M19.5 12a7.5 7.5 0 1 1-2.2-5.3M19.5 4v4.5H15"}),"download"===a&&(0,h.jsx)("path",{d:"M12 4v11M7.5 10.5 12 15l4.5-4.5M4.5 19.5h15"}),"image"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"3.5",y:"5",width:"17",height:"14",rx:"1.5"}),(0,h.jsx)("circle",{cx:"9",cy:"10",r:"1.6"}),(0,h.jsx)("path",{d:"m4 17.5 5-5 4 4 2.5-2.5 4.5 4.5"})]}),"plus"===a&&(0,h.jsx)("path",{d:"M12 5v14M5 12h14"}),"check"===a&&(0,h.jsx)("path",{d:"m5 12.5 4.5 4.5L19 7.5"}),"bolt"===a&&(0,h.jsx)("path",{d:"M13 3 5.5 13.5h5.5L10 21l8-11h-5.5z"}),"scroll"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M6.5 3.5h8l4 4v12a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1v-15a1 1 0 0 1 1-1z"}),(0,h.jsx)("path",{d:"M14.5 3.5v4h4M8.5 12h7M8.5 15.5h7M8.5 9h3"})]}),"code"===a&&(0,h.jsx)("path",{d:"m8.5 7.5-5 4.5 5 4.5M15.5 7.5l5 4.5-5 4.5M13.5 5l-3 14"}),"trash"===a&&(0,h.jsx)("path",{d:"M4.5 6.5h15M9.5 6.5V4.5h5v2M6.5 6.5l.9 12.6a1.5 1.5 0 0 0 1.5 1.4h6.2a1.5 1.5 0 0 0 1.5-1.4l.9-12.6M10 10.5v6M14 10.5v6"}),"sliders"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M5 4v16M12 4v16M19 4v16"}),(0,h.jsx)("circle",{cx:"5",cy:"9",r:"2",fill:"currentColor",stroke:"none"}),(0,h.jsx)("circle",{cx:"12",cy:"15",r:"2",fill:"currentColor",stroke:"none"}),(0,h.jsx)("circle",{cx:"19",cy:"7.5",r:"2",fill:"currentColor",stroke:"none"})]}),"gear"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,h.jsx)("path",{d:"M12 3.5v2.2M12 18.3v2.2M3.5 12h2.2M18.3 12h2.2M6 6l1.6 1.6M16.4 16.4 18 18M6 18l1.6-1.6M16.4 7.6 18 6"})]})]})}function ee({label:a,actions:b,onChange:c}){let d=(a,d)=>c(b.map((b,c)=>c===a?{...b,...d}:b));return(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:"flex items-center justify-between",children:[(0,h.jsx)("span",{className:"text-xs font-medium text-gray-500",children:a}),(0,h.jsx)("button",{onClick:()=>c([...b,{action:"code",code:""}]),className:"text-xs text-blue-500 hover:text-blue-400",children:"+ action"})]}),b.map((a,e)=>(0,h.jsxs)("div",{className:"flex items-start gap-1 mt-1",children:[(0,h.jsxs)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:a.action,onChange:a=>d(e,{action:a.target.value}),children:[(0,h.jsx)("option",{value:"code",children:"Code"}),(0,h.jsx)("option",{value:"timerStart",children:"Timer Start"}),(0,h.jsx)("option",{value:"timerStop",children:"Timer Stop"})]}),"code"===a.action?(0,h.jsx)("textarea",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200 h-10 font-mono",value:a.code??"",placeholder:"// action code...",onChange:a=>d(e,{code:a.target.value})}):(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:a.name??"",placeholder:"Timer name",onChange:a=>d(e,{name:a.target.value})}),(0,h.jsx)("button",{onClick:()=>c(b.filter((a,b)=>b!==e)),className:"text-red-600 hover:text-red-400 text-xs mt-0.5",children:"✕"})]},e)),0===b.length&&(0,h.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]})}function ef(){let a=d_(a=>a.definition),b=d_(a=>a.selection),c=d_(a=>a.updateState),d=d_(a=>a.removeState);d_(a=>a.addAction),d_(a=>a.removeAction);let e=d_(a=>a.updateTransition),f=d_(a=>a.removeTransition);if(!b.kind||!b.id)return(0,h.jsx)("div",{className:"p-3 text-xs text-gray-500",children:"Select a state or transition to edit its properties."});let g=(a,b)=>{if(a.name===b)return a;for(let c of a.states??[]){let a=g(c,b);if(a)return a}return null};if("state"===b.kind){let e=g(a.state,b.id);if(!e)return(0,h.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"State not found"});let i=e.onEntry?.actions??[],j=e.onExit?.actions??[];return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm md:overflow-y-auto md:max-h-[calc(100vh-160px)]",children:[(0,h.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["State: ",e.name]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.name,onChange:a=>c(b.id,{name:a.target.value})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Kind"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.kind??"normal",onChange:a=>c(b.id,{kind:a.target.value}),children:[(0,h.jsx)("option",{value:"normal",children:"Normal"}),(0,h.jsx)("option",{value:"final",children:"Final"}),(0,h.jsx)("option",{value:"history",children:"History"})]})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:e.description??"",onChange:a=>c(b.id,{description:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Prompt for the agent in this state"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-20",placeholder:"What the agent resolves here, and how it opens…",value:e.prompt??"",onChange:a=>c(b.id,{prompt:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Notes"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-20",placeholder:"An open question, a decision, something to tell the agent…",value:e.notes??"",onChange:a=>c(b.id,{notes:a.target.value||void 0})})]}),(0,h.jsx)(ee,{label:"▸ onEntry Actions",actions:i,onChange:a=>c(b.id,{onEntry:{actions:a}})}),(0,h.jsx)(ee,{label:"◂ onExit Actions",actions:j,onChange:a=>c(b.id,{onExit:{actions:a}})}),(0,h.jsxs)("div",{children:[(0,h.jsx)("span",{className:"text-xs font-medium text-gray-500",children:"Transitions"}),(e.transitions??[]).map((a,c)=>(0,h.jsxs)("div",{className:"flex items-center gap-1 text-xs text-gray-400 py-1 border-b border-gray-800/50",children:[(0,h.jsxs)("span",{className:"flex-1",children:[a.event," → ",a.nextState??"(internal)"]}),a.condition&&(0,h.jsxs)("span",{className:"text-gray-600",children:["[",a.condition,"]"]}),(0,h.jsx)("button",{onClick:()=>f(b.id,c),className:"text-red-600 hover:text-red-400",children:"✕"})]},c)),(e.transitions?.length??0)===0&&(0,h.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]}),(0,h.jsxs)("button",{onClick:()=>d(b.id),className:"text-red-500 hover:text-red-400 text-xs mt-2",children:[(0,h.jsx)(ed,{name:"trash"})," Delete State"]})]})}if("transition"===b.kind){let[c,d]=b.id.split(":"),i=parseInt(d,10),j=g(a.state,c),k=j?.transitions?.[i];if(!k)return(0,h.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"Transition not found"});let l=dX(a),m=(function a(b){let c=[b];for(let d of b.states??[])c.push(...a(d));return c})(a.state).map(a=>a.name).filter(a=>"Root"!==a);return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,h.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Transition"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Event"}),(0,h.jsx)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:k.event,onChange:a=>e(c,i,{event:a.target.value}),children:l.map(a=>(0,h.jsx)("option",{value:a,children:a},a))})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Target State"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:k.nextState??"",onChange:a=>e(c,i,{nextState:a.target.value||void 0}),children:[(0,h.jsx)("option",{value:"",children:"(internal transition)"}),m.map(a=>(0,h.jsx)("option",{value:a,children:a},a))]})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Condition (guard)"}),(0,h.jsx)("textarea",{rows:3,className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200 resize-y leading-snug",value:k.condition??"",onChange:a=>e(c,i,{condition:a.target.value||void 0})})]}),(0,h.jsxs)("button",{onClick:()=>f(c,i),className:"text-red-500 hover:text-red-400 text-xs",children:[(0,h.jsx)(ed,{name:"trash"})," Delete Transition"]})]})}return null}let eg=["string","int","float","bool","object"];function eh(){let a=d_(a=>a.definition),b=d_(a=>a.addEvent),c=d_(a=>a.updateEvent),d=d_(a=>a.removeEvent),e=d_(a=>a.addParameter),f=d_(a=>a.removeParameter),g=d_(a=>a.updateParameter),j=d_(a=>a.updateEventSource),k=d_(a=>a.select),l=d_(a=>a.selection),[m,n]=(0,i.useState)(""),[o,p]=(0,i.useState)(null),[q,r]=(0,i.useState)(null);return(0,h.jsxs)("div",{className:"p-3 text-sm",children:[a.events.map((a,b)=>(0,h.jsxs)("div",{className:"mb-3",children:[(0,h.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,h.jsx)("span",{className:"text-xs font-semibold text-gray-500",children:"Source:"}),(0,h.jsx)("input",{className:"flex-1 bg-transparent border-b border-gray-700 text-xs text-gray-300 px-1 py-0.5 focus:border-blue-500 outline-none",value:a.name,onChange:a=>j(b,{name:a.target.value})}),void 0!==a.feeder&&(0,h.jsx)("input",{className:"w-24 bg-transparent border-b border-gray-700 text-xs text-gray-400 px-1 py-0.5 focus:border-blue-500 outline-none",value:a.feeder??"",placeholder:"Feeder...",onChange:a=>j(b,{feeder:a.target.value||void 0})}),void 0===a.feeder&&(0,h.jsx)("button",{className:"text-xs text-gray-600 hover:text-gray-400",title:"Add feeder class",onClick:()=>j(b,{feeder:`${a.name}Feeder`}),children:"+feeder"})]}),(0,h.jsx)("div",{className:"-mx-1 overflow-x-auto px-1",children:(0,h.jsxs)("table",{className:"w-full text-xs",children:[(0,h.jsx)("thead",{children:(0,h.jsxs)("tr",{className:"text-gray-600 border-b border-gray-800",children:[(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"ID"}),(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"Description"}),(0,h.jsx)("th",{className:"text-left py-1 font-medium",children:"Params"}),(0,h.jsx)("th",{className:"w-6"})]})}),(0,h.jsx)("tbody",{children:(a.events??[]).map(a=>(0,h.jsxs)(i.Fragment,{children:[(0,h.jsxs)("tr",{className:`border-b border-gray-800/50 hover:bg-gray-800/30 cursor-pointer ${"event"===l.kind&&l.id===a.id?"bg-blue-900/30":""}`,onClick:()=>{k("event",a.id),p(o===a.id?null:a.id)},children:[(0,h.jsx)("td",{className:"py-1 pr-1",children:q===a.id?(0,h.jsx)("input",{autoFocus:!0,className:"w-full bg-gray-800 border border-gray-700 rounded px-1 text-gray-200",value:a.id,onChange:b=>c(a.id,{id:b.target.value}),onBlur:()=>r(null),onKeyDown:a=>"Enter"===a.key&&r(null),onClick:a=>a.stopPropagation()}):(0,h.jsx)("span",{className:"text-gray-300",onDoubleClick:b=>{b.stopPropagation(),r(a.id)},children:a.id})}),(0,h.jsx)("td",{className:"py-1 pr-1 text-gray-500 truncate max-w-[80px]",children:a.description??"—"}),(0,h.jsx)("td",{className:"py-1 text-gray-500",children:(a.parameters?.length??0)>0?a.parameters.map(a=>`${a.name}:${a.type}`).join(", "):"—"}),(0,h.jsx)("td",{className:"py-1",children:(0,h.jsx)("button",{onClick:b=>{b.stopPropagation(),d(a.id)},className:"text-red-600 hover:text-red-400",children:"✕"})})]}),o===a.id&&(0,h.jsx)("tr",{children:(0,h.jsx)("td",{colSpan:4,className:"py-2 px-1 bg-gray-900/50",children:(0,h.jsxs)("div",{className:"space-y-2",children:[(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Description"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-gray-200 mt-0.5",value:a.description??"",onChange:b=>c(a.id,{description:b.target.value||void 0})})]}),(0,h.jsxs)("div",{children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Parameters"}),(a.parameters??[]).map((b,c)=>(0,h.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:b.name,placeholder:"name",onChange:b=>g(a.id,c,{name:b.target.value})}),(0,h.jsx)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:b.type,onChange:b=>g(a.id,c,{type:b.target.value}),children:eg.map(a=>(0,h.jsx)("option",{value:a,children:a},a))}),(0,h.jsx)("button",{onClick:()=>f(a.id,c),className:"text-red-600 hover:text-red-400",children:"✕"})]},c)),(0,h.jsx)("button",{className:"text-blue-500 hover:text-blue-400 mt-1",onClick:()=>e(a.id,{name:"param",type:"string"}),children:"+ parameter"})]}),(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("span",{className:"text-gray-600",children:"Generated method:"}),(0,h.jsxs)("code",{className:"block bg-gray-800 rounded px-2 py-1 text-green-400 mt-0.5 font-mono",children:["on_",a.id.toLowerCase(),"(context",(a.parameters??[]).map(a=>`, ${a.name}: ${a.type}`).join(""),")"]})]})]})})})]},a.id))})]})})]},b)),(0,h.jsxs)("div",{className:"flex gap-1 mt-2",children:[(0,h.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-2 py-1 text-gray-200",placeholder:"New event ID...",value:m,onChange:a=>n(a.target.value),onKeyDown:a=>{"Enter"===a.key&&m.trim()&&(b({id:m.trim()}),n(""))}}),(0,h.jsx)("button",{onClick:()=>{m.trim()&&(b({id:m.trim()}),n(""))},className:"bg-blue-600 hover:bg-blue-500 text-white px-2 py-1 rounded",children:"+"})]})]})}function ei(){let a=d_(a=>a.definition.settings),b=d_(a=>a.definition.settings.context),c=d_(a=>a.updateSettings);return(0,h.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,h.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Machine Settings"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Namespace"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:a.namespace,onChange:a=>c({namespace:a.target.value})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:a.name??"",onChange:a=>c({name:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:a.description??"",onChange:a=>c({description:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Notes on this diagram"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-24",placeholder:"What was discussed, what is still open, what to tell the agent…",value:a.notes??"",onChange:a=>c({notes:a.target.value||void 0})})]}),(0,h.jsxs)("label",{className:"flex items-center gap-2 text-sm text-gray-300",children:[(0,h.jsx)("input",{type:"checkbox",checked:a.asynchronous,onChange:a=>c({asynchronous:a.target.checked}),className:"rounded bg-gray-800 border-gray-600"}),"Asynchronous"]}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Context"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Context Class"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:b?.class??"",placeholder:"e.g. MyStateMachineContext",onChange:a=>c({context:{...b,class:a.target.value||void 0}})})]}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Base Class"}),(0,h.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:b?.baseClass??"",placeholder:"e.g. Context",onChange:a=>c({context:{...b,baseClass:a.target.value||void 0}})})]}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Imports"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-16 font-mono",value:(a.imports??[]).join("\n"),placeholder:"One import per line",onChange:a=>c({imports:a.target.value?a.target.value.split("\n"):[]})}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Object References"}),(0,h.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12 font-mono",value:(a.objects??[]).map(a=>`${a.instance}: ${a.class}`).join("\n"),placeholder:"instance: Class (one per line)",onChange:a=>{c({objects:a.target.value.split("\n").filter(a=>a.includes(":")).map(a=>{let[b,c]=a.split(":").map(a=>a.trim());return{instance:b,class:c}})})}}),(0,h.jsx)("hr",{className:"border-gray-800"}),(0,h.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Code Generation"}),(0,h.jsxs)("label",{className:"block",children:[(0,h.jsx)("span",{className:"text-xs text-gray-500",children:"Target Language"}),(0,h.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:a.targetLanguage??"python",onChange:a=>c({targetLanguage:a.target.value}),children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"}),(0,h.jsx)("option",{value:"csharp",children:"C#"})]})]})]})}function ej(){let a=d_(a=>a.errors),b=d_(a=>a.validate),c=d_(a=>a.select);return(0,h.jsxs)("div",{className:"p-3",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,h.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["Validation ",a.length>0&&(0,h.jsxs)("span",{className:"text-red-500",children:["(",a.length,")"]})]}),(0,h.jsx)("button",{onClick:()=>b(),className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-2 py-0.5 rounded",children:"Re-check"})]}),0===a.length?(0,h.jsxs)("div",{className:"flex items-center gap-2 text-green-500 text-xs",children:[(0,h.jsx)("span",{children:"✓"}),(0,h.jsx)("span",{children:"Definition is valid"})]}):(0,h.jsx)("div",{className:"space-y-0.5",children:a.map((a,b)=>(0,h.jsxs)("div",{className:`flex items-start gap-1.5 text-[13px] py-2.5 border-b border-gray-800/50 md:text-xs md:py-1 ${a.element?"cursor-pointer hover:bg-gray-800/30":""}`,onClick:()=>{a.element&&c("state",a.element)},title:a.element?`Click to select "${a.element}"`:void 0,children:[(0,h.jsx)("span",{className:`font-mono text-[10px] mt-0.5 ${"error"===a.severity?"text-red-600":"text-yellow-600"}`,children:a.ruleId}),(0,h.jsx)("span",{className:`flex-1 ${"error"===a.severity?"text-red-400":"text-yellow-400"}`,children:a.message}),a.element&&(0,h.jsxs)("span",{className:"text-gray-600 text-[10px]",children:["→ ",a.element]})]},b))})]})}var ek=a.i(41455);function el(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(!1),[d,e]=(0,i.useState)(""),[f,g]=(0,i.useState)(null),[j,k]=(0,i.useState)([]),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)(null);(0,i.useEffect)(()=>{if(!b)return;let a=!0;return o(null),fetch("/api/docs",{cache:"no-store"}).then(a=>a.ok?a.json():Promise.reject(Error(`HTTP ${a.status}`))).then(b=>{a&&(g(b.docs??[]),k(b.roots??[]),m(b.current??null))}).catch(b=>{a&&(g([]),o(b.message))}),()=>{a=!1}},[b]);let p=a=>{c(!1),e(""),(0,ek.navigateToDoc)(a)},q=new Set((f??[]).map(a=>a.path)),r=b?(function(){try{let a=[];for(let b=0;b<window.localStorage.length;b++){let c=window.localStorage.key(b);c?.startsWith(ea)&&a.push(c.slice(ea.length))}return a.sort()}catch{return[]}})().filter(b=>b.startsWith("/")&&b!==a&&!q.has(b)):[],s=a??l,t=(f??[]).filter(a=>a.path!==s),u=d.trim().toLowerCase(),v=u?t.filter(a=>a.path.toLowerCase().includes(u)):t,w="block w-full truncate rounded px-1.5 py-1 text-left text-xs text-gray-300 hover:bg-gray-800";return(0,h.jsxs)("span",{className:"relative inline-flex",children:[(0,h.jsx)("button",{onClick:()=>c(a=>!a),className:"toolbar-btn",title:a?`Document: ${a}`:"Switch document",children:"⇄"}),b&&(0,h.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 w-80 rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,h.jsx)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:"switch document"}),(0,h.jsxs)("form",{onSubmit:a=>{a.preventDefault();let b=d.trim();if(b){if(1===v.length)return p(v[0].path);if(b.startsWith("/"))return p(b)}},className:"mb-1 flex gap-1",children:[(0,h.jsx)("input",{value:d,onChange:a=>e(a.target.value),placeholder:null===f?"loading…":"filter, or /absolute/path.json",className:"min-w-0 flex-1 rounded border border-gray-700 bg-gray-950 px-1.5 py-1 text-xs text-gray-200 placeholder:text-gray-600"}),(0,h.jsx)("button",{type:"submit",className:"toolbar-btn",title:"Open",children:"→"})]}),(0,h.jsxs)("div",{className:"max-h-64 overflow-y-auto",children:[a&&(0,h.jsx)("button",{onClick:()=>p(null),className:w,title:"Return to the default project file",children:"⌂ default document"}),v.map(a=>(0,h.jsxs)("button",{onClick:()=>p(a.path),className:w,title:a.path,children:[a.name,(0,h.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:a.dir})]},a.path)),r.length>0&&(0,h.jsxs)("div",{className:"mt-1 border-t border-gray-800 pt-1",children:[(0,h.jsx)("div",{className:"px-1.5 pb-0.5 text-[10px] uppercase tracking-wide text-gray-600",children:"recent"}),r.map(a=>(0,h.jsxs)("button",{onClick:()=>p(a),className:w,title:a,children:[a.split("/").pop(),(0,h.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:a})]},a))]}),null!==f&&0===v.length&&0===r.length&&(0,h.jsx)("div",{className:"px-1.5 py-1 text-[11px] text-gray-500",children:u?"nothing matches":"no other documents here"})]}),j.length>0&&(0,h.jsxs)("div",{className:"mt-1 truncate border-t border-gray-800 pt-1 text-[10px] text-gray-600",children:["paths are as the server sees them: ",j.join(", ")]}),n&&(0,h.jsxs)("div",{className:"mt-1 text-[10px] text-gray-600",children:["this server does not list documents (",n,") — type a path"]})]})]})}function em({size:a=16}){return(0,h.jsxs)("svg",{width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("path",{d:"M12 4.5 21 19.5H3Z"}),(0,h.jsx)("path",{d:"M12 10v4.5"}),(0,h.jsx)("path",{d:"M12 17.3v.01"})]})}function en(){let a=d_(a=>a.presence),[b,c]=(0,i.useState)(!1);if(0===a.length)return null;let d=new Map;for(let b of a)d.set(b.role,(d.get(b.role)??0)+1);let e=[...d].map(([a,b])=>b>1?`${a} \xd7${b}`:a).join(" · ");return(0,h.jsxs)("span",{className:"relative inline-flex",children:[(0,h.jsxs)("button",{onClick:()=>c(a=>!a),className:"toolbar-btn inline-flex items-center gap-1.5",title:`Connected: ${e}`,"aria-expanded":b,"aria-label":`${a.length} connected: ${e}`,children:[(0,h.jsx)("span",{className:"flex -space-x-1",children:a.slice(0,4).map(a=>(0,h.jsx)("span",{className:"inline-block h-2 w-2 rounded-full ring-1 ring-gray-900",style:{backgroundColor:a.color??s(a.clientId)}},a.clientId))}),(0,h.jsx)("span",{className:"tabular-nums",children:a.length})]}),b&&(0,h.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 max-h-64 w-56 overflow-y-auto rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,h.jsxs)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:["connected · ",e]}),a.map(a=>(0,h.jsxs)("div",{className:"flex items-center gap-1.5 rounded px-1 py-1 text-xs text-gray-300",title:a.clientId,children:[(0,h.jsx)("span",{className:"inline-block h-2 w-2 shrink-0 rounded-full",style:{backgroundColor:a.color??s(a.clientId)}}),(0,h.jsx)("span",{className:"shrink-0",children:a.role}),a.name&&(0,h.jsx)("span",{className:"truncate text-gray-500",children:a.name})]},a.clientId))]})]})}function eo(){let a=d_(a=>a.definition),b=d_(a=>a.fileName),c=d_(a=>a.docPath),d=d_(a=>a.dirty),e=d_(a=>a.loadFromJson),f=d_(a=>a.exportJson),g=d_(a=>a.addState),j=d_(a=>a.validate),k=d_(a=>a.showCodePreview),l=d_(a=>a.setShowCodePreview),m=d_(a=>a.setGeneratedCode),n=d_(a=>a.drawMode),o=d_(a=>a.setDrawMode),p=d_(a=>a.arrangeLayout),q=d_(a=>a.undo),r=d_(a=>a.redo),s=d_(a=>a.undoStack),t=d_(a=>a.redoStack),u=d_(a=>a.remoteStatus),v=d_(a=>a.remoteMessage),w=d_(a=>a.setRemoteStatus),x=d_(a=>a.setRemoteMtime),y=d_(a=>a.applyRemote),z=(0,ek.useRequestedDoc)(),A=(0,i.useRef)(null),[B,C]=(0,i.useState)(!1),[D,E]=(0,i.useState)(""),[F,G]=(0,i.useState)(!1),[H,I]=(0,i.useState)("png"),[J,K]=(0,i.useState)(!1),[L,M]=(0,i.useState)(null),[N,O]=(0,i.useState)(null),P=async()=>{let a=f();G(!0);try{let b=await fetch(`/api/file${(0,ek.docQuery)(z)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:a})});if(b.ok){let a=await b.json();x(a.mtime),d_.setState({dirty:!1}),w("synced",null)}else{let a=await b.json().catch(()=>({error:"unknown"}));w("error",`Save failed: ${a.error??b.statusText}`)}}catch(a){w("error",`Save failed: ${a}`)}finally{G(!1)}},Q=async()=>{K(!0),M(null);try{let d=await d9(H,{definition:a,docPath:c,fileName:b});O(d)}catch(a){M(a instanceof Error?a.message:String(a))}finally{K(!1)}},R=async()=>{try{let a=await fetch(`/api/file${(0,ek.docQuery)(z)}`,{cache:"no-store"});if(!a.ok)return void w("error","Reload failed");let b=await a.json();b.exists&&b.content?y(b.content,b.mtime,b.path.split("/").pop()):w("idle",`No file at ${b.path}`)}catch(a){w("error",`Reload failed: ${a}`)}},S=()=>{D.trim()&&(g(null,{name:D.trim(),kind:"normal"}),E(""),C(!1))},[T,U]=(0,i.useState)("python"),V=async()=>{try{let a=await fetch("/api/rispec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(a.ok){let b=await a.json();m(b.rispec)}else{let b=await a.json().catch(()=>({error:"Unknown"}));m(`# RISE rispec generation failed
7
7
  ${b.error}`)}}catch(a){m(`# RISE rispec generation failed
8
8
  ${a}`)}l(!0)},W=async()=>{let a=f();try{let b=await fetch("/api/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({definition:a,language:T})});if(b.ok){let a=await b.json();m(a.code)}else{let c=await b.json().catch(()=>({error:"Unknown error"}));m(`// Code generation failed: ${c.error}
9
9
  // Showing definition JSON as fallback:
10
10
  ${a}`)}}catch{m(`// Backend unavailable — showing definition JSON
11
- ${a}`)}l(!0)};return(0,h.jsxs)("div",{className:"flex flex-col gap-1.5 px-2 py-1.5 bg-gray-900 border-b border-gray-800 md:flex-row md:flex-wrap md:items-center md:px-3",children:[(0,h.jsxs)("div",{className:"toolbar-ident",children:[(0,h.jsx)("input",{ref:A,type:"file",accept:".json,.smdf.json",onChange:a=>{let b=a.target.files?.[0];if(!b)return;let c=new FileReader;c.onload=a=>{e(a.target?.result,b.name)},c.readAsText(b),a.target.value=""},className:"hidden"}),(0,h.jsxs)("span",{className:"text-xs text-gray-400 mr-1 truncate max-w-[50vw] md:max-w-none",children:[b??"untitled.smdf.json",d&&(0,h.jsx)("span",{className:"text-yellow-500 ml-0.5",children:"●"})]}),(0,h.jsx)(ec,{}),"synced"===u&&(0,h.jsx)("span",{className:"text-[10px] text-emerald-500",title:"In sync with disk",children:"⌁ synced"}),"remote-changed"===u&&(0,h.jsx)("span",{className:"text-[10px] text-amber-400",title:v??"",children:"↻ remote changed"}),"error"===u&&(0,h.jsx)("span",{className:"text-[10px] text-red-400",title:v??"",children:"⚠ disk error"}),"idle"===u&&(0,h.jsx)("span",{className:"text-[10px] text-gray-600",title:v??"No file bound",children:"○ no disk"}),(0,h.jsx)(ed,{}),(0,h.jsx)("div",{className:"flex-1"})]}),(0,h.jsxs)("div",{className:"toolbar-strip",children:[(0,h.jsx)("button",{onClick:q,disabled:0===s.length,className:"toolbar-btn disabled:opacity-30",title:"Undo (Ctrl+Z)",children:"↩"}),(0,h.jsx)("button",{onClick:r,disabled:0===t.length,className:"toolbar-btn disabled:opacity-30",title:"Redo (Ctrl+Y)",children:"↪"}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:p,className:"toolbar-btn",title:"Arrange states into layers (auto-layout)",children:"⤢ Arrange"}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>o("select"===n?"transition":"select"),className:`toolbar-btn ${"transition"===n?"!bg-amber-700 !text-white":""}`,title:"transition"===n?"Exit draw mode (Esc)":"Draw transition mode",children:"transition"===n?"✏️ Drawing":"↗ Draw"}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>A.current?.click(),className:"toolbar-btn",title:"Open local .smdf.json (browser)",children:"📂"}),(0,h.jsx)("button",{onClick:P,disabled:F,className:"toolbar-btn disabled:opacity-40",title:"Save to disk (STATELOOM_PROJECT_FILE)",children:"💾 Disk"}),(0,h.jsx)("button",{onClick:R,className:"toolbar-btn",title:"Reload from disk",children:"🔄"}),(0,h.jsx)("button",{onClick:()=>{let a=new Blob([f()],{type:"application/json"}),c=URL.createObjectURL(a),d=document.createElement("a");d.href=c,d.download=b??"statemachine.smdf.json",d.click(),URL.revokeObjectURL(c)},className:"toolbar-btn",title:"Download as file",children:"📥"}),(0,h.jsx)("select",{value:H,onChange:a=>{I(a.target.value),O(null),M(null)},className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",title:"Export format",children:dZ.map(a=>(0,h.jsx)("option",{value:a,children:d$[a]},a))}),(0,h.jsx)("button",{onClick:Q,disabled:J,className:`toolbar-btn disabled:opacity-40 ${L?"!text-red-400":""}`,title:L??`Export the board as ${d$[H]}`,children:J?"…":"🖼 Export"}),N&&!L&&(0,h.jsxs)("span",{className:"text-[10px] text-emerald-500 truncate max-w-[40vw] md:max-w-[16rem]",title:N,children:["⤓ ",N]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),B?(0,h.jsxs)("div",{className:"flex items-center gap-1",children:[(0,h.jsx)("input",{autoFocus:!0,className:"bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-xs text-gray-200 w-32 md:w-24",placeholder:"State name...",value:D,onChange:a=>E(a.target.value),onKeyDown:a=>{"Enter"===a.key&&S(),"Escape"===a.key&&C(!1)}}),(0,h.jsx)("button",{onClick:S,className:"toolbar-btn-sm",children:"✓"}),(0,h.jsx)("button",{onClick:()=>C(!1),className:"toolbar-btn-sm",children:"✕"})]}):(0,h.jsx)("button",{onClick:()=>C(!0),className:"toolbar-btn",children:"+State"}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>j(),className:"toolbar-btn",children:"✓ Validate"}),(0,h.jsxs)("select",{value:T,onChange:a=>U(a.target.value),className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"})]}),(0,h.jsx)("button",{onClick:W,className:"toolbar-btn",children:"⚡ Generate"}),(0,h.jsx)("button",{onClick:V,className:"toolbar-btn",title:"Generate RISE rispec markdown",children:"📜 RISE"}),(0,h.jsxs)("button",{onClick:()=>l(!k),className:`toolbar-btn ${k?"text-blue-400":""}`,children:["</>"," Code"]})]})]})}function ef(){let a=dT(a=>a.generatedCode),b=dT(a=>a.showCodePreview),c=dT(a=>a.setShowCodePreview);return b?(0,h.jsx)("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 p-2 md:p-0",children:(0,h.jsxs)("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-xl w-full max-h-[85dvh] md:w-[80%] md:max-w-3xl md:max-h-[80dvh] flex flex-col",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-800",children:[(0,h.jsx)("h3",{className:"text-sm font-semibold text-gray-300",children:"Generated Definition (JSON)"}),(0,h.jsx)("button",{onClick:()=>c(!1),className:"text-gray-500 hover:text-gray-300 text-lg min-h-11 min-w-11 md:min-h-0 md:min-w-0","aria-label":"Close preview",children:"✕"})]}),(0,h.jsx)("pre",{className:"flex-1 overflow-auto overscroll-contain p-4 text-[11px] leading-relaxed text-green-400 font-mono md:text-sm",children:a??"No code generated yet"}),(0,h.jsx)("div",{className:"flex justify-end px-4 py-2 border-t border-gray-800",children:(0,h.jsx)("button",{onClick:()=>{a&&navigator.clipboard.writeText(a)},className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-4 py-3 rounded md:px-3 md:py-1",children:"Copy to Clipboard"})})]})}):null}function eg(){let a=dT(a=>a.applyRemote),b=dT(a=>a.setRemoteStatus),c=dT(a=>a.setRemoteMtime),d=(0,eb.useRequestedDoc)();return(0,i.useEffect)(()=>{let e=!1,f=(0,eb.docQuery)(d);async function g(){try{let a=await fetch(`/api/file${f}`,{cache:"no-store"});if(!a.ok)return null;return await a.json()}catch{return null}}(async()=>{let c=await g();e||(c?.path&&dT.getState().setDocPath(c.path),c?.exists&&c.content?a(c.content,c.mtime,c.path.split("/").pop()):b("idle",c?`No file at ${c.path}`:null))})();let h=new EventSource(`/api/watch${f}`);return h.addEventListener("hello",a=>{try{let b=JSON.parse(a.data);"number"==typeof b?.mtime&&c(b.mtime)}catch{}}),h.addEventListener("change",async d=>{let e=0;try{e=JSON.parse(d.data)?.mtime??0}catch{}if(e<=(dT.getState().remoteMtime??0))return;let f=await g();f?.exists&&f.content&&(dT.getState().dirty?(b("remote-changed",`Disk changed at ${new Date(f.mtime).toLocaleTimeString()} — local has unsaved edits`),c(f.mtime)):a(f.content,f.mtime,f.path.split("/").pop()))}),h.addEventListener("error",()=>{b("error","Watch stream disconnected")}),()=>{e=!0,h.close()}},[a,b,c,d]),null}function eh({url:a}){let b=(0,eb.useRequestedDoc)();return(0,i.useEffect)(()=>{if(!a)return;let c=!1,d=null,e=null,f=null,g=null;return(async()=>{let h="";try{let a=await fetch(`/api/file${(0,eb.docQuery)(b)}`,{cache:"no-store"});a.ok&&(h=(await a.json())?.path??"")}catch{}c||(h&&dT.getState().setDocPath(h),(d=dF({url:a,role:"web",docId:h,name:"web-designer",onFull:a=>{dT.getState().applyRemote(JSON.stringify({stateMachine:a.def}),a.mtime??Date.now(),h&&h.split("/").pop()||void 0),g=a.def},onPatch:a=>{dT.getState().applyRemoteOps(a.ops,a.mtime??Date.now(),a.seq),g=dT.getState().definition},onPresence:a=>{dT.getState().setPresence(a)}})).connect(),e=dT.subscribe((a,b)=>{a.definition===b.definition||a._applyingRemote||(f&&clearTimeout(f),f=setTimeout(()=>{var a,b;let c,e;if(!d||"connected"!==d.getSnapshot().status)return;let f=dT.getState().definition;if(null===g){d.emitFull(f),g=f;return}let h=(a=g,b=f,c=a??{settings:{namespace:"",asynchronous:!1},events:[],state:{name:b.state.name,states:[]}},function(a,b,c){let d={},e=!1,f=new Set([...Object.keys(a.settings),...Object.keys(b.settings)]),g=a.settings,h=b.settings;for(let a of f)q(g[a],h[a])||void 0===h[a]||(d[a]=h[a],e=!0);void 0!==a.settings.notes&&void 0===b.settings.notes&&(d.notes="",e=!0),e&&c.push({op:"settings.update",patch:d})}(c,b,e=[]),function(a,b,c){let d=a.events,e=b.events,f=Math.min(d.length,e.length);for(let a=0;a<f;a++)!function(a,b,c,d){let e={},f=!1;for(let a of["name","file","feeder","description","timers"])q(b[a],c[a])||void 0===c[a]||(e[a]=c[a],f=!0);f&&d.push({op:"eventSource.update",index:a,patch:e});let g=b.events??[],h=c.events??[],i=new Set(h.map(a=>a.id));for(let a of g)i.has(a.id)||d.push({op:"event.remove",id:a.id});let j=g.filter(a=>i.has(a.id)),k=0;for(;k<h.length;){let b=h[k];k<j.length&&j[k].id===b.id?(function(a,b,c){let d={},e=!1;for(let c of["name","description","preAction","postAction"])q(a[c],b[c])||void 0===b[c]||(d[c]=b[c],e=!0);e&&c.push({op:"event.update",id:b.id,patch:d})}(j[k],b,d),function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++)if(!q(b[f],c[f])){let e={};b[f].name!==c[f].name&&(e.name=c[f].name),b[f].type!==c[f].type&&(e.type=c[f].type),d.push({op:"parameter.update",eventId:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"parameter.add",eventId:a,parameter:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"parameter.remove",eventId:a,index:e})}(b.id,j[k].parameters??[],b.parameters??[],d)):(d.push({op:"event.add",sourceIndex:a,event:b,index:k}),j.splice(k,0,b)),k++}}(a,d[a],e[a],c);for(let a=d.length;a<e.length;a++)c.push({op:"eventSource.add",source:e[a]});for(let a=d.length-1;a>=e.length;a--)c.push({op:"eventSource.remove",index:a})}(c,b,e),function(a,b,c){let d=o(a.state),e=o(b.state),f=new Map(d.map(a=>[a.name,a])),g=new Map(e.map(a=>[a.name,a])),h=p(a.state),i=p(b.state),j=[];for(let a of e){if(f.has(a.name))continue;let b=i.get(a.name)??null,{states:d,transitions:e,...g}=a;c.push({op:"state.add",parent:b,state:{...g}}),e&&e.length>0&&j.push({state:a.name,transitions:e})}for(let a of e){if(!f.has(a.name))continue;let b=h.get(a.name)??null,d=i.get(a.name)??null;b!==d&&null!==d&&c.push({op:"state.nest",child:a.name,newParent:d})}for(let a of e){let b=f.get(a.name);if(!b)continue;let d={},e=!1;q(b.kind,a.kind)||void 0===a.kind||(d.kind=a.kind,e=!0),q(b.description,a.description)||void 0===a.description||(d.description=a.description,e=!0),q(b.notes,a.notes)||(d.notes=a.notes??"",e=!0),q(b.prompt,a.prompt)||(d.prompt=a.prompt??"",e=!0),e&&c.push({op:"state.update",name:a.name,patch:d}),r(a.name,"onEntry",b.onEntry?.actions??[],a.onEntry?.actions??[],c),r(a.name,"onExit",b.onExit?.actions??[],a.onExit?.actions??[],c)}for(let a of j)a.transitions.forEach((b,d)=>{c.push({op:"transition.add",state:a.state,transition:b,index:d})});for(let a of e){let b=f.get(a.name);b&&function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++){if(q(b[f],c[f]))continue;let e={};for(let a of["event","nextState","condition","description","actions"])q(b[f][a],c[f][a])||void 0===c[f][a]||(e[a]=c[f][a]);Object.keys(e).length>0&&d.push({op:"transition.update",state:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"transition.add",state:a,transition:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"transition.remove",state:a,index:e})}(a.name,b.transitions??[],a.transitions??[],c)}for(let a=d.length-1;a>=0;a--){let b=d[a];if(g.has(b.name))continue;let e=b.transitions??[];for(let a=e.length-1;a>=0;a--)c.push({op:"transition.remove",state:b.name,index:a});c.push({op:"state.remove",name:b.name})}}(c,b,e),e);0!==h.length&&(d.emitPatch(h),g=f)},60))}))})(),()=>{c=!0,f&&clearTimeout(f),e&&e(),d&&d.disconnect()}},[a,b]),null}function ei(){let a=process.env.NEXT_PUBLIC_STATELOOM_BRIDGE_URL??process.env.NEXT_PUBLIC_SMCRAFT_BRIDGE_URL;return"string"==typeof a&&a.length>0?a:void 0}let ej=null;function ek(){return ej||(ej=(async()=>{let a=ei()??null;try{let b=await fetch("/api/config",{cache:"no-store"});if(b.ok){let c=await b.json();return{bridgeUrl:c.bridgeUrl||a,projectFile:c.projectFile??null,stage:c.stage??null,companion:!0===c.companion,companionEpisode:c.companionEpisode??null}}}catch{}return{bridgeUrl:a,projectFile:null,stage:null,companion:!1,companionEpisode:null}})())}function el(){let a=ei(),[b,c]=(0,i.useState)(a);return((0,i.useEffect)(()=>{let a=!0;return ek().then(b=>{a&&b.bridgeUrl&&c(b.bridgeUrl)}),()=>{a=!1}},[]),"string"==typeof b&&b.length>0)?(0,h.jsx)(eh,{url:b}):(0,h.jsx)(eg,{})}function em(a){return Number.isFinite(a)?Math.min(1.75,Math.max(.75,a)):1}function en(a){"u">typeof document&&(document.documentElement.style.fontSize=`${16*em(a)}px`)}let eo=1,ep=!1,eq=new Set;function er(){return ep||(ep=!0,eo=1),eo}function es(){return 1}function et(a){return eq.add(a),()=>{eq.delete(a)}}function eu(a,b){let c=em(a);if(en(c),b,ep=!0,c!==eo)for(let a of(eo=c,eq))a()}function ev(a,b){return Math.max(1,Math.hypot(b.clientX-a.clientX,b.clientY-a.clientY))}function ew(a,b){for(let c=0;c<a.length;c++)if(a[c].identifier===b)return a[c];return null}function ex(){let a=(0,i.useSyncExternalStore)(et,er,es),b=(0,i.useRef)(null),c=(0,i.useRef)(null),d=(0,i.useRef)(null);(0,i.useEffect)(()=>{en(a)},[a]);let e=(0,i.useCallback)(a=>{c.current=a,null===d.current&&(d.current=requestAnimationFrame(()=>{d.current=null,null!==c.current&&eu(c.current,!1)}))},[]),f=(0,i.useCallback)(()=>{c.current=null,eu(1,!0)},[]);return((0,i.useEffect)(()=>{let a=()=>{let a=b.current;if(b.current=null,!a?.engaged)return;null!==d.current&&(cancelAnimationFrame(d.current),d.current=null);let e=c.current??er();c.current=null,eu(em(e),!0)},f=c=>{if(2!==c.touches.length){b.current&&a();return}let[d,e]=[c.touches[0],c.touches[1]];dW(d.target)||dW(e.target)||(b.current={a:d.identifier,b:e.identifier,startScale:er(),startDist:ev(d,e),engaged:!1})},g=a=>{let c=b.current;if(!c)return;let d=ew(a.touches,c.a),f=ew(a.touches,c.b);if(!d||!f)return;a.preventDefault();let g=ev(d,f);if(!c.engaged){if(12>Math.abs(g-c.startDist))return;c.engaged=!0,c.startDist=g;return}e(em(c.startScale*(g/c.startDist)))},h=c=>{let d=b.current;d&&(ew(c.touches,d.a)&&ew(c.touches,d.b)||a())};return document.addEventListener("touchstart",f,{passive:!0,capture:!0}),document.addEventListener("touchmove",g,{passive:!1,capture:!0}),document.addEventListener("touchend",h,{passive:!0,capture:!0}),document.addEventListener("touchcancel",h,{passive:!0,capture:!0}),()=>{document.removeEventListener("touchstart",f,{capture:!0}),document.removeEventListener("touchmove",g,{capture:!0}),document.removeEventListener("touchend",h,{capture:!0}),document.removeEventListener("touchcancel",h,{capture:!0}),null!==d.current&&cancelAnimationFrame(d.current)}},[e]),1===a)?null:(0,h.jsxs)("div",{className:"ui-scale-pill",role:"status","aria-live":"polite",children:[(0,h.jsxs)("span",{children:["UI ",Math.round(100*a),"%"]}),(0,h.jsx)("button",{type:"button",onClick:f,"aria-label":"Reset interface size to 100 percent",children:"Reset"})]})}var ey=i;class ez extends ey.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,b){console.error(`[stateloom] the ${this.props.what} could not be drawn:`,a,b.componentStack)}componentDidUpdate(a){this.state.error&&a.resetKey!==this.props.resetKey&&this.setState({error:null})}render(){let{error:a}=this.state;return a?(0,h.jsx)("div",{role:"alert",className:"flex h-full w-full items-center justify-center p-6 text-center text-sm text-amber-300",children:(0,h.jsxs)("p",{className:"max-w-md",children:["This ",this.props.what," cannot be drawn: ",a.message,". The file on disk is unchanged — correct it in the panel, in the file, or with the agent that wrote it."]})}):this.props.children}}function eA({size:a=16}){return(0,h.jsxs)("svg",{width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("path",{d:"M12 4.5 21 19.5H3Z"}),(0,h.jsx)("path",{d:"M12 10v4.5"}),(0,h.jsx)("path",{d:"M12 17.3v.01"})]})}function eB({locked:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("rect",{x:"5",y:"11",width:"14",height:"9",rx:"2"}),(0,h.jsx)("path",{d:a?"M8 11V8a4 4 0 0 1 8 0v3":"M8 11V8a4 4 0 0 1 7.5-1.9"})]})}function eC(a){let{onClose:b,restVh:c,tallVh:d}=a,[e,f]=(0,i.useState)(!1),[g,h]=(0,i.useState)(null),j=(0,i.useRef)(null),k=()=>{f(!1),b()},l=a=>{let b=j.current;if(!b||b.id!==a.pointerId)return;j.current=null;let c=a.clientY-b.y;if(h(null),6>Math.abs(c))return f(a=>!a);if(c<=-50)return f(!0);if(c>=80){if(e&&c<260)return f(!1);k()}},m=e?d:c,n=null!==g;return{zoneProps:{onPointerDown:a=>{a.target.closest("button")||(j.current={y:a.clientY,id:a.pointerId},a.currentTarget.setPointerCapture(a.pointerId),h(0))},onPointerMove:a=>{let b=j.current;b&&b.id===a.pointerId&&h(a.clientY-b.y)},onPointerUp:l,onPointerCancel:l,style:{touchAction:"none",cursor:"grab"}},sheetStyle:{"--sheet-h":n&&g<0?`min(calc(${m}dvh + ${-g}px), ${d}dvh)`:`${m}dvh`,...n?{transition:"none"}:{},...n&&g>0?{transform:`translateY(${g}px)`}:{}},close:k}}let eD="stateloom:focus-request",eE="stateloom:system-changed",eF="stateloom:strip-note";function eG(a){let[b,c]=(0,i.useState)(null);return(0,i.useEffect)(()=>{let a=()=>c(null);a();let b=["popstate",eb.DOC_CHANGE_EVENT,"stateloom:focus",eD];for(let c of b)window.addEventListener(c,a);return()=>{for(let c of b)window.removeEventListener(c,a)}},[a]),b}function eH(a){let b=new URL(window.location.href),c=b.searchParams.get("doc")!==a.doc;b.searchParams.set("doc",a.doc);let d=void 0===a.system?b.searchParams.get("system"):a.system;d?b.searchParams.set("system",d):b.searchParams.delete("system"),a.focus?b.searchParams.set("focus",a.focus):b.searchParams.delete("focus"),c?window.history.pushState({},"",b):window.history.replaceState(window.history.state,"",b),c&&window.dispatchEvent(new Event(eb.DOC_CHANGE_EVENT)),window.dispatchEvent(new Event(eD))}function eI(a){}function eJ(){let[a,b]=(0,i.useState)({focus:null,nonce:0});return(0,i.useEffect)(()=>{let a=()=>b(a=>({focus:null,nonce:a.nonce+1}));a();let c=["popstate",eb.DOC_CHANGE_EVENT,eD];for(let b of c)window.addEventListener(b,a);return()=>{for(let b of c)window.removeEventListener(b,a)}},[]),a}let eK="/api/companion/",eL="stateloom.companion.autoplay",eM="stateloom.companion.episode",eN=/^\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+$/;function eO(a){let b=a?.match(/(?:^|\/)(\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+)\/diagrams\/[^/]+$/);return b?b[1]:null}function eP(a){try{return window.localStorage.getItem(a)}catch{return null}}function eQ(a,b){try{window.localStorage.setItem(a,b)}catch{}}let eR=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},eS=a=>"starting"===a||"recording"===a||"sending"===a,eT={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null},eU={episode:null,items:[],presence:null,waiting:null,error:null};function eV({stage:a,defaultEpisode:b}){let[c,d]=(0,i.useState)(!1),[e,f]=(0,i.useState)(()=>"0"!==eP(eL)),[g,j]=(0,i.useState)(()=>{let a=null,c=eP(eM);return(a&&eN.test(a)?a:null)??eO((0,eb.requestedDoc)())??(c&&eN.test(c)?c:null)??b}),[k,l]=(0,i.useState)([]),[m,n]=(0,i.useState)(eT),[o,p]=(0,i.useState)(eU),[q,r]=(0,i.useState)(null),[s,t]=(0,i.useState)([]),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(null),[y,z]=(0,i.useState)(()=>Date.now()),A=(0,i.useRef)(a),B=(0,i.useRef)(g),C=(0,i.useRef)(e);(0,i.useEffect)(()=>{A.current=a,B.current=g,C.current=e});let D=(0,i.useRef)(eT),E=(0,i.useRef)(null),F=(0,i.useRef)([]),G=(0,i.useRef)(!1),H=(0,i.useRef)([]),I=(0,i.useRef)(null),J=(0,i.useRef)(null),K=(0,i.useMemo)(()=>dG({recordings:!0,speech:!1}),[]),L=a=>{E.current=a,r(a)},M=(0,i.useRef)(async()=>{}),N=(0,i.useCallback)(async(a,b=0)=>{L(a.id),t(b=>b.filter(b=>b!==a.id)),a.steps?.length&&window.matchMedia("(max-width: 767px)").matches&&d(!1);let c=F.current.length;v(c?`${c} more of Mia's replies wait after this one.`:null);let e=await A.current.present(function(a,b,c="Mia"){let d=new Date(a.at),e=Number.isNaN(d.getTime())?`${c}'s reply`:`Reply at ${d.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`,f=!a.unvoiced,g=(a,c)=>(function(a,b){if(!b)return;if(/^https?:\/\//.test(b))return b;let c=b.replace(/^\/?api\//,"");return`${a.endsWith("/")?a:`${a}/`}${c}`})(b,a||(f?c:null));return{settings:{namespace:"companion",name:e,author:c},steps:a.steps?.length?a.steps.map(({audio:b,...c},d)=>{let e=g(b,`api/replies/${a.id}/steps/${d}/audio`);return{...c,...e?{audio:e}:{}}}):[{say:a.text,...g(a.audio,`api/replies/${a.id}/audio`)?{audio:g(a.audio,`api/replies/${a.id}/audio`)}:{}}]}}(a,eK,"Mia"),{voice:K,origin:"Mia",from:b});if(E.current!==a.id||(L(null),G.current))return;if(!e){F.current=[];return}let f=F.current.shift();f&&!eS(D.current.state)?M.current(f):f&&F.current.unshift(f)},[K]);(0,i.useEffect)(()=>{M.current=N},[N]);let O=(0,i.useCallback)(a=>{let b=a.id;if(!C.current)return void t(a=>a.includes(b)?a:[...a,b]);if(eS(D.current.state)||E.current){t(a=>a.includes(b)?a:[...a,b]),F.current.some(a=>a.id===b)||F.current.push(a),v(eS(D.current.state)?`Mia replied at ${eR(a.at)}. Her voice waits until you have sent your take.`:`Mia replied again at ${eR(a.at)}. It plays when this one ends.`);return}M.current(a)},[]);(0,i.useEffect)(()=>{let a=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.everyMs??1e4,e=a.waitEveryMs??4e3,f=a.waitForMs??9e5,g={episode:null,items:[],presence:null,waiting:null,error:null},h=new Set,i=!1,j=null,k=null,l="",m=0,n=b=>{g={...g,...b},a.onChange?.(g)};async function o(){let d=g.episode;if(!d)return;let e=m;try{let j=await c(`${b}thread?episode=${encodeURIComponent(d)}`,{cache:"no-store"}),o=await j.json();if(e!==m)return;if(!o.success)return n({error:o.error??`HTTP ${j.status}`});let p=o.items??[],q=p.map(a=>"reply"===a.kind?`${a.id}:${+!!a.audio}:${a.feedback??""}`:`${a.take}:${a.text.length}`).join(",")+`|${o.presence?.state}`,r=p.filter(a=>"reply"===a.kind&&!h.has(a.id));for(let a of r)h.add(a.id);if((q!==l||g.error)&&(l=q,n({items:p,presence:o.presence??null,error:null})),i)for(let b of r)a.onReply?.(b);i=!0;let s=g.waiting;s&&(p.some(a=>"reply"===a.kind&&a.take===s.take)||Date.now()-s.since>f)&&(k&&clearInterval(k),k=null,n({waiting:null}))}catch(a){e===m&&n({error:a instanceof Error?a.message:String(a)})}}let p=()=>{"visible"===document.visibilityState&&o()};return"u">typeof document&&document.addEventListener("visibilitychange",p),{getSnapshot:()=>g,setEpisode(a){a!==g.episode&&(m+=1,h.clear(),i=!1,l="",k&&clearInterval(k),k=null,n({episode:a,items:[],presence:null,waiting:null,error:null}),a?(j&&clearInterval(j),j=setInterval(()=>{("u"<typeof document||"visible"===document.visibilityState)&&o()},d),o()):j&&(clearInterval(j),j=null))},refresh:o,waitFor(a){n({waiting:{take:a,since:Date.now()}}),k&&clearInterval(k),k=setInterval(()=>void o(),e),o()},async feedback(a,d){await c(`${b}replies/${a}/feedback`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({value:d})}),l="",await o()},destroy(){for(let a of(m+=1,[j,k]))a&&clearInterval(a);j=k=null,"u">typeof document&&document.removeEventListener("visibilitychange",p)}}}({base:eK,onChange:p,onReply:O}),b=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.partEveryMs??1e4,e=a.beatEveryMs??15e3,f=a.getUserMedia??(a=>navigator.mediaDevices.getUserMedia(a)),g=a.createRecorder??(a=>{let b,c,d,e,f,g,h,i;return c=(b=new(window.AudioContext??window.webkitAudioContext)).createMediaStreamSource(a),d=b.createScriptProcessor(4096,1,1),e=[],f=[],g=!1,h=null,i={mimeType:"audio/wav",ondataavailable:null,onstop:null,onerror:null,start(a=1e3){d.onaudioprocess=a=>{let b=a.inputBuffer.getChannelData(0),c=new Int16Array(b.length);for(let a=0;a<b.length;a++)c[a]=Math.max(-32768,Math.min(32767,Math.round(32767*b[a])));e.push(c),f.push(c)},c.connect(d),d.connect(b.destination),h=setInterval(()=>{if(!f.length)return;let a=g?[]:[dH(0x7fffffff,b.sampleRate)];g=!0,a.push(...f.map(a=>a.buffer)),f=[],i.ondataavailable?.({data:new Blob(a,{type:"audio/wav"})})},a)},stop(){h&&clearInterval(h),h=null;try{c.disconnect(),d.disconnect()}catch{}b.close().catch(()=>{}),i.whole=new Blob([dH(e.reduce((a,b)=>a+b.byteLength,0),b.sampleRate),...e.map(a=>a.buffer)],{type:"audio/wav"}),i.onstop?.()}}}),h={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null,...!a.createRecorder?{unavailable:"this browser cannot record audio"}:{}},i=b=>{h={...h,...b},a.onChange?.(h)},j=null,k=null,l=[],m="",n="",o=null,p=0,q=null,r=null,s=null,t=null,u=!1,v=()=>p?Math.floor((Date.now()-p)/1e3):0,w=()=>(k?.mimeType||"audio/mp4").split(";")[0]||"audio/mp4",x=(a="")=>`episode=${encodeURIComponent(n)}${m?`&rec=${m}`:""}${o?`&context=${encodeURIComponent(o)}`:""}${a}`;function y(a){n&&c(`${b}recorder`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({episode:n,recording:a})}).catch(()=>{})}function z(a,d={}){m&&c(`${b}takes/diagnostic`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({rec:m,episode:n,kind:a,at:new Date().toISOString(),mime:k?.mimeType??null,visibility:"u">typeof document?document.visibilityState:"",agent:"u">typeof navigator?navigator.userAgent:"",source:"stateloom-canvas",...d}),keepalive:!0}).catch(()=>{})}function A(){for(let a of[r,s,t])a&&clearInterval(a);r=s=t=null}function B(){try{j?.getTracks().forEach(a=>a.stop())}catch{}j=null}async function C(){if(!m||u||!l.length)return;let a=new Blob(l,{type:w()});if(a.size<=h.held)return;u=!0;let d=m;try{let e=await c(`${b}takes/part?${x(`&offset=${h.held}`)}`,{method:"POST",headers:{"content-type":w()},body:a.slice(h.held)}),f=await e.json();d===m&&"number"==typeof f.bytes&&i({held:f.bytes})}catch{}finally{u=!1}}async function D(){let b;if("idle"!==h.state&&"retry"!==h.state)return;if(h.unavailable)return i({message:`Cannot record: ${h.unavailable}.`,error:!0});if(!(n=a.episode()??""))return i({message:"Choose the episode this take belongs to.",error:!0});let c=a.context?.()??null;o=c?JSON.stringify(c).slice(0,4e3):null,q=null,i({state:"starting",message:"",error:!1,held:0,seconds:0}),y(!0);try{b=await f({audio:!0})}catch(a){return y(!1),i({state:"idle",message:`Microphone refused: ${a instanceof Error?a.message:String(a)}`,error:!0})}if("starting"!==h.state)return void b.getTracks().forEach(a=>a.stop());j=b,l=[],m=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`;try{k=g(b)}catch(a){return B(),y(!1),i({state:"idle",message:`This browser refused to record: ${a instanceof Error?a.message:String(a)}`,error:!0})}k.ondataavailable=a=>{a.data&&a.data.size&&l.push(a.data)},k.onerror=a=>{let b=v(),c=new Blob(l,{type:w()});if(z("recorder-error",{name:a?.error?.name??"",message:a?.error?.message??"",seconds:b,bytes:c.size,held:h.held}),A(),B(),y(!1),c.size)q=c,i({state:"retry",message:`The recorder stopped with an error after ${Math.floor(b/60)}:${String(b%60).padStart(2,"0")}. What it captured is kept: Send again.${h.held?` ${dI(h.held)} of it is already stored.`:""}`,error:!0});else i({state:"idle",message:"The recorder stopped before it captured anything. Nothing was sent.",error:!0})},k.start(1e3),p=Date.now(),r=setInterval(()=>void C(),d),s=setInterval(()=>y(!0),e),t=setInterval(()=>i({seconds:v()}),500),i({state:"recording",seconds:0,message:""})}async function E(d){i({state:"sending",message:`Sending ${dI(d.size)}, then transcribing and storing…`,error:!1});try{let e=await c(`${b}takes?${x()}`,{method:"POST",headers:{"content-type":(d.type||"audio/mp4").split(";")[0]},body:d}),f=await e.json();if(!f.success||!f.take)throw Error(f.error||`HTTP ${e.status}`);q=null,m="";let g=f.presence??{state:f.listening?"listening":"away"},h=f.transcriptError?` Transcription failed, so no session wakes yet: ${f.transcriptError}`:({listening:" The session listening there will hear it.",answering:" Mia is answering an earlier take; she hears this one next.",answered:" The session hears it as soon as it listens again."})[g.state]??" No session is listening yet; the take waits, and her reply comes here when one answers.";i({state:"idle",seconds:0,held:0,message:`Take ${f.take} is in the episode.${h}`,error:!!f.transcriptError,stored:{take:f.take,english:f.english??"",transcriptError:f.transcriptError,presence:g}}),f.transcriptError||a.onStored?.(f.take)}catch(a){q=d,z("send-failed",{message:a instanceof Error?a.message:String(a),bytes:d.size,held:h.held}),i({state:"retry",message:`Not stored: ${a instanceof Error?a.message:String(a)}. Your recording is kept — Send again.${h.held?` ${dI(h.held)} of it is already stored, and becomes a take by itself if you leave.`:""}`,error:!0})}}async function F(){if("recording"!==h.state)return;let a=v();A(),y(!1),i({state:"sending",seconds:a});let b=await new Promise(a=>{let b=!1,c=()=>{b||(b=!0,a(k?.whole??new Blob(l,{type:w()})))},d=setTimeout(c,3e3);if(!k)return c();k.onstop=()=>{clearTimeout(d),c()};try{k.stop()}catch{clearTimeout(d),c()}});if(B(),!b.size)return z("empty-at-stop",{seconds:a,held:h.held}),i({state:"idle",message:h.held?`The recorder handed back nothing at Stop, but ${dI(h.held)} is stored; it becomes a take within a few minutes.`:"Nothing was recorded. Try again.",error:!0});await E(b)}async function G(){"retry"===h.state&&q&&await E(q)}return{getSnapshot:()=>h,press:async()=>"recording"===h.state?F():"retry"===h.state&&q?G():D(),start:D,stop:F,resend:G,destroy(){A(),("recording"===h.state||"starting"===h.state)&&y(!1);try{k?.stop()}catch{}B()}}}({base:eK,episode:()=>B.current,context:()=>{let a=A.current.shown,b=a?{...a.title||a.step.title?{title:[a.title,a.step.title].filter(Boolean).join(" · ")}:{},say:a.step.say.slice(0,400),...null!==a.index&&null!==a.count?{index:a.index,count:a.count}:{},...a.origin?{by:a.origin}:{}}:null;return function(a,b={}){if(!a?.doc)return null;let c={stage:a.stage,doc:a.doc,kind:a.kind,system:a.system,focus:a.focus??void 0,visible:a.visible,tour:a.tour,who:a.who,at:new Date().toISOString(),...b};for(let a of Object.keys(c))(void 0===c[a]||null===c[a])&&delete c[a];return c}(A.current.lastReport(),{...H.current.length?{marks:H.current}:{},...a?.step.spotlight?.length?{spotlight:a.step.spotlight}:{},...b?{step:b}:{}})},onChange:a=>{let b=D.current.state;if(D.current=a,n(a),!eS(b)||eS(a.state)||(G.current=!1,!C.current||E.current))return;let c=F.current.shift();c?M.current(c):v(null)},onStored:b=>a.waitFor(b)});return J.current=a,I.current=b,D.current=b.getSnapshot(),n(b.getSnapshot()),()=>{b.destroy(),a.destroy(),J.current=null,I.current=null}},[O]),(0,i.useEffect)(()=>{J.current?.setEpisode(g)},[g]),(0,i.useEffect)(()=>{let a=!0;return fetch(`${eK}health`,{cache:"no-store"}).then(a=>a.json()).then(b=>{if(a){if(!b.success)return x(`The companion does not answer: ${b.error??"no reason given"}.`);x(null),b.defaultEpisode&&j(a=>a??b.defaultEpisode??null)}}).catch(b=>a&&x(`The companion does not answer: ${b instanceof Error?b.message:String(b)}.`)),()=>{a=!1}},[]),(0,i.useEffect)(()=>{if(!c||k.length)return;let a=!0;return fetch(`${eK}episodes`,{cache:"no-store"}).then(a=>a.json()).then(b=>{a&&b.success&&b.episodes&&l(b.episodes)}).catch(()=>{}),()=>{a=!1}},[c,k.length]);let P=(0,i.useRef)(null),Q=(0,i.useCallback)(async(a=!1)=>{let b=A.current.lastReport()?.doc??null;if(a||b!==P.current){if(P.current=b,!b){H.current=[];return}try{let a=await fetch(`/api/marks?doc=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();H.current=bo(function(a,b=""){let c=a&&"object"==typeof a?a:{},d=Array.isArray(c.marks)?c.marks.map(bn).filter(a=>null!==a):[];return{doc:bk(c.doc)||b,marks:d}}(c,b).marks,"agent").map(a=>a.id)}catch{H.current=[]}}},[]);(0,i.useEffect)(()=>{Q(!0);let a=A.current.onMarks(()=>void Q(!0)),b=setInterval(()=>void Q(),3e3);return()=>{a(),clearInterval(b)}},[Q]),(0,i.useEffect)(()=>{if(!o.waiting)return;let a=setInterval(()=>z(Date.now()),1e3);return()=>clearInterval(a)},[o.waiting]);let R=(0,i.useCallback)(()=>{let a=I.current;a&&(!eS(D.current.state)&&"retry"!==D.current.state&&E.current&&(G.current=!0,A.current.stop()),a.press())},[]),S=(0,i.useCallback)((a,b)=>{let c=J.current?.getSnapshot().items.find(b=>"reply"===b.kind&&b.id===a);if(c){if(eS(D.current.state))return void v(`Send your take first. Then press ▶ to hear Mia.`);F.current=[],G.current=!1,M.current(c,b)}},[]),T=(0,i.useCallback)(()=>{F.current=[],G.current=!1,A.current.stop()},[]),U=o.waiting?{take:o.waiting.take,seconds:Math.max(0,Math.floor((y-o.waiting.since)/1e3))}:null;return(0,h.jsx)("div",{className:"stage-talk-host",children:(0,h.jsx)(cp,{open:c,onOpenChange:a=>{d(a),a&&Q(!0)},who:"Mia",episode:g,episodes:k,onEpisode:a=>{eN.test(a)&&a!==g&&(F.current=[],t([]),v(null),j(a),eQ(eM,a))},presence:o.presence,recorder:m,onRecord:R,items:o.items,unheard:s,playing:q,playingStep:q&&a.shown?.origin==="Mia"?a.shown.index:null,onPlay:S,onStop:T,onFeedback:(a,b)=>{J.current?.feedback(a,b).catch(a=>x(`Your thumb was not kept: ${a instanceof Error?a.message:String(a)}.`))},autoplay:e,onAutoplay:a=>{f(a),eQ(eL,a?"1":"0"),a||(F.current=[])},waiting:U,notice:u,error:w??o.error})})}let eW=(0,i.createContext)(null);function eX(){return(0,i.useContext)(eW)}function eY(a,b){try{window.localStorage.setItem(a,b)}catch{}}function eZ({children:a}){var b;let c,d,e,f,g,j,k,l,[m,n]=(0,i.useState)({bridgeUrl:null,stage:bf,companion:!1,companionEpisode:null});(0,i.useEffect)(()=>{let a=!0;return ek().then(b=>{if(!a)return;let c=null,d=bh(c)?c:bh(b.stage)?b.stage:bf;n({bridgeUrl:b.bridgeUrl,stage:d,companion:b.companion,companionEpisode:b.companionEpisode})}),()=>{a=!1}},[]);let[o,p]=(0,i.useState)(()=>!1),[q,r]=(0,i.useState)(()=>""),s=(0,i.useMemo)(()=>o?dG():null,[o]),t=(0,i.useMemo)(()=>null,[]),[u,v]=(0,i.useState)(null),w=(0,i.useRef)(new Set),x=(0,i.useCallback)(a=>{var b;if(!a)return void v(null);let{step:c}=a,d=(0,eb.requestedDoc)();if(a.caught,c.doc&&c.doc!==d)eH({doc:c.doc,system:c.system??void 0,focus:c.focus??null});else if(c.focus)if(c.system&&null!==c.system&&d)eH({doc:d,system:c.system,focus:c.focus});else{let a;b=c.focus,(a=new URL(window.location.href)).searchParams.set("focus",b),window.history.replaceState(window.history.state,"",a),window.dispatchEvent(new Event(eD))}v({doc:c.doc,focus:c.focus,spotlight:c.spotlight,region:c.region,nonce:a.nonce})},[]),y=(b={url:m.bridgeUrl??"",stage:m.stage,name:"web-stage",voice:s,enabled:!!m.bridgeUrl,onShow:x,onMarks:a=>{for(let b of[...w.current])b(a)}},(c=(0,i.useRef)({onShow:b.onShow,onMarks:b.onMarks})).current={onShow:b.onShow,onMarks:b.onMarks},d=(0,i.useRef)(null),e=`${b.url}\u0000${b.stage??""}\u0000${b.token??""}`,f=(0,i.useRef)(e),(null===d.current||f.current!==e)&&(f.current=e,d.current=function(a){let b,c=bh(a.stage)?a.stage:bf,d=a.setTimer??((a,b)=>setTimeout(a,b)),e=a.clearTimer??(a=>clearTimeout(a)),f=a.gapMs??900,g=a.client??dD({url:a.url,role:a.role??"web",docId:`stage:${c}`,name:a.name??"web-stage",token:a.token,autoResync:!1}),h=a.voice??null,i=a=>a&&void 0!==b?b:h,j=null,k=null,l=a=>{let b=k;k=null,b?.(a)},m=null,n=null,o=[],p=[],q=0,r=!1,s=!1,t=0,u=null,v=0,w=!1,x=!1,y=!1,z=!1,A=0,B=!1,C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!1},D=new Set;function E(){for(let a of(C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!!n&&void 0!==b},[...D]))a()}function F(){v+=1,u&&e(u),u=null,s&&j?.cancel(),s=!1,j=null}function G(a,b,c=b){F();let e=++v,g=()=>{e!==v||(s&&(s=!1,E()),b&&r&&(u=d(()=>{u=null,e===v&&r&&M()},h?f:0)))},h=i(c);if(h)s=!0,j=h,E(),h.speak(a).then(g,g);else{let c;b&&(u=d(()=>{u=null,g()},"number"==typeof(c=a.holdMs)&&Number.isFinite(c)&&a.holdMs>=0?a.holdMs:Math.min(2e4,Math.max(2500,1200+400*`${a.title??""} ${a.say??""}`.trim().split(/\s+/).filter(Boolean).length))))}}function H(b,c){t+=1,F(),m=b?{...b,nonce:t,...B?{caught:!0}:{}}:null,E(),a.onShow?.(m);let d=!!m&&null!==m.index;m&&(i(d)||c)&&G(m.step,c,d)}function I(a){if(!n)return null;let b=n.def.steps[a];if(!b)return null;let c=b.doc??o[a],d=b.system??p[a];return{step:{...b,...c?{doc:c}:{},...d?{system:d}:{}},index:a,count:n.def.steps.length,title:n.def.settings?.name,origin:n.origin,tourPath:n.path}}function J(a,c,d){var e;let f,g;l(!1),b=d;let h=Array.isArray(a.tour?.steps)?a.tour.steps:[];e=(n={def:{...a.tour,steps:h},path:a.path,origin:a.origin}).def,g=void 0,o=e.steps.map(a=>g=a.doc??g),p=h.map(a=>f=a.system??f),q=Math.min(Math.max(0,a.from??0),Math.max(0,h.length-1)),w=!1,r=c&&h.length>0,H(I(q),r)}function K(a){r=!1,H({step:a.step,index:null,count:null,title:a.title,origin:a.origin,tourPath:a.tour},!1)}function L(a){if(!n)return;let b=n.def.steps.length-1;b<0||(w=!1,H(I(q=Math.min(Math.max(0,Math.floor(a)),b)),r))}function M(){if(n){if(q>=n.def.steps.length-1){let a=r;w=r||w,r=!1,F(),E(),a&&l(!0);return}L(q+1)}}function N(){n&&q>0&&L(q-1)}function O(){n&&n.def.steps.length&&(r=!0,w&&(w=!1,q=0),m?.index!==q||m.caught?H(I(q),!0):(E(),G(m.step,!0)))}function P(){r=!1,F(),E()}function Q(){l(!1),b=void 0,w=!1,n=null,o=[],p=[],q=0,r=!1,H(null,!1)}function R(){if(z)return;z=!0;let a=++A;g.joinStage(c).then(({state:b})=>{a===A&&(z=!1,y=!0,m||n||function(a){B=!0;try{a.tour&&J(a.tour,!1),a.step&&K(a.step)}finally{B=!1}}(b),E())}).catch(()=>{a===A&&(z=!1,E())})}return g.on("stage-step",a=>{a?.stage===c&&a.step&&K(a)}),g.on("stage-load",a=>{a?.stage===c&&a.tour&&J(a,!1!==a.autoplay)}),g.on("stage-control",a=>{a?.stage===c&&function(a){switch(a.action){case"play":return O();case"pause":return P();case"next":return M();case"prev":return N();case"goto":return L(a.index??0);case"stop":return Q()}}(a)}),g.on("marks",b=>a.onMarks?.(b)),g.on("status",a=>{"disconnected"===a||"error"===a?y=!1:"connected"===a&&x&&!y&&R(),E()}),{getSnapshot:()=>C,subscribe:a=>(D.add(a),()=>{D.delete(a)}),connect(){x=!0,R()},disconnect(){x=!1,A+=1,z=!1,y=!1,F(),g.leaveStage(c),g.disconnect()},play:O,pause:P,next:M,prev:N,goto:L,stop:Q,dismiss:function(){if(m){if(null===m.index&&n)return void H(I(q),!1);null===m.index?H(null,!1):Q()}},setVoice(a){void 0===b&&F(),h=a,E()},present:(a,b={})=>Array.isArray(a?.steps)&&a.steps.length?new Promise(d=>{J({stage:c,tour:a,from:b.from??0,autoplay:!1!==b.autoplay,origin:b.origin??"page"},!1!==b.autoplay,b.voice),k=d}):Promise.resolve(!1),sendContext(a){g.emitContext({...a,stage:c,...n?{tour:{path:n.path,title:n.def.settings?.name,index:q,count:n.def.steps.length,playing:r}}:{}})},sendMarks(a){g.emitMarks({...a,stage:c}).catch(()=>{})}}}({...b,voice:b.voice??null,onShow:a=>c.current.onShow?.(a),onMarks:a=>c.current.onMarks?.(a)})),g=d.current,j=(0,i.useSyncExternalStore)(g.subscribe,g.getSnapshot,g.getSnapshot),k=!1!==b.enabled&&!!b.url,(0,i.useEffect)(()=>{if(k)return g.connect(),()=>g.disconnect()},[g,k]),l=b.voice??null,(0,i.useEffect)(()=>{g.setVoice(l)},[g,l]),{...j,play:g.play,pause:g.pause,next:g.next,prev:g.prev,goto:g.goto,stop:g.stop,dismiss:g.dismiss,sendContext:g.sendContext,sendMarks:g.sendMarks,present:g.present}),z=(0,i.useRef)(null),A=(0,i.useRef)(null),B=y.sendContext,C=(0,i.useCallback)(a=>{z.current={...a,stage:m.stage,who:q||void 0,at:new Date().toISOString()},A.current&&clearTimeout(A.current),A.current=setTimeout(()=>B({...a,who:q||void 0}),400)},[m.stage,q,B]);(0,i.useEffect)(()=>()=>{A.current&&clearTimeout(A.current)},[]),(0,i.useEffect)(()=>{z.current&&B({...z.current,who:q||void 0})},[y.index,y.playing,y.tour,B,q]);let[D,E]=(0,i.useState)(0),F=!!y.shown;(0,i.useEffect)(()=>{let a=document.documentElement,b=F?document.querySelector(".stage-caption-host .slc-stage-caption"):null;if(!b||"u"<typeof ResizeObserver)return void a.style.removeProperty("--stage-caption-h");let c=()=>a.style.setProperty("--stage-caption-h",`${Math.ceil(b.getBoundingClientRect().height)+12}px`),d=new ResizeObserver(c);return d.observe(b),c(),()=>{d.disconnect(),a.style.removeProperty("--stage-caption-h")}},[F]);let G=(0,i.useMemo)(()=>({stage:m.stage,connected:"connected"===y.status,lit:u,author:q,setAuthor:a=>{r(a),eY("stateloom.author",a)},listener:t,answerNonce:D,report:C,lastReport:()=>z.current,sendMarks:y.sendMarks,onMarks:a=>(w.current.add(a),()=>{w.current.delete(a)}),shown:y.shown,present:y.present,companion:m.companion,pause:y.pause,stop:y.stop}),[m.stage,m.companion,y.status,y.shown,y.sendMarks,y.present,y.pause,y.stop,u,q,t,D,C]);return(0,h.jsxs)(eW.Provider,{value:G,children:[a,y.shown&&(0,h.jsx)("div",{className:"stage-caption-host",children:(0,h.jsx)(b9,{shown:y.shown,playing:y.playing,speaking:y.speaking,voice:y.ownVoice?void 0:o,onToggleVoice:()=>{let a=!o;p(a),eY("stateloom.stage.voice",a?"1":"0")},onPlay:y.play,onPause:y.pause,onNext:y.next,onPrev:y.prev,onGoto:y.goto,onClose:y.dismiss,onAnswer:()=>E(a=>a+1)})}),m.companion&&(0,h.jsx)(eV,{stage:G,defaultEpisode:m.companionEpisode})]})}let e$="flex h-9 min-w-9 items-center justify-center gap-1 rounded-lg border border-gray-700 bg-gray-900/90 px-2 text-sm text-gray-200 shadow-lg backdrop-blur hover:bg-gray-800";async function e_(a,b){let c=await fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d?.error??`the marks could not be written (${c.status})`);return d}function e0({docPath:a,kind:b,viewport:c,setViewport:d,boxes:e,boardRef:f,focus:g=null,level:j,onReveal:k}){let l=eX(),[m,n]=(0,i.useState)([]),[o,p]=(0,i.useState)(!1),[q,r]=(0,i.useState)(null),[s,t]=(0,i.useState)(null),[u,v]=(0,i.useState)(!1),[w,x]=(0,i.useState)(!1),[y,z]=(0,i.useState)(null),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(null),E=(0,i.useRef)(null),F=(0,i.useRef)(null);F.current=s;let{read:G,markRead:H}=function(a){let[b,c]=(0,i.useState)(()=>({doc:a,read:a?cj(a):{}}));(0,i.useEffect)(()=>{c(b=>b.doc===a?b:{doc:a,read:a?cj(a):{}})},[a]);let d=(0,i.useCallback)(b=>{a&&c(c=>{let d=c.doc===a?c.read:cj(a);if(d[b.id]===(b.replies?.length??0)&&c.doc===a)return c;let e={...d,[b.id]:b.replies?.length??0};try{window.localStorage.setItem(ci(a),JSON.stringify(e))}catch{}return{doc:a,read:e}})},[a]);return{read:b.doc===a?b.read:{},markRead:d}}(a),I=(0,i.useCallback)(()=>{a&&fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>a&&Array.isArray(a.marks)&&n(a.marks)).catch(()=>{})},[a]);(0,i.useEffect)(()=>(n([]),t(null),r(null),I(),window.addEventListener("focus",I),()=>window.removeEventListener("focus",I)),[I]),(0,i.useEffect)(()=>l?.onMarks(b=>{if(!a||b.docId!==a||!Array.isArray(b.marks))return;n(b.marks);let c=function(a){let b=a.change;if(!b||"reply"!==b.action&&"add"!==b.action||!Array.isArray(a.marks))return null;let c=a.marks.findIndex(a=>a&&a.id===b.id);if(c<0)return null;let d=a.marks[c];if("add"===b.action)return d.author?.role==="agent"?{action:"add",mark:d,number:c+1,name:d.author.name||"the agent"}:null;let e=d.replies?.[d.replies.length-1];return e&&e.author?.role==="agent"?{action:"reply",mark:d,number:c+1,name:e.author.name||"the agent"}:null}(b);c&&c.mark.id!==F.current&&(D({id:c.mark.id,text:"reply"===c.action?`${c.name} answered mark ${c.number}`:`${c.name} asked about mark ${c.number}`}),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>D(null),7e3))}),[l,a]),(0,i.useEffect)(()=>(D(null),()=>{E.current&&clearTimeout(E.current)}),[a]);let J=async b=>{if(!a)return!1;x(!0),z(null);try{let c=await e_(a,b);return n(c.marks),l?.sendMarks({docId:a,marks:c.marks,change:c.change}),!0}catch(a){return z(a instanceof Error?a.message:String(a)),!1}finally{x(!1)}},K=l?.lit??null,L=K&&(!K.doc||K.doc===a)?K:null,M=L?.spotlight,N=L?.region??null,P=(0,i.useRef)(-1),Q=(0,i.useRef)(-1),R=(0,i.useRef)(null),T=(0,i.useMemo)(()=>M?.length?bu(e,M):[],[e,M]);(0,i.useEffect)(()=>{if(!L||P.current===L.nonce)return;let a=[...T,...N?[N]:[]];if(!a.length){M?.length&&Q.current!==L.nonce&&(Q.current=L.nonce,k?.(M));return}P.current=L.nonce;let b=()=>{let b=f.current?.getBoundingClientRect();if(!b?.width)return;let c=document.querySelector(".stage-caption-host .slc-stage-caption")?.getBoundingClientRect(),e=c&&c.top<b.bottom?Math.max(0,b.bottom-c.top+8):0,g=Math.max(.4*b.height,b.height-e);d(S(a,b.width,g,{padding:48,maxScale:1}))};b(),R.current&&clearTimeout(R.current),R.current=setTimeout(b,520)},[L,T,N,M,f,d,k]),(0,i.useEffect)(()=>()=>{R.current&&clearTimeout(R.current)},[]);let U=(0,i.useRef)(l?.answerNonce??0);(0,i.useEffect)(()=>{if(!l||l.answerNonce===U.current)return;U.current=l.answerNonce;let a=M?.length?[...M]:L?.focus?[L.focus]:g?[g]:[];v(!1),t(null),r({elements:a,region:N??void 0,listen:!!l.listener})},[l,M,L,g,N]);let V=l?.report;(0,i.useEffect)(()=>{if(!V||!a)return;let d=f.current?.getBoundingClientRect(),e=O(c,{x:0,y:0}),h=d?O(c,{x:d.width,y:d.height}):e;V({doc:a,kind:b,system:void 0,focus:g,...d?.width?{visible:{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(h.x-e.x),height:Math.round(h.y-e.y)}}:{}})},[V,a,b,g,c,f]);let W=l?.companion?eO(a):null,X=function(a,b){let c;if(!a||!b)return null;let d=(c=b.match(/-episode-(\d+)-/))?Number(c[1]):null,e=null===d?"this episode":`episode ${d}`;switch(a){case"listening":return`Mia is listening in ${e}: she answers here`;case"answering":return"Mia is answering";case"answered":return`Mia has answered in ${e}: your mark waits until she listens again`;case"away":return`No seat is listening in ${e}: your mark waits until one does`;default:return null}}(function(a,b){let[c,d]=(0,i.useState)(null);return(0,i.useEffect)(()=>{if(!a||!b)return;let c=!0,e=async()=>{if("u"<typeof document||"visible"===document.visibilityState)try{let b=await fetch(`/api/companion/thread?episode=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await b.json();c&&d({episode:a,state:e.success?e.presence?.state??null:null})}catch{c&&d({episode:a,state:null})}};e();let f=setInterval(()=>void e(),1e4);return()=>{c=!1,clearInterval(f)}},[a,b]),c&&c.episode===a?c.state:null}(W,!!(q||s||u)),W),Y=(0,i.useMemo)(()=>bq(m,G).map(a=>a.id),[m,G]),Z=function(a,b={}){return{forYou:bo(a,"person").length,forAgent:bo(a,"agent").length,unread:bq(a,b).length}}(m,G),$=m.find(a=>a.id===s)??null,_=$?.replies?.length??0;return((0,i.useEffect)(()=>{$&&H($)},[$?.id,_,H]),a)?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(bW,{viewport:c,boxes:e,spotlight:M,region:N,marks:m,unread:Y,selectedMark:s,onSelectMark:a=>{r(null),v(!1),t(b=>b===a?null:a)},marking:o,onDraft:a=>{p(!1),t(null),v(!1),D(null),r(a)},draft:q}),(0,h.jsxs)("div",{className:"stage-board-controls",children:[C&&(0,h.jsx)(ch,{className:"stage-board-notice",onOpen:()=>{var a;return a=C.id,void(r(null),v(!1),p(!1),t(a),D(null))},onDismiss:()=>D(null),children:C.text}),(0,h.jsxs)("button",{type:"button",className:`${e$} ${o?"!border-amber-400 !text-amber-300":""}`,"aria-pressed":o,onClick:()=>{r(null),p(a=>!a)},title:o?"Marking: tap an element, or drag around several. Tap ✎ again to stop.":"Mark something for the agent — tap an element or drag around several",children:[(0,h.jsx)(b8,{}),o&&(0,h.jsx)("span",{className:"text-xs",children:"marking"})]}),(0,h.jsxs)("button",{type:"button",className:e$,"aria-expanded":u,onClick:()=>{r(null),t(null),D(null),v(a=>!a)},title:`Marks on this drawing${Z.forYou?` \xb7 ${Z.forYou} for you`:""}${Z.forAgent?` \xb7 ${Z.forAgent} waiting on the agent`:""}`,"aria-label":`Marks on this drawing: ${Z.forYou} for you${Z.unread?` (${Z.unread} new)`:""}, ${Z.forAgent} waiting on the agent`,children:[(0,h.jsx)(b_,{}),Z.forYou>0&&(0,h.jsxs)("span",{className:`stage-for-you${Z.unread?" stage-for-you--new":""}`,children:[Z.forYou," for you"]}),Z.forAgent>0&&(0,h.jsx)("span",{className:"text-xs text-gray-400",children:Z.forAgent})]})]}),o&&!q&&!C&&(0,h.jsx)("div",{className:"stage-board-hint",role:"status",children:"Tap an element, or drag around several, to say something about it."}),(q||$||u)&&(0,h.jsx)("div",{className:"stage-board-card",children:q?(0,h.jsx)(ce,{elements:q.elements,region:q.region,author:l?.author??"",onAuthorChange:l?.setAuthor,listener:l?.listener,listenAtOnce:!!q.listen,busy:w,error:y,note:X,onCancel:()=>{r(null),z(null)},onSubmit:async({text:a,kind:b,author:c})=>{await J({action:"add",mark:{text:a,kind:b,elements:q.elements,region:q.region,level:j,author:{name:c||"someone"}}})&&r(null)}},`${q.elements.join(",")}|${q.region?JSON.stringify(q.region):""}`):$?(0,h.jsx)(cf,{mark:$,number:m.indexOf($)+1,listener:l?.listener,busy:w,error:y,note:X,onClose:()=>t(null),onReply:a=>void J({action:"reply",id:$.id,text:a,author:{name:l?.author||"someone"}}),onResolve:()=>void J({action:"resolve",id:$.id}),onReopen:()=>void J({action:"reopen",id:$.id}),onRemove:async()=>{await J({action:"remove",id:$.id})&&t(null)}}):(0,h.jsx)(cg,{marks:m,unread:Y,selected:s,onSelect:a=>{v(!1),t(a)},onCopy:()=>{var b,c;let d,e;if(!a)return;let f=(b=l?.lastReport()??null,d=(c=[{doc:a,marks:m.filter(a=>"resolved"!==a.status)}]).reduce((a,b)=>a+b.marks.length,0),e=function(a){if(!a||!a.doc)return"No canvas has said what it is showing.";let b=[`${a.who?`${a.who} is`:"The canvas is"} on ${bv(a.doc)}${a.kind?` (${a.kind})`:""}`];a.system&&b.push(`as a member of ${bv(a.system)}`),a.focus&&b.push(`with ${a.focus} in hand`);let c=b.join(", ")+".";return a.tour&&(c+=` Tour ${a.tour.title?`'${a.tour.title}' `:""}at step ${a.tour.index+1} of ${a.tour.count}, ${a.tour.playing?"playing":"paused"}.`),a.at&&(c+=` (reported ${a.at})`),c}(b),d?`${e}
11
+ ${a}`)}l(!0)};return(0,h.jsxs)("div",{className:"flex flex-col gap-1.5 px-2 py-1.5 bg-gray-900 border-b border-gray-800 md:flex-row md:flex-wrap md:items-center md:px-3",children:[(0,h.jsxs)("div",{className:"toolbar-ident",children:[(0,h.jsx)("input",{ref:A,type:"file",accept:".json,.smdf.json",onChange:a=>{let b=a.target.files?.[0];if(!b)return;let c=new FileReader;c.onload=a=>{e(a.target?.result,b.name)},c.readAsText(b),a.target.value=""},className:"hidden"}),(0,h.jsxs)("span",{className:"text-xs text-gray-400 mr-1 truncate max-w-[50vw] md:max-w-none",children:[b??"untitled.smdf.json",d&&(0,h.jsx)("span",{className:"text-yellow-500 ml-0.5",children:"●"})]}),(0,h.jsx)(el,{}),"synced"===u&&(0,h.jsx)("span",{className:"text-[10px] text-emerald-500",title:"In sync with disk",children:"⌁ synced"}),"remote-changed"===u&&(0,h.jsx)("span",{className:"text-[10px] text-amber-400",title:v??"",children:"↻ remote changed"}),"error"===u&&(0,h.jsxs)("span",{className:"inline-flex items-center gap-0.5 text-[10px] text-red-400",title:v??"",children:[(0,h.jsx)(em,{size:11})," disk error"]}),"idle"===u&&(0,h.jsx)("span",{className:"text-[10px] text-gray-600",title:v??"No file bound",children:"○ no disk"}),(0,h.jsx)(en,{}),(0,h.jsx)("div",{className:"flex-1"})]}),(0,h.jsxs)("div",{className:"toolbar-strip",children:[(0,h.jsx)("button",{onClick:q,disabled:0===s.length,className:"toolbar-btn disabled:opacity-30",title:"Undo (Ctrl+Z)","aria-label":"Undo",children:(0,h.jsx)(ed,{name:"undo"})}),(0,h.jsx)("button",{onClick:r,disabled:0===t.length,className:"toolbar-btn disabled:opacity-30",title:"Redo (Ctrl+Y)","aria-label":"Redo",children:(0,h.jsx)(ed,{name:"redo"})}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:p,className:"toolbar-btn",title:"Arrange states into layers (auto-layout)",children:[(0,h.jsx)(ed,{name:"arrange"})," Arrange"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>o("select"===n?"transition":"select"),className:`toolbar-btn ${"transition"===n?"!bg-amber-700 !text-white":""}`,title:"transition"===n?"Exit draw mode (Esc)":"Draw transition mode",children:[(0,h.jsx)(ed,{name:"draw"})," ","transition"===n?"Drawing":"Draw"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsx)("button",{onClick:()=>A.current?.click(),className:"toolbar-btn",title:"Open local .smdf.json (browser)","aria-label":"Open a local file",children:(0,h.jsx)(ed,{name:"open"})}),(0,h.jsxs)("button",{onClick:P,disabled:F,className:"toolbar-btn disabled:opacity-40",title:"Save to disk (STATELOOM_PROJECT_FILE)",children:[(0,h.jsx)(ed,{name:"save"})," Disk"]}),(0,h.jsx)("button",{onClick:R,className:"toolbar-btn",title:"Reload from disk","aria-label":"Reload from disk",children:(0,h.jsx)(ed,{name:"reload"})}),(0,h.jsx)("button",{onClick:()=>{let a=new Blob([f()],{type:"application/json"}),c=URL.createObjectURL(a),d=document.createElement("a");d.href=c,d.download=b??"statemachine.smdf.json",d.click(),URL.revokeObjectURL(c)},className:"toolbar-btn",title:"Download as file","aria-label":"Download as file",children:(0,h.jsx)(ed,{name:"download"})}),(0,h.jsx)("select",{value:H,onChange:a=>{I(a.target.value),O(null),M(null)},className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",title:"Export format",children:d5.map(a=>(0,h.jsx)("option",{value:a,children:d6[a]},a))}),(0,h.jsx)("button",{onClick:Q,disabled:J,className:`toolbar-btn disabled:opacity-40 ${L?"!text-red-400":""}`,title:L??`Export the board as ${d6[H]}`,children:J?"…":(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(ed,{name:"image"})," Export"]})}),N&&!L&&(0,h.jsxs)("span",{className:"text-[10px] text-emerald-500 truncate max-w-[40vw] md:max-w-[16rem]",title:N,children:["⤓ ",N]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),B?(0,h.jsxs)("div",{className:"flex items-center gap-1",children:[(0,h.jsx)("input",{autoFocus:!0,className:"bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-xs text-gray-200 w-32 md:w-24",placeholder:"State name...",value:D,onChange:a=>E(a.target.value),onKeyDown:a=>{"Enter"===a.key&&S(),"Escape"===a.key&&C(!1)}}),(0,h.jsx)("button",{onClick:S,className:"toolbar-btn-sm","aria-label":"Add the state",children:(0,h.jsx)(ed,{name:"check"})}),(0,h.jsx)("button",{onClick:()=>C(!1),className:"toolbar-btn-sm","aria-label":"Cancel",children:"✕"})]}):(0,h.jsxs)("button",{onClick:()=>C(!0),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"plus"})," State"]}),(0,h.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,h.jsxs)("button",{onClick:()=>j(),className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"check"})," Validate"]}),(0,h.jsxs)("select",{value:T,onChange:a=>U(a.target.value),className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",children:[(0,h.jsx)("option",{value:"python",children:"Python"}),(0,h.jsx)("option",{value:"typescript",children:"TypeScript"})]}),(0,h.jsxs)("button",{onClick:W,className:"toolbar-btn",children:[(0,h.jsx)(ed,{name:"bolt"})," Generate"]}),(0,h.jsxs)("button",{onClick:V,className:"toolbar-btn",title:"Generate RISE rispec markdown",children:[(0,h.jsx)(ed,{name:"scroll"})," RISE"]}),(0,h.jsxs)("button",{onClick:()=>l(!k),className:`toolbar-btn ${k?"text-blue-400":""}`,children:[(0,h.jsx)(ed,{name:"code"})," Code"]})]})]})}function ep(){let a=d_(a=>a.generatedCode),b=d_(a=>a.showCodePreview),c=d_(a=>a.setShowCodePreview);return b?(0,h.jsx)("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 p-2 md:p-0",children:(0,h.jsxs)("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-xl w-full max-h-[85dvh] md:w-[80%] md:max-w-3xl md:max-h-[80dvh] flex flex-col",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-800",children:[(0,h.jsx)("h3",{className:"text-sm font-semibold text-gray-300",children:"Generated Definition (JSON)"}),(0,h.jsx)("button",{onClick:()=>c(!1),className:"text-gray-500 hover:text-gray-300 text-lg min-h-11 min-w-11 md:min-h-0 md:min-w-0","aria-label":"Close preview",children:"✕"})]}),(0,h.jsx)("pre",{className:"flex-1 overflow-auto overscroll-contain p-4 text-[11px] leading-relaxed text-green-400 font-mono md:text-sm",children:a??"No code generated yet"}),(0,h.jsx)("div",{className:"flex justify-end px-4 py-2 border-t border-gray-800",children:(0,h.jsx)("button",{onClick:()=>{a&&navigator.clipboard.writeText(a)},className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-4 py-3 rounded md:px-3 md:py-1",children:"Copy to Clipboard"})})]})}):null}function eq(){let a=d_(a=>a.applyRemote),b=d_(a=>a.setRemoteStatus),c=d_(a=>a.setRemoteMtime),d=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{let e=!1,f=(0,ek.docQuery)(d);async function g(){try{let a=await fetch(`/api/file${f}`,{cache:"no-store"});if(!a.ok)return null;return await a.json()}catch{return null}}(async()=>{let c=await g();e||(c?.path&&d_.getState().setDocPath(c.path),c?.exists&&c.content?a(c.content,c.mtime,c.path.split("/").pop()):b("idle",c?`No file at ${c.path}`:null))})();let h=new EventSource(`/api/watch${f}`);return h.addEventListener("hello",a=>{try{let b=JSON.parse(a.data);"number"==typeof b?.mtime&&c(b.mtime)}catch{}}),h.addEventListener("change",async d=>{let e=0;try{e=JSON.parse(d.data)?.mtime??0}catch{}if(e<=(d_.getState().remoteMtime??0))return;let f=await g();f?.exists&&f.content&&(d_.getState().dirty?(b("remote-changed",`Disk changed at ${new Date(f.mtime).toLocaleTimeString()} — local has unsaved edits`),c(f.mtime)):a(f.content,f.mtime,f.path.split("/").pop()))}),h.addEventListener("error",()=>{b("error","Watch stream disconnected")}),()=>{e=!0,h.close()}},[a,b,c,d]),null}function er({url:a}){let b=(0,ek.useRequestedDoc)();return(0,i.useEffect)(()=>{if(!a)return;let c=!1,d=null,e=null,f=null,g=null;return(async()=>{let h="";try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{cache:"no-store"});a.ok&&(h=(await a.json())?.path??"")}catch{}c||(h&&d_.getState().setDocPath(h),(d=dL({url:a,role:"web",docId:h,name:"web-designer",onFull:a=>{d_.getState().applyRemote(JSON.stringify({stateMachine:a.def}),a.mtime??Date.now(),h&&h.split("/").pop()||void 0),g=a.def},onPatch:a=>{d_.getState().applyRemoteOps(a.ops,a.mtime??Date.now(),a.seq),g=d_.getState().definition},onPresence:a=>{d_.getState().setPresence(a)}})).connect(),e=d_.subscribe((a,b)=>{a.definition===b.definition||a._applyingRemote||(f&&clearTimeout(f),f=setTimeout(()=>{var a,b;let c,e;if(!d||"connected"!==d.getSnapshot().status)return;let f=d_.getState().definition;if(null===g){d.emitFull(f),g=f;return}let h=(a=g,b=f,c=a??{settings:{namespace:"",asynchronous:!1},events:[],state:{name:b.state.name,states:[]}},function(a,b,c){let d={},e=!1,f=new Set([...Object.keys(a.settings),...Object.keys(b.settings)]),g=a.settings,h=b.settings;for(let a of f)q(g[a],h[a])||void 0===h[a]||(d[a]=h[a],e=!0);void 0!==a.settings.notes&&void 0===b.settings.notes&&(d.notes="",e=!0),e&&c.push({op:"settings.update",patch:d})}(c,b,e=[]),function(a,b,c){let d=a.events,e=b.events,f=Math.min(d.length,e.length);for(let a=0;a<f;a++)!function(a,b,c,d){let e={},f=!1;for(let a of["name","file","feeder","description","timers"])q(b[a],c[a])||void 0===c[a]||(e[a]=c[a],f=!0);f&&d.push({op:"eventSource.update",index:a,patch:e});let g=b.events??[],h=c.events??[],i=new Set(h.map(a=>a.id));for(let a of g)i.has(a.id)||d.push({op:"event.remove",id:a.id});let j=g.filter(a=>i.has(a.id)),k=0;for(;k<h.length;){let b=h[k];k<j.length&&j[k].id===b.id?(function(a,b,c){let d={},e=!1;for(let c of["name","description","preAction","postAction"])q(a[c],b[c])||void 0===b[c]||(d[c]=b[c],e=!0);e&&c.push({op:"event.update",id:b.id,patch:d})}(j[k],b,d),function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++)if(!q(b[f],c[f])){let e={};b[f].name!==c[f].name&&(e.name=c[f].name),b[f].type!==c[f].type&&(e.type=c[f].type),d.push({op:"parameter.update",eventId:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"parameter.add",eventId:a,parameter:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"parameter.remove",eventId:a,index:e})}(b.id,j[k].parameters??[],b.parameters??[],d)):(d.push({op:"event.add",sourceIndex:a,event:b,index:k}),j.splice(k,0,b)),k++}}(a,d[a],e[a],c);for(let a=d.length;a<e.length;a++)c.push({op:"eventSource.add",source:e[a]});for(let a=d.length-1;a>=e.length;a--)c.push({op:"eventSource.remove",index:a})}(c,b,e),function(a,b,c){let d=o(a.state),e=o(b.state),f=new Map(d.map(a=>[a.name,a])),g=new Map(e.map(a=>[a.name,a])),h=p(a.state),i=p(b.state),j=[];for(let a of e){if(f.has(a.name))continue;let b=i.get(a.name)??null,{states:d,transitions:e,...g}=a;c.push({op:"state.add",parent:b,state:{...g}}),e&&e.length>0&&j.push({state:a.name,transitions:e})}for(let a of e){if(!f.has(a.name))continue;let b=h.get(a.name)??null,d=i.get(a.name)??null;b!==d&&null!==d&&c.push({op:"state.nest",child:a.name,newParent:d})}for(let a of e){let b=f.get(a.name);if(!b)continue;let d={},e=!1;q(b.kind,a.kind)||void 0===a.kind||(d.kind=a.kind,e=!0),q(b.description,a.description)||void 0===a.description||(d.description=a.description,e=!0),q(b.notes,a.notes)||(d.notes=a.notes??"",e=!0),q(b.prompt,a.prompt)||(d.prompt=a.prompt??"",e=!0),e&&c.push({op:"state.update",name:a.name,patch:d}),r(a.name,"onEntry",b.onEntry?.actions??[],a.onEntry?.actions??[],c),r(a.name,"onExit",b.onExit?.actions??[],a.onExit?.actions??[],c)}for(let a of j)a.transitions.forEach((b,d)=>{c.push({op:"transition.add",state:a.state,transition:b,index:d})});for(let a of e){let b=f.get(a.name);b&&function(a,b,c,d){let e=Math.min(b.length,c.length);for(let f=0;f<e;f++){if(q(b[f],c[f]))continue;let e={};for(let a of["event","nextState","condition","description","actions"])q(b[f][a],c[f][a])||void 0===c[f][a]||(e[a]=c[f][a]);Object.keys(e).length>0&&d.push({op:"transition.update",state:a,index:f,patch:e})}for(let b=e;b<c.length;b++)d.push({op:"transition.add",state:a,transition:c[b],index:b});for(let e=b.length-1;e>=c.length;e--)d.push({op:"transition.remove",state:a,index:e})}(a.name,b.transitions??[],a.transitions??[],c)}for(let a=d.length-1;a>=0;a--){let b=d[a];if(g.has(b.name))continue;let e=b.transitions??[];for(let a=e.length-1;a>=0;a--)c.push({op:"transition.remove",state:b.name,index:a});c.push({op:"state.remove",name:b.name})}}(c,b,e),e);0!==h.length&&(d.emitPatch(h),g=f)},60))}))})(),()=>{c=!0,f&&clearTimeout(f),e&&e(),d&&d.disconnect()}},[a,b]),null}function es(){let a=process.env.NEXT_PUBLIC_STATELOOM_BRIDGE_URL??process.env.NEXT_PUBLIC_SMCRAFT_BRIDGE_URL;return"string"==typeof a&&a.length>0?a:void 0}let et=null;function eu(){return et||(et=(async()=>{let a=es()??null;try{let b=await fetch("/api/config",{cache:"no-store"});if(b.ok){let c=await b.json();return{bridgeUrl:c.bridgeUrl||a,projectFile:c.projectFile??null,stage:c.stage??null,companion:!0===c.companion,companionEpisode:c.companionEpisode??null}}}catch{}return{bridgeUrl:a,projectFile:null,stage:null,companion:!1,companionEpisode:null}})())}function ev(){let a=es(),[b,c]=(0,i.useState)(a);return((0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&b.bridgeUrl&&c(b.bridgeUrl)}),()=>{a=!1}},[]),"string"==typeof b&&b.length>0)?(0,h.jsx)(er,{url:b}):(0,h.jsx)(eq,{})}function ew(a){return Number.isFinite(a)?Math.min(1.75,Math.max(.75,a)):1}function ex(a){"u">typeof document&&(document.documentElement.style.fontSize=`${16*ew(a)}px`)}let ey=1,ez=!1,eA=new Set;function eB(){return ez||(ez=!0,ey=1),ey}function eC(){return 1}function eD(a){return eA.add(a),()=>{eA.delete(a)}}function eE(a,b){let c=ew(a);if(ex(c),b,ez=!0,c!==ey)for(let a of(ey=c,eA))a()}function eF(a,b){return Math.max(1,Math.hypot(b.clientX-a.clientX,b.clientY-a.clientY))}function eG(a,b){for(let c=0;c<a.length;c++)if(a[c].identifier===b)return a[c];return null}function eH(){let a=(0,i.useSyncExternalStore)(eD,eB,eC),b=(0,i.useRef)(null),c=(0,i.useRef)(null),d=(0,i.useRef)(null);(0,i.useEffect)(()=>{ex(a)},[a]);let e=(0,i.useCallback)(a=>{c.current=a,null===d.current&&(d.current=requestAnimationFrame(()=>{d.current=null,null!==c.current&&eE(c.current,!1)}))},[]),f=(0,i.useCallback)(()=>{c.current=null,eE(1,!0)},[]);return((0,i.useEffect)(()=>{let a=()=>{let a=b.current;if(b.current=null,!a?.engaged)return;null!==d.current&&(cancelAnimationFrame(d.current),d.current=null);let e=c.current??eB();c.current=null,eE(ew(e),!0)},f=c=>{if(2!==c.touches.length){b.current&&a();return}let[d,e]=[c.touches[0],c.touches[1]];d2(d.target)||d2(e.target)||(b.current={a:d.identifier,b:e.identifier,startScale:eB(),startDist:eF(d,e),engaged:!1})},g=a=>{let c=b.current;if(!c)return;let d=eG(a.touches,c.a),f=eG(a.touches,c.b);if(!d||!f)return;a.preventDefault();let g=eF(d,f);if(!c.engaged){if(12>Math.abs(g-c.startDist))return;c.engaged=!0,c.startDist=g;return}e(ew(c.startScale*(g/c.startDist)))},h=c=>{let d=b.current;d&&(eG(c.touches,d.a)&&eG(c.touches,d.b)||a())};return document.addEventListener("touchstart",f,{passive:!0,capture:!0}),document.addEventListener("touchmove",g,{passive:!1,capture:!0}),document.addEventListener("touchend",h,{passive:!0,capture:!0}),document.addEventListener("touchcancel",h,{passive:!0,capture:!0}),()=>{document.removeEventListener("touchstart",f,{capture:!0}),document.removeEventListener("touchmove",g,{capture:!0}),document.removeEventListener("touchend",h,{capture:!0}),document.removeEventListener("touchcancel",h,{capture:!0}),null!==d.current&&cancelAnimationFrame(d.current)}},[e]),1===a)?null:(0,h.jsxs)("div",{className:"ui-scale-pill",role:"status","aria-live":"polite",children:[(0,h.jsxs)("span",{children:["UI ",Math.round(100*a),"%"]}),(0,h.jsx)("button",{type:"button",onClick:f,"aria-label":"Reset interface size to 100 percent",children:"Reset"})]})}var eI=i;class eJ extends eI.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,b){console.error(`[stateloom] the ${this.props.what} could not be drawn:`,a,b.componentStack)}componentDidUpdate(a){this.state.error&&a.resetKey!==this.props.resetKey&&this.setState({error:null})}render(){let{error:a}=this.state;return a?(0,h.jsx)("div",{role:"alert",className:"flex h-full w-full items-center justify-center p-6 text-center text-sm text-amber-300",children:(0,h.jsxs)("p",{className:"max-w-md",children:["This ",this.props.what," cannot be drawn: ",a.message,". The file on disk is unchanged — correct it in the panel, in the file, or with the agent that wrote it."]})}):this.props.children}}function eK({locked:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,h.jsx)("rect",{x:"5",y:"11",width:"14",height:"9",rx:"2"}),(0,h.jsx)("path",{d:a?"M8 11V8a4 4 0 0 1 8 0v3":"M8 11V8a4 4 0 0 1 7.5-1.9"})]})}function eL(a){let{onClose:b,restVh:c,tallVh:d}=a,[e,f]=(0,i.useState)(!1),[g,h]=(0,i.useState)(null),j=(0,i.useRef)(null),k=()=>{f(!1),b()},l=a=>{let b=j.current;if(!b||b.id!==a.pointerId)return;j.current=null;let c=a.clientY-b.y;if(h(null),6>Math.abs(c))return f(a=>!a);if(c<=-50)return f(!0);if(c>=80){if(e&&c<260)return f(!1);k()}},m=e?d:c,n=null!==g;return{zoneProps:{onPointerDown:a=>{a.target.closest("button")||(j.current={y:a.clientY,id:a.pointerId},a.currentTarget.setPointerCapture(a.pointerId),h(0))},onPointerMove:a=>{let b=j.current;b&&b.id===a.pointerId&&h(a.clientY-b.y)},onPointerUp:l,onPointerCancel:l,style:{touchAction:"none",cursor:"grab"}},sheetStyle:{"--sheet-h":n&&g<0?`min(calc(${m}dvh + ${-g}px), ${d}dvh)`:`${m}dvh`,...n?{transition:"none"}:{},...n&&g>0?{transform:`translateY(${g}px)`}:{}},close:k}}let eM="stateloom:focus-request",eN="stateloom:system-changed",eO="stateloom:system-found",eP="stateloom:strip-note";function eQ(a){let[b,c]=(0,i.useState)(null);return(0,i.useEffect)(()=>{let a=()=>c(null);a();let b=["popstate",ek.DOC_CHANGE_EVENT,"stateloom:focus",eM,eO];for(let c of b)window.addEventListener(c,a);return()=>{for(let c of b)window.removeEventListener(c,a)}},[a]),b}function eR(a){let b=new URL(window.location.href),c=b.searchParams.get("doc")!==a.doc;b.searchParams.set("doc",a.doc);let d=void 0===a.system?b.searchParams.get("system"):a.system;d?b.searchParams.set("system",d):b.searchParams.delete("system"),a.focus?b.searchParams.set("focus",a.focus):b.searchParams.delete("focus"),c?window.history.pushState({},"",b):window.history.replaceState(window.history.state,"",b),c&&window.dispatchEvent(new Event(ek.DOC_CHANGE_EVENT)),window.dispatchEvent(new Event(eM))}function eS(a){}function eT(){let[a,b]=(0,i.useState)({focus:null,nonce:0});return(0,i.useEffect)(()=>{let a=()=>b(a=>({focus:null,nonce:a.nonce+1}));a();let c=["popstate",ek.DOC_CHANGE_EVENT,eM];for(let b of c)window.addEventListener(b,a);return()=>{for(let b of c)window.removeEventListener(b,a)}},[]),a}var eU=a.i(19933);let eV="stateloom:mark-request",eW=null,eX="/api/companion/",eY="stateloom.companion.autoplay",eZ="stateloom.companion.episode",e$=/^\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+$/;function e_(a){let b=a?.match(/(?:^|\/)(\d{4}-\d{2}-\d{2}-episode-\d+-[a-z0-9-]+)\/diagrams\/[^/]+$/);return b?b[1]:null}function e0(a){try{return window.localStorage.getItem(a)}catch{return null}}function e1(a,b){try{window.localStorage.setItem(a,b)}catch{}}let e2=a=>{let b=new Date(a);return Number.isNaN(b.getTime())?"":b.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})},e3=a=>"starting"===a||"recording"===a||"sending"===a,e4={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null},e5={episode:null,items:[],presence:null,waiting:null,error:null};function e6({stage:a,defaultEpisode:b}){let[c,d]=(0,i.useState)(!1),[e,f]=(0,i.useState)(()=>"0"!==e0(eY)),[g,j]=(0,i.useState)(()=>{let a=null,c=e0(eZ);return(a&&e$.test(a)?a:null)??e_((0,ek.requestedDoc)())??(c&&e$.test(c)?c:null)??b}),[k,l]=(0,i.useState)([]),[m,n]=(0,i.useState)(e4),[o,p]=(0,i.useState)(e5),[q,r]=(0,i.useState)(null),[s,t]=(0,i.useState)([]),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(null),[y,z]=(0,i.useState)(()=>Date.now()),A=(0,i.useRef)(a),B=(0,i.useRef)(g),C=(0,i.useRef)(e);(0,i.useEffect)(()=>{A.current=a,B.current=g,C.current=e});let D=(0,i.useRef)(e4),E=(0,i.useRef)(null),F=(0,i.useRef)([]),G=(0,i.useRef)(!1),H=(0,i.useRef)([]),I=(0,i.useRef)(null),J=(0,i.useRef)(null),K=(0,i.useMemo)(()=>dM({recordings:!0,speech:!1}),[]),L=a=>{E.current=a,r(a)},M=(0,i.useRef)(async()=>{}),N=(0,i.useCallback)(async(a,b=0)=>{L(a.id),t(b=>b.filter(b=>b!==a.id)),a.steps?.length&&window.matchMedia("(max-width: 767px)").matches&&d(!1);let c=F.current.length;v(c?`${c} more of Mia's replies wait after this one.`:null);let e=await A.current.present(function(a,b,c="Mia"){let d=new Date(a.at),e=Number.isNaN(d.getTime())?`${c}'s reply`:`Reply at ${d.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}`,f=!a.unvoiced,g=(a,c)=>(function(a,b){if(!b)return;if(/^https?:\/\//.test(b))return b;let c=b.replace(/^\/?api\//,"");return`${a.endsWith("/")?a:`${a}/`}${c}`})(b,a||(f?c:null));return{settings:{namespace:"companion",name:e,author:c},steps:a.steps?.length?a.steps.map(({audio:b,...c},d)=>{let e=g(b,`api/replies/${a.id}/steps/${d}/audio`);return{...c,...e?{audio:e}:{}}}):[{say:a.text,...g(a.audio,`api/replies/${a.id}/audio`)?{audio:g(a.audio,`api/replies/${a.id}/audio`)}:{}}]}}(a,eX,"Mia"),{voice:K,origin:"Mia",from:b});if(E.current!==a.id||(L(null),G.current))return;if(!e){F.current=[];return}let f=F.current.shift();f&&!e3(D.current.state)?M.current(f):f&&F.current.unshift(f)},[K]);(0,i.useEffect)(()=>{M.current=N},[N]);let O=(0,i.useCallback)(a=>{let b=a.id;if(!C.current)return void t(a=>a.includes(b)?a:[...a,b]);if(e3(D.current.state)||E.current){t(a=>a.includes(b)?a:[...a,b]),F.current.some(a=>a.id===b)||F.current.push(a),v(e3(D.current.state)?`Mia replied at ${e2(a.at)}. Her voice waits until you have sent your take.`:`Mia replied again at ${e2(a.at)}. It plays when this one ends.`);return}M.current(a)},[]);(0,i.useEffect)(()=>{let a=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.everyMs??1e4,e=a.waitEveryMs??4e3,f=a.waitForMs??9e5,g={episode:null,items:[],presence:null,waiting:null,error:null},h=new Set,i=!1,j=null,k=null,l="",m=0,n=b=>{g={...g,...b},a.onChange?.(g)};async function o(){let d=g.episode;if(!d)return;let e=m;try{var j;let o=await c(`${b}thread?episode=${encodeURIComponent(d)}&include=marks`,{cache:"no-store"}),p=await o.json();if(e!==m)return;if(!p.success)return n({error:p.error??`HTTP ${o.status}`});let q=function(a){if(!Array.isArray(a))return[];let b=[];for(let c of a)if(c&&"object"==typeof c){if("take"===c.kind&&dN(c.take))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("reply"===c.kind&&dN(c.id))b.push({...c,text:dN(c.text),at:dN(c.at)});else if("mark"===c.kind&&dN(c.id)&&dN(c.doc)){let a=c.region;b.push({kind:"mark",id:dN(c.id),doc:dN(c.doc),...dN(c.drawing)?{drawing:dN(c.drawing)}:{},...dN(c.title)?{title:dN(c.title)}:{},elements:Array.isArray(c.elements)?c.elements.filter(a=>"string"==typeof a&&!!a):[],...a&&"object"==typeof a&&"number"==typeof a.x?{region:a}:{},text:dN(c.text),author:dO(c.author),at:dN(c.at),...dN(c.lastAt)?{lastAt:dN(c.lastAt)}:{},status:"answered"===c.status||"resolved"===c.status?c.status:"open",replies:(Array.isArray(c.replies)?c.replies:[]).flatMap(a=>{let b=a&&"object"==typeof a?a:{};return dN(b.text)?[{author:dO(b.author),text:dN(b.text),at:dN(b.at)}]:[]})})}}return b}(p.items),r=(j=p.presence,q.map(a=>"reply"===a.kind?`${a.id}:${+!!a.audio}:${a.feedback??""}`:"mark"===a.kind?`m${a.id}:${a.status}:${a.replies.length}`:`${a.take}:${a.text.length}`).join(",")+`|${j?.state??""}`),s=q.filter(a=>"reply"===a.kind&&!h.has(a.id));for(let a of s)h.add(a.id);if((r!==l||g.error)&&(l=r,n({items:q,presence:p.presence??null,error:null})),i)for(let b of s)a.onReply?.(b);i=!0;let t=g.waiting;t&&(q.some(a=>"reply"===a.kind&&a.take===t.take)||Date.now()-t.since>f)&&(k&&clearInterval(k),k=null,n({waiting:null}))}catch(a){e===m&&n({error:a instanceof Error?a.message:String(a)})}}let p=()=>{"visible"===document.visibilityState&&o()};return"u">typeof document&&document.addEventListener("visibilitychange",p),{getSnapshot:()=>g,setEpisode(a){a!==g.episode&&(m+=1,h.clear(),i=!1,l="",k&&clearInterval(k),k=null,n({episode:a,items:[],presence:null,waiting:null,error:null}),a?(j&&clearInterval(j),j=setInterval(()=>{("u"<typeof document||"visible"===document.visibilityState)&&o()},d),o()):j&&(clearInterval(j),j=null))},refresh:o,waitFor(a){n({waiting:{take:a,since:Date.now()}}),k&&clearInterval(k),k=setInterval(()=>void o(),e),o()},async feedback(a,d){await c(`${b}replies/${a}/feedback`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({value:d})}),l="",await o()},destroy(){for(let a of(m+=1,[j,k]))a&&clearInterval(a);j=k=null,"u">typeof document&&document.removeEventListener("visibilitychange",p)}}}({base:eX,onChange:p,onReply:O}),b=function(a){let b=a.base.endsWith("/")?a.base:`${a.base}/`,c=a.fetch??((...a)=>fetch(...a)),d=a.partEveryMs??1e4,e=a.beatEveryMs??15e3,f=a.getUserMedia??(a=>navigator.mediaDevices.getUserMedia(a)),g=a.createRecorder??(a=>{let b,c,d,e,f,g,h,i;return c=(b=new(window.AudioContext??window.webkitAudioContext)).createMediaStreamSource(a),d=b.createScriptProcessor(4096,1,1),e=[],f=[],g=!1,h=null,i={mimeType:"audio/wav",ondataavailable:null,onstop:null,onerror:null,start(a=1e3){d.onaudioprocess=a=>{let b=a.inputBuffer.getChannelData(0),c=new Int16Array(b.length);for(let a=0;a<b.length;a++)c[a]=Math.max(-32768,Math.min(32767,Math.round(32767*b[a])));e.push(c),f.push(c)},c.connect(d),d.connect(b.destination),h=setInterval(()=>{if(!f.length)return;let a=g?[]:[dP(0x7fffffff,b.sampleRate)];g=!0,a.push(...f.map(a=>a.buffer)),f=[],i.ondataavailable?.({data:new Blob(a,{type:"audio/wav"})})},a)},stop(){h&&clearInterval(h),h=null;try{c.disconnect(),d.disconnect()}catch{}b.close().catch(()=>{}),i.whole=new Blob([dP(e.reduce((a,b)=>a+b.byteLength,0),b.sampleRate),...e.map(a=>a.buffer)],{type:"audio/wav"}),i.onstop?.()}}}),h={state:"idle",seconds:0,held:0,message:"",error:!1,stored:null,...!a.createRecorder?{unavailable:"this browser cannot record audio"}:{}},i=b=>{h={...h,...b},a.onChange?.(h)},j=null,k=null,l=[],m="",n="",o=null,p=0,q=null,r=null,s=null,t=null,u=!1,v=()=>p?Math.floor((Date.now()-p)/1e3):0,w=()=>(k?.mimeType||"audio/mp4").split(";")[0]||"audio/mp4",x=(a="")=>`episode=${encodeURIComponent(n)}${m?`&rec=${m}`:""}${o?`&context=${encodeURIComponent(o)}`:""}${a}`;function y(a){n&&c(`${b}recorder`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({episode:n,recording:a})}).catch(()=>{})}function z(a,d={}){m&&c(`${b}takes/diagnostic`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({rec:m,episode:n,kind:a,at:new Date().toISOString(),mime:k?.mimeType??null,visibility:"u">typeof document?document.visibilityState:"",agent:"u">typeof navigator?navigator.userAgent:"",source:"stateloom-canvas",...d}),keepalive:!0}).catch(()=>{})}function A(){for(let a of[r,s,t])a&&clearInterval(a);r=s=t=null}function B(){try{j?.getTracks().forEach(a=>a.stop())}catch{}j=null}async function C(){if(!m||u||!l.length)return;let a=new Blob(l,{type:w()});if(a.size<=h.held)return;u=!0;let d=m;try{let e=await c(`${b}takes/part?${x(`&offset=${h.held}`)}`,{method:"POST",headers:{"content-type":w()},body:a.slice(h.held)}),f=await e.json();d===m&&"number"==typeof f.bytes&&i({held:f.bytes})}catch{}finally{u=!1}}async function D(){let b;if("idle"!==h.state&&"retry"!==h.state)return;if(h.unavailable)return i({message:`Cannot record: ${h.unavailable}.`,error:!0});if(!(n=a.episode()??""))return i({message:"Choose the episode this take belongs to.",error:!0});let c=a.context?.()??null;o=c?JSON.stringify(c).slice(0,4e3):null,q=null,i({state:"starting",message:"",error:!1,held:0,seconds:0}),y(!0);try{b=await f({audio:!0})}catch(a){return y(!1),i({state:"idle",message:`Microphone refused: ${a instanceof Error?a.message:String(a)}`,error:!0})}if("starting"!==h.state)return void b.getTracks().forEach(a=>a.stop());j=b,l=[],m=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`;try{k=g(b)}catch(a){return B(),y(!1),i({state:"idle",message:`This browser refused to record: ${a instanceof Error?a.message:String(a)}`,error:!0})}k.ondataavailable=a=>{a.data&&a.data.size&&l.push(a.data)},k.onerror=a=>{let b=v(),c=new Blob(l,{type:w()});if(z("recorder-error",{name:a?.error?.name??"",message:a?.error?.message??"",seconds:b,bytes:c.size,held:h.held}),A(),B(),y(!1),c.size)q=c,i({state:"retry",message:`The recorder stopped with an error after ${Math.floor(b/60)}:${String(b%60).padStart(2,"0")}. What it captured is kept: Send again.${h.held?` ${dQ(h.held)} of it is already stored.`:""}`,error:!0});else i({state:"idle",message:"The recorder stopped before it captured anything. Nothing was sent.",error:!0})},k.start(1e3),p=Date.now(),r=setInterval(()=>void C(),d),s=setInterval(()=>y(!0),e),t=setInterval(()=>i({seconds:v()}),500),i({state:"recording",seconds:0,message:""})}async function E(d){i({state:"sending",message:`Sending ${dQ(d.size)}, then transcribing and storing…`,error:!1});try{let e=await c(`${b}takes?${x()}`,{method:"POST",headers:{"content-type":(d.type||"audio/mp4").split(";")[0]},body:d}),f=await e.json();if(!f.success||!f.take)throw Error(f.error||`HTTP ${e.status}`);q=null,m="";let g=f.presence??{state:f.listening?"listening":"away"},h=f.transcriptError?` Transcription failed, so no session wakes yet: ${f.transcriptError}`:({listening:" The session listening there will hear it.",answering:" Mia is answering an earlier take; she hears this one next.",answered:" The session hears it as soon as it listens again."})[g.state]??" No session is listening yet; the take waits, and her reply comes here when one answers.";i({state:"idle",seconds:0,held:0,message:`Take ${f.take} is in the episode.${h}`,error:!!f.transcriptError,stored:{take:f.take,english:f.english??"",transcriptError:f.transcriptError,presence:g}}),f.transcriptError||a.onStored?.(f.take)}catch(a){q=d,z("send-failed",{message:a instanceof Error?a.message:String(a),bytes:d.size,held:h.held}),i({state:"retry",message:`Not stored: ${a instanceof Error?a.message:String(a)}. Your recording is kept — Send again.${h.held?` ${dQ(h.held)} of it is already stored, and becomes a take by itself if you leave.`:""}`,error:!0})}}async function F(){if("recording"!==h.state)return;let a=v();A(),y(!1),i({state:"sending",seconds:a});let b=await new Promise(a=>{let b=!1,c=()=>{b||(b=!0,a(k?.whole??new Blob(l,{type:w()})))},d=setTimeout(c,3e3);if(!k)return c();k.onstop=()=>{clearTimeout(d),c()};try{k.stop()}catch{clearTimeout(d),c()}});if(B(),!b.size)return z("empty-at-stop",{seconds:a,held:h.held}),i({state:"idle",message:h.held?`The recorder handed back nothing at Stop, but ${dQ(h.held)} is stored; it becomes a take within a few minutes.`:"Nothing was recorded. Try again.",error:!0});await E(b)}async function G(){"retry"===h.state&&q&&await E(q)}return{getSnapshot:()=>h,press:async()=>"recording"===h.state?F():"retry"===h.state&&q?G():D(),start:D,stop:F,resend:G,destroy(){A(),("recording"===h.state||"starting"===h.state)&&y(!1);try{k?.stop()}catch{}B()}}}({base:eX,episode:()=>B.current,context:()=>{let a=A.current.shown,b=a?{...a.title||a.step.title?{title:[a.title,a.step.title].filter(Boolean).join(" · ")}:{},say:a.step.say.slice(0,400),...null!==a.index&&null!==a.count?{index:a.index,count:a.count}:{},...a.origin?{by:a.origin}:{}}:null;return function(a,b={}){if(!a?.doc)return null;let c={stage:a.stage,doc:a.doc,kind:a.kind,system:a.system,focus:a.focus??void 0,visible:a.visible,tour:a.tour,who:a.who,at:new Date().toISOString(),...b};for(let a of Object.keys(c))(void 0===c[a]||null===c[a])&&delete c[a];return c}(A.current.lastReport(),{...H.current.length?{marks:H.current}:{},...a?.step.spotlight?.length?{spotlight:a.step.spotlight}:{},...b?{step:b}:{}})},onChange:a=>{let b=D.current.state;if(D.current=a,n(a),!e3(b)||e3(a.state)||(G.current=!1,!C.current||E.current))return;let c=F.current.shift();c?M.current(c):v(null)},onStored:b=>a.waitFor(b)});return J.current=a,I.current=b,D.current=b.getSnapshot(),n(b.getSnapshot()),()=>{b.destroy(),a.destroy(),J.current=null,I.current=null}},[O]),(0,i.useEffect)(()=>{J.current?.setEpisode(g)},[g]),(0,i.useEffect)(()=>{let a=!0;return fetch(`${eX}health`,{cache:"no-store"}).then(a=>a.json()).then(b=>{if(a){if(!b.success)return x(`The companion does not answer: ${b.error??"no reason given"}.`);x(null),b.defaultEpisode&&j(a=>a??b.defaultEpisode??null)}}).catch(b=>a&&x(`The companion does not answer: ${b instanceof Error?b.message:String(b)}.`)),()=>{a=!1}},[]),(0,i.useEffect)(()=>{if(!c||k.length)return;let a=!0;return fetch(`${eX}episodes`,{cache:"no-store"}).then(a=>a.json()).then(b=>{a&&b.success&&b.episodes&&l(b.episodes)}).catch(()=>{}),()=>{a=!1}},[c,k.length]);let P=(0,i.useRef)(null),Q=(0,i.useCallback)(async(a=!1)=>{let b=A.current.lastReport()?.doc??null;if(a||b!==P.current){if(P.current=b,!b){H.current=[];return}try{let a=await fetch(`/api/marks?doc=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();H.current=bo(function(a,b=""){let c=a&&"object"==typeof a?a:{},d=Array.isArray(c.marks)?c.marks.map(bn).filter(a=>null!==a):[];return{doc:bk(c.doc)||b,marks:d}}(c,b).marks,"agent").map(a=>a.id)}catch{H.current=[]}}},[]);(0,i.useEffect)(()=>{Q(!0);let a=A.current.onMarks(()=>void Q(!0)),b=setInterval(()=>void Q(),3e3);return()=>{a(),clearInterval(b)}},[Q]),(0,i.useEffect)(()=>{if(!o.waiting)return;let a=setInterval(()=>z(Date.now()),1e3);return()=>clearInterval(a)},[o.waiting]);let R=(0,i.useCallback)(()=>{let a=I.current;a&&(!e3(D.current.state)&&"retry"!==D.current.state&&E.current&&(G.current=!0,A.current.stop()),a.press())},[]),S=(0,i.useCallback)((a,b)=>{let c=J.current?.getSnapshot().items.find(b=>"reply"===b.kind&&b.id===a);if(c){if(e3(D.current.state))return void v("Send your take first. Then press play to hear Mia.");F.current=[],G.current=!1,M.current(c,b)}},[]),T=(0,i.useCallback)(()=>{F.current=[],G.current=!1,A.current.stop()},[]),U=o.waiting?{take:o.waiting.take,seconds:Math.max(0,Math.floor((y-o.waiting.since)/1e3))}:null,{narrow:V,sheet:W,claimSheet:X,releaseSheet:Y}=a;(0,i.useEffect)(()=>{c?X("talk"):Y("talk")},[c,X,Y]),(0,i.useEffect)(()=>()=>Y("talk"),[Y]);let[Z,$]=(0,i.useState)(W);Z!==W&&($(W),V&&"card"===W&&d(!1));let _=(0,i.useCallback)(a=>{window.matchMedia("(max-width: 767px)").matches&&d(!1),eW={doc:a.doc,id:a.id},window.dispatchEvent(new Event(eV)),A.current.board!==a.doc&&eR({doc:a.doc,focus:null})},[]),aa=(0,h.jsx)(cv,{open:c,onOpenChange:a=>{d(a),a&&Q(!0)},variant:V?"bar":"fab",onOpenMark:_,who:"Mia",episode:g,episodes:k,onEpisode:a=>{e$.test(a)&&a!==g&&(F.current=[],t([]),v(null),j(a),e1(eZ,a))},presence:o.presence,recorder:m,onRecord:R,items:o.items,unheard:s,playing:q,playingStep:q&&a.shown?.origin==="Mia"?a.shown.index:null,onPlay:S,onStop:T,onFeedback:(a,b)=>{J.current?.feedback(a,b).catch(a=>x(`Your thumb was not kept: ${a instanceof Error?a.message:String(a)}.`))},autoplay:e,onAutoplay:a=>{f(a),e1(eY,a?"1":"0"),a||(F.current=[])},waiting:U,notice:u,error:w??o.error});if(V){let b=c?a.sheetBody:a.sheetHandle;return b?(0,eU.createPortal)(aa,b):null}return(0,h.jsx)("div",{className:"stage-talk-host",children:aa})}let e7=(0,i.createContext)(null);function e8(){return(0,i.useContext)(e7)}function e9(a,b){try{window.localStorage.setItem(a,b)}catch{}}let fa=new Map;function fb({children:a}){var b;let c,d,e,f,g,j,k,l,[m,n]=(0,i.useState)({bridgeUrl:null,stage:bf,companion:!1,companionEpisode:null});(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{if(!a)return;let c=null,d=bh(c)?c:bh(b.stage)?b.stage:bf;n({bridgeUrl:b.bridgeUrl,stage:d,companion:b.companion,companionEpisode:b.companionEpisode})}),()=>{a=!1}},[]);let[o,p]=(0,i.useState)(()=>!1),[q,r]=(0,i.useState)(()=>""),s=(0,i.useMemo)(()=>o?dM():null,[o]),t=(0,i.useMemo)(()=>null,[]),[u,v]=(0,i.useState)(null),w=(0,i.useRef)(new Set),[x,y]=(0,i.useState)(null),[z,A]=(0,i.useState)(null),B=(0,i.useRef)(null),C=(0,i.useCallback)(a=>A({doc:a,from:B.current}),[]),D=(0,i.useCallback)(a=>{B.current=a,y(a)},[]),E=(0,i.useCallback)(a=>{var b;if(!a)return void v(null);let{step:c}=a,d=(0,ek.requestedDoc)();if(a.caught,c.doc&&c.doc!==d)C(c.doc),eR({doc:c.doc,system:c.system??void 0,focus:c.focus??null});else if(c.focus)if(c.system&&null!==c.system&&d)eR({doc:d,system:c.system,focus:c.focus});else{let a;b=c.focus,(a=new URL(window.location.href)).searchParams.set("focus",b),window.history.replaceState(window.history.state,"",a),window.dispatchEvent(new Event(eM))}v({doc:c.doc,focus:c.focus,spotlight:c.spotlight,region:c.region,nonce:a.nonce})},[C]),F=(b={url:m.bridgeUrl??"",stage:m.stage,name:"web-stage",voice:s,enabled:!!m.bridgeUrl,onShow:E,onMarks:a=>{for(let b of[...w.current])b(a)}},(c=(0,i.useRef)({onShow:b.onShow,onMarks:b.onMarks})).current={onShow:b.onShow,onMarks:b.onMarks},d=(0,i.useRef)(null),e=`${b.url}\u0000${b.stage??""}\u0000${b.token??""}`,f=(0,i.useRef)(e),(null===d.current||f.current!==e)&&(f.current=e,d.current=function(a){let b,c=bh(a.stage)?a.stage:bf,d=a.setTimer??((a,b)=>setTimeout(a,b)),e=a.clearTimer??(a=>clearTimeout(a)),f=a.gapMs??900,g=a.client??dJ({url:a.url,role:a.role??"web",docId:`stage:${c}`,name:a.name??"web-stage",token:a.token,autoResync:!1}),h=a.voice??null,i=a=>a&&void 0!==b?b:h,j=null,k=null,l=a=>{let b=k;k=null,b?.(a)},m=null,n=null,o=[],p=[],q=0,r=!1,s=!1,t=0,u=null,v=0,w=!1,x=!1,y=!1,z=!1,A=0,B=!1,C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!1},D=new Set;function E(){for(let a of(C={status:g.status,stage:c,shown:m,tour:n,index:q,playing:r,speaking:s,ownVoice:!!n&&void 0!==b},[...D]))a()}function F(){v+=1,u&&e(u),u=null,s&&j?.cancel(),s=!1,j=null}function G(a,b,c=b){F();let e=++v,g=()=>{e!==v||(s&&(s=!1,E()),b&&r&&(u=d(()=>{u=null,e===v&&r&&M()},h?f:0)))},h=i(c);if(h)s=!0,j=h,E(),h.speak(a).then(g,g);else{let c;b&&(u=d(()=>{u=null,g()},"number"==typeof(c=a.holdMs)&&Number.isFinite(c)&&a.holdMs>=0?a.holdMs:Math.min(2e4,Math.max(2500,1200+400*`${a.title??""} ${a.say??""}`.trim().split(/\s+/).filter(Boolean).length))))}}function H(b,c){t+=1,F(),m=b?{...b,nonce:t,...B?{caught:!0}:{}}:null,E(),a.onShow?.(m);let d=!!m&&null!==m.index;m&&(i(d)||c)&&G(m.step,c,d)}function I(a){if(!n)return null;let b=n.def.steps[a];if(!b)return null;let c=b.doc??o[a],d=b.system??p[a];return{step:{...b,...c?{doc:c}:{},...d?{system:d}:{}},index:a,count:n.def.steps.length,title:n.def.settings?.name,origin:n.origin,tourPath:n.path}}function J(a,c,d){var e;let f,g;l(!1),b=d;let h=Array.isArray(a.tour?.steps)?a.tour.steps:[];e=(n={def:{...a.tour,steps:h},path:a.path,origin:a.origin}).def,g=void 0,o=e.steps.map(a=>g=a.doc??g),p=h.map(a=>f=a.system??f),q=Math.min(Math.max(0,a.from??0),Math.max(0,h.length-1)),w=!1,r=c&&h.length>0,H(I(q),r)}function K(a){r=!1,H({step:a.step,index:null,count:null,title:a.title,origin:a.origin,tourPath:a.tour},!1)}function L(a){if(!n)return;let b=n.def.steps.length-1;b<0||(w=!1,H(I(q=Math.min(Math.max(0,Math.floor(a)),b)),r))}function M(){if(n){if(q>=n.def.steps.length-1){let a=r;w=r||w,r=!1,F(),E(),a&&l(!0);return}L(q+1)}}function N(){n&&q>0&&L(q-1)}function O(){n&&n.def.steps.length&&(r=!0,w&&(w=!1,q=0),m?.index!==q||m.caught?H(I(q),!0):(E(),G(m.step,!0)))}function P(){r=!1,F(),E()}function Q(){l(!1),b=void 0,w=!1,n=null,o=[],p=[],q=0,r=!1,H(null,!1)}function R(){if(z)return;z=!0;let a=++A;g.joinStage(c).then(({state:b})=>{a===A&&(z=!1,y=!0,m||n||function(a){B=!0;try{a.tour&&J(a.tour,!1),a.step&&K(a.step)}finally{B=!1}}(b),E())}).catch(()=>{a===A&&(z=!1,E())})}return g.on("stage-step",a=>{a?.stage===c&&a.step&&K(a)}),g.on("stage-load",a=>{a?.stage===c&&a.tour&&J(a,!1!==a.autoplay)}),g.on("stage-control",a=>{a?.stage===c&&function(a){switch(a.action){case"play":return O();case"pause":return P();case"next":return M();case"prev":return N();case"goto":return L(a.index??0);case"stop":return Q()}}(a)}),g.on("marks",b=>a.onMarks?.(b)),g.on("status",a=>{"disconnected"===a||"error"===a?y=!1:"connected"===a&&x&&!y&&R(),E()}),{getSnapshot:()=>C,subscribe:a=>(D.add(a),()=>{D.delete(a)}),connect(){x=!0,R()},disconnect(){x=!1,A+=1,z=!1,y=!1,F(),g.leaveStage(c),g.disconnect()},play:O,pause:P,next:M,prev:N,goto:L,stop:Q,dismiss:function(){if(m){if(null===m.index&&n)return void H(I(q),!1);null===m.index?H(null,!1):Q()}},setVoice(a){void 0===b&&F(),h=a,E()},present:(a,b={})=>Array.isArray(a?.steps)&&a.steps.length?new Promise(d=>{J({stage:c,tour:a,from:b.from??0,autoplay:!1!==b.autoplay,origin:b.origin??"page"},!1!==b.autoplay,b.voice),k=d}):Promise.resolve(!1),sendContext(a){g.emitContext({...a,stage:c,...n?{tour:{path:n.path,title:n.def.settings?.name,index:q,count:n.def.steps.length,playing:r}}:{}})},sendMarks(a){g.emitMarks({...a,stage:c}).catch(()=>{})}}}({...b,voice:b.voice??null,onShow:a=>c.current.onShow?.(a),onMarks:a=>c.current.onMarks?.(a)})),g=d.current,j=(0,i.useSyncExternalStore)(g.subscribe,g.getSnapshot,g.getSnapshot),k=!1!==b.enabled&&!!b.url,(0,i.useEffect)(()=>{if(k)return g.connect(),()=>g.disconnect()},[g,k]),l=b.voice??null,(0,i.useEffect)(()=>{g.setVoice(l)},[g,l]),{...j,play:g.play,pause:g.pause,next:g.next,prev:g.prev,goto:g.goto,stop:g.stop,dismiss:g.dismiss,sendContext:g.sendContext,sendMarks:g.sendMarks,present:g.present}),G=(0,i.useRef)(null),H=(0,i.useRef)(null),I=F.sendContext,J=(0,i.useCallback)(a=>{G.current={...a,stage:m.stage,who:q||void 0,at:new Date().toISOString()},H.current&&clearTimeout(H.current),H.current=setTimeout(()=>I({...a,who:q||void 0}),400)},[m.stage,q,I]);(0,i.useEffect)(()=>()=>{H.current&&clearTimeout(H.current)},[]),(0,i.useEffect)(()=>{G.current&&I({...G.current,who:q||void 0})},[F.index,F.playing,F.tour,I,q]);let[K,L]=(0,i.useState)(0),M=function(a="(max-width: 599px)"){let[b,c]=(0,i.useState)(()=>(function(a){try{return!1}catch{return!1}})(0));return(0,i.useEffect)(()=>{if("function"!=typeof window.matchMedia)return;let b=window.matchMedia(a),d=()=>c(b.matches);return d(),b.addEventListener("change",d),()=>b.removeEventListener("change",d)},[a]),b}(),[N,O]=(0,i.useState)(null),P=(0,i.useCallback)(a=>O(a),[]),Q=(0,i.useCallback)(a=>O(b=>b===a?null:b),[]),[R,S]=(0,i.useState)(null),[T,U]=(0,i.useState)(null),V=F.shown?.step??null,W=null,X=x??(W&&!aQ(W)?W:null),Y=z&&z.from===x?z.doc:null,Z=V?.doc&&V.doc!==X&&V.doc!==Y?V.doc:null,[$,_]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a;if(!Z)return;let b=!0;return(!(a=fa.get(Z))&&(a=fetch(`/api/file?doc=${encodeURIComponent(Z)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>{let b=a?.content?JSON.parse(a.content):null,c=(b?.settings??b?.stateMachine?.settings)?.name;return"string"==typeof c&&c?c:null}).catch(()=>null),fa.set(Z,a)),a).then(a=>b&&_({doc:Z,title:a})),()=>{b=!1}},[Z]);let aa=F.play,ab=(0,i.useMemo)(()=>{if(!Z||!V)return null;let a=($?.doc===Z?$.title:null)??(Z.split("/").pop()??Z).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$/i,"").replace(/\.json$/i,""),b=F.shown?.index!==null&&F.shown?.index!==void 0;return{drawing:a,label:b?"Open and play":"Open the drawing",onOpen:()=>{C(Z),eR({doc:Z,system:V.system??void 0,focus:V.focus??null}),b&&aa()}}},[Z,$,V,F.shown?.index,aa,C]),ac=!!F.shown&&!M;(0,i.useEffect)(()=>{let a=document.documentElement,b=ac?document.querySelector(".stage-caption-host .slc-stage-caption"):null;if(!b||"u"<typeof ResizeObserver)return void a.style.removeProperty("--stage-caption-h");let c=()=>a.style.setProperty("--stage-caption-h",`${Math.ceil(b.getBoundingClientRect().height)+12}px`),d=new ResizeObserver(c);return d.observe(b),c(),()=>{d.disconnect(),a.style.removeProperty("--stage-caption-h")}},[ac]);let ad=(0,i.useMemo)(()=>({stage:m.stage,connected:"connected"===F.status,lit:u,author:q,setAuthor:a=>{r(a),e9("stateloom.author",a)},listener:t,answerNonce:K,report:J,lastReport:()=>G.current,sendMarks:F.sendMarks,onMarks:a=>(w.current.add(a),()=>{w.current.delete(a)}),shown:F.shown,present:F.present,companion:m.companion,pause:F.pause,stop:F.stop,board:x,setBoard:D,narrow:M,sheet:N,claimSheet:P,releaseSheet:Q,sheetHandle:R,sheetBody:T}),[m.stage,m.companion,F.status,F.shown,F.sendMarks,F.present,F.pause,F.stop,u,q,t,K,J,x,D,M,N,P,Q,R,T]),ae=F.shown?(0,h.jsx)(ce,{shown:F.shown,playing:F.playing,speaking:F.speaking,voice:F.ownVoice?void 0:o,onToggleVoice:()=>{let a=!o;p(a),e9("stateloom.stage.voice",a?"1":"0")},onPlay:F.play,onPause:F.pause,onNext:F.next,onPrev:F.prev,onGoto:F.goto,onClose:F.dismiss,onAnswer:()=>L(a=>a+1),held:ab}):null;return(0,h.jsxs)(e7.Provider,{value:ad,children:[a,M?(0,h.jsxs)("div",{className:"stage-sheet",children:[(0,h.jsx)("div",{className:"stage-sheet-handle",ref:S}),(0,h.jsx)("div",{className:"stage-sheet-body",ref:U}),!N&&ae&&(0,h.jsx)("div",{className:"stage-sheet-caption",children:ae})]}):ae&&(0,h.jsx)("div",{className:"stage-caption-host",children:ae}),m.companion&&(0,h.jsx)(e6,{stage:ad,defaultEpisode:m.companionEpisode})]})}let fc="stage-quiet-btn flex h-9 min-w-9 items-center justify-center gap-1 rounded-lg border border-gray-700 bg-gray-900/90 px-2 text-sm text-gray-200 shadow-lg backdrop-blur hover:bg-gray-800";function fd(a){let b=1/0;for(let c of[".stage-sheet",".stage-caption-host .slc-stage-caption"]){let d=document.querySelector(c)?.getBoundingClientRect();d&&d.height>0&&d.top<a.bottom&&(b=Math.min(b,d.top))}return b===1/0?0:Math.max(0,a.bottom-b+8)}async function fe(a,b){let c=await fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(b)}),d=await c.json().catch(()=>({}));if(!c.ok)throw Error(d?.error??`the marks could not be written (${c.status})`);return d}function ff({docPath:a,kind:b,viewport:c,setViewport:d,boxes:e,boardRef:f,focus:g=null,level:j,onReveal:k,labels:l}){let m,n=e8(),[o,p]=(0,i.useState)([]),[q,r]=(0,i.useState)(!1),[s,t]=(0,i.useState)(null),[u,v]=(0,i.useState)(null),[w,x]=(0,i.useState)(!1),[y,z]=(0,i.useState)(!1),[A,B]=(0,i.useState)(null),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(null),G=(0,i.useRef)(null),H=(0,i.useRef)(null);H.current=u;let{read:I,markRead:J}=function(a){let[b,c]=(0,i.useState)(()=>({doc:a,read:a?co(a):{}}));(0,i.useEffect)(()=>{c(b=>b.doc===a?b:{doc:a,read:a?co(a):{}})},[a]);let d=(0,i.useCallback)(b=>{a&&c(c=>{let d=c.doc===a?c.read:co(a);if(d[b.id]===(b.replies?.length??0)&&c.doc===a)return c;let e={...d,[b.id]:b.replies?.length??0};try{window.localStorage.setItem(cn(a),JSON.stringify(e))}catch{}return{doc:a,read:e}})},[a]);return{read:b.doc===a?b.read:{},markRead:d}}(a),K=n?.setBoard;(0,i.useEffect)(()=>{if(K&&a)return K(a),()=>K(null)},[K,a]);let L=(0,i.useCallback)((a,b={})=>{let c=f.current?.getBoundingClientRect();if(!c?.width||!a.length)return;let e=fd(c),g=Math.max(.4*c.height,c.height-e);d(function(a,b,c,d={}){let e=d.padding??48,f=d.floor??.55,g=S(a,b,c,{padding:e,maxScale:d.maxScale??1});if(!a.length||g.scale>=f)return g;let h=1/0,i=1/0,j=-1/0,k=-1/0;for(let b of a)h=Math.min(h,b.x),i=Math.min(i,b.y),j=Math.max(j,b.x+b.width),k=Math.max(k,b.y+b.height);let l=(j-h)*f,m=(k-i)*f;return{x:l<=b-2*e?(b-l)/2-h*f:e-h*f,y:m<=c-2*e?(c-m)/2-i*f:e-i*f,scale:f}}(a,c.width,g,{padding:48,maxScale:1,floor:b.floor??.2}))},[f,d]),M=(0,i.useCallback)(()=>{a&&fetch(`/api/marks?doc=${encodeURIComponent(a)}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(a=>a&&Array.isArray(a.marks)&&p(a.marks)).catch(()=>{})},[a]);(0,i.useEffect)(()=>(p([]),v(null),t(null),M(),window.addEventListener("focus",M),()=>window.removeEventListener("focus",M)),[M]),(0,i.useEffect)(()=>n?.onMarks(b=>{if(!a||b.docId!==a||!Array.isArray(b.marks))return;p(b.marks);let c=function(a){let b=a.change;if(!b||"reply"!==b.action&&"add"!==b.action||!Array.isArray(a.marks))return null;let c=a.marks.findIndex(a=>a&&a.id===b.id);if(c<0)return null;let d=a.marks[c];if("add"===b.action)return d.author?.role==="agent"?{action:"add",mark:d,number:c+1,name:d.author.name||"the agent"}:null;let e=d.replies?.[d.replies.length-1];return e&&e.author?.role==="agent"?{action:"reply",mark:d,number:c+1,name:e.author.name||"the agent"}:null}(b);c&&c.mark.id!==H.current&&(F({id:c.mark.id,text:"reply"===c.action?`${c.name} answered mark ${c.number}`:`${c.name} asked about mark ${c.number}`}),G.current&&clearTimeout(G.current),G.current=setTimeout(()=>F(null),7e3))}),[n,a]),(0,i.useEffect)(()=>(F(null),()=>{G.current&&clearTimeout(G.current)}),[a]);let N=async b=>{if(!a)return!1;z(!0),B(null);try{let c=await fe(a,b);return p(c.marks),n?.sendMarks({docId:a,marks:c.marks,change:c.change}),!0}catch(a){return B(a instanceof Error?a.message:String(a)),!1}finally{z(!1)}},P=n?.lit??null,Q=P&&(!P.doc||P.doc===a)?P:null,R=Q?.spotlight,T=Q?.region??null,U=(0,i.useRef)(-1),V=(0,i.useRef)(-1),W=(0,i.useRef)(null),X=(0,i.useMemo)(()=>R?.length?bt(e,R):[],[e,R]);(0,i.useEffect)(()=>{if(!Q||U.current===Q.nonce)return;let a=[...X,...T?[T]:[]];if(!a.length){R?.length&&V.current!==Q.nonce&&(V.current=Q.nonce,k?.(R));return}U.current=Q.nonce;let b=()=>L(a);b(),W.current&&clearTimeout(W.current),W.current=setTimeout(b,520)},[Q,X,T,R,L,k]),(0,i.useEffect)(()=>()=>{W.current&&clearTimeout(W.current)},[]);let Y=(0,i.useRef)(null),Z=(0,i.useRef)([]),$=(0,i.useRef)(c);$.current=c,(0,i.useEffect)(()=>{if(!a||Y.current===a)return;if(Q){Y.current=a;return}let b=o.filter(a=>"resolved"!==a.status&&(!a.level||!j||a.level===j));if(!b.length||!e.length)return;let c=b.filter(a=>a.elements?.length),d=c.filter(a=>bt(e,a.elements).length>0);if(c.length&&!d.length)return;let h=[...d,...b.filter(a=>!a.elements?.length)].map(a=>bV(a,e)).filter(a=>!!a);if(Y.current=a,!h.length)return;let i=[...h,...g?bt(e,[g]):[]],k=()=>{let a=f.current?.getBoundingClientRect();if(!a?.width)return;let b=$.current,c=O(b,{x:0,y:0}),d=O(b,{x:a.width,y:a.height-fd(a)});i.every(a=>a.x>=c.x&&a.y>=c.y&&a.x+a.width<=d.x&&a.y+a.height<=d.y)||L(i,{floor:.55})};for(let a of(k(),Z.current))clearTimeout(a);Z.current=[setTimeout(k,520),setTimeout(k,1400)]},[a,o,e,Q,j,g,L,f]),(0,i.useEffect)(()=>()=>{for(let a of Z.current)clearTimeout(a)},[]);let _=(0,i.useRef)(n?.answerNonce??0);(0,i.useEffect)(()=>{if(!n||n.answerNonce===_.current)return;_.current=n.answerNonce;let a=R?.length?[...R]:Q?.focus?[Q.focus]:g?[g]:[];x(!1),v(null),t({elements:a,region:T??void 0,listen:!!n.listener})},[n,R,Q,g,T]);let aa=n?.report;(0,i.useEffect)(()=>{if(!aa||!a)return;let d=f.current?.getBoundingClientRect(),e=O(c,{x:0,y:0}),h=d?O(c,{x:d.width,y:d.height}):e;aa({doc:a,kind:b,system:void 0,focus:g,...d?.width?{visible:{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(h.x-e.x),height:Math.round(h.y-e.y)}}:{}})},[aa,a,b,g,c,f]);let ab=n?.companion?e_(a):null,ac=function(a,b){let c;if(!a||!b)return null;let d=(c=b.match(/-episode-(\d+)-/))?Number(c[1]):null,e=null===d?"this episode":`episode ${d}`;switch(a){case"listening":return`Mia is listening in ${e}: she answers here`;case"answering":return"Mia is answering";case"answered":return`Mia has answered in ${e}: your mark waits until she listens again`;case"away":return`No seat is listening in ${e}: your mark waits until one does`;default:return null}}(function(a,b){let[c,d]=(0,i.useState)(null);return(0,i.useEffect)(()=>{if(!a||!b)return;let c=!0,e=async()=>{if("u"<typeof document||"visible"===document.visibilityState)try{let b=await fetch(`/api/companion/thread?episode=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await b.json();c&&d({episode:a,state:e.success?e.presence?.state??null:null})}catch{c&&d({episode:a,state:null})}};e();let f=setInterval(()=>void e(),1e4);return()=>{c=!1,clearInterval(f)}},[a,b]),c&&c.episode===a?c.state:null}(ab,!!(s||u||w)),ab),ad=(0,i.useMemo)(()=>bq(o,I).map(a=>a.id),[o,I]),ae=function(a,b={}){return{forYou:bo(a,"person").length,forAgent:bo(a,"agent").length,unread:bq(a,b).length}}(o,I),af=o.find(a=>a.id===u)??null,ag=af?.replies?.length??0;(0,i.useEffect)(()=>{af&&J(af)},[af?.id,ag,J]);let ah=(0,i.useCallback)(a=>{t(null),x(!1),r(!1),v(a),F(null)},[]);(0,i.useEffect)(()=>{let b=()=>{let b=a&&eW?.doc===a?eW.id:null,c=b?o.find(a=>a.id===b):null;if(!c)return;eW=null,ah(c.id);let d=bV(c,e);d&&setTimeout(()=>L([d],{floor:.55}),60)};return b(),window.addEventListener(eV,b),()=>window.removeEventListener(eV,b)},[a,o,e,ah,L]);let ai=!!(s||af||w),aj=n?.claimSheet,ak=n?.releaseSheet;(0,i.useEffect)(()=>{ai?aj?.("card"):ak?.("card")},[ai,aj,ak]),(0,i.useEffect)(()=>()=>ak?.("card"),[ak]);let al=!!n?.narrow,am=n?.sheet??null,[an,ao]=(0,i.useState)(am);an!==am&&(ao(am),al&&"talk"===am&&(t(null),v(null),x(!1)));let ap=(0,i.useRef)(null),[aq,ar]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=ap.current;if(!a)return;let b=()=>{let b={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight};ar(a=>a&&a.x===b.x&&a.y===b.y&&a.width===b.width&&a.height===b.height?a:b)};if(b(),window.addEventListener("resize",b),"u"<typeof ResizeObserver)return()=>window.removeEventListener("resize",b);let c=new ResizeObserver(b);return c.observe(a),()=>{c.disconnect(),window.removeEventListener("resize",b)}},[a]);let[as,at]=(0,i.useState)(null),au=n?.shown??null;(0,i.useEffect)(()=>{let a=f.current;if(!a)return;let b=()=>document.querySelector(".stage-sheet")??document.querySelector(".stage-caption-host .slc-stage-caption"),c=0,d=()=>{cancelAnimationFrame(c),c=requestAnimationFrame(()=>{let c=a.getBoundingClientRect(),d=b()?.getBoundingClientRect(),e=d&&d.height>0&&d.top<c.bottom?{x:d.left-c.left,y:d.top-c.top,width:d.width,height:Math.min(d.bottom,c.bottom)-d.top}:null;at(a=>a&&e&&a.x===e.x&&a.y===e.y&&a.width===e.width&&a.height===e.height?a:e)})};d();let e=b(),g=e&&"u">typeof ResizeObserver?new ResizeObserver(d):null;return e&&g?.observe(e),window.addEventListener("resize",d),()=>{cancelAnimationFrame(c),g?.disconnect(),window.removeEventListener("resize",d)}},[f,au,ai,am,al,a]);let av=(0,i.useMemo)(()=>[aq,as].filter(a=>!!a),[aq,as]);return a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(bW,{viewport:c,boxes:e,spotlight:R,region:T,marks:o,unread:ad,selectedMark:u,onSelectMark:a=>{t(null),x(!1),v(b=>b===a?null:a)},marking:q,onDraft:a=>{r(!1),v(null),x(!1),F(null),t(a)},draft:s,avoid:av}),(0,h.jsxs)("div",{className:"stage-board-controls",ref:ap,children:[E&&(0,h.jsx)(cm,{className:"stage-board-notice",onOpen:()=>ah(E.id),onDismiss:()=>F(null),children:E.text}),(0,h.jsxs)("button",{type:"button",className:`${fc} ${q?"!border-amber-400 !text-amber-300":""}`,"aria-pressed":q,onClick:()=>{t(null),r(a=>!a)},title:q?"Marking: tap an element, or drag around several. Tap ✎ again to stop.":"Mark something for the agent — tap an element or drag around several",children:[(0,h.jsx)(cc,{}),q&&(0,h.jsx)("span",{className:"text-xs",children:"marking"})]}),(0,h.jsxs)("button",{type:"button",className:fc,"aria-expanded":w,onClick:()=>{t(null),v(null),F(null),x(a=>!a)},title:`Marks on this drawing${ae.forYou?` \xb7 ${ae.forYou} for you`:""}${ae.forAgent?` \xb7 ${ae.forAgent} waiting on the agent`:""}`,"aria-label":`Marks on this drawing: ${ae.forYou} for you${ae.unread?` (${ae.unread} new)`:""}, ${ae.forAgent} waiting on the agent`,children:[(0,h.jsx)(b3,{}),ae.forYou>0&&(0,h.jsxs)("span",{className:`stage-for-you${ae.unread?" stage-for-you--new":""}`,children:[ae.forYou," for you"]}),ae.forAgent>0&&(0,h.jsx)("span",{className:"text-xs text-gray-400",children:ae.forAgent})]})]}),q&&!s&&!E&&(0,h.jsx)("div",{className:"stage-board-hint",role:"status",children:"Tap an element, or drag around several, to say something about it."}),ai&&(m=s?(0,h.jsx)(cj,{elements:s.elements,region:s.region,author:n?.author??"",onAuthorChange:n?.setAuthor,listener:n?.listener,listenAtOnce:!!s.listen,busy:y,error:A,note:ac,labels:l,onCancel:()=>{t(null),B(null)},onSubmit:async({text:a,kind:b,author:c})=>{await N({action:"add",mark:{text:a,kind:b,elements:s.elements,region:s.region,level:j,author:{name:c||"someone"}}})&&t(null)}},`${s.elements.join(",")}|${s.region?JSON.stringify(s.region):""}`):af?(0,h.jsx)(ck,{mark:af,number:o.indexOf(af)+1,listener:n?.listener,busy:y,error:A,note:ac,labels:l,onClose:()=>v(null),onReply:a=>void N({action:"reply",id:af.id,text:a,author:{name:n?.author||"someone"}}),onResolve:()=>void N({action:"resolve",id:af.id}),onReopen:()=>void N({action:"reopen",id:af.id}),onRemove:async()=>{await N({action:"remove",id:af.id})&&v(null)}}):(0,h.jsx)(cl,{marks:o,unread:ad,selected:u,onSelect:a=>{x(!1),v(a)},onCopy:()=>{var b,c;let d,e;if(!a)return;let f=(b=n?.lastReport()??null,d=(c=[{doc:a,marks:o.filter(a=>"resolved"!==a.status)}]).reduce((a,b)=>a+b.marks.length,0),e=function(a){if(!a||!a.doc)return"No canvas has said what it is showing.";let b=[`${a.who?`${a.who} is`:"The canvas is"} on ${bu(a.doc)}${a.kind?` (${a.kind})`:""}`];a.system&&b.push(`as a member of ${bu(a.system)}`),a.focus&&b.push(`with ${a.focus} in hand`);let c=b.join(", ")+".";return a.tour&&(c+=` Tour ${a.tour.title?`'${a.tour.title}' `:""}at step ${a.tour.index+1} of ${a.tour.count}, ${a.tour.playing?"playing":"paused"}.`),a.at&&(c+=` (reported ${a.at})`),c}(b),d?`${e}
12
12
  ${d} mark(s):
13
- ${function(a,b={}){let c=[],d=b.start??1;for(let{doc:b,marks:e}of a)for(let a of e){for(let e of(c.push(`${d}. [${a.status} \xb7 ${a.kind}] ${a.author.name}${"agent"===a.author.role?" (agent)":""} on ${br(a)} (${bv(b)}) — ${a.id}`),c.push(` "${bw(a.text)}"`),a.replies??[]))c.push(` ↳ ${e.author.name}${"agent"===e.author.role?" (agent)":""}: "${bw(e.text)}"`);d++}return c.join("\n")}(c)}`:`${e}
14
- No marks.`);navigator.clipboard?.writeText(f).then(()=>{B(!0),setTimeout(()=>B(!1),2e3)})},copied:A,note:X,onClose:()=>v(!1)})})]}):null}function e1({docPath:a,onReveal:b}){let c=eX(),d=c?.lit??null,e=(0,i.useRef)(-1);return(0,i.useEffect)(()=>{!d||e.current===d.nonce||d.doc&&d.doc!==a||(d.spotlight?.length||d.region)&&(e.current=d.nonce,b())},[d,a,b]),null}function e2(a,b,c){try{return a()}catch(d){let a=d instanceof Error?d.message:String(d);return console.warn("[stateloom] skipped on a malformed document:",a),c?.(a),b}}let e3=(a,b)=>"chen"===b?`stateloom:erd-layout:chen:${a}`:`stateloom:erd-layout:${a}`,e4="stateloom:erd-notation",e5="stateloom:erd-lock";function e6(a,b){try{return JSON.parse(localStorage.getItem(e3(a,b))??"{}")}catch{return{}}}async function e7(a){let b=a.slice(0,a.lastIndexOf("/")),c=((await (await fetch("/api/docs",{cache:"no-store"})).json()).docs??[]).map(a=>a.path).filter(a=>a.endsWith(".smdf.json")&&a.slice(0,a.lastIndexOf("/"))===b),d=[];for(let a of c)try{let b=await (await fetch(`/api/file${(0,eb.docQuery)(a)}`,{cache:"no-store"})).json(),c=JSON.parse(b.content??"null"),e=aq(c?.stateMachine??c?.StateMachine??c);e?.state&&d.push({path:a,def:e})}catch{}return d}let e8="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",e9="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fa="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fb(){let a=(0,eb.useRequestedDoc)(),[b,c]=(0,i.useState)(""),[d,e]=(0,i.useState)(null),[f,g]=(0,i.useState)({}),[j,k]=(0,i.useState)("crowsfoot"),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("entities"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),G=(0,i.useRef)(null),H=eC({onClose:()=>B(!1),restVh:62,tallVh:92}),[I,J]=(0,i.useState)(0),[K,L]=(0,i.useState)(null),N=(0,i.useRef)(null);(0,i.useEffect)(()=>{let b=!1,d=null;return(async()=>{let f=await (await fetch(`/api/file${(0,eb.docQuery)(a)}`,{cache:"no-store"})).json();if(b)return;if(f.error)return v(f.error,"warn");let h=f.path??"",i=null;try{let a=f.content?aq(JSON.parse(f.content)):null;X(a)&&(i={...a,relationships:a.relationships??[]})}catch{}if(f.exists&&!i)return v(`${h} is not a readable ERD definition`,"warn");let j=(h.split("/").pop()??"Untitled").replace(/\.erdf\.json$/i,""),l=function(){try{return"chen"===localStorage.getItem(e4)?"chen":"crowsfoot"}catch{return"crowsfoot"}}();c(h),e(i??{settings:{namespace:"Default",name:j},entities:[],relationships:[]}),k(l),m(function(){try{let a=localStorage.getItem(e5);if(null!==a)return"1"===a;return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}()),g(e6(h,l)),s(null),L(null),q(a=>a+1),v(f.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:n}=await ek();!b&&n&&(N.current=d=dF({url:n,role:"web",docId:h,name:"web-designer",onFull:a=>{let b=a.def;X(b)&&(e({...b,relationships:b.relationships??[]}),v("updated live"))},onPatch:()=>{},onPresence:a=>J(a.length)}),d.connect())})().catch(a=>!b&&v(String(a),"warn")),()=>{b=!0,N.current=null,d?.disconnect()}},[a,v]);let O=(0,i.useMemo)(()=>{if(!d)return{};let a=e2(()=>(function(a,b={}){let c=b.notation??"crowsfoot",d=b.hSpacing??70,e=b.vSpacing??("chen"===c?130:90),f="chen"===c?aj:as,g=[],h=new Set;for(let b of a.entities??[])!b?.name||h.has(b.name)||(h.add(b.name),g.push(b));let i=new Map,j=(a,b,c=new Set)=>a===b||!c.has(a)&&(c.add(a),(i.get(a)??[]).some(a=>j(a,b,c)));for(let b of a.relationships??[]){if(!b||!h.has(b.from)||!h.has(b.to)||b.from===b.to)continue;let[a,c]="N:1"===b.cardinality?[b.to,b.from]:[b.from,b.to];if((i.get(a)??[]).includes(c)||j(c,a))continue;let d=i.get(a);d?d.push(c):i.set(a,[c])}let k=new Map,l=(a,b)=>{if(!((k.get(a)??-1)>=b))for(let c of(k.set(a,b),i.get(a)??[]))l(c,b+1)},m=new Set([...i.values()].flat());for(let a of g)m.has(a.name)||l(a.name,0);for(let a of g)k.has(a.name)||l(a.name,0);for(let a of[...g].sort((a,b)=>k.get(b.name)-k.get(a.name))){let b=i.get(a.name)??[];b.length&&k.set(a.name,Math.min(...b.map(a=>k.get(a)))-1)}let n=[],o=new Map,p=(a,b)=>((n[b]??=[]).push(a),o.set(a.id,a),a);for(let a of g)p({id:a.name,entity:a.name,...f(a),upper:[],lower:[],x:0},k.get(a.name)??0);let q=0;for(let[a,b]of i)for(let c of b){let b=a;for(let d=k.get(a)+1;d<k.get(c);d++){let a=p({id:`\u0000lane${q++}`,width:28,height:0,upper:[],lower:[],x:0},d);o.get(b).lower.push(a.id),a.upper.push(b),b=a.id}o.get(b).lower.push(c),o.get(c).upper.push(b)}for(let a=n.length-1;a>=0;a--)n[a]?.length||n.splice(a,1);let r=(a,b)=>a.length?a.reduce((a,c)=>a+b(o.get(c)),0)/a.length:null,s=(a,b)=>{let c=new Map;for(let a of n)a.forEach((a,b)=>c.set(a.id,b));let d=new Map(a.map((a,d)=>[a.id,r(a[b],a=>c.get(a.id))??d]));a.sort((a,b)=>d.get(a.id)-d.get(b.id))};for(let a=0;a<2;a++){for(let a=1;a<n.length;a++)s(n[a],"upper");for(let a=n.length-2;a>=0;a--)s(n[a],"lower")}let t=a=>a.x+a.width/2,u=(a,b)=>{let c=0;for(let e of a){let a=r(e[b],t);e.x=Math.max(c,null===a?c:a-e.width/2),c=e.x+e.width+d}};for(let a of n)u(a,"upper");for(let a=n.length-2;a>=0;a--)u(n[a],"lower");let v=Math.min(0,...[...o.values()].map(a=>a.x)),w={},x=40;for(let a of n){for(let b of a)b.entity&&(w[b.entity]={x:Math.round(b.x-v)+40,y:x,width:b.width,height:b.height});x+=Math.max(0,...a.map(a=>a.height))+e}return w})(d,{notation:j}),{});for(let[b,c]of Object.entries(f))a[b]&&(a[b]={...a[b],...c});return a},[d,f,j]),P=(0,i.useMemo)(()=>{if(!d)return[];let a="";return e2(()=>Y(d),null,b=>a=b)??[{ruleId:"E000",message:`The document could not be checked (${a}): a field is not the shape Spec 80 gives it`}]},[d]),R=(0,i.useMemo)(()=>P.map(a=>(a.element??"").split(/[.[]/)[0]).filter(Boolean),[P]),T=(0,i.useCallback)(async a=>{let c;if(d&&b){try{c=a(d)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}e(c),L(null);try{let a=await fetch(`/api/file${(0,eb.docQuery)(b)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(c,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);N.current?.emitFull(c),v("saved")}catch(a){v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}}},[d,b,v]),U=(0,i.useCallback)((a,c)=>{g(d=>{let e={...d,[a]:{x:Math.round(c.x),y:Math.round(c.y)}};try{localStorage.setItem(e3(b,j),JSON.stringify(e))}catch{}return e})},[b,j]),Z=()=>{g({});try{localStorage.removeItem(e3(b,j))}catch{}q(a=>a+1)},af=async()=>{if(!d)return;v("checking links…");let a=await e7(b);if(0===a.length)return L("none"),z("issues"),B(!0),v("no .smdf.json beside this document to check against","warn");let c=a.flatMap(a=>$(a.def,d).map(b=>({...b,message:`${a.def.settings?.name??a.path}: ${b.message}`})));c.push(..._(d,a.map(a=>a.def.settings?.name??""))),L(c),z("issues"),B(!0),F(!1),v(`checked ${a.length} machine(s): ${c.length} problem(s)`,c.length?"warn":"ok")},ag=async a=>{let c=(await e7(b)).find(b=>b.def.settings?.name===a);c?(0,eb.navigateToDoc)(c.path):v(`no .smdf.json beside this document defines '${a}'`,"warn")},ah=()=>{let a=G.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},al=a=>{let b=O[a],{width:c,height:d}=ah();b&&c&&(o(S([b],c,d,{padding:28,maxScale:1.25})),s(a),H.close())},ap=eJ(),ar=eG("focus"),at=(0,i.useMemo)(()=>d?e2(()=>(function(a,b,c={}){let d=!1!==c.rows,e=[];for(let c of a?.entities??[]){let a=c?.name?b[c.name]:void 0;a&&(e.push({focus:`entity:${c.name}`,box:a}),(c.attributes??[]).filter(a=>a?.name).forEach((b,f)=>{e.push({focus:`attribute:${c.name}.${b.name}`,box:d?{x:a.x,y:a.y+30+20*f,width:a.width,height:20}:a})}))}return e})(d,O,{rows:"chen"!==j}),[]):[],[d,O,j]),au=(0,i.useRef)(-1);(0,i.useEffect)(()=>{if(!d||au.current===ap.nonce)return;au.current=ap.nonce;let a=ap.focus?a8(ap.focus):null,b=a?.kind==="entity"?a.name:a?.kind==="attribute"?a.name.split(".")[0]:null;b&&O[b]&&al(b)},[d,ap,O]),(0,i.useEffect)(()=>{r&&1&&eI(`entity:${r}`)},[r]);let av=d?.entities.find(a=>a.name===r)??null,aw=b.split("/").pop()||"…",ax=Array.isArray(K)?K:[],ay=P.length+ax.length,az=[{id:"entities",label:"Entities",icon:"▭"},{id:"relations",label:"Relations",icon:"⟷"},{id:"notes",label:"Notes",icon:"✎",badge:void 0},{id:"issues",label:"Issues",icon:(0,h.jsx)(eA,{}),badge:ay||void 0}],aA=a=>y===a?"":"hidden md:block",aB=()=>{d&&navigator.clipboard?.writeText(function(a){let b=["erDiagram"],c=" ",d=new Set;for(let e of a.relationships??[]){if(!e?.from||!e?.to)continue;let a=ak[e.cardinality]??ak["1:N"];b.push(`${c}${am(e.from)} ${a} ${am(e.to)} : ${ao(e.label??"")}`),d.add(e.from),d.add(e.to)}let e=new Set;for(let f of a.entities??[]){if(!f?.name||e.has(f.name))continue;e.add(f.name);let a=(f.attributes??[]).filter(a=>a?.name);if(0===a.length){d.has(f.name)||b.push(`${c}${am(f.name)}`);continue}for(let d of(b.push(`${c}${am(f.name)} {`),a))b.push(`${c}${c}${function(a){let b=[];"pk"===a.key&&b.push("PK"),"uk"===a.key&&b.push("UK"),a.references&&b.push("FK");let c=[],d=V(a);d.length&&c.push(`stateOf ${d.join(", ")}`),a.description&&c.push(a.description);let e=[an(a.type??"","unknown"),an(a.name,"unnamed")];return b.length&&e.push(b.join(", ")),c.length&&e.push(ao(c.join(" — "))),e.join(" ")}(d)}`);b.push(`${c}}`)}return b.join("\n")}(d)).then(()=>v("mermaid copied"))};return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsx)("span",{className:"font-semibold text-blue-300",children:"ERD"}),(0,h.jsx)(ec,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:b,children:[d?.settings.name??aw,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aw]})]}),(0,h.jsx)("span",{className:"inline-flex shrink-0 overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Notation",children:[["crowsfoot","▤","Crow's foot — attributes listed inside the entity box"],["chen","◇","Chen — attributes as ovals, relationships as diamonds"]].map(([a,c,d])=>(0,h.jsx)("button",{title:d,"aria-label":d,"aria-pressed":j===a,onClick:()=>(a=>{if(a!==j){try{localStorage.setItem(e4,a)}catch{}k(a),g(e6(b,a)),q(a=>a+1)}})(a),className:`px-2.5 py-1.5 text-sm leading-none md:px-2 md:py-1 ${j===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:c},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:e9,onClick:Z,title:"Forget the dragged positions and lay the board out again",children:"⤢ Arrange"}),(0,h.jsx)("button",{className:e9,onClick:af,title:"Check the state machines beside this document against it",children:"Check links"}),(0,h.jsx)("button",{className:e9,onClick:aB,children:"Copy mermaid"}),(0,h.jsx)("button",{className:e9,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:[["⤢ Arrange the board",Z],["Check links to the machines",af],["Copy as mermaid",aB]].map(([a,b])=>(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),b()},children:a},a))})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:G,className:"relative min-w-0 flex-1 overflow-hidden",children:[d&&(0,h.jsx)(ez,{what:"diagram",resetKey:d,children:(0,h.jsx)(bO,{definition:d,notation:j,positions:O,viewport:n,onViewportChange:o,selection:r,readOnly:l,errorElements:R,fitKey:p,onSelect:s,onClearSelection:()=>s(null),onEntityMove:U,onOpenMachine:ag,emptyHint:"No entities yet — add one in the panel, or let an agent call add_entity."})}),d&&(0,h.jsx)(e0,{docPath:b||null,kind:"erd",viewport:n,setViewport:o,boxes:at,boardRef:G,focus:ar}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,I>1?` \xb7 ${I} in the room`:""]})]}),(0,h.jsxs)("div",{className:"absolute bottom-3 right-3 flex flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur",children:[(0,h.jsx)("button",{title:l?"Shapes are locked: dragging moves the view. Tap to unlock.":"Lock the shapes in place, so dragging only moves the view","aria-label":"Lock shapes in place","aria-pressed":l,onClick:()=>{let a=!l;m(a);try{localStorage.setItem(e5,a?"1":"0")}catch{}v(a?"shapes locked — a drag anywhere moves the view":"shapes unlocked — drag one to move it")},className:`flex h-10 w-10 items-center justify-center border-b border-gray-800 hover:bg-gray-800 md:h-8 md:w-8 ${l?"bg-blue-950/60 text-blue-300":"text-gray-400"}`,children:(0,h.jsx)(eB,{locked:l})}),[["+","Zoom in",()=>ai(1.25)],["−","Zoom out",()=>ai(.8)],["⛶","Fit the whole diagram",()=>q(a=>a+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))]}),av&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("entities"),B(!0)},children:["✎ ",av.name]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:H.close,"aria-hidden":"true"}),d&&(0,h.jsxs)("aside",{style:H.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...H.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:az.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:H.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:aA("entities"),children:[(0,h.jsx)("div",{className:fa,style:{marginTop:0},children:"Entities"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.map(a=>(0,h.jsx)("button",{className:`${e9} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))}),(0,h.jsx)(fd,{fields:[{name:"name",placeholder:"new entity"}],submit:"+ Entity",onSubmit:a=>{T(b=>ad(b,{name:a.name.trim()})),s(a.name.trim())}}),av&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fa} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:av.name}),(0,h.jsx)("button",{className:`${e9} normal-case tracking-normal`,onClick:()=>al(av.name),title:"Bring this entity to the middle of the board at a readable size",children:"◎ Show on board"})]}),(0,h.jsxs)("label",{className:"mb-1 flex items-center gap-2 text-[11px] text-gray-400",title:"Exists only through another entity (an order line, without its order). Chen draws it as a double rectangle.",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!av.weak,onChange:a=>T(b=>ae(b,av.name,{weak:a.target.checked}))}),"weak entity"]}),(av.attributes??[]).map(a=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 font-mono text-[11px]",children:[(0,h.jsxs)("span",{className:a.stateOf?"text-blue-300":"text-gray-300",children:[a.name," : ",a.type,(0,h.jsxs)("span",{className:"text-gray-500",children:[a.key?` ${a.key.toUpperCase()}`:"",a.references?` → ${a.references}`:"",a.stateOf?` ◉ ${[a.stateOf].flat().join(", ")}`:""]})]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove ${a.name}`,onClick:()=>T(b=>(function(a,b,c){let d=aa(a),e=ab(d,b),f=e.attributes?.length??0;if(e.attributes=(e.attributes??[]).filter(a=>a.name!==c),e.attributes.length===f)throw Error(`Attribute '${b}.${c}' not found.`);return d})(b,av.name,a.name)),children:"✕"})]},a.name)),(0,h.jsx)(fd,{fields:[{name:"name",placeholder:"attribute"},{name:"type",placeholder:"type",initial:"string"},{name:"key",options:["","pk","uk"]},{name:"references",placeholder:"references Entity.attr"},{name:"stateOf",placeholder:"stateOf Machine"}],submit:"+ Attribute",onSubmit:a=>T(b=>(function(a,b,c){if(!c.name?.trim())throw Error("An attribute needs a name.");let d=aa(a),e=ab(d,b);if(e.attributes??=[],e.attributes.some(a=>a.name===c.name))throw Error(`Attribute '${b}.${c.name}' already exists.`);return e.attributes.push(ac({...c})),d})(b,av.name,{name:a.name.trim(),type:a.type.trim()||"string",key:"pk"===a.key||"uk"===a.key?a.key:void 0,references:a.references.trim()||void 0,stateOf:a.stateOf.trim()||void 0}))}),(0,h.jsxs)("button",{className:`${e9} mt-2 text-red-300`,onClick:()=>{T(a=>{var b;let c;return b=av.name,ab(c=aa(a),b),c.entities=c.entities.filter(a=>a.name!==b),c.relationships=c.relationships.filter(a=>a.from!==b&&a.to!==b),c}),s(null)},children:["🗑 Delete ",av.name]})]})]}),(0,h.jsxs)("section",{className:aA("relations"),children:[(0,h.jsx)("div",{className:`${fa} max-md:mt-0`,children:"Relationships"}),0===d.relationships.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),d.relationships.map((a,b)=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 text-[11px] text-gray-300",children:[(0,h.jsxs)("span",{children:[a.from," ",(0,h.jsx)("span",{className:"text-gray-500",children:a.cardinality})," ",a.to,a.label?(0,h.jsxs)("span",{className:"text-gray-500",children:[" : ",a.label]}):null]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":"Remove relationship",onClick:()=>T(b=>(function(a,b,c,d){let e=aa(a),f=e.relationships.length;if(e.relationships=e.relationships.filter(a=>a.from!==b||a.to!==c||void 0!==d&&a.label!==d),e.relationships.length===f)throw Error(`No relationship from '${b}' to '${c}'${void 0===d?"":` labelled '${d}'`}.`);return e})(b,a.from,a.to,a.label)),children:"✕"})]},b)),d.entities.length>0&&(0,h.jsx)(fd,{fields:[{name:"from",options:d.entities.map(a=>a.name)},{name:"cardinality",options:[...W],initial:"1:N"},{name:"to",options:d.entities.map(a=>a.name)},{name:"label",placeholder:"label (a verb)"}],submit:"+ Relationship",onSubmit:a=>T(b=>(function(a,b){let c=aa(a);if(ab(c,b.from),ab(c,b.to),!W.includes(b.cardinality))throw Error(`Cardinality '${b.cardinality}' is not one of ${W.join(", ")}.`);return c.relationships.push(ac({...b})),c})(b,{from:a.from,to:a.to,cardinality:a.cardinality,label:a.label.trim()||void 0}))})]}),(0,h.jsxs)("section",{className:aA("notes"),children:[(0,h.jsx)("div",{className:`${fa} max-md:mt-0`,children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent (it reads them with get_notes)."}),(0,h.jsx)(fc,{label:"On this diagram",value:d.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>T(b=>(function(a,b){let c=aa(a);for(let a of["description","notes"]){let d=b[a];void 0!==d&&(d.trim()?c.settings[a]=d:delete c.settings[a])}return c})(b,{notes:a}))},"diagram"),av?(0,h.jsx)(fc,{label:`On ${av.name}`,value:av.notes??"",placeholder:`A question or a decision about ${av.name}…`,onSave:a=>T(b=>ae(b,av.name,{notes:a}))},`entity:${av.name}`):(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select an entity to leave a note on it."}),d.entities.some(a=>a.notes?.trim())&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fa,children:"Entities with notes"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:`${e9} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))})]})]}),(0,h.jsxs)("section",{className:aA("issues"),children:[(0,h.jsx)("div",{className:`${fa} max-md:mt-0 ${0===ay&&!K?"md:hidden":""}`,children:"Issues"}),P.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-red-300",children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ax.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-amber-300",children:["[",a.ruleId,"] ",a.message]},`l${b}`)),"none"===K&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-amber-300",children:"No state machine (.smdf.json) sits beside this document, so there was nothing to check it against."}),0===ay&&"none"!==K&&(0,h.jsx)("div",{className:`py-0.5 text-[11px] ${K?"text-green-400":"text-gray-600 md:hidden"}`,children:K?"Every name the machines use resolves.":"The document is valid. “Check links” (⋯) holds the state machines beside it against it."})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:az.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?H.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fc({label:a,value:b,placeholder:c,onSave:d}){let[e,f]=(0,i.useState)(b),[g,j]=(0,i.useState)(b),[k,l]=(0,i.useState)(!1);b!==g&&(j(b),k||f(b));let m=(0,i.useRef)(null),n=a=>{m.current&&clearTimeout(m.current),m.current=null,a!==b&&d(a)};return(0,h.jsxs)("label",{className:"mt-2 block",children:[(0,h.jsx)("span",{className:"text-[11px] text-gray-500",children:a}),(0,h.jsx)("textarea",{className:`${e8} h-24 resize-y leading-snug`,placeholder:c,value:e,onChange:a=>{let b=a.target.value;f(b),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>n(b),900)},onFocus:()=>l(!0),onBlur:()=>{l(!1),n(e)}})]})}function fd({fields:a,submit:b,onSubmit:c}){let d=()=>Object.fromEntries(a.map(a=>[a.name,a.initial??a.options?.[0]??""])),[e,f]=(0,i.useState)(d),g=a[0];return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:b=>{b.preventDefault();let h={...d(),...e};h[g.name]?.trim()&&(c(h),f(b=>Object.fromEntries(a.map(a=>[a.name,a.options?b[a.name]??"":a.initial??""]))))},children:[a.map(a=>a.options?(0,h.jsx)("select",{className:e8,"aria-label":a.name,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value})),children:a.options.map(b=>(0,h.jsx)("option",{value:b,children:b||`(${a.name})`},b))},a.name):(0,h.jsx)("input",{className:e8,"aria-label":a.name,placeholder:a.placeholder,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value}))},a.name)),(0,h.jsx)("button",{type:"submit",className:`${e9} ${1===a.length?"":"col-span-2"}`,children:b})]})}let fe="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",ff="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fg="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fh({id:a,fields:b,submit:c,onSubmit:d,reset:e=!1,required:f}){let g=()=>Object.fromEntries(b.map(a=>[a.name,a.initial??(!a.checkbox&&(a.options?a.options[0]??"":""))])),[j,k]=(0,i.useState)(g),l=(a,b)=>k(c=>({...c,[a]:b}));return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:a=>{a.preventDefault();let c={...g(),...j};!(f??[]).some(a=>!String(c[a]??"").trim())&&(d(c),e&&k(a=>Object.fromEntries(b.map(b=>[b.name,b.options||b.checkbox?a[b.name]??"":b.initial??""]))))},children:[b.map(b=>{let c=b.label??b.name;if(b.checkbox)return(0,h.jsxs)("label",{className:"flex items-center gap-2 text-[11px] text-gray-400",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!j[b.name],onChange:a=>l(b.name,a.target.checked)}),c]},b.name);if(b.options)return(0,h.jsx)("select",{className:`${fe} ${b.wide?"col-span-2":""}`,"aria-label":c,title:c,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value),children:b.options.map(a=>(0,h.jsx)("option",{value:a,children:a||`(${c})`},a))},b.name);let d=b.suggest?.length?`${a}-${b.name}`:void 0;return(0,h.jsxs)("span",{className:b.wide?"col-span-2":"",children:[(0,h.jsx)("input",{className:fe,"aria-label":c,title:c,placeholder:b.placeholder??c,list:d,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value)}),d&&(0,h.jsx)("datalist",{id:d,children:b.suggest.map(a=>(0,h.jsx)("option",{value:a},a))})]},b.name)}),(0,h.jsx)("button",{type:"submit",className:`${ff} col-span-2`,children:c})]})}function fi({kind:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:"shrink-0",children:["erd"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"4",y:"4.5",width:"16",height:"15",rx:"1.5"}),(0,h.jsx)("path",{d:"M4 9h16M8 13h8M8 16.5h6"})]}),"machine"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"2.5",y:"4",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("rect",{x:"13.5",y:"14",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("path",{d:"M6.5 10v4.5a2.5 2.5 0 0 0 2.5 2.5h4.5"}),(0,h.jsx)("path",{d:"M11.5 15l2 2-2 2"})]}),"sequence"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M6 4v16M18 4v16",strokeDasharray:"2 2.2"}),(0,h.jsx)("path",{d:"M6 9h11M15 7l2 2-2 2"}),(0,h.jsx)("path",{d:"M18 15H7M9 13l-2 2 2 2"})]}),"system"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"3",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"14",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"8.5",y:"14.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("path",{d:"M10 6.5h4M7 9.5l3 5M17 9.5l-3 5"})]}),"link"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.2 1.2"}),(0,h.jsx)("path",{d:"M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.2-1.2"})]}),"actor"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"12",cy:"7.5",r:"3.5"}),(0,h.jsx)("path",{d:"M5 20a7 7 0 0 1 14 0"})]})]})}let fj=["text-sky-300","text-emerald-300","text-amber-300","text-rose-300","text-violet-300","text-cyan-300","text-lime-300","text-orange-300"],fk=a=>`seq-read-${a.kind}-${a.id}`;function fl({definition:a,selection:b,issues:c,onSelect:d,onShowInDiagram:e}){let f=new Map(a.participants.map((a,b)=>[a.name,fj[b%fj.length]])),g=az(a),i=g.filter(a=>null===a.fragment),j=(a.fragments??[]).map((a,b)=>({f:a,fi:b,rows:g.filter(a=>a.fragment===b)})),k=(a,c)=>b?.kind===a&&b.id===c,l=a=>(0,h.jsx)("span",{className:`font-semibold ${f.get(a)??"text-gray-300"}`,children:a||"?"}),m=(a,b)=>{let f={kind:"message",id:a},g=c.get(`message:${a}`)??[],i=g.some(a=>"error"===a.severity)?"error":g.length?"warning":null,j=k("message",a);return(0,h.jsx)("li",{id:fk(f),className:"scroll-mt-16 scroll-mb-24",children:(0,h.jsxs)("div",{role:"button",tabIndex:0,"aria-pressed":j,onClick:()=>d(f),onKeyDown:a=>("Enter"===a.key||" "===a.key)&&(a.preventDefault(),d(f)),className:`flex gap-3 rounded-lg border-l-2 px-3 py-2.5 ${j?"bg-blue-950/60 ring-1 ring-blue-500/60":"hover:bg-gray-900"} ${"error"===i?"border-red-500":"warning"===i?"border-amber-400":"border-transparent"}`,children:[(0,h.jsx)("span",{className:"mt-0.5 flex h-6 min-w-6 shrink-0 items-center justify-center rounded-full border border-gray-700 bg-gray-900 px-1 font-mono text-[11px] text-gray-300",children:a}),(0,h.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,h.jsxs)("div",{className:"text-[13px] leading-5 text-gray-400",children:[l(b.from),b.from===b.to?(0,h.jsx)("span",{children:" to itself"}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"px-1.5 text-gray-500",children:b.reply?"⇠":"→"}),l(b.to)]}),b.reply&&(0,h.jsx)("span",{className:"ml-2 text-[11px] text-gray-500",children:"reply"}),b.optional&&(0,h.jsx)("span",{className:"ml-2 rounded border border-gray-700 px-1 text-[11px] text-gray-400",children:"optional"})]}),(0,h.jsx)("div",{className:`mt-0.5 break-words text-[15px] leading-6 ${b.reply?"text-gray-300":"text-gray-100"}`,children:b.label||(0,h.jsx)("span",{className:"text-gray-500",children:"no label"})}),(b.event||b.state||b.carries)&&(0,h.jsxs)("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[12px] leading-5",children:[b.event&&(0,h.jsx)("span",{className:"rounded border border-blue-500/50 bg-blue-950/50 px-1.5 font-mono text-blue-200",children:b.event}),b.event&&b.machine&&(0,h.jsxs)("span",{className:"text-gray-400",children:["on ",b.machine]}),b.state&&(0,h.jsxs)("span",{className:"text-emerald-300",children:["→ ",b.state]}),b.carries&&(0,h.jsxs)("span",{className:"text-gray-400",children:["carries ",b.carries]})]}),g.map((a,b)=>(0,h.jsx)("p",{className:`mt-1.5 text-[12px] leading-5 ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:a.text},b)),j&&(0,h.jsx)("button",{className:"mt-2 rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-[12px] text-gray-200",onClick:a=>{a.stopPropagation(),e(f)},children:"Show in the diagram"})]})]})},a)};return(0,h.jsx)("div",{className:"h-full overflow-y-auto overscroll-contain",children:(0,h.jsxs)("div",{className:"mx-auto max-w-2xl px-4 pb-28 pt-10",children:[a.participants.length>0&&(0,h.jsx)("ul",{className:"mb-4 flex flex-wrap gap-2","aria-label":"Participants",children:a.participants.map(a=>{let b={kind:"participant",id:a.name},e=a.actor?"actor":a.object?"object":a.service?"service":"",f=c.get(`participant:${a.name}`)??[];return(0,h.jsx)("li",{id:fk(b),children:(0,h.jsxs)("button",{onClick:()=>d(b),"aria-pressed":k("participant",a.name),title:f.map(a=>a.text).join("\n")||void 0,className:`rounded-full border px-3 py-1 text-[13px] ${k("participant",a.name)?"border-blue-500 bg-blue-950/60":"border-gray-700 bg-gray-900"} ${f.length?"ring-1 ring-amber-400/70":""}`,children:[l(a.name),e&&(0,h.jsx)("span",{className:"ml-1.5 text-[11px] text-gray-400",children:e})]})},a.name)})}),0===g.length&&(0,h.jsx)("p",{className:"text-sm text-gray-400",children:"No messages yet — add them in the panel, or let an agent write the scenario."}),(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:i.map(({ref:a,message:b})=>m(a,b))}),j.map(({f:a,fi:b,rows:c})=>(0,h.jsxs)("section",{className:"mt-5 rounded-xl border border-indigo-500/50 bg-indigo-950/20 p-1.5",children:[(0,h.jsxs)("header",{className:"px-3 pb-1.5 pt-2",children:[(0,h.jsxs)("div",{className:"text-[12px] text-indigo-200",children:[(0,h.jsx)("span",{className:"font-semibold uppercase tracking-wide",children:a.kind}),(0,h.jsxs)("span",{className:"text-indigo-300",children:[" · after ",a.after]})]}),(0,h.jsx)("div",{className:"mt-0.5 break-words text-[14px] leading-5 text-gray-100",children:a.label})]}),0===c.length?(0,h.jsx)("p",{className:"px-3 pb-2 text-[12px] text-gray-400",children:"No messages in this fragment."}):(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:c.map(({ref:a,message:b})=>m(a,b))})]},b))]})})}async function fm(a){try{let b=await fetch(`/api/file${(0,eb.docQuery)(a)}`,{cache:"no-store"}),c=await b.json();if(!b.ok||c.error)return{path:a??"",content:null,exists:!1,error:c.error??`HTTP ${b.status}`};return{path:c.path??a??"",content:c.content??null,exists:!!c.exists,mtime:c.mtime}}catch(b){return{path:a??"",content:null,exists:!1,error:b instanceof Error?b.message:String(b)}}}class fn extends Error{constructor(a){super(`${a.split("/").pop()} changed on disk since it was read`)}}async function fo(a,b,c){let d=await fetch(`/api/file${(0,eb.docQuery)(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n",...void 0!==c?{mtime:c}:{}})}),e=await d.json().catch(()=>({}));if(409===d.status)throw new fn(a);if(!d.ok)throw Error(e?.error??`HTTP ${d.status}`);return e?.mtime}async function fp(a){let b=await fm(a),c={path:b.path||a,def:null,members:[],absOf:{},wrapped:{},mtimes:{}};if(b.error)return{...c,error:b.error};if(!b.exists||!b.content)return{...c,error:`${a} does not exist`};let d=null;try{let a=aq(JSON.parse(b.content));aR(a)&&(d=a)}catch{}if(!d)return{...c,error:`${b.path} is not a readable system definition`};let e={},f={},g={[b.path]:b.mtime??0},h=await Promise.all((d.members??[]).filter(a=>a?.path).map(async a=>{let c=aV(b.path,a.path);e[a.path]=c;let d=aS(a.path),h=await fm(c);if(h.error)return{path:a.path,kind:d,def:null,error:h.error};if(!h.exists||!h.content)return{path:a.path,kind:d,def:null,error:"the file does not exist"};g[a.path]=h.mtime??0;try{let b=JSON.parse(h.content);if("machine"===d&&b&&(b.stateMachine||b.StateMachine))return f[a.path]=!0,{path:a.path,kind:d,def:aq(b.stateMachine??b.StateMachine)};return{path:a.path,kind:d,def:aq(b)}}catch(b){return{path:a.path,kind:d,def:null,error:`not JSON: ${b instanceof Error?b.message:String(b)}`}}}));return{path:b.path,def:d,members:h,absOf:e,wrapped:f,mtimes:g}}function fq(){window.dispatchEvent(new Event(eE))}function fr(a){let[b,c]=(0,i.useState)(null),[d,e]=(0,i.useState)(0),f=(0,i.useCallback)(()=>e(a=>a+1),[]);return(0,i.useEffect)(()=>(window.addEventListener(eE,f),()=>window.removeEventListener(eE,f)),[f]),(0,i.useEffect)(()=>{if(!a)return;let b=!0;return fp(a).then(d=>b&&c({for:a,system:d})),()=>{b=!1}},[a,d]),{system:a&&b?.for===a?b.system:null,reload:f}}function fs(a,b){if(!a||!b)return null;for(let[c,d]of Object.entries(a.absOf))if(d===b)return c;return null}async function ft(a,b,c,d){let{bridgeUrl:e}=await ek();if(!e)return;let f=dD({url:e,role:"web",docId:a,name:"web-reconcile",autoResync:!1});try{let a=await Promise.race([f.join(),new Promise((a,b)=>setTimeout(()=>b(Error("join timeout")),3e3))]),e=a.snapshot?.def,g=a=>(function(a){let b=JSON.stringify(a),c=0x811c9dc5;for(let a=0;a<b.length;a++)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")})(a);if(e&&g(e)===g(b))return;await new Promise(a=>{let h=f.on("ack",()=>{h(),a()});d&&e&&g(e)===g(d.from)?f.emitPatch(d.ops,c):f.emitFull(b,c),setTimeout(a,800)})}catch{}finally{f.disconnect()}}async function fu(a,b){let c=[],d=[],e=[],f=async(a,b)=>{try{await b(),c.push(a)}catch(b){b instanceof fn?e.push(a):d.push(`${a}: ${b instanceof Error?b.message:String(b)}`)}};for(let c of b.machines){let b=a.absOf[c.member];b&&c.ops.length&&await f(c.member,async()=>{let d=a.wrapped[c.member]?{stateMachine:c.def}:c.def,e=await fo(b,d,a.mtimes[c.member]),f=a.members.find(a=>a.path===c.member)?.def;await ft(b,c.def,e,{from:f,ops:c.ops})})}for(let c of b.erds){let b=a.absOf[c.member];b&&await f(c.member,async()=>{let d=await fo(b,c.def,a.mtimes[c.member]);await ft(b,c.def,d)})}return b.system&&await f(a.path.split("/").pop()??a.path,async()=>{let c=await fo(a.path,b.system.def,a.mtimes[a.path]);await ft(a.path,b.system.def,c)}),fq(),{written:c,failed:d,conflicts:e}}async function fv(a){let b={result:null,written:[],failed:[],conflicts:[]};for(let c=0;c<2;c+=1){let d=await fp(a);if(!d.def)return{...b,failed:[d.error??"the system could not be read"],retried:c>0};let e=bd(d.def,d.members);if(!e.count)return{...b,result:e,conflicts:c?b.conflicts:[],retried:c>0};let f=await fu(d,e);if(b={result:e,written:[...b.written,...f.written],failed:f.failed,conflicts:f.conflicts},!f.conflicts.length)return{...b,retried:c>0}}return{...b,retried:!0}}let fw="stateloom.sequence.view",fx=["","actor","service","object"],fy=a=>"string"==typeof a?a.trim():"",fz=a=>fy(a).split(",").map(a=>a.trim()).filter(Boolean);function fA(a){return{from:fy(a.from),to:fy(a.to),label:fy(a.label),event:fy(a.event),machine:fy(a.machine),carries:fy(a.carries),state:fy(a.state),description:fy(a.description),optional:!!a.optional||void 0,reply:!!a.reply||void 0}}function fB(){let a,b,c,d=(0,eb.useRequestedDoc)(),e=eG("system"),{system:f}=fr(e),g=eJ(),[j,k]=(0,i.useState)(""),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(void 0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("messages"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),[G,H]=(0,i.useState)("diagram"),I=(0,i.useRef)("diagram");(0,i.useEffect)(()=>{let a=null;try{a=window.localStorage.getItem(fw)}catch{}let b="list"===a||"diagram"===a?a:window.matchMedia("(max-width: 767px)").matches?"list":"diagram";I.current=b,H(b)},[]);let J=(0,i.useCallback)(a=>{I.current=a,H(a);try{window.localStorage.setItem(fw,a)}catch{}},[]),K=(0,i.useRef)(null),L=eC({onClose:()=>B(!1),restVh:62,tallVh:92}),[O,P]=(0,i.useState)(0),R=(0,i.useRef)(null),T=(0,i.useRef)(!0),U=(0,i.useRef)(-1);(0,i.useEffect)(()=>{let a=!1,b=null;return(async()=>{let c=await (await fetch(`/api/file${(0,eb.docQuery)(d)}`,{cache:"no-store"})).json();if(a)return;if(c.error)return v(c.error,"warn");let e=c.path??"",f=null;try{let a=c.content?aq(JSON.parse(c.content)):null;av(a)&&(f=a)}catch{}if(c.exists&&!f)return v(`${e} is not a readable sequence definition`,"warn");let g=(e.split("/").pop()??"Untitled").replace(/\.sqdf\.json$/i,"");k(e),m(f??aw("Default",g)),v(c.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:h}=await ek();!a&&h&&(R.current=b=dF({url:h,role:"web",docId:e,name:"web-designer",onFull:a=>{let b=a.def;av(b)&&(m(b),v("updated live"))},onPatch:()=>{},onPresence:a=>P(a.length)}),b.connect())})().catch(b=>!a&&v(String(b),"warn")),()=>{a=!0,R.current=null,b?.disconnect()}},[d,v]);let V=(0,i.useMemo)(()=>l?bU(l):null,[l]),W=(0,i.useMemo)(()=>V?aL(V):null,[V]),X=(0,i.useMemo)(()=>V&&W?e2(()=>(function(a,b){let c=[];for(let a of b.participants)c.push({focus:`participant:${a.name}`,box:{x:a.left,y:a.top,width:a.width,height:Math.max(a.height,b.lifelineBottom-a.top)}});let d=new Map(az(a).map(a=>[a.ref,a.message]));for(let a of b.rows){let b=a.self?a.fromX:Math.min(a.fromX,a.toX),e=a.self?220:Math.max(40,Math.abs(a.toX-a.fromX)),f={x:b-10,y:a.y-24,width:e+20,height:40};c.push({focus:`message:${a.ref}`,box:f});let g=d.get(a.ref)?.event;g&&c.push({focus:`event:${g}`,box:f})}return c})(V,W),[]):[],[V,W]),Y=eG("focus"),Z=(0,i.useMemo)(()=>{if(!l)return[];let a="";return e2(()=>aA(l),null,b=>a=b)??[{ruleId:"S000",message:`The document could not be checked (${a}): a field is not the shape Spec 81 gives it`}]},[l]),$=fs(f,j),_=(0,i.useMemo)(()=>f?.def&&$&&l?e2(()=>a6(f.def,f.members.map(a=>a.path===$?{...a,def:l,error:void 0}:a)),null):null,[f,$,l]),aa=(0,i.useMemo)(()=>(_?.issues??[]).filter(a=>a.member===$&&!/^S0/.test(a.ruleId)),[_,$]),ab=_?.replays.find(a=>a.member===$)?.report??null,ac=(0,i.useMemo)(()=>(function(a){let b={events:new Set,states:new Set,machines:new Set,objects:new Set,entities:new Set,actors:new Set};if(!a)return{events:[],states:[],machines:[],objects:[],entities:[],actors:[]};let{machines:c,erds:d}=a5(a.members);for(let{def:a}of(c.forEach(({def:a},c)=>{for(let d of(b.machines.add(a_(a,c)),a.events??[]))for(let a of[...d?.events??[],...d?.timers??[]])a?.id&&b.events.add(a.id);for(let c of a.settings?.objects??[])c?.instance&&b.objects.add(c.instance);let d=a=>{a&&(b.states.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};d(a.state)}),d))for(let c of a.entities??[])c?.name&&b.entities.add(c.name);for(let c of a.def?.actors??[])c?.name&&b.actors.add(c.name);let e=a=>[...a].sort((a,b)=>a.localeCompare(b));return{events:e(b.events),states:e(b.states),machines:e(b.machines),objects:e(b.objects),entities:e(b.entities),actors:e(b.actors)}})(f),[f]),ad=(0,i.useMemo)(()=>{let a=a=>a?/^(message|participant):/.test(a)?a:V?.participants.some(b=>b.name===a)?`participant:${a}`:"":"";return[...Z.map(b=>a(b.element)),...aa.filter(a=>"error"===a.severity).map(b=>a(b.element))].filter(Boolean)},[Z,aa,V]),ae=(0,i.useMemo)(()=>aa.filter(a=>"warning"===a.severity).map(a=>a.element??""),[aa]),af=(0,i.useMemo)(()=>{let a=new Map,b=(b,c)=>{let d=b?/^(message|participant):/.test(b)?b:V?.participants.some(a=>a.name===b)?`participant:${b}`:"":"";d&&a.set(d,[...a.get(d)??[],c])};return Z.forEach(a=>b(a.element,{severity:"error",text:a.message})),aa.forEach(a=>b(a.element,{severity:"error"===a.severity?"error":"warning",text:a.message})),a},[Z,aa,V]),ag=()=>{let a=K.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ah=(0,i.useCallback)(a=>{let b=K.current?.getBoundingClientRect();if(!b?.width)return;let c=N(Math.max(S([a],b.width,b.height,{padding:24,maxScale:1.1}).scale,.7));o({scale:c,x:b.width/2-(a.x+a.width/2)*c,y:b.height/2-(a.y+a.height/2)*c})},[]),ai=(0,i.useCallback)(a=>{if(W)if("message"===a.kind){let b=W.rows.find(b=>b.ref===a.id);if(!b)return;let c=b.self?b.fromX:Math.min(b.fromX,b.toX),d=b.self?220:Math.abs(b.toX-b.fromX);ah({x:c-10,y:b.y-24,width:d+20,height:40})}else{let b=W.participants.find(b=>b.name===a.id);b&&ah({x:b.left-20,y:b.top,width:b.width+40,height:Math.min(260,W.height-b.top)})}},[W,ah]),aj=(0,i.useCallback)(a=>{if("diagram"===I.current)return ai(a);requestAnimationFrame(()=>document.getElementById(fk(a))?.scrollIntoView({block:"center",behavior:"smooth"}))},[ai]),ak=(0,i.useCallback)(a=>{s(a),a&&eI(`${a.kind}:${a.id}`)},[]);(0,i.useEffect)(()=>{if(!l||!W||U.current===g.nonce)return;U.current=g.nonce;let a=g.focus?a8(g.focus):null;if(!a)return;let b=null;if("message"===a.kind&&ay(V??l,a.name)&&(b={kind:"message",id:a.name}),"participant"===a.kind&&(V??l).participants.some(b=>b.name===a.name)&&(b={kind:"participant",id:a.name}),!b)return v(`${g.focus} is not in this sequence`,"warn");T.current=!1,s(b),aj(b)},[l,V,W,g,aj,v]),(0,i.useEffect)(()=>{if(!W||!T.current||"diagram"!==G)return;let{width:a,height:b}=ag();a&&(T.current=!1,Math.min((a-32)/W.width,(b-32)/W.height)>=.5||0===W.participants.length?q(a=>(a??0)+1):o({x:8,y:8,scale:.6}))},[W,G]);let al=(0,i.useCallback)(async a=>{let b;if(l&&j){try{b=a(l)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}m(b);try{let a=await fetch(`/api/file${(0,eb.docQuery)(j)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);R.current?.emitFull(b),v("saved")}catch(a){return v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}if(f?.def&&$){if("auto"===aO(f.def)){let{result:a,failed:b,conflicts:d}=await fv(f.path);if(a&&a.count>0){var c;return void(c=b.length?`auto: not written — ${b[0]}`:d.length?`auto: ${d.join(", ")} kept changing on disk; not written — save again`:be(a,"auto"),window.dispatchEvent(new CustomEvent(eF,{detail:{text:c,origin:void 0}})))}}fq()}}},[l,j,v,f,$]),am=a=>{let{width:b,height:c}=ag();o(d=>Q(d,a,{x:b/2,y:c/2}))},an=()=>{let a,b,c,d,e,f,g,h,i;l&&navigator.clipboard?.writeText((a=["sequenceDiagram"],b=new Map,(l.participants??[]).forEach((c,d)=>{let e=`p${d+1}`;b.set(c.name,e),a.push(` ${c.actor?"actor":"participant"} ${e} as ${aM(c.name)}`)}),c=a=>b.get(a)??aM(a).replace(/\W+/g,"_"),d=(a,b,d)=>{let e=a.reply?"-->>":"->>",f=[`${b} ${aM(a.label??"")}`,a.event?aM(a.event):""].filter(Boolean).join(" · "),g=`${d}${c(a.from)}${e}${c(a.to)}: ${f}`;return a.optional?[`${d}opt optional`,` ${g}`,`${d}end`]:[g]},e=l.messages??[],f=l.fragments??[],g=a=>f.filter(b=>b?.after===a),h=(b,c)=>(b.messages??[]).forEach((e,g)=>a.push(...d(e,`f${f.indexOf(b)+1}.${g+1}`,c+" "))),(i=(b,c,f)=>{for(let j=b;j<=e.length;j++){let b=j===f?[]:g(j);for(let d of b.filter(a=>"alt"!==a.kind))a.push(`${c}${d.kind} ${aM(d.label??"")}`),h(d,c),a.push(`${c}end`);let k=b.filter(a=>"alt"===a.kind);if(k.length){k.forEach((b,d)=>{a.push(`${c}${0===d?"alt":"else"} ${aM(b.label??"")}`),h(b,c)}),j<e.length&&(a.push(`${c}else as written`),i(j,c+" ",j)),a.push(`${c}end`);return}j<e.length&&a.push(...d(e[j],String(j+1),c))}})(0," ",null),a.join("\n")+"\n")).then(()=>v("mermaid copied"))},ao=a=>{let b=a?a8(a):null;if(!b||"message"!==b.kind&&"participant"!==b.kind)return;let c={kind:b.kind,id:b.name};ak(c),aj(c),L.close()},ap=V??aw("",""),ar=az(ap),as=l&&r?.kind==="message"?ay(ap,r.id):null,at=l&&r?.kind==="participant"?ap.participants.find(a=>a.name===r.id)??null:null,ax=ap.participants.map(a=>a.name),aK=j.split("/").pop()||"…",aN=Z.length+aa.filter(a=>"error"===a.severity).length,aP=aa.filter(a=>"warning"===a.severity).length,aQ=[{id:"participants",label:"Participants",icon:(0,h.jsx)(fi,{kind:"actor"})},{id:"messages",label:"Messages",icon:(0,h.jsx)(fi,{kind:"sequence"})},{id:"notes",label:"Notes",icon:"✎"},{id:"issues",label:"Issues",icon:(0,h.jsx)(eA,{}),badge:aN+aP||void 0}],aR=a=>[{name:"from",label:"from",options:ax,initial:a?.from??ax[0]??""},{name:"to",label:"to",options:ax,initial:a?.to??ax[1]??ax[0]??""},{name:"label",label:"label",placeholder:"what is said or done",initial:a?.label??"",wide:!0},{name:"event",label:"event it fires",suggest:ac.events,initial:a?.event??""},{name:"state",label:"state after",suggest:ac.states,initial:a?.state??""},{name:"carries",label:"entity it carries",suggest:ac.entities,initial:a?.carries??""},{name:"machine",label:"machine",suggest:ac.machines,initial:a?.machine??""},{name:"optional",label:"optional",checkbox:!0,initial:!!a?.optional},{name:"reply",label:"reply (dashed)",checkbox:!0,initial:!!a?.reply}],aS=a=>a.actor?"actor":a.object?"object":a.service?"service":"",aT=["main: at the end",...as&&null===as.fragment?[`main: after ${as.index+1}`]:[],...(l?.fragments??[]).map((a,b)=>`fragment ${b+1}: ${a.kind} \xb7 ${a.label}`)];return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fi,{kind:"sequence",size:14}),"SEQ"]}),(0,h.jsx)(ec,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:j,children:[l?.settings.name??aK,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aK]})]}),(0,h.jsx)("div",{className:"flex shrink-0 overflow-hidden rounded border border-gray-700 text-[12px] leading-none",role:"group","aria-label":"View",children:[["list","List","Read the messages in order, one under the other"],["diagram","Diagram","The lifelines and arrows"]].map(([a,b,c])=>(0,h.jsx)("button",{title:c,"aria-pressed":G===a,onClick:()=>{G!==a&&(r&&(T.current=!1),J(a),r&&requestAnimationFrame(()=>aj(r)))},className:`px-2.5 py-1.5 ${G===a?"bg-gray-700 text-gray-100":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,children:b},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:ff,onClick:an,children:"Copy mermaid"}),(0,h.jsx)("button",{className:ff,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),an()},children:"Copy as mermaid"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:K,className:"relative min-w-0 flex-1 overflow-hidden",children:[l&&W&&"list"===G&&V&&(0,h.jsx)(ez,{what:"sequence",resetKey:l,children:(0,h.jsx)(fl,{definition:V,selection:r,issues:af,onSelect:a=>ak(a),onShowInDiagram:a=>{T.current=!1,J("diagram"),requestAnimationFrame(()=>ai(a))}})}),l&&W&&"diagram"===G&&(0,h.jsx)(ez,{what:"sequence",resetKey:l,children:(0,h.jsx)(bV,{definition:V,layout:W,viewport:n,onViewportChange:o,selection:r,errorElements:ad,warningElements:ae,fitKey:p,onSelect:(a,b)=>ak({kind:a,id:b}),onClearSelection:()=>s(null),emptyHint:"No participants yet — add them in the panel, or let an agent write the scenario."})}),l&&W&&"diagram"===G&&(0,h.jsx)(e0,{docPath:j||null,kind:"sequence",viewport:n,setViewport:o,boxes:X,boardRef:K,focus:Y}),l&&W&&"list"===G&&(0,h.jsx)(e1,{docPath:j,onReveal:()=>J("diagram")}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"} ${"list"===G&&w&&"ok"===t.tone?"hidden":"flex"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,O>1?` \xb7 ${O} in the room`:""]})]}),(0,h.jsx)("div",{className:`absolute bottom-3 right-3 flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur ${"diagram"===G?"flex":"hidden"}`,children:[["+","Zoom in",()=>am(1.25)],["−","Zoom out",()=>am(.8)],["⛶","Fit the whole diagram",()=>q(a=>(a??0)+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))}),r&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("message"===r.kind?"messages":"participants"),B(!0)},children:["Edit ","message"===r.kind?`${r.id}. ${as?.message.label??""}`:r.id]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:L.close,"aria-hidden":"true"}),l&&(0,h.jsxs)("aside",{style:L.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...L.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:aQ.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:L.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:aQ.map(a=>(0,h.jsxs)("button",{onClick:()=>z(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${y===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsx)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:(0,h.jsxs)(ez,{what:"panel",resetKey:l,children:[(0,h.jsxs)("section",{className:"participants"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Participants"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:ap.participants.map(a=>(0,h.jsxs)("button",{className:`${ff} ${r?.kind==="participant"&&r.id===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>{ak({kind:"participant",id:a.name}),aj({kind:"participant",id:a.name})},title:aS(a)||"participant",children:[a.name,aS(a)&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" · ",aS(a)]})]},a.name))}),(0,h.jsx)(fh,{id:"add-participant",reset:!0,required:["name"],fields:[{name:"name",placeholder:"new participant"},{name:"kind",options:fx,label:"kind"},{name:"value",placeholder:"actor / service / object",suggest:[...ac.actors,...ac.objects]},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ac.entities}],submit:"+ Participant",onSubmit:a=>{let b=fy(a.name),c=fy(a.kind);al(d=>(function(a,b,c){if(!b.name?.trim())throw Error("A participant needs a name.");let d=aB(a);if(d.participants.some(a=>a.name===b.name))throw Error(`Participant '${b.name}' already exists.`);let e=d.participants.length;return d.participants.splice(e,0,aC({...b})),d})(d,{name:b,...c?{[c]:fy(a.value)||b}:{},holds:fz(a.holds)})),ak({kind:"participant",id:b})}}),at&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fg} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:at.name}),(0,h.jsx)("button",{className:`${ff} normal-case tracking-normal`,onClick:()=>aj({kind:"participant",id:at.name}),children:"◎ Show on board"})]}),(a=ap.participants.findIndex(a=>a.name===at.name),b=ap.participants.length-1,c=a=>al(b=>{var c;let d,e;return c=at.name,e=aD(d=aB(b),c),d.participants.splice(d.participants.indexOf(e),1),d.participants.splice(Math.max(0,Math.min(a,d.participants.length)),0,e),d}),(0,h.jsxs)("div",{className:"mb-1 flex items-center gap-1 text-[11px] text-gray-400",children:[(0,h.jsx)("button",{className:`${ff} disabled:opacity-40`,disabled:a<=0,onClick:()=>c(a-1),"aria-label":"Move one column left",children:"← Left"}),(0,h.jsxs)("span",{className:"flex-1 text-center",children:["column ",a+1," of ",b+1]}),(0,h.jsx)("button",{className:`${ff} disabled:opacity-40`,disabled:a>=b,onClick:()=>c(a+1),"aria-label":"Move one column right",children:"Right →"})]})),(0,h.jsx)(fh,{id:"rename-participant",required:["to"],fields:[{name:"to",label:"new name",initial:at.name}],submit:"Rename (every message follows)",onSubmit:a=>{let b=fy(a.to);b!==at.name&&(al(a=>(function(a,b,c){if(!c?.trim())throw Error("A participant needs a name.");let d=aB(a),e=aD(d,b);if(c===b)return d;if(d.participants.some(a=>a.name===c))throw Error(`Participant '${c}' already exists.`);e.name=c;let f=a=>{a.from===b&&(a.from=c),a.to===b&&(a.to=c)};for(let a of(d.messages.forEach(f),d.fragments??[]))a.messages.forEach(f);return d})(a,at.name,b)),ak({kind:"participant",id:b}))}},`rename:${at.name}`),(0,h.jsx)(fh,{id:"edit-participant",fields:[{name:"kind",options:fx,label:"kind",initial:aS(at)},{name:"value",placeholder:"actor / service / object",suggest:[...ac.actors,...ac.objects],initial:at.actor??at.object??at.service??""},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ac.entities,initial:(at.holds??[]).join(", "),wide:!0},{name:"description",placeholder:"description",initial:at.description??"",wide:!0}],submit:"Save participant",onSubmit:a=>al(b=>{let c,d;return aG(b,at.name,{...(c=fy(a.kind),d=fy(a.value)||at.name,{actor:"actor"===c?d:"",service:"service"===c?d:"",object:"object"===c?d:""}),holds:fz(a.holds),description:fy(a.description)})})},`p:${JSON.stringify(at)}`),(0,h.jsxs)("button",{className:`${ff} mt-2 text-red-300`,onClick:()=>{al(a=>{var b;let c,d;return b=at.name,aD(c=aB(a),b),c.participants=c.participants.filter(a=>a.name!==b),d=a=>a.from!==b&&a.to!==b,c.messages=c.messages.filter(d),c.fragments&&(c.fragments=c.fragments.map(b=>{let c;return{...b,after:Math.max(0,b.after-(c=b.after,a.messages.slice(0,c).filter(a=>!d(a)).length)),messages:b.messages.filter(d)}}).filter(a=>a.messages.length>0),c.fragments.length||delete c.fragments),c}),s(null),eI(null)},title:"Also removes every message it sends or receives",children:["Delete ",at.name," and its messages"]})]})]}),(0,h.jsxs)("section",{className:"messages"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Messages"}),0===ar.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),(0,h.jsx)("div",{className:"flex flex-col",children:ar.map(({ref:a,message:b,fragment:c},d)=>{let e=null!==c&&(0===d||ar[d-1].fragment!==c),f=null!==c?ap.fragments?.[c]:void 0,g=r?.kind==="message"&&r.id===a;return(0,h.jsxs)("div",{children:[e&&f&&(0,h.jsxs)("div",{className:"mt-2 border-t border-gray-800 pt-1 text-[11px] text-indigo-300",children:[(0,h.jsx)("span",{className:"font-semibold",children:f.kind})," · after ",f.after," · ",f.label]}),(0,h.jsxs)("button",{className:`block w-full truncate rounded px-1 py-0.5 text-left text-[11px] ${g?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>{ak({kind:"message",id:a}),aj({kind:"message",id:a})},title:`${b.from} → ${b.to}: ${b.label}`,children:[(0,h.jsxs)("span",{className:"text-gray-500",children:[a,"."]})," ",b.from," → ",b.to,": ",b.label,b.event?(0,h.jsxs)("span",{className:"text-blue-300",children:[" [",b.event,"]"]}):null,b.state?(0,h.jsxs)("span",{className:"text-emerald-400",children:[" → ",b.state]}):null,b.optional?(0,h.jsx)("span",{className:"text-gray-500",children:" opt"}):null]})]},a)})}),as&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fg} flex items-center justify-between gap-2`,children:[(0,h.jsxs)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:["Message ",r.id]}),(0,h.jsxs)("span",{className:"flex gap-1 normal-case tracking-normal",children:[null===as.fragment&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:ff,"aria-label":"Move up",title:"Move up",disabled:0===as.index,onClick:()=>{al(a=>aJ(a,as.index,as.index-1)),ak({kind:"message",id:String(as.index)})},children:"↑"}),(0,h.jsx)("button",{className:ff,"aria-label":"Move down",title:"Move down",disabled:as.index>=ap.messages.length-1,onClick:()=>{al(a=>aJ(a,as.index,as.index+1)),ak({kind:"message",id:String(as.index+2)})},children:"↓"})]}),(0,h.jsx)("button",{className:ff,onClick:()=>aj(r),children:"◎ Show"})]})]}),(0,h.jsx)(fh,{id:"edit-message",required:["label"],fields:[...aR(as.message),{name:"description",placeholder:"description",initial:as.message.description??"",wide:!0}],submit:"Save message",onSubmit:a=>al(b=>aI(b,as.index,fA(a),as.fragment))},`m:${r.id}:${JSON.stringify(as.message)}`),(0,h.jsxs)("button",{className:`${ff} mt-2 text-red-300`,onClick:()=>{al(a=>(function(a,b,c=null){let d=aB(a);if(null!==c){let a=aF(d,c);if(!a.messages[b])throw Error(`Message ${b+1} not found in fragment ${c+1}.`);return a.messages.splice(b,1),d}if(!d.messages[b])throw Error(`Message ${b+1} not found. The sequence has ${d.messages.length}.`);if(d.messages.splice(b,1),d.fragments)for(let a of d.fragments)a.after>b&&(a.after-=1);return d})(a,as.index,as.fragment)),s(null),eI(null)},children:["Delete message ",r.id]})]}),(0,h.jsx)("div",{className:fg,children:"Add a message"}),(0,h.jsx)(fh,{id:"add-message",reset:!0,required:["label"],fields:[{name:"where",options:aT,label:"where",wide:!0},...aR()],submit:"+ Message",onSubmit:a=>{let b=fy(a.where),c=fA(a),d=/^fragment (\d+):/.exec(b),e=/^main: after (\d+)$/.exec(b);d?al(a=>{var b;let e,f,g;return b=Number(d[1])-1,f=aF(e=aB(a),b),aE(e,c),g=f.messages.length,f.messages.splice(g,0,aC({...c})),e}):e?al(a=>aH(a,c,Number(e[1]))):al(a=>aH(a,c))}},`add:${aT.join("|")}:${ax.join("|")}`),(0,h.jsx)("div",{className:fg,children:"Fragments"}),0===(ap.fragments??[]).length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None."}),(ap.fragments??[]).map((a,b)=>(0,h.jsxs)("div",{className:"mb-2 rounded border border-gray-800 p-1.5",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between text-[11px] text-indigo-300",children:[(0,h.jsxs)("span",{children:[b+1,". ",(0,h.jsx)("span",{className:"font-semibold",children:a.kind})," · after ",a.after," · ",a.messages.length," message(s)"]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove fragment ${b+1}`,onClick:()=>al(a=>{let c;return aF(c=aB(a),b),c.fragments.splice(b,1),c.fragments.length||delete c.fragments,c}),children:"✕"})]}),(0,h.jsx)(fh,{id:`edit-fragment-${b}`,fields:[{name:"kind",options:au,initial:a.kind},{name:"after",placeholder:"after message",initial:String(a.after)},{name:"label",placeholder:"the condition, in words",initial:a.label,wide:!0}],submit:"Save fragment",onSubmit:a=>al(c=>(function(a,b,c){let d=aB(a),e=aF(d,b);if(void 0!==c.kind&&!au.includes(c.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${c.kind}'.`);if(void 0!==c.after&&(!Number.isInteger(c.after)||c.after<0||c.after>d.messages.length))throw Error(`A fragment branches after a main message, 0 to ${d.messages.length}; got ${c.after}.`);return d.fragments[b]={...aC({...e,...c,messages:void 0}),messages:e.messages??[]},d})(c,b,{kind:fy(a.kind),after:Number(fy(a.after)),label:fy(a.label)}))})]},`${b}:${JSON.stringify({...a,messages:void 0})}`)),(0,h.jsx)(fh,{id:"add-fragment",reset:!0,required:["label"],fields:[{name:"kind",options:au},{name:"after",placeholder:"after message",initial:String(as&&null===as.fragment?as.index+1:ap.messages.length)},{name:"label",placeholder:"the condition, in words",wide:!0},{name:"from",options:ax,label:"first message from"},{name:"to",options:ax,label:"to",initial:ax[1]??ax[0]??""},{name:"first",placeholder:"first message label (optional)",wide:!0}],submit:"+ Fragment",onSubmit:a=>al(b=>(function(a,b){if(!au.includes(b.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${b.kind}'.`);if(!b.label?.trim())throw Error("A fragment needs a label: the condition in words.");let c=aB(a);if(!Number.isInteger(b.after)||b.after<0||b.after>c.messages.length)throw Error(`A fragment branches after a main message, 0 to ${c.messages.length}; got ${b.after}.`);for(let a of b.messages??[])aE(c,a);return(c.fragments??=[]).push({...aC({...b,messages:void 0}),messages:(b.messages??[]).map(a=>aC({...a}))}),c})(b,{kind:fy(a.kind),after:Number(fy(a.after)),label:fy(a.label),messages:fy(a.first)?[{from:fy(a.from),to:fy(a.to),label:fy(a.first)}]:[]}))},`add-fragment:${ap.messages.length}:${as?.index??""}`)]}),(0,h.jsxs)("section",{className:"notes"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent."}),(0,h.jsx)(fc,{label:"On this sequence",value:l.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>al(b=>{var c;let d;return c={notes:a},(d=aB(b)).settings=aC({...d.settings,...c}),d})},"sequence"),at&&(0,h.jsx)(fc,{label:`On ${at.name}`,value:at.notes??"",placeholder:`A question or a decision about ${at.name}…`,onSave:a=>al(b=>aG(b,at.name,{notes:a}))},`participant:${at.name}`),as&&(0,h.jsx)(fc,{label:`On message ${r.id}`,value:as.message.notes??"",placeholder:"A question or a decision about this message…",onSave:a=>al(b=>aI(b,as.index,{notes:a},as.fragment))},`message:${r.id}`),!r&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select a participant or a message to leave a note on it."}),[...ap.participants.filter(a=>a.notes?.trim()),...ar.filter(a=>a.message.notes?.trim())].length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fg,children:"With notes"}),(0,h.jsxs)("div",{className:"flex flex-wrap gap-1",children:[ap.participants.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:ff,onClick:()=>ao(`participant:${a.name}`),children:a.name},`p${a.name}`)),ar.filter(a=>a.message.notes?.trim()).map(a=>(0,h.jsxs)("button",{className:ff,onClick:()=>ao(`message:${a.ref}`),children:["message ",a.ref]},`m${a.ref}`))]})]})]}),(0,h.jsxs)("section",{className:"issues"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Issues"}),Z.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 text-left text-[11px] text-red-300",onClick:()=>ao(a.element),children:["[",a.ruleId,"] ",a.message]},`p${b}`)),aa.map((a,b)=>(0,h.jsxs)("button",{className:`block w-full py-0.5 text-left text-[11px] ${"error"===a.severity?"text-red-300":"text-amber-300"}`,onClick:()=>ao(a.element),children:["[",a.ruleId,"] ",a.message]},`s${b}`)),0===Z.length&&0===aa.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-green-400",children:_?"Valid, and every name it uses resolves in the system.":"The document is valid."}),!e&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Open this sequence from its system to check it against the machines and the data."}),e&&!$&&f&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-amber-300",children:"This document is not a member of the open system."}),ab&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:fg,children:["Replay against ",ab.machines.join(", ")||"no machine"]}),ab.paths.map(a=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${a.accepted?"text-green-400":"text-amber-300"}`,children:[a.name," — ",a.accepted?"accepted":"stops"]}),a.steps.filter(a=>"data"!==a.result).map(b=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===b.result||"stayed"===b.result?"text-gray-400":"text-amber-300"}`,title:b.note??b.result,onClick:()=>ao(`message:${b.ref}`),children:[b.ref,". ",b.event??""," ",b.from.join("|")||"·"," → ",b.to.join("|")||"·"," ",b.result]},`${a.name}:${b.ref}`))]},a.name))]})]})]})})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:aQ.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?L.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fC(a,b){let c=a?.members.find(a=>a.path===b)?.def;return c?.settings?.name||(b.split("/").pop()??b).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$|\.json$/i,"")}let fD=(a,b)=>a?.members.find(a=>a.path===b)?.kind??"machine";function fE(a){return"message"===a.kind?`message ${a.name}`:`${a.kind} ${a.name}`}function fF({systemPath:a}){let b=eG("doc"),c=eG("focus"),{system:d}=fr(a),[e,f]=(0,i.useState)(!1),[g,j]=(0,i.useState)(null),k=(0,i.useRef)(d);(0,i.useEffect)(()=>{k.current=d},[d]);let l=(0,i.useMemo)(()=>d?e2(()=>a9(d.members),[]):[],[d]),m=fs(d,b),n=!!d&&(b===d.path||b===a),o=m&&c?function(a,b,c){let d=a8(c);if(!d)return[];let e=a=>a.member===b&&a.kind===d.kind&&a.name===d.name,f=[];for(let b of a)e(b.from)?f.push({other:b.to,text:b.text,rule:b.rule}):e(b.to)&&f.push({other:b.from,text:b.back,rule:b.rule});return f}(l,m,c):[],p=function(a,b){if(!b)return[];let c=new Map;for(let d of a)for(let a of[d.from,d.to]){if(a.member!==b)continue;let d=a7(a);c.set(d,(c.get(d)??0)+1)}return[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0]))}(l,m);(0,i.useEffect)(()=>{let a=a=>{let b=a.detail;b?.text&&j({...b,at:Date.now()})};return window.addEventListener(eF,a),()=>window.removeEventListener(eF,a)},[]),(0,i.useEffect)(()=>{if(!g)return;let a=setTimeout(()=>j(null),9e3);return()=>clearTimeout(a)},[g]);let q=d?.path;(0,i.useEffect)(()=>{if(!q)return;let b=!0,c=null,d=null;return(async()=>{let{bridgeUrl:e}=await ek();if(b&&e){var g;let b,h,i,l;(c=dD({url:e,role:"web",docId:q,name:"web-system-strip"})).on("view",b=>{let c=k.current;if(!c)return;let d=b.member?void 0!==c.absOf[b.member]?b.member:Object.keys(c.absOf).find(a=>c.absOf[a]===b.member):void 0;if(b.member&&!d)return void j({text:`ignored a view of ${b.member.split("/").pop()}: it is not a member of this system`,origin:b.origin,at:Date.now()});eH({doc:d?c.absOf[d]:q,system:a,focus:b.focus??null}),f(!1);let e=[d?fC(c,d):"the system map",b.focus].filter(Boolean).join(" · ");j({text:b.note?b.note:`showing ${e}`,origin:b.origin,at:Date.now()})}),c.on("full",()=>fq()),g=c,b=!1,h=!1,i=()=>{g.join().then(()=>{b=!0}).catch(()=>{})},l=g.on("status",a=>{"connected"!==a?h=b:h&&(h=!1,i())}),i(),d=()=>{l()}}})(),()=>{b=!1,d?.(),c?.disconnect()}},[q,a]);let r=b=>{f(!1),d&&eH({doc:b.member?d.absOf[b.member]??aV(d.path,b.member):d.path,system:a,focus:b.focus??null})},s=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],t=d?.def?.settings?.name??(a.split("/").pop()??"system").replace(/\.sysdf\.json$/i,""),u=o.length;return(0,h.jsxs)("div",{className:"system-strip relative z-50 border-b border-gray-800 bg-gray-950 text-xs text-gray-300",children:[(0,h.jsxs)("div",{className:"flex h-[var(--strip-h)] items-center gap-1 px-1.5 md:px-2",children:[(0,h.jsxs)("button",{onClick:()=>r({}),className:`flex min-w-0 max-w-[30%] shrink-0 items-center gap-1 rounded px-1.5 py-1 md:max-w-[16rem] ${n?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,title:`${a} — the system map`,children:[(0,h.jsx)(fi,{kind:"system",size:15}),(0,h.jsx)("span",{className:"truncate font-semibold",children:t})]}),(0,h.jsx)("span",{className:"h-4 w-px shrink-0 bg-gray-800"}),(0,h.jsxs)("nav",{className:"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto [scrollbar-width:none]","aria-label":"Members",children:[s.map(a=>{let b=a===m,c=d?.members.find(b=>b.path===a)?.error;return(0,h.jsxs)("button",{onClick:()=>r({member:a}),"aria-current":b?"page":void 0,title:`${fC(d,a)} — ${a}${c?` (cannot be read: ${c})`:""}`,className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 ${b?"bg-blue-950/60 text-blue-200":c?"text-red-400 hover:bg-gray-800":"text-gray-400 hover:bg-gray-800 hover:text-gray-200"}`,children:[(0,h.jsx)(fi,{kind:fD(d,a),size:15}),(0,h.jsx)("span",{className:`max-w-[7.5rem] truncate md:max-w-[11rem] ${b?"":"hidden md:inline"}`,children:fC(d,a)})]},a)}),!d&&(0,h.jsx)("span",{className:"px-1 text-gray-600",children:"loading…"}),d?.error&&(0,h.jsx)("span",{className:"truncate px-1 text-amber-300",children:d.error})]}),(0,h.jsxs)("button",{onClick:()=>f(a=>!a),disabled:!m,"aria-expanded":e,title:m?c?`What ${c} links to in the other drawings`:"Elements of this drawing that link to the others":"Open a member to follow its links",className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 disabled:opacity-40 ${e?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,children:[(0,h.jsx)(fi,{kind:"link",size:15}),(0,h.jsx)("span",{className:"hidden sm:inline",children:"Links"}),u>0&&(0,h.jsx)("span",{className:"rounded-full border border-gray-700 px-1 text-[10px] leading-4 text-gray-300",children:u})]})]}),g&&!e&&(0,h.jsx)("div",{className:"pointer-events-none absolute inset-x-0 top-full flex justify-center px-2 pt-1",role:"status",children:(0,h.jsxs)("span",{className:"max-w-full truncate rounded border border-gray-700 bg-gray-900/95 px-2 py-0.5 text-[11px] text-gray-300 shadow",children:[g.origin?(0,h.jsxs)("span",{className:"text-blue-300",children:[g.origin,": "]}):null,g.text]})}),e&&m&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>f(!1),"aria-hidden":"true"}),(0,h.jsxs)("div",{className:"absolute right-1 top-full z-50 mt-1 max-h-[60vh] w-[min(24rem,calc(100vw-0.5rem))] overflow-y-auto rounded-lg border border-gray-700 bg-gray-900 p-2 shadow-xl",children:[c&&a8(c)?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 flex items-center justify-between gap-2 text-[11px] text-gray-500",children:[(0,h.jsxs)("span",{className:"truncate",children:[(0,h.jsx)("span",{className:"text-gray-200",children:fE(a8(c))})," in ",fC(d,m)]}),(0,h.jsx)("button",{className:"shrink-0 text-gray-500 hover:text-gray-200",onClick:()=>eH({doc:b,focus:null}),children:"clear"})]}),0===o.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"Nothing in the other drawings names it."}),o.map((a,b)=>(0,h.jsxs)("button",{onClick:()=>r({member:a.other.member,focus:a7(a.other)}),className:"flex w-full items-start gap-2 rounded px-1.5 py-1.5 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-gray-400",children:(0,h.jsx)(fi,{kind:fD(d,a.other.member),size:14})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block text-[12px] text-gray-200",children:a.text}),(0,h.jsxs)("span",{className:"block truncate text-[10.5px] text-gray-500",children:[fE(a.other)," · ",fC(d,a.other.member)," · ",a.rule]})]})]},b))]}):null,(!c||!a8(c))&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["Elements of ",fC(d,m)," that the other drawings name — pick one to follow it."]}),0===p.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"None."}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:p.map(([a,c])=>(0,h.jsxs)("button",{onClick:()=>{f(!0),eH({doc:b,focus:a})},className:"rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[11px] text-gray-200 hover:bg-gray-700",children:[a," ",(0,h.jsx)("span",{className:"text-gray-500",children:c})]},a))})]})]})]})]})}let fG={erd:"ERD",machine:"STATE MACHINE",sequence:"SEQUENCE",system:"SYSTEM"};function fH(a,b,c=!1){if(!b)return"";if("erd"===a)return`${b.entities?.length??0} entities \xb7 ${b.relationships?.length??0} relationships`;if("sequence"===a){let a=b.fragments?.length??0;return`${b.participants?.length??0} participants \xb7 ${b.messages?.length??0} messages${a&&!c?` \xb7 ${a} fragment${a>1?"s":""}`:""}`}let d=0,e=a=>{a&&(d+=1,(a.states??[]).forEach(e),(a.parallel?.states??[]).forEach(e))};(b.state?.states??[]).forEach(e),(b.state?.parallel?.states??[]).forEach(e);let f=(b.events??[]).reduce((a,b)=>a+(b?.events?.length??0)+(b?.timers?.length??0),0);return`${d} states \xb7 ${f} events`}let fI=(a,b)=>a<b?`${a}\u0000${b}`:`${b}\u0000${a}`;function fJ(a){let b="message"===a.from.kind?`message ${a.from.name}`:`${a.from.kind} ${a.from.name}`;return`${b} ${a.text}`}function fK(){let a=(0,eb.useRequestedDoc)(),[b,c]=(0,i.useState)(a);(0,i.useEffect)(()=>{let b=!0;if(a)c(a);else fm(null).then(a=>b&&c(a.path||null));return()=>{b=!1}},[a]);let{system:d,reload:e}=fr(b),[f,g]=(0,i.useState)("members"),[j,k]=(0,i.useState)(!1),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)(!1),[p,q]=(0,i.useState)(null),[r,s]=(0,i.useState)({text:"loading…",tone:"ok"}),t=(0,i.useCallback)((a,b="ok")=>s({text:a,tone:b}),[]),[u,v]=(0,i.useState)(!1),w=eC({onClose:()=>k(!1),restVh:62,tallVh:92}),x=(0,i.useRef)(null),[y,z]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=x.current;if(!a)return;let b=()=>{let b=a.getBoundingClientRect();b.width&&z(b.height>1.1*b.width)};b();let c=new ResizeObserver(b);return c.observe(a),()=>c.disconnect()},[]);let A=(0,i.useRef)(!1);(0,i.useEffect)(()=>{d&&(d.error?t(d.error,"warn"):A.current||t(`${d.members.length} member${1===d.members.length?"":"s"} loaded`),A.current=!0)},[d,t]);let[B,C]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>C(!0),4e3);return()=>{clearTimeout(a),C(!1)}},[r]);let D=(0,i.useMemo)(()=>d?.def?e2(()=>a6(d.def,d.members),null):null,[d]),E=(0,i.useMemo)(()=>d?e2(()=>a9(d.members),[]):[],[d]),F=(0,i.useMemo)(()=>d?.def?e2(()=>bd(d.def,d.members),null):null,[d]),G=aO(d?.def),H=(0,i.useMemo)(()=>{let a=new Map;for(let b of E){if(b.from.member===b.to.member)continue;let c=fI(b.from.member,b.to.member),d=a.get(c)??{a:c.split("\0")[0],b:c.split("\0")[1],links:[]};d.links.push(b),a.set(c,d)}return a},[E]),I=(D?.issues??[]).filter(a=>"error"===a.severity),J=(D?.issues??[]).filter(a=>"warning"===a.severity),K=(b,c)=>{d&&eH({doc:d.absOf[b]??b,system:a??d.path,focus:c??null})},L=async(a,b)=>{if(d)try{await fo(d.path,a,d.mtimes[d.path]),t(b),fq()}catch(a){a instanceof fn?(t("the system changed on disk — reloaded; make the change again","warn"),fq()):t(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}},M=async()=>{if(!d||!F||!F.count)return;v(!0);let{result:a,written:b,failed:c,conflicts:e}=await fv(d.path);v(!1),c.length?t(`not all written: ${c.join("; ")}`,"warn"):e.length?t(`${e.join(", ")} kept changing on disk — not written; apply again`,"warn"):a?.count?t(`${be(a,"propose").replace(/ proposed/," applied")} — ${b.length} file(s) written`):t("nothing to apply: the drawings on disk already agree")},N=y?420:760,O=y?640:520,P=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],Q=d?.def?.actors??[],R=64*!!Q.length,S=(0,i.useMemo)(()=>{let a=P.length,b=N/2,c=(O-R)/2+6,d=Math.max(0,N/2-98-16),e=Math.max(0,(O-R)/2-46-18),f=new Map;return P.forEach((g,h)=>{if(1===a)return f.set(g,{x:b,y:c});if(y){let b=O-R-46-16;return f.set(g,{x:h%2?.67*N:.33*N,y:62+(b-62)*h/(a-1)})}if(2===a)return f.set(g,y?{x:b,y:h?c+e:c-e}:{x:h?b+d:b-d,y:c});let i=-Math.PI/2+2*h*Math.PI/a;f.set(g,{x:b+d*Math.cos(i),y:c+e*Math.sin(i)})}),f},[P.join("|"),N,O,196,R,y]),T=(0,i.useMemo)(()=>{let a=new Map;for(let{member:b,def:c}of a5(d?.members??[]).sequences)for(let d of c.participants??[]){if(!d?.actor)continue;let c=a.get(d.actor)??[];c.includes(b)||c.push(b),a.set(d.actor,c)}return a},[d]),U=d?.def,V=(d?.path??b??"").split("/").pop()||"…",W=[{id:"members",label:"Members",icon:(0,h.jsx)(fi,{kind:"system"})},{id:"checks",label:"Checks",icon:(0,h.jsx)(eA,{}),badge:I.length+J.length||void 0},{id:"notes",label:"Notes",icon:"✎"}],X=p?H.get(p):void 0,Y=(0,i.useMemo)(()=>{let a=[];for(let b of["error","warning"]){let c=new Map;for(let a of D?.issues??[])a.severity===b&&c.set(a.ruleId,[...c.get(a.ruleId)??[],a]);for(let[d,e]of[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0])))a.push({key:`${b}:${d}`,ruleId:d,severity:b,issues:e})}return a},[D]);return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>l&&m(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fi,{kind:"system",size:14}),"SYS"]}),(0,h.jsx)(ec,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:d?.path,children:[U?.settings?.name??V,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",V]})]}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:ff,onClick:e,title:"Read the system and every member again",children:"Re-check"}),(0,h.jsx)("button",{className:ff,onClick:()=>o(a=>!a),"aria-pressed":!n,children:n?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":l,onClick:a=>{a.stopPropagation(),m(a=>!a)},children:"⋯"}),l&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{m(!1),e()},children:"Re-check the system"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:x,className:"relative min-w-0 flex-1 overflow-hidden bg-[#030712]",children:[d&&U&&(0,h.jsx)(ez,{what:"system map",resetKey:d,children:(0,h.jsxs)("svg",{className:"h-full w-full",viewBox:`0 0 ${N} ${O}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":`System map of ${U.settings?.name}`,children:[[...H.entries()].map(([a,b])=>{let c=S.get(b.a),d=S.get(b.b);if(!c||!d)return null;let e=(c.x+d.x)/2,f=(c.y+d.y)/2,i=`${b.links.length} link${1===b.links.length?"":"s"}`,j=6.4*i.length+16,l=p===a;return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>{q(l?null:a),g("members"),k(!0)},children:[(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:"transparent",strokeWidth:18}),(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:l?"#3b82f6":"#475569",strokeWidth:l?2.5:1.6}),(0,h.jsx)("rect",{x:e-j/2,y:f-11,width:j,height:22,rx:11,fill:"#0f172a",stroke:l?"#3b82f6":"#334155"}),(0,h.jsx)("text",{x:e,y:f+4,textAnchor:"middle",fontSize:11.5,fill:l?"#93c5fd":"#cbd5e1",children:i})]},a)}),Q.map((a,b)=>{let c=(b+1)*N/(Q.length+1),d=O-30;return(0,h.jsxs)("g",{children:[(T.get(a.name)??[]).map(a=>{let b=S.get(a);return b?(0,h.jsx)("line",{x1:c,y1:d-14,x2:b.x,y2:b.y+46,stroke:"#334155",strokeDasharray:"3 4"},a):null}),(0,h.jsx)("title",{children:[`${a.kind}`,a.description??"",a.wheelNode??""].filter(Boolean).join(" — ")}),(0,h.jsx)("rect",{x:c-62,y:d-14,width:124,height:28,rx:14,fill:"#0c1020",stroke:"#6366f1"}),(0,h.jsx)("g",{transform:`translate(${c-54} ${d-8})`,color:"#a5b4fc",children:(0,h.jsx)(fi,{kind:"actor",size:16})}),(0,h.jsx)("text",{x:c-34,y:d-1,fontSize:11.5,fontWeight:600,fill:"#e2e8f0",children:a.name.length>12?`${a.name.slice(0,11)}…`:a.name}),(0,h.jsx)("text",{x:c-34,y:d+9,fontSize:8.5,fill:"#94a3b8",children:a.kind})]},a.name)}),P.map(a=>{let b=S.get(a),c=d.members.find(b=>b.path===a);if(!b||!c)return null;let e=c.kind,f=(D?.issues??[]).filter(b=>b.member===a),g=f.filter(a=>"error"===a.severity).length,i=f.filter(a=>"warning"===a.severity).length,j=b.x-98,k=b.y-46,l=fC(d,a),m=X&&(X.a===a||X.b===a);return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>K(a),children:[(0,h.jsx)("title",{children:`${a}${c.error?` — cannot be read: ${c.error}`:""}
15
- Tap to open it inside the system.`}),(0,h.jsx)("rect",{x:j,y:k,width:196,height:92,rx:10,fill:"#0f172a",stroke:c.error?"#ef4444":m?"#3b82f6":g?"#b91c1c":"#475569",strokeWidth:m?2.2:1.5,strokeDasharray:c.error?"5 4":void 0}),(0,h.jsx)("g",{transform:`translate(${j+10} ${k+9})`,color:"#93c5fd",children:(0,h.jsx)(fi,{kind:e,size:16})}),(0,h.jsx)("text",{x:j+32,y:k+21,fontSize:9,fontWeight:700,letterSpacing:"0.06em",fill:"#64748b",children:fG[e]}),(0,h.jsx)("text",{x:j+10,y:k+43,fontSize:14,fontWeight:600,fill:"#e2e8f0",children:l.length>22?`${l.slice(0,21)}…`:l}),(0,h.jsx)("text",{x:j+10,y:k+60,fontSize:10.5,fill:"#94a3b8",children:c.error?"cannot be read":fH(e,c.def,!0)}),(0,h.jsx)("text",{x:j+10,y:k+79,fontSize:10.5,fill:g?"#fca5a5":i?"#fcd34d":"#4ade80",children:c.error?c.error.length>30?`${c.error.slice(0,29)}…`:c.error:g||i?[g?`${g} error${g>1?"s":""}`:"",i?`${i} warning${i>1?"s":""}`:""].filter(Boolean).join(" · "):"checks pass"}),(0,h.jsx)("text",{x:j+196-10,y:k+79,fontSize:10.5,textAnchor:"end",fill:"#64748b",children:"open ›"})]},a)})]})}),d&&!U&&(0,h.jsx)("div",{className:"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-amber-300",children:d.error}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===r.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===r.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsx)("span",{className:`truncate transition-opacity duration-500 ${B&&"ok"===r.tone?"opacity-0":"opacity-100"}`,children:r.text})]})]}),j&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:w.close,"aria-hidden":"true"}),d&&U&&(0,h.jsxs)("aside",{style:w.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${j?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-96 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${n?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...w.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:W.find(a=>a.id===f)?.label}),(0,h.jsx)("button",{onClick:w.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:W.map(a=>(0,h.jsxs)("button",{onClick:()=>g(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${f===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:"members"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Members"}),P.map(a=>{let b=d.members.find(b=>b.path===a),c=U.members.find(b=>b.path===a)?.notes;return(0,h.jsxs)("div",{className:"mb-1 rounded border border-gray-800",children:[(0,h.jsxs)("button",{onClick:()=>K(a),className:"flex w-full items-start gap-2 p-2 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-blue-300",children:(0,h.jsx)(fi,{kind:b?.kind??"machine"})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block truncate text-[12px] font-semibold text-gray-200",children:fC(d,a)}),(0,h.jsx)("span",{className:"block truncate text-[10.5px] text-gray-500",children:a}),(0,h.jsx)("span",{className:`block text-[11px] ${b?.error?"text-red-300":"text-gray-400"}`,children:b?.error?`cannot be read: ${b.error}`:fH(b?.kind??"machine",b?.def)})]}),(0,h.jsx)("span",{className:"shrink-0 text-[11px] text-gray-500",children:"open ›"})]}),(0,h.jsx)("div",{className:"px-2 pb-2 [&_label]:mt-0",children:(0,h.jsx)(fc,{label:"Note on this member, in the system",value:c??"",placeholder:`Why ${fC(d,a)} is part of this system, what is open…`,onSave:b=>void L(function(a,b,c){let d=aX(a),e=d.members.findIndex(a=>a.path===b);if(e<0)throw Error(`'${b}' is not a member. Members: ${a.members.map(a=>a.path).join(", ")||"none"}.`);return d.members[e]=aY({...d.members[e],...c}),d}(U,a,{notes:b}),"saved")},`member:${a}`)})]},a)}),(0,h.jsx)("div",{className:fg,children:"Links between members"}),0===H.size&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"No name crosses between the members yet."}),[...H.entries()].map(([a,b])=>(0,h.jsxs)("div",{className:"mb-1",children:[(0,h.jsxs)("button",{className:`flex w-full items-center justify-between rounded px-1.5 py-1 text-left text-[11px] ${p===a?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>q(p===a?null:a),children:[(0,h.jsxs)("span",{className:"truncate",children:[fC(d,b.a)," ↔ ",fC(d,b.b)]}),(0,h.jsx)("span",{className:"shrink-0 text-gray-500",children:b.links.length})]}),p===a&&(0,h.jsx)("div",{className:"ml-2 border-l border-gray-800 pl-2",children:b.links.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full truncate py-0.5 text-left text-[11px] text-gray-400 hover:text-gray-200",title:`${fJ(a)} — ${a.rule}`,onClick:()=>{let b;return K((b=a.from).member,a7(b))},children:[(0,h.jsx)("span",{className:"text-gray-600",children:a.rule})," ",fJ(a)]},b))})]},a)),Q.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fg,children:"Actors"}),Q.map(a=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-gray-300",children:[a.name," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.kind]}),a.description?(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",a.description]}):null]},a.name))]})]}),(0,h.jsxs)("section",{className:"checks"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Checks"}),(0,h.jsxs)("div",{className:`text-[11px] ${I.length?"text-red-300":J.length?"text-amber-300":"text-green-400"}`,children:[I.length," error",1===I.length?"":"s"," · ",J.length," warning",1===J.length?"":"s"]}),Y.map(a=>(0,h.jsxs)("div",{className:"mt-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:[a.ruleId," · ",a.issues.length," ",a.severity,1===a.issues.length?"":"s"]}),a.issues.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 pl-2 text-left text-[11px] text-gray-300 hover:text-white",onClick:()=>{a.member&&K(a.member,a.element&&/^[a-z]+:/.test(a.element)?a.element:null)},title:a.member?`Open ${a.member}${a.element?` at ${a.element}`:""}`:void 0,children:[a.message,a.member&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",fC(d,a.member)]})]},b))]},a.key)),(0,h.jsx)("div",{className:fg,children:"Reconcile"}),(0,h.jsxs)("p",{className:"mb-1 text-[11px] text-gray-500",children:["What the scenarios imply for the machines and the data. ",(0,h.jsx)("b",{className:"text-gray-400",children:"propose"})," lists it here to apply by hand; ",(0,h.jsx)("b",{className:"text-gray-400",children:"auto"})," writes it each time a scenario is saved."]}),(0,h.jsx)("span",{className:"inline-flex overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Reconcile mode",children:aN.map(a=>(0,h.jsx)("button",{"aria-pressed":G===a,onClick:()=>{d?.def&&a!==G&&L(function(a,b){if(!aN.includes(b))throw Error(`The reconcile mode is ${aN.join(" or ")}; got '${b}'.`);return aZ(a,{reconcile:b})}(d.def,a),`reconcile mode: ${a}`)},className:`px-3 py-1 text-xs ${G===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:a},a))}),(0,h.jsx)("div",{className:"mt-2 text-[11px] font-semibold text-gray-400",children:"Scenario changes"}),F&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-500",children:be(F,"propose")}),F.machines.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.machine," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),F.erds.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.def.settings?.name??a.member," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),F.system&&(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-300",children:"the system"}),F.system.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]}),F.unresolved.map((a,b)=>(0,h.jsxs)("div",{className:"mt-1 text-[11px] text-amber-300",children:["left open: ",a]},b)),(0,h.jsx)("button",{className:`${ff} mt-2 disabled:opacity-40`,disabled:!F.count||u,onClick:M,children:u?"Applying…":`Apply${F.count?` ${F.count} change${1===F.count?"":"s"}`:""}`})]}),(D?.replays??[]).map(({member:a,report:b})=>(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:fg,children:["Replay · ",fC(d,a)]}),(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["against ",b.machines.join(", ")||"no machine"]}),b.paths.map(b=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${b.accepted?"text-green-400":"text-amber-300"}`,children:[b.name," — ",b.accepted?"accepted":"stops"]}),b.steps.filter(a=>"data"!==a.result).map(c=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===c.result||"stayed"===c.result?"text-gray-400":"text-amber-300"}`,title:c.note??c.result,onClick:()=>K(a,`message:${c.ref}`),children:[c.ref,". ",c.event??""," ",c.from.join("|")||"·"," → ",c.to.join("|")||"·"," ",c.result]},`${b.name}:${c.ref}`))]},b.name))]},a))]}),(0,h.jsxs)("section",{className:"notes"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fg,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the system file, for whoever opens it next."}),(0,h.jsx)(fc,{label:"On this system",value:U.settings?.notes??"",placeholder:"What the system is for, what is still open…",onSave:a=>void L(aZ(U,{notes:a}),"saved")},"system"),U.settings?.description&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fg,children:"Description"}),(0,h.jsx)("p",{className:"text-[11px] text-gray-400",children:U.settings.description})]})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:W.map(a=>{let b=j&&f===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(j&&f===b?w.close():k(!0),g(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fL(){let a=dT(a=>a.definition),b=dT(a=>a.layout.positions),c=dT(a=>a.navigationPath),d=dT(a=>a.viewport),e=dT(a=>a.setViewport),f=dT(a=>a.docPath),g=eG("focus"),j=(0,i.useMemo)(()=>({get current(){return document.getElementById("machine-board")}}),[]),k=c.slice(1),l=(0,i.useMemo)(()=>a?.state?function(a,b){let c=[];for(let d of a){let a=d?.name?b[d.name]:void 0;a&&c.push({focus:`state:${d.name}`,box:a})}for(let d of a){let e=d?.name?b[d.name]:void 0;if(e)for(let f of d.transitions??[]){if(!f?.event)continue;let d=f.nextState?b[f.nextState]:void 0;c.push({focus:`event:${f.event}`,box:d&&a.some(a=>a.name===f.nextState)?bs([e,d]):e})}}return c}(bz(a.state,k),b):[],[a,b,c]);return(0,h.jsx)(e0,{docPath:f,kind:"machine",viewport:d,setViewport:e,boxes:l,boardRef:j,focus:g,level:c[c.length-1],onReveal:a=>{let b=a.map(a8).find(a=>a?.kind==="state");if(!b)return;let c=new URL(window.location.href);c.searchParams.set("focus",`state:${b.name}`),window.history.replaceState(window.history.state,"",c),window.dispatchEvent(new Event(eD))}})}let fM=a=>a.parallel?a.parallel.states:a.states??[];function fN(a,b){if(!a)return null;if(a.name===b)return[a.name];for(let c of fM(a)){let d=fN(c,b);if(d)return[a.name,...d]}return null}function fO(){let a=(0,eb.useRequestedDoc)(),b=eG("system"),[c,d]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=!0;return ek().then(b=>{a&&d(b.projectFile?aS(b.projectFile):"machine")}),()=>{a=!1}},[]);let e=a?aS(a):c;if(null===e)return(0,h.jsx)("div",{className:"app-shell bg-gray-950"});let f=a??"default",g="erd"===e?(0,h.jsx)(fb,{},f):"sequence"===e?(0,h.jsx)(fB,{},f):"system"===e?(0,h.jsx)(fK,{},f):(0,h.jsx)(fP,{}),j=(0,h.jsx)(ez,{what:"document",resetKey:a,children:g});return b&&aQ(b)?(0,h.jsx)(eZ,{children:(0,h.jsxs)("div",{className:"system-frame",children:[(0,h.jsx)(fF,{systemPath:b}),j]})}):(0,h.jsx)(eZ,{children:j})}function fP(){let a,b;a=eJ(),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=()=>{let a=b.current;if(!a)return;let c=dT.getState(),d=null;if(d&&c.docPath!==d||a.docAt!==c.docPath&&c.definition===a.defAt)return;b.current=null;let e=a8(a.focus);if(!e)return;let f=null,g=null;if("state"===e.kind)(f=fN(c.definition.state,e.name))&&(g={kind:"state",id:e.name});else if("event"===e.kind){let a=function a(b,c){if(!b)return null;let d=(b.transitions??[]).findIndex(a=>a?.event===c);if(d>=0)return{state:b.name,index:d};for(let d of fM(b)){let b=a(d,c);if(b)return b}return null}(c.definition.state,e.name);a&&(f=fN(c.definition.state,a.state),g={kind:"transition",id:`${a.state}:${a.index}`})}if(!f||!g)return;let h=f.length>1?f.slice(0,-1):f;dT.setState({navigationPath:h,currentParent:h[h.length-1]}),c.select(g.kind,g.id);let i=()=>{let a=dT.getState().layout.positions[f[f.length-1]],b=document.getElementById(dX)?.getBoundingClientRect();if(!a||!b?.width)return;let c=S([a],b.width,b.height,{padding:60,maxScale:1});dT.getState().setViewport(c)};requestAnimationFrame(i),setTimeout(i,450)};if(a.nonce>0){let d=dT.getState();b.current=a.focus?{focus:a.focus,docAt:d.docPath,defAt:d.definition}:null,c()}return dT.subscribe(c)},[a]),(0,i.useEffect)(()=>dT.subscribe((a,b)=>{if(a.selection===b.selection||!a.selection.id)return;let{kind:c,id:d}=a.selection;if("state"===c)eI(`state:${d}`);else if("event"===c)eI(`event:${d}`);else if("transition"===c){let b=function(a,b){let c=b.lastIndexOf(":"),d=fN(a.state,b.slice(0,c));if(!d)return null;let e=a.state;for(let a of d.slice(1))e=fM(e).find(b=>b.name===a);return e?.transitions?.[Number(b.slice(c+1))]?.event??null}(a.definition,d);b&&eI(`event:${b}`)}}),[]);let[c,d]=(0,i.useState)("properties"),[e,f]=(0,i.useState)(!1),g=eC({onClose:()=>f(!1),restVh:70,tallVh:92}),j=dT(a=>a.errors),k=dT(a=>a.contextMenu),l=dT(a=>a.hideContextMenu),m=dT(a=>a.addState),n=dT(a=>a.removeState),o=dT(a=>a.setDrawMode),p=dT(a=>a.setDrawSource),q=[{id:"properties",label:"Properties",icon:"🎛"},{id:"events",label:"Events",icon:"⚡"},{id:"settings",label:"Settings",icon:"⚙"},{id:"validation",label:"Errors",icon:(0,h.jsx)(eA,{}),badge:j.length||void 0}],r=q.find(a=>a.id===c)?.label??"";return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden",onClick:()=>k.visible&&l(),children:[(0,h.jsx)(el,{}),(0,h.jsx)(ex,{}),(0,h.jsx)(ee,{}),(0,h.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden relative",children:[(0,h.jsxs)("div",{className:"relative flex-1 overflow-hidden",id:"machine-board",children:[(0,h.jsx)(ez,{what:"state machine",children:(0,h.jsx)(d4,{})}),(0,h.jsx)(fL,{})]}),e&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:g.close,"aria-hidden":"true"}),(0,h.jsxs)("aside",{style:g.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 h-[var(--sheet-h)] flex flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${e?"translate-y-0":"translate-y-full pointer-events-none"} md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:pointer-events-auto md:rounded-none md:border-t-0 md:border-l md:shadow-none md:transition-none`,children:[(0,h.jsxs)("div",{className:"md:hidden",...g.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pt-2 pb-1",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:r}),(0,h.jsx)("button",{onClick:g.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:q.map(a=>(0,h.jsxs)("button",{onClick:()=>d(a.id),className:`flex-1 text-xs py-2 px-1 text-center transition-colors relative ${c===a.id?"text-blue-400 border-b-2 border-blue-400 bg-gray-800/50":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1 bg-red-600 text-white text-[9px] rounded-full px-1 min-w-[14px]",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain",children:["properties"===c&&(0,h.jsx)(d6,{}),"events"===c&&(0,h.jsx)(d8,{}),"settings"===c&&(0,h.jsx)(d9,{}),"validation"===c&&(0,h.jsx)(ea,{})]})]}),(0,h.jsx)(ef,{})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:q.map(a=>{let b=e&&c===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(e&&c===b?g.close():f(!0),d(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1/2 translate-x-4 rounded-full bg-red-600 px-1 text-[10px] leading-4 text-white min-w-[16px]",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})}),k.visible&&(0,h.jsx)("div",{className:"fixed z-50 bg-gray-900 border border-gray-700 rounded-lg shadow-xl py-1 min-w-[180px] md:min-w-[140px]",style:{left:k.x,top:k.y,maxWidth:"calc(100vw - 1rem)",maxHeight:"calc(100dvh - 1rem)",overflowY:"auto",transform:"translate(0, 0)"},onClick:a=>a.stopPropagation(),children:k.target?.kind==="state"?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{o("transition"),p(k.target.id),l()},children:"↗ Draw transition from here"}),(0,h.jsx)("button",{className:"block w-full text-left text-sm text-red-400 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{k.target?.id&&n(k.target.id),l()},children:"🗑 Delete state"})]}):(0,h.jsx)(h.Fragment,{children:(0,h.jsx)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{let a=prompt("State name:");a&&m(null,{name:a,kind:"normal"}),l()},children:"+ Add state here"})})})]})}a.s(["default",()=>fO],95421)}];
13
+ ${function(a,b={}){let c=[],d=b.start??1;for(let{doc:b,marks:e}of a)for(let a of e){for(let e of(c.push(`${d}. [${a.status} \xb7 ${a.kind}] ${a.author.name}${"agent"===a.author.role?" (agent)":""} on ${function(a){let b=[];if(a.elements?.length&&b.push(a.elements.join(", ")),a.region){let c=a.region;b.push(`the area ${Math.round(c.x)},${Math.round(c.y)} ${Math.round(c.width)}\xd7${Math.round(c.height)}${a.level?` inside ${a.level}`:""}`)}return b.length?b.join(" in "):"the drawing"}(a)} (${bu(b)}) — ${a.id}`),c.push(` "${bv(a.text)}"`),a.replies??[]))c.push(` ↳ ${e.author.name}${"agent"===e.author.role?" (agent)":""}: "${bv(e.text)}"`);d++}return c.join("\n")}(c)}`:`${e}
14
+ No marks.`);navigator.clipboard?.writeText(f).then(()=>{D(!0),setTimeout(()=>D(!1),2e3)})},copied:C,note:ac,labels:l,onClose:()=>x(!1)}),al&&n?.sheetBody?(0,eU.createPortal)(m,n.sheetBody):(0,h.jsx)("div",{className:"stage-board-card",children:m}))]}):null}function fg({docPath:a,onReveal:b}){let c=e8(),d=c?.lit??null,e=(0,i.useRef)(-1);return(0,i.useEffect)(()=>{!d||e.current===d.nonce||d.doc&&d.doc!==a||(d.spotlight?.length||d.region)&&(e.current=d.nonce,b())},[d,a,b]),null}function fh(a,b,c){try{return a()}catch(d){let a=d instanceof Error?d.message:String(d);return console.warn("[stateloom] skipped on a malformed document:",a),c?.(a),b}}let fi=(a,b)=>"chen"===b?`stateloom:erd-layout:chen:${a}`:`stateloom:erd-layout:${a}`,fj="stateloom:erd-notation",fk="stateloom:erd-lock";function fl(a,b){try{return JSON.parse(localStorage.getItem(fi(a,b))??"{}")}catch{return{}}}async function fm(a){let b=a.slice(0,a.lastIndexOf("/")),c=((await (await fetch("/api/docs",{cache:"no-store"})).json()).docs??[]).map(a=>a.path).filter(a=>a.endsWith(".smdf.json")&&a.slice(0,a.lastIndexOf("/"))===b),d=[];for(let a of c)try{let b=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json(),c=JSON.parse(b.content??"null"),e=aq(c?.stateMachine??c?.StateMachine??c);e?.state&&d.push({path:a,def:e})}catch{}return d}let fn="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",fo="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fp="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fq(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(""),[d,e]=(0,i.useState)(null),[f,g]=(0,i.useState)({}),[j,k]=(0,i.useState)("crowsfoot"),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("entities"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),G=(0,i.useRef)(null),H=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[I,J]=(0,i.useState)(0),[K,L]=(0,i.useState)(null),N=(0,i.useRef)(null);(0,i.useEffect)(()=>{let b=!1,d=null;return(async()=>{let f=await (await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"})).json();if(b)return;if(f.error)return v(f.error,"warn");let h=f.path??"",i=null;try{let a=f.content?aq(JSON.parse(f.content)):null;X(a)&&(i={...a,relationships:a.relationships??[]})}catch{}if(f.exists&&!i)return v(`${h} is not a readable ERD definition`,"warn");let j=(h.split("/").pop()??"Untitled").replace(/\.erdf\.json$/i,""),l=function(){try{return"chen"===localStorage.getItem(fj)?"chen":"crowsfoot"}catch{return"crowsfoot"}}();c(h),e(i??{settings:{namespace:"Default",name:j},entities:[],relationships:[]}),k(l),m(function(){try{let a=localStorage.getItem(fk);if(null!==a)return"1"===a;return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}()),g(fl(h,l)),s(null),L(null),q(a=>a+1),v(f.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:n}=await eu();!b&&n&&(N.current=d=dL({url:n,role:"web",docId:h,name:"web-designer",onFull:a=>{let b=a.def;X(b)&&(e({...b,relationships:b.relationships??[]}),v("updated live"))},onPatch:()=>{},onPresence:a=>J(a.length)}),d.connect())})().catch(a=>!b&&v(String(a),"warn")),()=>{b=!0,N.current=null,d?.disconnect()}},[a,v]);let O=(0,i.useMemo)(()=>{if(!d)return{};let a=fh(()=>(function(a,b={}){let c=b.notation??"crowsfoot",d=b.hSpacing??70,e=b.vSpacing??("chen"===c?130:90),f="chen"===c?aj:as,g=[],h=new Set;for(let b of a.entities??[])!b?.name||h.has(b.name)||(h.add(b.name),g.push(b));let i=new Map,j=(a,b,c=new Set)=>a===b||!c.has(a)&&(c.add(a),(i.get(a)??[]).some(a=>j(a,b,c)));for(let b of a.relationships??[]){if(!b||!h.has(b.from)||!h.has(b.to)||b.from===b.to)continue;let[a,c]="N:1"===b.cardinality?[b.to,b.from]:[b.from,b.to];if((i.get(a)??[]).includes(c)||j(c,a))continue;let d=i.get(a);d?d.push(c):i.set(a,[c])}let k=new Map,l=(a,b)=>{if(!((k.get(a)??-1)>=b))for(let c of(k.set(a,b),i.get(a)??[]))l(c,b+1)},m=new Set([...i.values()].flat());for(let a of g)m.has(a.name)||l(a.name,0);for(let a of g)k.has(a.name)||l(a.name,0);for(let a of[...g].sort((a,b)=>k.get(b.name)-k.get(a.name))){let b=i.get(a.name)??[];b.length&&k.set(a.name,Math.min(...b.map(a=>k.get(a)))-1)}let n=[],o=new Map,p=(a,b)=>((n[b]??=[]).push(a),o.set(a.id,a),a);for(let a of g)p({id:a.name,entity:a.name,...f(a),upper:[],lower:[],x:0},k.get(a.name)??0);let q=0;for(let[a,b]of i)for(let c of b){let b=a;for(let d=k.get(a)+1;d<k.get(c);d++){let a=p({id:`\u0000lane${q++}`,width:28,height:0,upper:[],lower:[],x:0},d);o.get(b).lower.push(a.id),a.upper.push(b),b=a.id}o.get(b).lower.push(c),o.get(c).upper.push(b)}for(let a=n.length-1;a>=0;a--)n[a]?.length||n.splice(a,1);let r=(a,b)=>a.length?a.reduce((a,c)=>a+b(o.get(c)),0)/a.length:null,s=(a,b)=>{let c=new Map;for(let a of n)a.forEach((a,b)=>c.set(a.id,b));let d=new Map(a.map((a,d)=>[a.id,r(a[b],a=>c.get(a.id))??d]));a.sort((a,b)=>d.get(a.id)-d.get(b.id))};for(let a=0;a<2;a++){for(let a=1;a<n.length;a++)s(n[a],"upper");for(let a=n.length-2;a>=0;a--)s(n[a],"lower")}let t=a=>a.x+a.width/2,u=(a,b)=>{let c=0;for(let e of a){let a=r(e[b],t);e.x=Math.max(c,null===a?c:a-e.width/2),c=e.x+e.width+d}};for(let a of n)u(a,"upper");for(let a=n.length-2;a>=0;a--)u(n[a],"lower");let v=Math.min(0,...[...o.values()].map(a=>a.x)),w={},x=40;for(let a of n){for(let b of a)b.entity&&(w[b.entity]={x:Math.round(b.x-v)+40,y:x,width:b.width,height:b.height});x+=Math.max(0,...a.map(a=>a.height))+e}return w})(d,{notation:j}),{});for(let[b,c]of Object.entries(f))a[b]&&(a[b]={...a[b],...c});return a},[d,f,j]),P=(0,i.useMemo)(()=>{if(!d)return[];let a="";return fh(()=>Y(d),null,b=>a=b)??[{ruleId:"E000",message:`The document could not be checked (${a}): a field is not the shape Spec 80 gives it`}]},[d]),R=(0,i.useMemo)(()=>P.map(a=>(a.element??"").split(/[.[]/)[0]).filter(Boolean),[P]),T=(0,i.useCallback)(async a=>{let c;if(d&&b){try{c=a(d)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}e(c),L(null);try{let a=await fetch(`/api/file${(0,ek.docQuery)(b)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(c,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);N.current?.emitFull(c),v("saved")}catch(a){v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}}},[d,b,v]),U=(0,i.useCallback)((a,c)=>{g(d=>{let e={...d,[a]:{x:Math.round(c.x),y:Math.round(c.y)}};try{localStorage.setItem(fi(b,j),JSON.stringify(e))}catch{}return e})},[b,j]),Z=()=>{g({});try{localStorage.removeItem(fi(b,j))}catch{}q(a=>a+1)},af=async()=>{if(!d)return;v("checking links…");let a=await fm(b);if(0===a.length)return L("none"),z("issues"),B(!0),v("no .smdf.json beside this document to check against","warn");let c=a.flatMap(a=>$(a.def,d).map(b=>({...b,message:`${a.def.settings?.name??a.path}: ${b.message}`})));c.push(..._(d,a.map(a=>a.def.settings?.name??""))),L(c),z("issues"),B(!0),F(!1),v(`checked ${a.length} machine(s): ${c.length} problem(s)`,c.length?"warn":"ok")},ag=async a=>{let c=(await fm(b)).find(b=>b.def.settings?.name===a);c?(0,ek.navigateToDoc)(c.path):v(`no .smdf.json beside this document defines '${a}'`,"warn")},ah=()=>{let a=G.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},al=a=>{let b=O[a],{width:c,height:d}=ah();b&&c&&(o(S([b],c,d,{padding:28,maxScale:1.25})),s(a),H.close())},ap=eT(),ar=eQ("focus"),at=(0,i.useMemo)(()=>d?fh(()=>(function(a,b,c={}){let d=!1!==c.rows,e=[];for(let c of a?.entities??[]){let a=c?.name?b[c.name]:void 0;a&&(e.push({focus:`entity:${c.name}`,box:a}),(c.attributes??[]).filter(a=>a?.name).forEach((b,f)=>{e.push({focus:`attribute:${c.name}.${b.name}`,box:d?{x:a.x,y:a.y+30+20*f,width:a.width,height:20}:a})}))}return e})(d,O,{rows:"chen"!==j}),[]):[],[d,O,j]),au=(0,i.useRef)(-1);(0,i.useEffect)(()=>{if(!d||au.current===ap.nonce)return;au.current=ap.nonce;let a=ap.focus?a8(ap.focus):null,b=a?.kind==="entity"?a.name:a?.kind==="attribute"?a.name.split(".")[0]:null;b&&O[b]&&al(b)},[d,ap,O]),(0,i.useEffect)(()=>{r&&1&&eS(`entity:${r}`)},[r]);let av=d?.entities.find(a=>a.name===r)??null,aw=b.split("/").pop()||"…",ax=Array.isArray(K)?K:[],ay=P.length+ax.length,az=[{id:"entities",label:"Entities",icon:"▭"},{id:"relations",label:"Relations",icon:"⟷"},{id:"notes",label:"Notes",icon:"✎",badge:void 0},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:ay||void 0}],aA=a=>y===a?"":"hidden md:block",aB=()=>{d&&navigator.clipboard?.writeText(function(a){let b=["erDiagram"],c=" ",d=new Set;for(let e of a.relationships??[]){if(!e?.from||!e?.to)continue;let a=ak[e.cardinality]??ak["1:N"];b.push(`${c}${am(e.from)} ${a} ${am(e.to)} : ${ao(e.label??"")}`),d.add(e.from),d.add(e.to)}let e=new Set;for(let f of a.entities??[]){if(!f?.name||e.has(f.name))continue;e.add(f.name);let a=(f.attributes??[]).filter(a=>a?.name);if(0===a.length){d.has(f.name)||b.push(`${c}${am(f.name)}`);continue}for(let d of(b.push(`${c}${am(f.name)} {`),a))b.push(`${c}${c}${function(a){let b=[];"pk"===a.key&&b.push("PK"),"uk"===a.key&&b.push("UK"),a.references&&b.push("FK");let c=[],d=V(a);d.length&&c.push(`stateOf ${d.join(", ")}`),a.description&&c.push(a.description);let e=[an(a.type??"","unknown"),an(a.name,"unnamed")];return b.length&&e.push(b.join(", ")),c.length&&e.push(ao(c.join(" — "))),e.join(" ")}(d)}`);b.push(`${c}}`)}return b.join("\n")}(d)).then(()=>v("mermaid copied"))};return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsx)("span",{className:"font-semibold text-blue-300",children:"ERD"}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:b,children:[d?.settings.name??aw,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aw]})]}),(0,h.jsx)("span",{className:"inline-flex shrink-0 overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Notation",children:[["crowsfoot","▤","Crow's foot — attributes listed inside the entity box"],["chen","◇","Chen — attributes as ovals, relationships as diamonds"]].map(([a,c,d])=>(0,h.jsx)("button",{title:d,"aria-label":d,"aria-pressed":j===a,onClick:()=>(a=>{if(a!==j){try{localStorage.setItem(fj,a)}catch{}k(a),g(fl(b,a)),q(a=>a+1)}})(a),className:`px-2.5 py-1.5 text-sm leading-none md:px-2 md:py-1 ${j===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:c},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fo,onClick:Z,title:"Forget the dragged positions and lay the board out again",children:"⤢ Arrange"}),(0,h.jsx)("button",{className:fo,onClick:af,title:"Check the state machines beside this document against it",children:"Check links"}),(0,h.jsx)("button",{className:fo,onClick:aB,children:"Copy mermaid"}),(0,h.jsx)("button",{className:fo,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:[["⤢ Arrange the board",Z],["Check links to the machines",af],["Copy as mermaid",aB]].map(([a,b])=>(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),b()},children:a},a))})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:G,className:"relative min-w-0 flex-1 overflow-hidden",children:[d&&(0,h.jsx)(eJ,{what:"diagram",resetKey:d,children:(0,h.jsx)(bN,{definition:d,notation:j,positions:O,viewport:n,onViewportChange:o,selection:r,readOnly:l,errorElements:R,fitKey:p,onSelect:s,onClearSelection:()=>s(null),onEntityMove:U,onOpenMachine:ag,emptyHint:"No entities yet — add one in the panel, or let an agent call add_entity."})}),d&&(0,h.jsx)(ff,{docPath:b||null,kind:"erd",viewport:n,setViewport:o,boxes:at,boardRef:G,focus:ar}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,I>1?` \xb7 ${I} in the room`:""]})]}),(0,h.jsxs)("div",{className:"absolute bottom-3 right-3 flex flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur",children:[(0,h.jsx)("button",{title:l?"Shapes are locked: dragging moves the view. Tap to unlock.":"Lock the shapes in place, so dragging only moves the view","aria-label":"Lock shapes in place","aria-pressed":l,onClick:()=>{let a=!l;m(a);try{localStorage.setItem(fk,a?"1":"0")}catch{}v(a?"shapes locked — a drag anywhere moves the view":"shapes unlocked — drag one to move it")},className:`flex h-10 w-10 items-center justify-center border-b border-gray-800 hover:bg-gray-800 md:h-8 md:w-8 ${l?"bg-blue-950/60 text-blue-300":"text-gray-400"}`,children:(0,h.jsx)(eK,{locked:l})}),[["+","Zoom in",()=>ai(1.25)],["−","Zoom out",()=>ai(.8)],["⛶","Fit the whole diagram",()=>q(a=>a+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))]}),av&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("entities"),B(!0)},children:["✎ ",av.name]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:H.close,"aria-hidden":"true"}),d&&(0,h.jsxs)("aside",{style:H.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...H.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:az.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:H.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:aA("entities"),children:[(0,h.jsx)("div",{className:fp,style:{marginTop:0},children:"Entities"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.map(a=>(0,h.jsx)("button",{className:`${fo} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))}),(0,h.jsx)(fs,{fields:[{name:"name",placeholder:"new entity"}],submit:"+ Entity",onSubmit:a=>{T(b=>ad(b,{name:a.name.trim()})),s(a.name.trim())}}),av&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fp} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:av.name}),(0,h.jsx)("button",{className:`${fo} normal-case tracking-normal`,onClick:()=>al(av.name),title:"Bring this entity to the middle of the board at a readable size",children:"◎ Show on board"})]}),(0,h.jsxs)("label",{className:"mb-1 flex items-center gap-2 text-[11px] text-gray-400",title:"Exists only through another entity (an order line, without its order). Chen draws it as a double rectangle.",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!av.weak,onChange:a=>T(b=>ae(b,av.name,{weak:a.target.checked}))}),"weak entity"]}),(av.attributes??[]).map(a=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 font-mono text-[11px]",children:[(0,h.jsxs)("span",{className:a.stateOf?"text-blue-300":"text-gray-300",children:[a.name," : ",a.type,(0,h.jsxs)("span",{className:"text-gray-500",children:[a.key?` ${a.key.toUpperCase()}`:"",a.references?` → ${a.references}`:"",a.stateOf?` ◉ ${[a.stateOf].flat().join(", ")}`:""]})]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove ${a.name}`,onClick:()=>T(b=>(function(a,b,c){let d=aa(a),e=ab(d,b),f=e.attributes?.length??0;if(e.attributes=(e.attributes??[]).filter(a=>a.name!==c),e.attributes.length===f)throw Error(`Attribute '${b}.${c}' not found.`);return d})(b,av.name,a.name)),children:"✕"})]},a.name)),(0,h.jsx)(fs,{fields:[{name:"name",placeholder:"attribute"},{name:"type",placeholder:"type",initial:"string"},{name:"key",options:["","pk","uk"]},{name:"references",placeholder:"references Entity.attr"},{name:"stateOf",placeholder:"stateOf Machine"}],submit:"+ Attribute",onSubmit:a=>T(b=>(function(a,b,c){if(!c.name?.trim())throw Error("An attribute needs a name.");let d=aa(a),e=ab(d,b);if(e.attributes??=[],e.attributes.some(a=>a.name===c.name))throw Error(`Attribute '${b}.${c.name}' already exists.`);return e.attributes.push(ac({...c})),d})(b,av.name,{name:a.name.trim(),type:a.type.trim()||"string",key:"pk"===a.key||"uk"===a.key?a.key:void 0,references:a.references.trim()||void 0,stateOf:a.stateOf.trim()||void 0}))}),(0,h.jsxs)("button",{className:`${fo} mt-2 text-red-300`,onClick:()=>{T(a=>{var b;let c;return b=av.name,ab(c=aa(a),b),c.entities=c.entities.filter(a=>a.name!==b),c.relationships=c.relationships.filter(a=>a.from!==b&&a.to!==b),c}),s(null)},children:[(0,h.jsx)(ed,{name:"trash"})," Delete ",av.name]})]})]}),(0,h.jsxs)("section",{className:aA("relations"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0`,children:"Relationships"}),0===d.relationships.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),d.relationships.map((a,b)=>(0,h.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 text-[11px] text-gray-300",children:[(0,h.jsxs)("span",{children:[a.from," ",(0,h.jsx)("span",{className:"text-gray-500",children:a.cardinality})," ",a.to,a.label?(0,h.jsxs)("span",{className:"text-gray-500",children:[" : ",a.label]}):null]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":"Remove relationship",onClick:()=>T(b=>(function(a,b,c,d){let e=aa(a),f=e.relationships.length;if(e.relationships=e.relationships.filter(a=>a.from!==b||a.to!==c||void 0!==d&&a.label!==d),e.relationships.length===f)throw Error(`No relationship from '${b}' to '${c}'${void 0===d?"":` labelled '${d}'`}.`);return e})(b,a.from,a.to,a.label)),children:"✕"})]},b)),d.entities.length>0&&(0,h.jsx)(fs,{fields:[{name:"from",options:d.entities.map(a=>a.name)},{name:"cardinality",options:[...W],initial:"1:N"},{name:"to",options:d.entities.map(a=>a.name)},{name:"label",placeholder:"label (a verb)"}],submit:"+ Relationship",onSubmit:a=>T(b=>(function(a,b){let c=aa(a);if(ab(c,b.from),ab(c,b.to),!W.includes(b.cardinality))throw Error(`Cardinality '${b.cardinality}' is not one of ${W.join(", ")}.`);return c.relationships.push(ac({...b})),c})(b,{from:a.from,to:a.to,cardinality:a.cardinality,label:a.label.trim()||void 0}))})]}),(0,h.jsxs)("section",{className:aA("notes"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0`,children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent (it reads them with get_notes)."}),(0,h.jsx)(fr,{label:"On this diagram",value:d.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>T(b=>(function(a,b){let c=aa(a);for(let a of["description","notes"]){let d=b[a];void 0!==d&&(d.trim()?c.settings[a]=d:delete c.settings[a])}return c})(b,{notes:a}))},"diagram"),av?(0,h.jsx)(fr,{label:`On ${av.name}`,value:av.notes??"",placeholder:`A question or a decision about ${av.name}…`,onSave:a=>T(b=>ae(b,av.name,{notes:a}))},`entity:${av.name}`):(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select an entity to leave a note on it."}),d.entities.some(a=>a.notes?.trim())&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fp,children:"Entities with notes"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:d.entities.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:`${fo} ${r===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>s(a.name),children:a.name},a.name))})]})]}),(0,h.jsxs)("section",{className:aA("issues"),children:[(0,h.jsx)("div",{className:`${fp} max-md:mt-0 ${0===ay&&!K?"md:hidden":""}`,children:"Issues"}),P.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-red-300",children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ax.map((a,b)=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-amber-300",children:["[",a.ruleId,"] ",a.message]},`l${b}`)),"none"===K&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-amber-300",children:"No state machine (.smdf.json) sits beside this document, so there was nothing to check it against."}),0===ay&&"none"!==K&&(0,h.jsx)("div",{className:`py-0.5 text-[11px] ${K?"text-green-400":"text-gray-600 md:hidden"}`,children:K?"Every name the machines use resolves.":"The document is valid. “Check links” (⋯) holds the state machines beside it against it."})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:az.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?H.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fr({label:a,value:b,placeholder:c,onSave:d}){let[e,f]=(0,i.useState)(b),[g,j]=(0,i.useState)(b),[k,l]=(0,i.useState)(!1);b!==g&&(j(b),k||f(b));let m=(0,i.useRef)(null),n=a=>{m.current&&clearTimeout(m.current),m.current=null,a!==b&&d(a)};return(0,h.jsxs)("label",{className:"mt-2 block",children:[(0,h.jsx)("span",{className:"text-[11px] text-gray-500",children:a}),(0,h.jsx)("textarea",{className:`${fn} h-24 resize-y leading-snug`,placeholder:c,value:e,onChange:a=>{let b=a.target.value;f(b),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>n(b),900)},onFocus:()=>l(!0),onBlur:()=>{l(!1),n(e)}})]})}function fs({fields:a,submit:b,onSubmit:c}){let d=()=>Object.fromEntries(a.map(a=>[a.name,a.initial??a.options?.[0]??""])),[e,f]=(0,i.useState)(d),g=a[0];return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:b=>{b.preventDefault();let h={...d(),...e};h[g.name]?.trim()&&(c(h),f(b=>Object.fromEntries(a.map(a=>[a.name,a.options?b[a.name]??"":a.initial??""]))))},children:[a.map(a=>a.options?(0,h.jsx)("select",{className:fn,"aria-label":a.name,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value})),children:a.options.map(b=>(0,h.jsx)("option",{value:b,children:b||`(${a.name})`},b))},a.name):(0,h.jsx)("input",{className:fn,"aria-label":a.name,placeholder:a.placeholder,value:e[a.name]??"",onChange:b=>f(c=>({...c,[a.name]:b.target.value}))},a.name)),(0,h.jsx)("button",{type:"submit",className:`${fo} ${1===a.length?"":"col-span-2"}`,children:b})]})}let ft="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",fu="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",fv="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function fw({id:a,fields:b,submit:c,onSubmit:d,reset:e=!1,required:f}){let g=()=>Object.fromEntries(b.map(a=>[a.name,a.initial??(!a.checkbox&&(a.options?a.options[0]??"":""))])),[j,k]=(0,i.useState)(g),l=(a,b)=>k(c=>({...c,[a]:b}));return(0,h.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:a=>{a.preventDefault();let c={...g(),...j};!(f??[]).some(a=>!String(c[a]??"").trim())&&(d(c),e&&k(a=>Object.fromEntries(b.map(b=>[b.name,b.options||b.checkbox?a[b.name]??"":b.initial??""]))))},children:[b.map(b=>{let c=b.label??b.name;if(b.checkbox)return(0,h.jsxs)("label",{className:"flex items-center gap-2 text-[11px] text-gray-400",children:[(0,h.jsx)("input",{type:"checkbox",checked:!!j[b.name],onChange:a=>l(b.name,a.target.checked)}),c]},b.name);if(b.options)return(0,h.jsx)("select",{className:`${ft} ${b.wide?"col-span-2":""}`,"aria-label":c,title:c,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value),children:b.options.map(a=>(0,h.jsx)("option",{value:a,children:a||`(${c})`},a))},b.name);let d=b.suggest?.length?`${a}-${b.name}`:void 0;return(0,h.jsxs)("span",{className:b.wide?"col-span-2":"",children:[(0,h.jsx)("input",{className:ft,"aria-label":c,title:c,placeholder:b.placeholder??c,list:d,value:String(j[b.name]??""),onChange:a=>l(b.name,a.target.value)}),d&&(0,h.jsx)("datalist",{id:d,children:b.suggest.map(a=>(0,h.jsx)("option",{value:a},a))})]},b.name)}),(0,h.jsx)("button",{type:"submit",className:`${fu} col-span-2`,children:c})]})}function fx({kind:a,size:b=16}){return(0,h.jsxs)("svg",{width:b,height:b,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:"shrink-0",children:["erd"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"4",y:"4.5",width:"16",height:"15",rx:"1.5"}),(0,h.jsx)("path",{d:"M4 9h16M8 13h8M8 16.5h6"})]}),"machine"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"2.5",y:"4",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("rect",{x:"13.5",y:"14",width:"8",height:"6",rx:"2.5"}),(0,h.jsx)("path",{d:"M6.5 10v4.5a2.5 2.5 0 0 0 2.5 2.5h4.5"}),(0,h.jsx)("path",{d:"M11.5 15l2 2-2 2"})]}),"sequence"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M6 4v16M18 4v16",strokeDasharray:"2 2.2"}),(0,h.jsx)("path",{d:"M6 9h11M15 7l2 2-2 2"}),(0,h.jsx)("path",{d:"M18 15H7M9 13l-2 2 2 2"})]}),"system"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("rect",{x:"3",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"14",y:"3.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("rect",{x:"8.5",y:"14.5",width:"7",height:"6",rx:"1.5"}),(0,h.jsx)("path",{d:"M10 6.5h4M7 9.5l3 5M17 9.5l-3 5"})]}),"link"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.2 1.2"}),(0,h.jsx)("path",{d:"M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.2-1.2"})]}),"actor"===a&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("circle",{cx:"12",cy:"7.5",r:"3.5"}),(0,h.jsx)("path",{d:"M5 20a7 7 0 0 1 14 0"})]})]})}let fy=["text-sky-300","text-emerald-300","text-amber-300","text-rose-300","text-violet-300","text-cyan-300","text-lime-300","text-orange-300"],fz=a=>`seq-read-${a.kind}-${a.id}`;function fA({definition:a,selection:b,issues:c,onSelect:d,onShowInDiagram:e}){let f=new Map(a.participants.map((a,b)=>[a.name,fy[b%fy.length]])),g=az(a),i=g.filter(a=>null===a.fragment),j=(a.fragments??[]).map((a,b)=>({f:a,fi:b,rows:g.filter(a=>a.fragment===b)})),k=(a,c)=>b?.kind===a&&b.id===c,l=a=>(0,h.jsx)("span",{className:`font-semibold ${f.get(a)??"text-gray-300"}`,children:a||"?"}),m=(a,b)=>{let f={kind:"message",id:a},g=c.get(`message:${a}`)??[],i=g.some(a=>"error"===a.severity)?"error":g.length?"warning":null,j=k("message",a);return(0,h.jsx)("li",{id:fz(f),className:"scroll-mt-16 scroll-mb-24",children:(0,h.jsxs)("div",{role:"button",tabIndex:0,"aria-pressed":j,onClick:()=>d(f),onKeyDown:a=>("Enter"===a.key||" "===a.key)&&(a.preventDefault(),d(f)),className:`flex gap-3 rounded-lg border-l-2 px-3 py-2.5 ${j?"bg-blue-950/60 ring-1 ring-blue-500/60":"hover:bg-gray-900"} ${"error"===i?"border-red-500":"warning"===i?"border-amber-400":"border-transparent"}`,children:[(0,h.jsx)("span",{className:"mt-0.5 flex h-6 min-w-6 shrink-0 items-center justify-center rounded-full border border-gray-700 bg-gray-900 px-1 font-mono text-[11px] text-gray-300",children:a}),(0,h.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,h.jsxs)("div",{className:"text-[13px] leading-5 text-gray-400",children:[l(b.from),b.from===b.to?(0,h.jsx)("span",{children:" to itself"}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("span",{className:"px-1.5 text-gray-500",children:b.reply?"⇠":"→"}),l(b.to)]}),b.reply&&(0,h.jsx)("span",{className:"ml-2 text-[11px] text-gray-500",children:"reply"}),b.optional&&(0,h.jsx)("span",{className:"ml-2 rounded border border-gray-700 px-1 text-[11px] text-gray-400",children:"optional"})]}),(0,h.jsx)("div",{className:`mt-0.5 break-words text-[15px] leading-6 ${b.reply?"text-gray-300":"text-gray-100"}`,children:b.label||(0,h.jsx)("span",{className:"text-gray-500",children:"no label"})}),(b.event||b.state||b.carries)&&(0,h.jsxs)("div",{className:"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-[12px] leading-5",children:[b.event&&(0,h.jsx)("span",{className:"rounded border border-blue-500/50 bg-blue-950/50 px-1.5 font-mono text-blue-200",children:b.event}),b.event&&b.machine&&(0,h.jsxs)("span",{className:"text-gray-400",children:["on ",b.machine]}),b.state&&(0,h.jsxs)("span",{className:"text-emerald-300",children:["→ ",b.state]}),b.carries&&(0,h.jsxs)("span",{className:"text-gray-400",children:["carries ",b.carries]})]}),g.map((a,b)=>(0,h.jsx)("p",{className:`mt-1.5 text-[12px] leading-5 ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:a.text},b)),j&&(0,h.jsx)("button",{className:"mt-2 rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-[12px] text-gray-200",onClick:a=>{a.stopPropagation(),e(f)},children:"Show in the diagram"})]})]})},a)};return(0,h.jsx)("div",{className:"h-full overflow-y-auto overscroll-contain",children:(0,h.jsxs)("div",{className:"mx-auto max-w-2xl px-4 pb-28 pt-10",children:[a.participants.length>0&&(0,h.jsx)("ul",{className:"mb-4 flex flex-wrap gap-2","aria-label":"Participants",children:a.participants.map(a=>{let b={kind:"participant",id:a.name},e=a.actor?"actor":a.object?"object":a.service?"service":"",f=c.get(`participant:${a.name}`)??[];return(0,h.jsx)("li",{id:fz(b),children:(0,h.jsxs)("button",{onClick:()=>d(b),"aria-pressed":k("participant",a.name),title:f.map(a=>a.text).join("\n")||void 0,className:`rounded-full border px-3 py-1 text-[13px] ${k("participant",a.name)?"border-blue-500 bg-blue-950/60":"border-gray-700 bg-gray-900"} ${f.length?"ring-1 ring-amber-400/70":""}`,children:[l(a.name),e&&(0,h.jsx)("span",{className:"ml-1.5 text-[11px] text-gray-400",children:e})]})},a.name)})}),0===g.length&&(0,h.jsx)("p",{className:"text-sm text-gray-400",children:"No messages yet — add them in the panel, or let an agent write the scenario."}),(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:i.map(({ref:a,message:b})=>m(a,b))}),j.map(({f:a,fi:b,rows:c})=>(0,h.jsxs)("section",{className:"mt-5 rounded-xl border border-indigo-500/50 bg-indigo-950/20 p-1.5",children:[(0,h.jsxs)("header",{className:"px-3 pb-1.5 pt-2",children:[(0,h.jsxs)("div",{className:"text-[12px] text-indigo-200",children:[(0,h.jsx)("span",{className:"font-semibold uppercase tracking-wide",children:a.kind}),(0,h.jsxs)("span",{className:"text-indigo-300",children:[" · after ",a.after]})]}),(0,h.jsx)("div",{className:"mt-0.5 break-words text-[14px] leading-5 text-gray-100",children:a.label})]}),0===c.length?(0,h.jsx)("p",{className:"px-3 pb-2 text-[12px] text-gray-400",children:"No messages in this fragment."}):(0,h.jsx)("ol",{className:"flex flex-col gap-1",children:c.map(({ref:a,message:b})=>m(a,b))})]},b))]})})}async function fB(a){try{let b=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{cache:"no-store"}),c=await b.json();if(!b.ok||c.error)return{path:a??"",content:null,exists:!1,error:c.error??`HTTP ${b.status}`};return{path:c.path??a??"",content:c.content??null,exists:!!c.exists,mtime:c.mtime}}catch(b){return{path:a??"",content:null,exists:!1,error:b instanceof Error?b.message:String(b)}}}class fC extends Error{constructor(a){super(`${a.split("/").pop()} changed on disk since it was read`)}}async function fD(a,b,c){let d=await fetch(`/api/file${(0,ek.docQuery)(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n",...void 0!==c?{mtime:c}:{}})}),e=await d.json().catch(()=>({}));if(409===d.status)throw new fC(a);if(!d.ok)throw Error(e?.error??`HTTP ${d.status}`);return e?.mtime}async function fE(a){let b=await fB(a),c={path:b.path||a,def:null,members:[],absOf:{},wrapped:{},mtimes:{}};if(b.error)return{...c,error:b.error};if(!b.exists||!b.content)return{...c,error:`${a} does not exist`};let d=null;try{let a=aq(JSON.parse(b.content));aR(a)&&(d=a)}catch{}if(!d)return{...c,error:`${b.path} is not a readable system definition`};let e={},f={},g={[b.path]:b.mtime??0},h=await Promise.all((d.members??[]).filter(a=>a?.path).map(async a=>{let c=aV(b.path,a.path);e[a.path]=c;let d=aS(a.path),h=await fB(c);if(h.error)return{path:a.path,kind:d,def:null,error:h.error};if(!h.exists||!h.content)return{path:a.path,kind:d,def:null,error:"the file does not exist"};g[a.path]=h.mtime??0;try{let b=JSON.parse(h.content);if("machine"===d&&b&&(b.stateMachine||b.StateMachine))return f[a.path]=!0,{path:a.path,kind:d,def:aq(b.stateMachine??b.StateMachine)};return{path:a.path,kind:d,def:aq(b)}}catch(b){return{path:a.path,kind:d,def:null,error:`not JSON: ${b instanceof Error?b.message:String(b)}`}}}));return{path:b.path,def:d,members:h,absOf:e,wrapped:f,mtimes:g}}function fF(){window.dispatchEvent(new Event(eN))}function fG(a){let[b,c]=(0,i.useState)(null),[d,e]=(0,i.useState)(0),f=(0,i.useCallback)(()=>e(a=>a+1),[]);return(0,i.useEffect)(()=>(window.addEventListener(eN,f),()=>window.removeEventListener(eN,f)),[f]),(0,i.useEffect)(()=>{if(!a)return;let b=!0;return fE(a).then(d=>b&&c({for:a,system:d})),()=>{b=!1}},[a,d]),{system:a&&b?.for===a?b.system:null,reload:f}}function fH(a,b){if(!a||!b)return null;for(let[c,d]of Object.entries(a.absOf))if(d===b)return c;return null}async function fI(a,b,c,d){let{bridgeUrl:e}=await eu();if(!e)return;let f=dJ({url:e,role:"web",docId:a,name:"web-reconcile",autoResync:!1});try{let a=await Promise.race([f.join(),new Promise((a,b)=>setTimeout(()=>b(Error("join timeout")),3e3))]),e=a.snapshot?.def,g=a=>(function(a){let b=JSON.stringify(a),c=0x811c9dc5;for(let a=0;a<b.length;a++)c^=b.charCodeAt(a),c=Math.imul(c,0x1000193);return(c>>>0).toString(16).padStart(8,"0")})(a);if(e&&g(e)===g(b))return;await new Promise(a=>{let h=f.on("ack",()=>{h(),a()});d&&e&&g(e)===g(d.from)?f.emitPatch(d.ops,c):f.emitFull(b,c),setTimeout(a,800)})}catch{}finally{f.disconnect()}}async function fJ(a,b){let c=[],d=[],e=[],f=async(a,b)=>{try{await b(),c.push(a)}catch(b){b instanceof fC?e.push(a):d.push(`${a}: ${b instanceof Error?b.message:String(b)}`)}};for(let c of b.machines){let b=a.absOf[c.member];b&&c.ops.length&&await f(c.member,async()=>{let d=a.wrapped[c.member]?{stateMachine:c.def}:c.def,e=await fD(b,d,a.mtimes[c.member]),f=a.members.find(a=>a.path===c.member)?.def;await fI(b,c.def,e,{from:f,ops:c.ops})})}for(let c of b.erds){let b=a.absOf[c.member];b&&await f(c.member,async()=>{let d=await fD(b,c.def,a.mtimes[c.member]);await fI(b,c.def,d)})}return b.system&&await f(a.path.split("/").pop()??a.path,async()=>{let c=await fD(a.path,b.system.def,a.mtimes[a.path]);await fI(a.path,b.system.def,c)}),fF(),{written:c,failed:d,conflicts:e}}async function fK(a){let b={result:null,written:[],failed:[],conflicts:[]};for(let c=0;c<2;c+=1){let d=await fE(a);if(!d.def)return{...b,failed:[d.error??"the system could not be read"],retried:c>0};let e=bd(d.def,d.members);if(!e.count)return{...b,result:e,conflicts:c?b.conflicts:[],retried:c>0};let f=await fJ(d,e);if(b={result:e,written:[...b.written,...f.written],failed:f.failed,conflicts:f.conflicts},!f.conflicts.length)return{...b,retried:c>0}}return{...b,retried:!0}}let fL="stateloom.sequence.view",fM=["","actor","service","object"],fN=a=>"string"==typeof a?a.trim():"",fO=a=>fN(a).split(",").map(a=>a.trim()).filter(Boolean);function fP(a){return{from:fN(a.from),to:fN(a.to),label:fN(a.label),event:fN(a.event),machine:fN(a.machine),carries:fN(a.carries),state:fN(a.state),description:fN(a.description),optional:!!a.optional||void 0,reply:!!a.reply||void 0}}function fQ(){let a,b,c,d=(0,ek.useRequestedDoc)(),e=eQ("system"),{system:f}=fG(e),g=eT(),[j,k]=(0,i.useState)(""),[l,m]=(0,i.useState)(null),[n,o]=(0,i.useState)({...M}),[p,q]=(0,i.useState)(void 0),[r,s]=(0,i.useState)(null),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>x(!0),4e3);return()=>{clearTimeout(a),x(!1)}},[t]);let[y,z]=(0,i.useState)("messages"),[A,B]=(0,i.useState)(!1),[C,D]=(0,i.useState)(!1),[E,F]=(0,i.useState)(!1),[G,H]=(0,i.useState)("diagram"),I=(0,i.useRef)("diagram");(0,i.useEffect)(()=>{let a=null;try{a=window.localStorage.getItem(fL)}catch{}let b="list"===a||"diagram"===a?a:window.matchMedia("(max-width: 767px)").matches?"list":"diagram";I.current=b,H(b)},[]);let J=(0,i.useCallback)(a=>{I.current=a,H(a);try{window.localStorage.setItem(fL,a)}catch{}},[]),K=(0,i.useRef)(null),L=eL({onClose:()=>B(!1),restVh:62,tallVh:92}),[O,P]=(0,i.useState)(0),R=(0,i.useRef)(null),T=(0,i.useRef)(!0),U=(0,i.useRef)(-1);(0,i.useEffect)(()=>{let a=!1,b=null;return(async()=>{let c=await (await fetch(`/api/file${(0,ek.docQuery)(d)}`,{cache:"no-store"})).json();if(a)return;if(c.error)return v(c.error,"warn");let e=c.path??"",f=null;try{let a=c.content?aq(JSON.parse(c.content)):null;av(a)&&(f=a)}catch{}if(c.exists&&!f)return v(`${e} is not a readable sequence definition`,"warn");let g=(e.split("/").pop()??"Untitled").replace(/\.sqdf\.json$/i,"");k(e),m(f??aw("Default",g)),v(c.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:h}=await eu();!a&&h&&(R.current=b=dL({url:h,role:"web",docId:e,name:"web-designer",onFull:a=>{let b=a.def;av(b)&&(m(b),v("updated live"))},onPatch:()=>{},onPresence:a=>P(a.length)}),b.connect())})().catch(b=>!a&&v(String(b),"warn")),()=>{a=!0,R.current=null,b?.disconnect()}},[d,v]);let V=(0,i.useMemo)(()=>l?bT(l):null,[l]),W=(0,i.useMemo)(()=>V?aL(V):null,[V]),X=(0,i.useMemo)(()=>V&&W?fh(()=>(function(a,b){let c=[];for(let a of b.participants)c.push({focus:`participant:${a.name}`,box:{x:a.left,y:a.top,width:a.width,height:Math.max(a.height,b.lifelineBottom-a.top)}});let d=new Map(az(a).map(a=>[a.ref,a.message]));for(let a of b.rows){let b=a.self?a.fromX:Math.min(a.fromX,a.toX),e=a.self?220:Math.max(40,Math.abs(a.toX-a.fromX)),f={x:b-10,y:a.y-24,width:e+20,height:40};c.push({focus:`message:${a.ref}`,box:f});let g=d.get(a.ref)?.event;g&&c.push({focus:`event:${g}`,box:f})}return c})(V,W),[]):[],[V,W]),Y=(0,i.useMemo)(()=>{let a={};for(let{ref:b,message:c}of V?fh(()=>az(V),[]):[]){let d=c?.label?`${b}. ${c.label}`:`message ${b}`;a[`message:${b}`]=d.length>48?`${d.slice(0,47)}…`:d}return a},[V]),Z=eQ("focus"),$=(0,i.useMemo)(()=>{if(!l)return[];let a="";return fh(()=>aA(l),null,b=>a=b)??[{ruleId:"S000",message:`The document could not be checked (${a}): a field is not the shape Spec 81 gives it`}]},[l]),_=fH(f,j),aa=(0,i.useMemo)(()=>f?.def&&_&&l?fh(()=>a6(f.def,f.members.map(a=>a.path===_?{...a,def:l,error:void 0}:a)),null):null,[f,_,l]),ab=(0,i.useMemo)(()=>(aa?.issues??[]).filter(a=>a.member===_&&!/^S0/.test(a.ruleId)),[aa,_]),ac=aa?.replays.find(a=>a.member===_)?.report??null,ad=(0,i.useMemo)(()=>(function(a){let b={events:new Set,states:new Set,machines:new Set,objects:new Set,entities:new Set,actors:new Set};if(!a)return{events:[],states:[],machines:[],objects:[],entities:[],actors:[]};let{machines:c,erds:d}=a5(a.members);for(let{def:a}of(c.forEach(({def:a},c)=>{for(let d of(b.machines.add(a_(a,c)),a.events??[]))for(let a of[...d?.events??[],...d?.timers??[]])a?.id&&b.events.add(a.id);for(let c of a.settings?.objects??[])c?.instance&&b.objects.add(c.instance);let d=a=>{a&&(b.states.add(a.name),(a.states??[]).forEach(d),(a.parallel?.states??[]).forEach(d))};d(a.state)}),d))for(let c of a.entities??[])c?.name&&b.entities.add(c.name);for(let c of a.def?.actors??[])c?.name&&b.actors.add(c.name);let e=a=>[...a].sort((a,b)=>a.localeCompare(b));return{events:e(b.events),states:e(b.states),machines:e(b.machines),objects:e(b.objects),entities:e(b.entities),actors:e(b.actors)}})(f),[f]),ae=(0,i.useMemo)(()=>{let a=a=>a?/^(message|participant):/.test(a)?a:V?.participants.some(b=>b.name===a)?`participant:${a}`:"":"";return[...$.map(b=>a(b.element)),...ab.filter(a=>"error"===a.severity).map(b=>a(b.element))].filter(Boolean)},[$,ab,V]),af=(0,i.useMemo)(()=>ab.filter(a=>"warning"===a.severity).map(a=>a.element??""),[ab]),ag=(0,i.useMemo)(()=>{let a=new Map,b=(b,c)=>{let d=b?/^(message|participant):/.test(b)?b:V?.participants.some(a=>a.name===b)?`participant:${b}`:"":"";d&&a.set(d,[...a.get(d)??[],c])};return $.forEach(a=>b(a.element,{severity:"error",text:a.message})),ab.forEach(a=>b(a.element,{severity:"error"===a.severity?"error":"warning",text:a.message})),a},[$,ab,V]),ah=()=>{let a=K.current?.getBoundingClientRect();return{width:a?.width??0,height:a?.height??0}},ai=(0,i.useCallback)(a=>{let b=K.current?.getBoundingClientRect();if(!b?.width)return;let c=N(Math.max(S([a],b.width,b.height,{padding:24,maxScale:1.1}).scale,.7));o({scale:c,x:b.width/2-(a.x+a.width/2)*c,y:b.height/2-(a.y+a.height/2)*c})},[]),aj=(0,i.useCallback)(a=>{if(W)if("message"===a.kind){let b=W.rows.find(b=>b.ref===a.id);if(!b)return;let c=b.self?b.fromX:Math.min(b.fromX,b.toX),d=b.self?220:Math.abs(b.toX-b.fromX);ai({x:c-10,y:b.y-24,width:d+20,height:40})}else{let b=W.participants.find(b=>b.name===a.id);b&&ai({x:b.left-20,y:b.top,width:b.width+40,height:Math.min(260,W.height-b.top)})}},[W,ai]),ak=(0,i.useCallback)(a=>{if("diagram"===I.current)return aj(a);requestAnimationFrame(()=>document.getElementById(fz(a))?.scrollIntoView({block:"center",behavior:"smooth"}))},[aj]),al=(0,i.useCallback)(a=>{s(a),a&&eS(`${a.kind}:${a.id}`)},[]);(0,i.useEffect)(()=>{if(!l||!W||U.current===g.nonce)return;U.current=g.nonce;let a=g.focus?a8(g.focus):null;if(!a)return;let b=null;if("message"===a.kind&&ay(V??l,a.name)&&(b={kind:"message",id:a.name}),"participant"===a.kind&&(V??l).participants.some(b=>b.name===a.name)&&(b={kind:"participant",id:a.name}),!b)return v(`${g.focus} is not in this sequence`,"warn");T.current=!1,s(b),ak(b)},[l,V,W,g,ak,v]),(0,i.useEffect)(()=>{if(!W||!T.current||"diagram"!==G)return;let{width:a,height:b}=ah();a&&(T.current=!1,Math.min((a-32)/W.width,(b-32)/W.height)>=.5||0===W.participants.length?q(a=>(a??0)+1):o({x:8,y:8,scale:.6}))},[W,G]);let am=(0,i.useCallback)(async a=>{let b;if(l&&j){try{b=a(l)}catch(a){return v(a instanceof Error?a.message:String(a),"warn")}m(b);try{let a=await fetch(`/api/file${(0,ek.docQuery)(j)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(b,null,2)+"\n"})});if(!a.ok)throw Error((await a.json())?.error??`HTTP ${a.status}`);R.current?.emitFull(b),v("saved")}catch(a){return v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}if(f?.def&&_){if("auto"===aO(f.def)){let{result:a,failed:b,conflicts:d}=await fK(f.path);if(a&&a.count>0){var c;return void(c=b.length?`auto: not written — ${b[0]}`:d.length?`auto: ${d.join(", ")} kept changing on disk; not written — save again`:be(a,"auto"),window.dispatchEvent(new CustomEvent(eP,{detail:{text:c,origin:void 0}})))}}fF()}}},[l,j,v,f,_]),an=a=>{let{width:b,height:c}=ah();o(d=>Q(d,a,{x:b/2,y:c/2}))},ao=()=>{let a,b,c,d,e,f,g,h,i;l&&navigator.clipboard?.writeText((a=["sequenceDiagram"],b=new Map,(l.participants??[]).forEach((c,d)=>{let e=`p${d+1}`;b.set(c.name,e),a.push(` ${c.actor?"actor":"participant"} ${e} as ${aM(c.name)}`)}),c=a=>b.get(a)??aM(a).replace(/\W+/g,"_"),d=(a,b,d)=>{let e=a.reply?"-->>":"->>",f=[`${b} ${aM(a.label??"")}`,a.event?aM(a.event):""].filter(Boolean).join(" · "),g=`${d}${c(a.from)}${e}${c(a.to)}: ${f}`;return a.optional?[`${d}opt optional`,` ${g}`,`${d}end`]:[g]},e=l.messages??[],f=l.fragments??[],g=a=>f.filter(b=>b?.after===a),h=(b,c)=>(b.messages??[]).forEach((e,g)=>a.push(...d(e,`f${f.indexOf(b)+1}.${g+1}`,c+" "))),(i=(b,c,f)=>{for(let j=b;j<=e.length;j++){let b=j===f?[]:g(j);for(let d of b.filter(a=>"alt"!==a.kind))a.push(`${c}${d.kind} ${aM(d.label??"")}`),h(d,c),a.push(`${c}end`);let k=b.filter(a=>"alt"===a.kind);if(k.length){k.forEach((b,d)=>{a.push(`${c}${0===d?"alt":"else"} ${aM(b.label??"")}`),h(b,c)}),j<e.length&&(a.push(`${c}else as written`),i(j,c+" ",j)),a.push(`${c}end`);return}j<e.length&&a.push(...d(e[j],String(j+1),c))}})(0," ",null),a.join("\n")+"\n")).then(()=>v("mermaid copied"))},ap=a=>{let b=a?a8(a):null;if(!b||"message"!==b.kind&&"participant"!==b.kind)return;let c={kind:b.kind,id:b.name};al(c),ak(c),L.close()},ar=V??aw("",""),as=az(ar),at=l&&r?.kind==="message"?ay(ar,r.id):null,ax=l&&r?.kind==="participant"?ar.participants.find(a=>a.name===r.id)??null:null,aK=ar.participants.map(a=>a.name),aN=j.split("/").pop()||"…",aP=$.length+ab.filter(a=>"error"===a.severity).length,aQ=ab.filter(a=>"warning"===a.severity).length,aR=[{id:"participants",label:"Participants",icon:(0,h.jsx)(fx,{kind:"actor"})},{id:"messages",label:"Messages",icon:(0,h.jsx)(fx,{kind:"sequence"})},{id:"notes",label:"Notes",icon:"✎"},{id:"issues",label:"Issues",icon:(0,h.jsx)(em,{}),badge:aP+aQ||void 0}],aS=a=>[{name:"from",label:"from",options:aK,initial:a?.from??aK[0]??""},{name:"to",label:"to",options:aK,initial:a?.to??aK[1]??aK[0]??""},{name:"label",label:"label",placeholder:"what is said or done",initial:a?.label??"",wide:!0},{name:"event",label:"event it fires",suggest:ad.events,initial:a?.event??""},{name:"state",label:"state after",suggest:ad.states,initial:a?.state??""},{name:"carries",label:"entity it carries",suggest:ad.entities,initial:a?.carries??""},{name:"machine",label:"machine",suggest:ad.machines,initial:a?.machine??""},{name:"optional",label:"optional",checkbox:!0,initial:!!a?.optional},{name:"reply",label:"reply (dashed)",checkbox:!0,initial:!!a?.reply}],aT=a=>a.actor?"actor":a.object?"object":a.service?"service":"",aU=["main: at the end",...at&&null===at.fragment?[`main: after ${at.index+1}`]:[],...(l?.fragments??[]).map((a,b)=>`fragment ${b+1}: ${a.kind} \xb7 ${a.label}`)];return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>C&&D(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fx,{kind:"sequence",size:14}),"SEQ"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:j,children:[l?.settings.name??aN,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",aN]})]}),(0,h.jsx)("div",{className:"flex shrink-0 overflow-hidden rounded border border-gray-700 text-[12px] leading-none",role:"group","aria-label":"View",children:[["list","List","Read the messages in order, one under the other"],["diagram","Diagram","The lifelines and arrows"]].map(([a,b,c])=>(0,h.jsx)("button",{title:c,"aria-pressed":G===a,onClick:()=>{G!==a&&(r&&(T.current=!1),J(a),r&&requestAnimationFrame(()=>ak(r)))},className:`px-2.5 py-1.5 ${G===a?"bg-gray-700 text-gray-100":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,children:b},a))}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fu,onClick:ao,children:"Copy mermaid"}),(0,h.jsx)("button",{className:fu,onClick:()=>F(a=>!a),"aria-pressed":!E,title:E?"Show the panel":"Hide the panel — the board takes the full width",children:E?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":C,onClick:a=>{a.stopPropagation(),D(a=>!a)},children:"⋯"}),C&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{D(!1),ao()},children:"Copy as mermaid"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:K,className:"relative min-w-0 flex-1 overflow-hidden",children:[l&&W&&"list"===G&&V&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(fA,{definition:V,selection:r,issues:ag,onSelect:a=>al(a),onShowInDiagram:a=>{T.current=!1,J("diagram"),requestAnimationFrame(()=>aj(a))}})}),l&&W&&"diagram"===G&&(0,h.jsx)(eJ,{what:"sequence",resetKey:l,children:(0,h.jsx)(bU,{definition:V,layout:W,viewport:n,onViewportChange:o,selection:r,errorElements:ae,warningElements:af,fitKey:p,onSelect:(a,b)=>al({kind:a,id:b}),onClearSelection:()=>s(null),emptyHint:"No participants yet — add them in the panel, or let an agent write the scenario."})}),l&&W&&"diagram"===G&&(0,h.jsx)(ff,{docPath:j||null,kind:"sequence",viewport:n,setViewport:o,boxes:X,boardRef:K,focus:Z,labels:Y}),l&&W&&"list"===G&&(0,h.jsx)(fg,{docPath:j,onReveal:()=>J("diagram")}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"} ${"list"===G&&w&&"ok"===t.tone?"hidden":"flex"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsxs)("span",{className:`truncate transition-opacity duration-500 ${w&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:[t.text,O>1?` \xb7 ${O} in the room`:""]})]}),(0,h.jsx)("div",{className:`absolute bottom-3 right-3 flex-col overflow-hidden rounded-lg border border-gray-700 bg-gray-900/90 shadow-lg backdrop-blur ${"diagram"===G?"flex":"hidden"}`,children:[["+","Zoom in",()=>an(1.25)],["−","Zoom out",()=>an(.8)],["⛶","Fit the whole diagram",()=>q(a=>(a??0)+1)]].map(([a,b,c])=>(0,h.jsx)("button",{title:b,"aria-label":b,onClick:c,className:"h-10 w-10 border-b border-gray-800 text-base leading-none text-gray-200 last:border-b-0 hover:bg-gray-800 md:h-8 md:w-8 md:text-sm",children:a},b))}),r&&!A&&(0,h.jsxs)("button",{className:"absolute bottom-3 left-1/2 max-w-[60%] -translate-x-1/2 truncate rounded-full border border-blue-500/60 bg-gray-900/95 px-4 py-2 text-sm text-blue-200 shadow-lg md:hidden",onClick:()=>{z("message"===r.kind?"messages":"participants"),B(!0)},children:["Edit ","message"===r.kind?`${r.id}. ${at?.message.label??""}`:r.id]})]}),A&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:L.close,"aria-hidden":"true"}),l&&(0,h.jsxs)("aside",{style:L.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${A?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${E?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...L.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:aR.find(a=>a.id===y)?.label}),(0,h.jsx)("button",{onClick:L.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:aR.map(a=>(0,h.jsxs)("button",{onClick:()=>z(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${y===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsx)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:(0,h.jsxs)(eJ,{what:"panel",resetKey:l,children:[(0,h.jsxs)("section",{className:"participants"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Participants"}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:ar.participants.map(a=>(0,h.jsxs)("button",{className:`${fu} ${r?.kind==="participant"&&r.id===a.name?"border-blue-500 text-blue-300":""}`,onClick:()=>{al({kind:"participant",id:a.name}),ak({kind:"participant",id:a.name})},title:aT(a)||"participant",children:[a.name,aT(a)&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" · ",aT(a)]})]},a.name))}),(0,h.jsx)(fw,{id:"add-participant",reset:!0,required:["name"],fields:[{name:"name",placeholder:"new participant"},{name:"kind",options:fM,label:"kind"},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects]},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities}],submit:"+ Participant",onSubmit:a=>{let b=fN(a.name),c=fN(a.kind);am(d=>(function(a,b,c){if(!b.name?.trim())throw Error("A participant needs a name.");let d=aB(a);if(d.participants.some(a=>a.name===b.name))throw Error(`Participant '${b.name}' already exists.`);let e=d.participants.length;return d.participants.splice(e,0,aC({...b})),d})(d,{name:b,...c?{[c]:fN(a.value)||b}:{},holds:fO(a.holds)})),al({kind:"participant",id:b})}}),ax&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fv} flex items-center justify-between gap-2`,children:[(0,h.jsx)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:ax.name}),(0,h.jsx)("button",{className:`${fu} normal-case tracking-normal`,onClick:()=>ak({kind:"participant",id:ax.name}),children:"◎ Show on board"})]}),(a=ar.participants.findIndex(a=>a.name===ax.name),b=ar.participants.length-1,c=a=>am(b=>{var c;let d,e;return c=ax.name,e=aD(d=aB(b),c),d.participants.splice(d.participants.indexOf(e),1),d.participants.splice(Math.max(0,Math.min(a,d.participants.length)),0,e),d}),(0,h.jsxs)("div",{className:"mb-1 flex items-center gap-1 text-[11px] text-gray-400",children:[(0,h.jsx)("button",{className:`${fu} disabled:opacity-40`,disabled:a<=0,onClick:()=>c(a-1),"aria-label":"Move one column left",children:"← Left"}),(0,h.jsxs)("span",{className:"flex-1 text-center",children:["column ",a+1," of ",b+1]}),(0,h.jsx)("button",{className:`${fu} disabled:opacity-40`,disabled:a>=b,onClick:()=>c(a+1),"aria-label":"Move one column right",children:"Right →"})]})),(0,h.jsx)(fw,{id:"rename-participant",required:["to"],fields:[{name:"to",label:"new name",initial:ax.name}],submit:"Rename (every message follows)",onSubmit:a=>{let b=fN(a.to);b!==ax.name&&(am(a=>(function(a,b,c){if(!c?.trim())throw Error("A participant needs a name.");let d=aB(a),e=aD(d,b);if(c===b)return d;if(d.participants.some(a=>a.name===c))throw Error(`Participant '${c}' already exists.`);e.name=c;let f=a=>{a.from===b&&(a.from=c),a.to===b&&(a.to=c)};for(let a of(d.messages.forEach(f),d.fragments??[]))a.messages.forEach(f);return d})(a,ax.name,b)),al({kind:"participant",id:b}))}},`rename:${ax.name}`),(0,h.jsx)(fw,{id:"edit-participant",fields:[{name:"kind",options:fM,label:"kind",initial:aT(ax)},{name:"value",placeholder:"actor / service / object",suggest:[...ad.actors,...ad.objects],initial:ax.actor??ax.object??ax.service??""},{name:"holds",placeholder:"holds: Entity, Entity",suggest:ad.entities,initial:(ax.holds??[]).join(", "),wide:!0},{name:"description",placeholder:"description",initial:ax.description??"",wide:!0}],submit:"Save participant",onSubmit:a=>am(b=>{let c,d;return aG(b,ax.name,{...(c=fN(a.kind),d=fN(a.value)||ax.name,{actor:"actor"===c?d:"",service:"service"===c?d:"",object:"object"===c?d:""}),holds:fO(a.holds),description:fN(a.description)})})},`p:${JSON.stringify(ax)}`),(0,h.jsxs)("button",{className:`${fu} mt-2 text-red-300`,onClick:()=>{am(a=>{var b;let c,d;return b=ax.name,aD(c=aB(a),b),c.participants=c.participants.filter(a=>a.name!==b),d=a=>a.from!==b&&a.to!==b,c.messages=c.messages.filter(d),c.fragments&&(c.fragments=c.fragments.map(b=>{let c;return{...b,after:Math.max(0,b.after-(c=b.after,a.messages.slice(0,c).filter(a=>!d(a)).length)),messages:b.messages.filter(d)}}).filter(a=>a.messages.length>0),c.fragments.length||delete c.fragments),c}),s(null),eS(null)},title:"Also removes every message it sends or receives",children:["Delete ",ax.name," and its messages"]})]})]}),(0,h.jsxs)("section",{className:"messages"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Messages"}),0===as.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None yet."}),(0,h.jsx)("div",{className:"flex flex-col",children:as.map(({ref:a,message:b,fragment:c},d)=>{let e=null!==c&&(0===d||as[d-1].fragment!==c),f=null!==c?ar.fragments?.[c]:void 0,g=r?.kind==="message"&&r.id===a;return(0,h.jsxs)("div",{children:[e&&f&&(0,h.jsxs)("div",{className:"mt-2 border-t border-gray-800 pt-1 text-[11px] text-indigo-300",children:[(0,h.jsx)("span",{className:"font-semibold",children:f.kind})," · after ",f.after," · ",f.label]}),(0,h.jsxs)("button",{className:`block w-full truncate rounded px-1 py-0.5 text-left text-[11px] ${g?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>{al({kind:"message",id:a}),ak({kind:"message",id:a})},title:`${b.from} → ${b.to}: ${b.label}`,children:[(0,h.jsxs)("span",{className:"text-gray-500",children:[a,"."]})," ",b.from," → ",b.to,": ",b.label,b.event?(0,h.jsxs)("span",{className:"text-blue-300",children:[" [",b.event,"]"]}):null,b.state?(0,h.jsxs)("span",{className:"text-emerald-400",children:[" → ",b.state]}):null,b.optional?(0,h.jsx)("span",{className:"text-gray-500",children:" opt"}):null]})]},a)})}),at&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:`${fv} flex items-center justify-between gap-2`,children:[(0,h.jsxs)("span",{className:"truncate text-sm normal-case tracking-normal text-gray-200",children:["Message ",r.id]}),(0,h.jsxs)("span",{className:"flex gap-1 normal-case tracking-normal",children:[null===at.fragment&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{className:fu,"aria-label":"Move up",title:"Move up",disabled:0===at.index,onClick:()=>{am(a=>aJ(a,at.index,at.index-1)),al({kind:"message",id:String(at.index)})},children:"↑"}),(0,h.jsx)("button",{className:fu,"aria-label":"Move down",title:"Move down",disabled:at.index>=ar.messages.length-1,onClick:()=>{am(a=>aJ(a,at.index,at.index+1)),al({kind:"message",id:String(at.index+2)})},children:"↓"})]}),(0,h.jsx)("button",{className:fu,onClick:()=>ak(r),children:"◎ Show"})]})]}),(0,h.jsx)(fw,{id:"edit-message",required:["label"],fields:[...aS(at.message),{name:"description",placeholder:"description",initial:at.message.description??"",wide:!0}],submit:"Save message",onSubmit:a=>am(b=>aI(b,at.index,fP(a),at.fragment))},`m:${r.id}:${JSON.stringify(at.message)}`),(0,h.jsxs)("button",{className:`${fu} mt-2 text-red-300`,onClick:()=>{am(a=>(function(a,b,c=null){let d=aB(a);if(null!==c){let a=aF(d,c);if(!a.messages[b])throw Error(`Message ${b+1} not found in fragment ${c+1}.`);return a.messages.splice(b,1),d}if(!d.messages[b])throw Error(`Message ${b+1} not found. The sequence has ${d.messages.length}.`);if(d.messages.splice(b,1),d.fragments)for(let a of d.fragments)a.after>b&&(a.after-=1);return d})(a,at.index,at.fragment)),s(null),eS(null)},children:["Delete message ",r.id]})]}),(0,h.jsx)("div",{className:fv,children:"Add a message"}),(0,h.jsx)(fw,{id:"add-message",reset:!0,required:["label"],fields:[{name:"where",options:aU,label:"where",wide:!0},...aS()],submit:"+ Message",onSubmit:a=>{let b=fN(a.where),c=fP(a),d=/^fragment (\d+):/.exec(b),e=/^main: after (\d+)$/.exec(b);d?am(a=>{var b;let e,f,g;return b=Number(d[1])-1,f=aF(e=aB(a),b),aE(e,c),g=f.messages.length,f.messages.splice(g,0,aC({...c})),e}):e?am(a=>aH(a,c,Number(e[1]))):am(a=>aH(a,c))}},`add:${aU.join("|")}:${aK.join("|")}`),(0,h.jsx)("div",{className:fv,children:"Fragments"}),0===(ar.fragments??[]).length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"None."}),(ar.fragments??[]).map((a,b)=>(0,h.jsxs)("div",{className:"mb-2 rounded border border-gray-800 p-1.5",children:[(0,h.jsxs)("div",{className:"flex items-center justify-between text-[11px] text-indigo-300",children:[(0,h.jsxs)("span",{children:[b+1,". ",(0,h.jsx)("span",{className:"font-semibold",children:a.kind})," · after ",a.after," · ",a.messages.length," message(s)"]}),(0,h.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove fragment ${b+1}`,onClick:()=>am(a=>{let c;return aF(c=aB(a),b),c.fragments.splice(b,1),c.fragments.length||delete c.fragments,c}),children:"✕"})]}),(0,h.jsx)(fw,{id:`edit-fragment-${b}`,fields:[{name:"kind",options:au,initial:a.kind},{name:"after",placeholder:"after message",initial:String(a.after)},{name:"label",placeholder:"the condition, in words",initial:a.label,wide:!0}],submit:"Save fragment",onSubmit:a=>am(c=>(function(a,b,c){let d=aB(a),e=aF(d,b);if(void 0!==c.kind&&!au.includes(c.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${c.kind}'.`);if(void 0!==c.after&&(!Number.isInteger(c.after)||c.after<0||c.after>d.messages.length))throw Error(`A fragment branches after a main message, 0 to ${d.messages.length}; got ${c.after}.`);return d.fragments[b]={...aC({...e,...c,messages:void 0}),messages:e.messages??[]},d})(c,b,{kind:fN(a.kind),after:Number(fN(a.after)),label:fN(a.label)}))})]},`${b}:${JSON.stringify({...a,messages:void 0})}`)),(0,h.jsx)(fw,{id:"add-fragment",reset:!0,required:["label"],fields:[{name:"kind",options:au},{name:"after",placeholder:"after message",initial:String(at&&null===at.fragment?at.index+1:ar.messages.length)},{name:"label",placeholder:"the condition, in words",wide:!0},{name:"from",options:aK,label:"first message from"},{name:"to",options:aK,label:"to",initial:aK[1]??aK[0]??""},{name:"first",placeholder:"first message label (optional)",wide:!0}],submit:"+ Fragment",onSubmit:a=>am(b=>(function(a,b){if(!au.includes(b.kind))throw Error(`A fragment is one of ${au.join(", ")}; got '${b.kind}'.`);if(!b.label?.trim())throw Error("A fragment needs a label: the condition in words.");let c=aB(a);if(!Number.isInteger(b.after)||b.after<0||b.after>c.messages.length)throw Error(`A fragment branches after a main message, 0 to ${c.messages.length}; got ${b.after}.`);for(let a of b.messages??[])aE(c,a);return(c.fragments??=[]).push({...aC({...b,messages:void 0}),messages:(b.messages??[]).map(a=>aC({...a}))}),c})(b,{kind:fN(a.kind),after:Number(fN(a.after)),label:fN(a.label),messages:fN(a.first)?[{from:fN(a.from),to:fN(a.to),label:fN(a.first)}]:[]}))},`add-fragment:${ar.messages.length}:${at?.index??""}`)]}),(0,h.jsxs)("section",{className:"notes"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the document, for whoever opens it next — you, or an agent."}),(0,h.jsx)(fr,{label:"On this sequence",value:l.settings.notes??"",placeholder:"What was discussed, what is still open…",onSave:a=>am(b=>{var c;let d;return c={notes:a},(d=aB(b)).settings=aC({...d.settings,...c}),d})},"sequence"),ax&&(0,h.jsx)(fr,{label:`On ${ax.name}`,value:ax.notes??"",placeholder:`A question or a decision about ${ax.name}…`,onSave:a=>am(b=>aG(b,ax.name,{notes:a}))},`participant:${ax.name}`),at&&(0,h.jsx)(fr,{label:`On message ${r.id}`,value:at.message.notes??"",placeholder:"A question or a decision about this message…",onSave:a=>am(b=>aI(b,at.index,{notes:a},at.fragment))},`message:${r.id}`),!r&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Select a participant or a message to leave a note on it."}),[...ar.participants.filter(a=>a.notes?.trim()),...as.filter(a=>a.message.notes?.trim())].length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"With notes"}),(0,h.jsxs)("div",{className:"flex flex-wrap gap-1",children:[ar.participants.filter(a=>a.notes?.trim()).map(a=>(0,h.jsx)("button",{className:fu,onClick:()=>ap(`participant:${a.name}`),children:a.name},`p${a.name}`)),as.filter(a=>a.message.notes?.trim()).map(a=>(0,h.jsxs)("button",{className:fu,onClick:()=>ap(`message:${a.ref}`),children:["message ",a.ref]},`m${a.ref}`))]})]})]}),(0,h.jsxs)("section",{className:"issues"===y?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Issues"}),$.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 text-left text-[11px] text-red-300",onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`p${b}`)),ab.map((a,b)=>(0,h.jsxs)("button",{className:`block w-full py-0.5 text-left text-[11px] ${"error"===a.severity?"text-red-300":"text-amber-300"}`,onClick:()=>ap(a.element),children:["[",a.ruleId,"] ",a.message]},`s${b}`)),0===$.length&&0===ab.length&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-green-400",children:aa?"Valid, and every name it uses resolves in the system.":"The document is valid."}),!e&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-gray-600",children:"Open this sequence from its system to check it against the machines and the data."}),e&&!_&&f&&(0,h.jsx)("p",{className:"mt-2 text-[11px] text-amber-300",children:"This document is not a member of the open system."}),ac&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:fv,children:["Replay against ",ac.machines.join(", ")||"no machine"]}),ac.paths.map(a=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${a.accepted?"text-green-400":"text-amber-300"}`,children:[a.name," — ",a.accepted?"accepted":"stops"]}),a.steps.filter(a=>"data"!==a.result).map(b=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===b.result||"stayed"===b.result?"text-gray-400":"text-amber-300"}`,title:b.note??b.result,onClick:()=>ap(`message:${b.ref}`),children:[b.ref,". ",b.event??""," ",b.from.join("|")||"·"," → ",b.to.join("|")||"·"," ",b.result]},`${a.name}:${b.ref}`))]},a.name))]})]})]})})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:aR.map(a=>{let b=A&&y===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(A&&y===b?L.close():B(!0),z(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function fR(a,b){let c=a?.members.find(a=>a.path===b)?.def;return c?.settings?.name||(b.split("/").pop()??b).replace(/\.(smdf|erdf|sqdf|sysdf)\.json$|\.json$/i,"")}let fS=(a,b)=>a?.members.find(a=>a.path===b)?.kind??"machine";function fT(a){return"message"===a.kind?`message ${a.name}`:`${a.kind} ${a.name}`}function fU({systemPath:a}){let b=eQ("doc"),c=eQ("focus"),{system:d}=fG(a),[e,f]=(0,i.useState)(!1),[g,j]=(0,i.useState)(null),k=(0,i.useRef)(d);(0,i.useEffect)(()=>{k.current=d},[d]);let l=(0,i.useMemo)(()=>d?fh(()=>a9(d.members),[]):[],[d]),m=fH(d,b),n=!!d&&(b===d.path||b===a),o=m&&c?function(a,b,c){let d=a8(c);if(!d)return[];let e=a=>a.member===b&&a.kind===d.kind&&a.name===d.name,f=[];for(let b of a)e(b.from)?f.push({other:b.to,text:b.text,rule:b.rule}):e(b.to)&&f.push({other:b.from,text:b.back,rule:b.rule});return f}(l,m,c):[],p=function(a,b){if(!b)return[];let c=new Map;for(let d of a)for(let a of[d.from,d.to]){if(a.member!==b)continue;let d=a7(a);c.set(d,(c.get(d)??0)+1)}return[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0]))}(l,m);(0,i.useEffect)(()=>{let a=a=>{let b=a.detail;b?.text&&j({...b,at:Date.now()})};return window.addEventListener(eP,a),()=>window.removeEventListener(eP,a)},[]),(0,i.useEffect)(()=>{if(!g)return;let a=setTimeout(()=>j(null),9e3);return()=>clearTimeout(a)},[g]);let q=d?.path;(0,i.useEffect)(()=>{if(!q)return;let b=!0,c=null,d=null;return(async()=>{let{bridgeUrl:e}=await eu();if(b&&e){var g;let b,h,i,l;(c=dJ({url:e,role:"web",docId:q,name:"web-system-strip"})).on("view",b=>{let c=k.current;if(!c)return;let d=b.member?void 0!==c.absOf[b.member]?b.member:Object.keys(c.absOf).find(a=>c.absOf[a]===b.member):void 0;if(b.member&&!d)return void j({text:`ignored a view of ${b.member.split("/").pop()}: it is not a member of this system`,origin:b.origin,at:Date.now()});eR({doc:d?c.absOf[d]:q,system:a,focus:b.focus??null}),f(!1);let e=[d?fR(c,d):"the system map",b.focus].filter(Boolean).join(" · ");j({text:b.note?b.note:`showing ${e}`,origin:b.origin,at:Date.now()})}),c.on("full",()=>fF()),g=c,b=!1,h=!1,i=()=>{g.join().then(()=>{b=!0}).catch(()=>{})},l=g.on("status",a=>{"connected"!==a?h=b:h&&(h=!1,i())}),i(),d=()=>{l()}}})(),()=>{b=!1,d?.(),c?.disconnect()}},[q,a]);let r=b=>{f(!1),d&&eR({doc:b.member?d.absOf[b.member]??aV(d.path,b.member):d.path,system:a,focus:b.focus??null})},s=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],t=d?.def?.settings?.name??(a.split("/").pop()??"system").replace(/\.sysdf\.json$/i,""),u=o.length;return(0,h.jsxs)("div",{className:"system-strip relative z-50 border-b border-gray-800 bg-gray-950 text-xs text-gray-300",children:[(0,h.jsxs)("div",{className:"flex h-[var(--strip-h)] items-center gap-1 px-1.5 md:px-2",children:[(0,h.jsxs)("button",{onClick:()=>r({}),className:`flex min-w-0 max-w-[30%] shrink-0 items-center gap-1 rounded px-1.5 py-1 md:max-w-[16rem] ${n?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,title:`${a} — the system map`,children:[(0,h.jsx)(fx,{kind:"system",size:15}),(0,h.jsx)("span",{className:"truncate font-semibold",children:t})]}),(0,h.jsx)("span",{className:"h-4 w-px shrink-0 bg-gray-800"}),(0,h.jsxs)("nav",{className:"flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto [scrollbar-width:none]","aria-label":"Members",children:[s.map(a=>{let b=a===m,c=d?.members.find(b=>b.path===a)?.error;return(0,h.jsxs)("button",{onClick:()=>r({member:a}),"aria-current":b?"page":void 0,title:`${fR(d,a)} — ${a}${c?` (cannot be read: ${c})`:""}`,className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 ${b?"bg-blue-950/60 text-blue-200":c?"text-red-400 hover:bg-gray-800":"text-gray-400 hover:bg-gray-800 hover:text-gray-200"}`,children:[(0,h.jsx)(fx,{kind:fS(d,a),size:15}),(0,h.jsx)("span",{className:`max-w-[7.5rem] truncate md:max-w-[11rem] ${b?"":"hidden md:inline"}`,children:fR(d,a)})]},a)}),!d&&(0,h.jsx)("span",{className:"px-1 text-gray-600",children:"loading…"}),d?.error&&(0,h.jsx)("span",{className:"truncate px-1 text-amber-300",children:d.error})]}),(0,h.jsxs)("button",{onClick:()=>f(a=>!a),disabled:!m,"aria-expanded":e,title:m?c?`What ${c} links to in the other drawings`:"Elements of this drawing that link to the others":"Open a member to follow its links",className:`flex shrink-0 items-center gap-1 rounded px-1.5 py-1 disabled:opacity-40 ${e?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,children:[(0,h.jsx)(fx,{kind:"link",size:15}),(0,h.jsx)("span",{className:"hidden sm:inline",children:"Links"}),u>0&&(0,h.jsx)("span",{className:"rounded-full border border-gray-700 px-1 text-[10px] leading-4 text-gray-300",children:u})]})]}),g&&!e&&(0,h.jsx)("div",{className:"pointer-events-none absolute inset-x-0 top-full flex justify-center px-2 pt-1",role:"status",children:(0,h.jsxs)("span",{className:"max-w-full truncate rounded border border-gray-700 bg-gray-900/95 px-2 py-0.5 text-[11px] text-gray-300 shadow",children:[g.origin?(0,h.jsxs)("span",{className:"text-blue-300",children:[g.origin,": "]}):null,g.text]})}),e&&m&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"fixed inset-0 z-40",onClick:()=>f(!1),"aria-hidden":"true"}),(0,h.jsxs)("div",{className:"absolute right-1 top-full z-50 mt-1 max-h-[60vh] w-[min(24rem,calc(100vw-0.5rem))] overflow-y-auto rounded-lg border border-gray-700 bg-gray-900 p-2 shadow-xl",children:[c&&a8(c)?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 flex items-center justify-between gap-2 text-[11px] text-gray-500",children:[(0,h.jsxs)("span",{className:"truncate",children:[(0,h.jsx)("span",{className:"text-gray-200",children:fT(a8(c))})," in ",fR(d,m)]}),(0,h.jsx)("button",{className:"shrink-0 text-gray-500 hover:text-gray-200",onClick:()=>eR({doc:b,focus:null}),children:"clear"})]}),0===o.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"Nothing in the other drawings names it."}),o.map((a,b)=>(0,h.jsxs)("button",{onClick:()=>r({member:a.other.member,focus:a7(a.other)}),className:"flex w-full items-start gap-2 rounded px-1.5 py-1.5 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-gray-400",children:(0,h.jsx)(fx,{kind:fS(d,a.other.member),size:14})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block text-[12px] text-gray-200",children:a.text}),(0,h.jsxs)("span",{className:"block truncate text-[10.5px] text-gray-500",children:[fT(a.other)," · ",fR(d,a.other.member)," · ",a.rule]})]})]},b))]}):null,(!c||!a8(c))&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["Elements of ",fR(d,m)," that the other drawings name — pick one to follow it."]}),0===p.length&&(0,h.jsx)("div",{className:"py-1 text-[11px] text-gray-500",children:"None."}),(0,h.jsx)("div",{className:"flex flex-wrap gap-1",children:p.map(([a,c])=>(0,h.jsxs)("button",{onClick:()=>{f(!0),eR({doc:b,focus:a})},className:"rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[11px] text-gray-200 hover:bg-gray-700",children:[a," ",(0,h.jsx)("span",{className:"text-gray-500",children:c})]},a))})]})]})]})]})}let fV={erd:"ERD",machine:"STATE MACHINE",sequence:"SEQUENCE",system:"SYSTEM"};function fW(a,b,c=!1){if(!b)return"";if("erd"===a)return`${b.entities?.length??0} entities \xb7 ${b.relationships?.length??0} relationships`;if("sequence"===a){let a=b.fragments?.length??0;return`${b.participants?.length??0} participants \xb7 ${b.messages?.length??0} messages${a&&!c?` \xb7 ${a} fragment${a>1?"s":""}`:""}`}let d=0,e=a=>{a&&(d+=1,(a.states??[]).forEach(e),(a.parallel?.states??[]).forEach(e))};(b.state?.states??[]).forEach(e),(b.state?.parallel?.states??[]).forEach(e);let f=(b.events??[]).reduce((a,b)=>a+(b?.events?.length??0)+(b?.timers?.length??0),0);return`${d} states \xb7 ${f} events`}let fX=(a,b)=>a<b?`${a}\u0000${b}`:`${b}\u0000${a}`;function fY(a){let b="message"===a.from.kind?`message ${a.from.name}`:`${a.from.kind} ${a.from.name}`;return`${b} ${a.text}`}function fZ(){let a=(0,ek.useRequestedDoc)(),[b,c]=(0,i.useState)(a);(0,i.useEffect)(()=>{let b=!0;if(a)c(a);else fB(null).then(a=>b&&c(a.path||null));return()=>{b=!1}},[a]);let{system:d,reload:e}=fG(b),[f,g]=(0,i.useState)("members"),[j,k]=(0,i.useState)(!1),[l,m]=(0,i.useState)(!1),[n,o]=(0,i.useState)(!1),[p,q]=(0,i.useState)(null),[r,s]=(0,i.useState)(()=>new Set),[t,u]=(0,i.useState)({text:"loading…",tone:"ok"}),v=(0,i.useCallback)((a,b="ok")=>u({text:a,tone:b}),[]),[w,x]=(0,i.useState)(!1),y=eL({onClose:()=>k(!1),restVh:62,tallVh:92}),z=(0,i.useRef)(null),[A,B]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=z.current;if(!a)return;let b=()=>{let b=a.getBoundingClientRect();b.width&&B(b.height>1.1*b.width)};b();let c=new ResizeObserver(b);return c.observe(a),()=>c.disconnect()},[]);let C=(0,i.useRef)(!1);(0,i.useEffect)(()=>{d&&(d.error?v(d.error,"warn"):C.current||v(`${d.members.length} member${1===d.members.length?"":"s"} loaded`),C.current=!0)},[d,v]);let[D,E]=(0,i.useState)(!1);(0,i.useEffect)(()=>{let a=setTimeout(()=>E(!0),4e3);return()=>{clearTimeout(a),E(!1)}},[t]);let F=(0,i.useMemo)(()=>d?.def?fh(()=>a6(d.def,d.members),null):null,[d]),G=(0,i.useMemo)(()=>d?fh(()=>a9(d.members),[]):[],[d]),H=(0,i.useMemo)(()=>d?.def?fh(()=>bd(d.def,d.members),null):null,[d]),I=aO(d?.def),J=(0,i.useMemo)(()=>{let a=new Map;for(let b of G){if(b.from.member===b.to.member)continue;let c=fX(b.from.member,b.to.member),d=a.get(c)??{a:c.split("\0")[0],b:c.split("\0")[1],links:[]};d.links.push(b),a.set(c,d)}return a},[G]),K=(F?.issues??[]).filter(a=>"error"===a.severity),L=(F?.issues??[]).filter(a=>"warning"===a.severity),M=(b,c)=>{d&&eR({doc:d.absOf[b]??b,system:a??d.path,focus:c??null})},N=async(a,b)=>{if(d)try{await fD(d.path,a,d.mtimes[d.path]),v(b),fF()}catch(a){a instanceof fC?(v("the system changed on disk — reloaded; make the change again","warn"),fF()):v(`not saved: ${a instanceof Error?a.message:String(a)}`,"warn")}},O=async()=>{if(!d||!H||!H.count)return;x(!0);let{result:a,written:b,failed:c,conflicts:e}=await fK(d.path);x(!1),c.length?v(`not all written: ${c.join("; ")}`,"warn"):e.length?v(`${e.join(", ")} kept changing on disk — not written; apply again`,"warn"):a?.count?v(`${be(a,"propose").replace(/ proposed/," applied")} — ${b.length} file(s) written`):v("nothing to apply: the drawings on disk already agree")},P=A?420:760,Q=A?640:520,R=d?.def?.members?.filter(a=>a?.path).map(a=>a.path)??[],S=d?.def?.actors??[],T=64*!!S.length,U=(0,i.useMemo)(()=>{let a=R.length,b=P/2,c=(Q-T)/2+6,d=Math.max(0,P/2-98-16),e=Math.max(0,(Q-T)/2-46-18),f=new Map;return R.forEach((g,h)=>{if(1===a)return f.set(g,{x:b,y:c});if(A){let b=Q-T-46-16;return f.set(g,{x:h%2?.67*P:.33*P,y:62+(b-62)*h/(a-1)})}if(2===a)return f.set(g,A?{x:b,y:h?c+e:c-e}:{x:h?b+d:b-d,y:c});let i=-Math.PI/2+2*h*Math.PI/a;f.set(g,{x:b+d*Math.cos(i),y:c+e*Math.sin(i)})}),f},[R.join("|"),P,Q,196,T,A]),V=(0,i.useMemo)(()=>{let a=new Map;for(let{member:b,def:c}of a5(d?.members??[]).sequences)for(let d of c.participants??[]){if(!d?.actor)continue;let c=a.get(d.actor)??[];c.includes(b)||c.push(b),a.set(d.actor,c)}return a},[d]),W=d?.def,X=(d?.path??b??"").split("/").pop()||"…",Y=[{id:"members",label:"Members",icon:(0,h.jsx)(fx,{kind:"system"})},{id:"checks",label:"Checks",icon:(0,h.jsx)(em,{}),badge:K.length+L.length||void 0},{id:"notes",label:"Notes",icon:"✎"}],Z=p?J.get(p):void 0,$=(0,i.useMemo)(()=>{let a=[];for(let b of["error","warning"]){let c=new Map;for(let a of F?.issues??[])a.severity===b&&c.set(a.ruleId,[...c.get(a.ruleId)??[],a]);for(let[d,e]of[...c.entries()].sort((a,b)=>a[0].localeCompare(b[0])))a.push({key:`${b}:${d}`,ruleId:d,severity:b,issues:e})}return a},[F]);return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden bg-gray-950 text-gray-200",onClick:()=>l&&m(!1),children:[(0,h.jsxs)("header",{className:"relative z-40 flex items-center gap-2 border-b border-gray-800 bg-gray-900 px-2 py-1.5 text-xs md:px-3 md:py-2",children:[(0,h.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-blue-300",children:[(0,h.jsx)(fx,{kind:"system",size:14}),"SYS"]}),(0,h.jsx)(el,{}),(0,h.jsxs)("span",{className:"min-w-0 flex-1 truncate text-gray-400",title:d?.path,children:[W?.settings?.name??X,(0,h.jsxs)("span",{className:"hidden text-gray-600 lg:inline",children:[" · ",X]})]}),(0,h.jsxs)("div",{className:"hidden shrink-0 items-center gap-2 md:flex",children:[(0,h.jsx)("button",{className:fu,onClick:e,title:"Read the system and every member again",children:"Re-check"}),(0,h.jsx)("button",{className:fu,onClick:()=>o(a=>!a),"aria-pressed":!n,children:n?"⟨ Panel":"Panel ⟩"})]}),(0,h.jsxs)("div",{className:"relative shrink-0 md:hidden",children:[(0,h.jsx)("button",{className:"rounded border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm leading-none text-gray-200","aria-label":"More actions","aria-expanded":l,onClick:a=>{a.stopPropagation(),m(a=>!a)},children:"⋯"}),l&&(0,h.jsx)("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 overflow-hidden rounded-lg border border-gray-700 bg-gray-900 py-1 shadow-xl",children:(0,h.jsx)("button",{className:"block w-full px-4 py-3 text-left text-sm text-gray-200 hover:bg-gray-800",onClick:()=>{m(!1),e()},children:"Re-check the system"})})]})]}),(0,h.jsxs)("div",{className:"relative flex min-h-0 flex-1",children:[(0,h.jsxs)("div",{ref:z,className:"relative min-w-0 flex-1 overflow-hidden bg-[#030712]",children:[d&&W&&(0,h.jsx)(eJ,{what:"system map",resetKey:d,children:(0,h.jsxs)("svg",{className:"h-full w-full",viewBox:`0 0 ${P} ${Q}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":`System map of ${W.settings?.name}`,children:[[...J.entries()].map(([a,b])=>{let c=U.get(b.a),d=U.get(b.b);if(!c||!d)return null;let e=(c.x+d.x)/2,f=(c.y+d.y)/2,i=`${b.links.length} link${1===b.links.length?"":"s"}`,j=6.4*i.length+16,l=p===a;return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>{q(l?null:a),g("members"),k(!0)},children:[(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:"transparent",strokeWidth:18}),(0,h.jsx)("line",{x1:c.x,y1:c.y,x2:d.x,y2:d.y,stroke:l?"#3b82f6":"#475569",strokeWidth:l?2.5:1.6}),(0,h.jsx)("rect",{x:e-j/2,y:f-11,width:j,height:22,rx:11,fill:"#0f172a",stroke:l?"#3b82f6":"#334155"}),(0,h.jsx)("text",{x:e,y:f+4,textAnchor:"middle",fontSize:11.5,fill:l?"#93c5fd":"#cbd5e1",children:i})]},a)}),S.map((a,b)=>{let c=(b+1)*P/(S.length+1),d=Q-30;return(0,h.jsxs)("g",{children:[(V.get(a.name)??[]).map(a=>{let b=U.get(a);return b?(0,h.jsx)("line",{x1:c,y1:d-14,x2:b.x,y2:b.y+46,stroke:"#334155",strokeDasharray:"3 4"},a):null}),(0,h.jsx)("title",{children:[`${a.kind}`,a.description??"",a.wheelNode??""].filter(Boolean).join(" — ")}),(0,h.jsx)("rect",{x:c-62,y:d-14,width:124,height:28,rx:14,fill:"#0c1020",stroke:"#6366f1"}),(0,h.jsx)("g",{transform:`translate(${c-54} ${d-8})`,color:"#a5b4fc",children:(0,h.jsx)(fx,{kind:"actor",size:16})}),(0,h.jsx)("text",{x:c-34,y:d-1,fontSize:11.5,fontWeight:600,fill:"#e2e8f0",children:a.name.length>12?`${a.name.slice(0,11)}…`:a.name}),(0,h.jsx)("text",{x:c-34,y:d+9,fontSize:8.5,fill:"#94a3b8",children:a.kind})]},a.name)}),R.map(a=>{let b=U.get(a),c=d.members.find(b=>b.path===a);if(!b||!c)return null;let e=c.kind,f=(F?.issues??[]).filter(b=>b.member===a),g=f.filter(a=>"error"===a.severity).length,i=f.filter(a=>"warning"===a.severity).length,j=b.x-98,k=b.y-46,l=fR(d,a),m=Z&&(Z.a===a||Z.b===a);return(0,h.jsxs)("g",{className:"cursor-pointer",onClick:()=>M(a),children:[(0,h.jsx)("title",{children:`${a}${c.error?` — cannot be read: ${c.error}`:""}
15
+ Tap to open it inside the system.`}),(0,h.jsx)("rect",{x:j,y:k,width:196,height:92,rx:10,fill:"#0f172a",stroke:c.error?"#ef4444":m?"#3b82f6":g?"#b91c1c":"#475569",strokeWidth:m?2.2:1.5,strokeDasharray:c.error?"5 4":void 0}),(0,h.jsx)("g",{transform:`translate(${j+10} ${k+9})`,color:"#93c5fd",children:(0,h.jsx)(fx,{kind:e,size:16})}),(0,h.jsx)("text",{x:j+32,y:k+21,fontSize:9,fontWeight:700,letterSpacing:"0.06em",fill:"#64748b",children:fV[e]}),(0,h.jsx)("text",{x:j+10,y:k+43,fontSize:14,fontWeight:600,fill:"#e2e8f0",children:l.length>22?`${l.slice(0,21)}…`:l}),(0,h.jsx)("text",{x:j+10,y:k+60,fontSize:10.5,fill:"#94a3b8",children:c.error?"cannot be read":fW(e,c.def,!0)}),(0,h.jsx)("text",{x:j+10,y:k+79,fontSize:10.5,fill:g?"#fca5a5":i?"#fcd34d":"#4ade80",children:c.error?c.error.length>30?`${c.error.slice(0,29)}…`:c.error:g||i?[g?`${g} error${g>1?"s":""}`:"",i?`${i} warning${i>1?"s":""}`:""].filter(Boolean).join(" · "):"checks pass"}),(0,h.jsx)("text",{x:j+196-10,y:k+79,fontSize:10.5,textAnchor:"end",fill:"#64748b",children:"open ›"})]},a)})]})}),d&&!W&&(0,h.jsx)("div",{className:"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-amber-300",children:d.error}),(0,h.jsxs)("div",{className:`pointer-events-none absolute left-2 top-2 flex max-w-[75%] items-center gap-1.5 rounded bg-gray-950/70 px-1.5 py-0.5 text-[11px] ${"warn"===t.tone?"text-amber-300":"text-gray-500"}`,role:"status",children:[(0,h.jsx)("span",{className:`h-1.5 w-1.5 shrink-0 rounded-full ${"warn"===t.tone?"bg-amber-400":"bg-emerald-500"}`}),(0,h.jsx)("span",{className:`truncate transition-opacity duration-500 ${D&&"ok"===t.tone?"opacity-0":"opacity-100"}`,children:t.text})]})]}),j&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:y.close,"aria-hidden":"true"}),d&&W&&(0,h.jsxs)("aside",{style:y.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 flex h-[var(--sheet-h)] flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${j?"translate-y-0":"pointer-events-none translate-y-full"} md:pointer-events-auto md:static md:z-auto md:h-auto md:w-96 md:translate-y-0 md:rounded-none md:border-l md:border-t-0 md:shadow-none md:transition-none ${n?"md:hidden":""}`,children:[(0,h.jsxs)("div",{className:"md:hidden",...y.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pb-1 pt-2",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:Y.find(a=>a.id===f)?.label}),(0,h.jsx)("button",{onClick:y.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:Y.map(a=>(0,h.jsxs)("button",{onClick:()=>g(a.id),className:`relative flex-1 px-1 py-2 text-center text-xs transition-colors ${f===a.id?"border-b-2 border-blue-400 bg-gray-800/50 text-blue-400":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1 top-1 min-w-[14px] rounded-full bg-red-900 px-1 text-[9px] text-red-100",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain p-3",children:[(0,h.jsxs)("section",{className:"members"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Members"}),R.map(a=>{let b=d.members.find(b=>b.path===a),c=W.members.find(b=>b.path===a)?.notes;return(0,h.jsxs)("div",{className:"mb-1 rounded border border-gray-800",children:[(0,h.jsxs)("button",{onClick:()=>M(a),className:"flex w-full items-start gap-2 p-2 text-left hover:bg-gray-800",children:[(0,h.jsx)("span",{className:"mt-0.5 text-blue-300",children:(0,h.jsx)(fx,{kind:b?.kind??"machine"})}),(0,h.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,h.jsx)("span",{className:"block truncate text-[12px] font-semibold text-gray-200",children:fR(d,a)}),(0,h.jsx)("span",{className:"block truncate text-[10.5px] text-gray-500",children:a}),(0,h.jsx)("span",{className:`block text-[11px] ${b?.error?"text-red-300":"text-gray-400"}`,children:b?.error?`cannot be read: ${b.error}`:fW(b?.kind??"machine",b?.def)})]}),(0,h.jsx)("span",{className:"shrink-0 text-[11px] text-gray-500",children:"open ›"})]}),c||r.has(a)?(0,h.jsx)("div",{className:"px-2 pb-2 [&_label]:mt-0",children:(0,h.jsx)(fr,{label:"Note on this member, in the system",value:c??"",placeholder:`Why ${fR(d,a)} is part of this system, what is open…`,onSave:b=>void N(function(a,b,c){let d=aX(a),e=d.members.findIndex(a=>a.path===b);if(e<0)throw Error(`'${b}' is not a member. Members: ${a.members.map(a=>a.path).join(", ")||"none"}.`);return d.members[e]=aY({...d.members[e],...c}),d}(W,a,{notes:b}),"saved")},`member:${a}`)}):(0,h.jsx)("button",{className:"mx-2 mb-1.5 text-[11px] text-gray-500 hover:text-gray-300",onClick:()=>s(b=>new Set(b).add(a)),children:"Add a note on this member"})]},a)}),(0,h.jsx)("div",{className:fv,children:"Links between members"}),0===J.size&&(0,h.jsx)("div",{className:"py-0.5 text-[11px] text-gray-600",children:"No name crosses between the members yet."}),[...J.entries()].map(([a,b])=>(0,h.jsxs)("div",{className:"mb-1",children:[(0,h.jsxs)("button",{className:`flex w-full items-center justify-between rounded px-1.5 py-1 text-left text-[11px] ${p===a?"bg-blue-950/60 text-blue-200":"text-gray-300 hover:bg-gray-800"}`,onClick:()=>q(p===a?null:a),children:[(0,h.jsxs)("span",{className:"truncate",children:[fR(d,b.a)," ","↔︎"," ",fR(d,b.b)]}),(0,h.jsx)("span",{className:"shrink-0 text-gray-500",children:b.links.length})]}),p===a&&(0,h.jsx)("div",{className:"ml-2 border-l border-gray-800 pl-2",children:b.links.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full truncate py-0.5 text-left text-[11px] text-gray-400 hover:text-gray-200",title:`${fY(a)} — ${a.rule}`,onClick:()=>{let b;return M((b=a.from).member,a7(b))},children:[(0,h.jsx)("span",{className:"text-gray-600",children:a.rule})," ",fY(a)]},b))})]},a)),S.length>0&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"Actors"}),S.map(a=>(0,h.jsxs)("div",{className:"py-0.5 text-[11px] text-gray-300",children:[a.name," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.kind]}),a.description?(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",a.description]}):null]},a.name))]})]}),(0,h.jsxs)("section",{className:"checks"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Checks"}),(0,h.jsxs)("div",{className:`text-[11px] ${K.length?"text-red-300":L.length?"text-amber-300":"text-green-400"}`,children:[K.length," error",1===K.length?"":"s"," · ",L.length," warning",1===L.length?"":"s"]}),$.map(a=>(0,h.jsxs)("div",{className:"mt-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${"error"===a.severity?"text-red-300":"text-amber-300"}`,children:[a.ruleId," · ",a.issues.length," ",a.severity,1===a.issues.length?"":"s"]}),a.issues.map((a,b)=>(0,h.jsxs)("button",{className:"block w-full py-0.5 pl-2 text-left text-[11px] text-gray-300 hover:text-white",onClick:()=>{a.member&&M(a.member,a.element&&/^[a-z]+:/.test(a.element)?a.element:null)},title:a.member?`Open ${a.member}${a.element?` at ${a.element}`:""}`:void 0,children:[a.message,a.member&&(0,h.jsxs)("span",{className:"text-gray-500",children:[" — ",fR(d,a.member)]})]},b))]},a.key)),(0,h.jsx)("div",{className:fv,children:"Reconcile"}),(0,h.jsxs)("p",{className:"mb-1 text-[11px] text-gray-500",children:["What the scenarios imply for the machines and the data. ",(0,h.jsx)("b",{className:"text-gray-400",children:"propose"})," lists it here to apply by hand; ",(0,h.jsx)("b",{className:"text-gray-400",children:"auto"})," writes it each time a scenario is saved."]}),(0,h.jsx)("span",{className:"inline-flex overflow-hidden rounded border border-gray-700",role:"group","aria-label":"Reconcile mode",children:aN.map(a=>(0,h.jsx)("button",{"aria-pressed":I===a,onClick:()=>{d?.def&&a!==I&&N(function(a,b){if(!aN.includes(b))throw Error(`The reconcile mode is ${aN.join(" or ")}; got '${b}'.`);return aZ(a,{reconcile:b})}(d.def,a),`reconcile mode: ${a}`)},className:`px-3 py-1 text-xs ${I===a?"bg-blue-900/60 text-blue-200":"bg-gray-800 text-gray-400 hover:bg-gray-700"}`,children:a},a))}),(0,h.jsx)("div",{className:"mt-2 text-[11px] font-semibold text-gray-400",children:"Scenario changes"}),H&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-500",children:be(H,"propose")}),H.machines.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.machine," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.erds.map(a=>(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsxs)("div",{className:"text-[11px] text-gray-300",children:[a.def.settings?.name??a.member," ",(0,h.jsxs)("span",{className:"text-gray-500",children:["· ",a.member]})]}),a.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]},a.member)),H.system&&(0,h.jsxs)("div",{className:"mt-1",children:[(0,h.jsx)("div",{className:"text-[11px] text-gray-300",children:"the system"}),H.system.reasons.map((a,b)=>(0,h.jsxs)("div",{className:"pl-2 text-[11px] text-gray-400",children:["+ ",a]},b))]}),H.unresolved.map((a,b)=>(0,h.jsxs)("div",{className:"mt-1 text-[11px] text-amber-300",children:["left open: ",a]},b)),(0,h.jsx)("button",{className:`${fu} mt-2 disabled:opacity-40`,disabled:!H.count||w,onClick:O,children:w?"Applying…":`Apply${H.count?` ${H.count} change${1===H.count?"":"s"}`:""}`})]}),(F?.replays??[]).map(({member:a,report:b})=>(0,h.jsxs)("div",{children:[(0,h.jsxs)("div",{className:fv,children:["Replay · ",fR(d,a)]}),(0,h.jsxs)("div",{className:"mb-1 text-[11px] text-gray-500",children:["against ",b.machines.join(", ")||"no machine"]}),b.paths.map(b=>(0,h.jsxs)("div",{className:"mb-2",children:[(0,h.jsxs)("div",{className:`text-[11px] font-semibold ${b.accepted?"text-green-400":"text-amber-300"}`,children:[b.name," — ",b.accepted?"accepted":"stops"]}),b.steps.filter(a=>"data"!==a.result).map(c=>(0,h.jsxs)("button",{className:`block w-full truncate py-0.5 pl-2 text-left font-mono text-[10.5px] ${"moved"===c.result||"stayed"===c.result?"text-gray-400":"text-amber-300"}`,title:c.note??c.result,onClick:()=>M(a,`message:${c.ref}`),children:[c.ref,". ",c.event??""," ",c.from.join("|")||"·"," → ",c.to.join("|")||"·"," ",c.result]},`${b.name}:${c.ref}`))]},b.name))]},a))]}),(0,h.jsxs)("section",{className:"notes"===f?"":"hidden",children:[(0,h.jsx)("div",{className:fv,style:{marginTop:0},children:"Notes"}),(0,h.jsx)("p",{className:"mb-1 text-[11px] text-gray-600",children:"Saved in the system file, for whoever opens it next."}),(0,h.jsx)(fr,{label:"On this system",value:W.settings?.notes??"",placeholder:"What the system is for, what is still open…",onSave:a=>void N(aZ(W,{notes:a}),"saved")},"system"),W.settings?.description&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("div",{className:fv,children:"Description"}),(0,h.jsx)("p",{className:"text-[11px] text-gray-400",children:W.settings.description})]})]})]})]})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:Y.map(a=>{let b=j&&f===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(j&&f===b?y.close():k(!0),g(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&(0,h.jsx)("span",{className:"absolute right-1/2 top-1 min-w-[16px] translate-x-5 rounded-full border border-red-900/80 bg-red-950/80 px-1 text-[10px] leading-4 text-red-200",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})})]})}function f$(){let a=d_(a=>a.definition),b=d_(a=>a.layout.positions),c=d_(a=>a.navigationPath),d=d_(a=>a.viewport),e=d_(a=>a.setViewport),f=d_(a=>a.docPath),g=eQ("focus"),j=(0,i.useMemo)(()=>({get current(){return document.getElementById("machine-board")}}),[]),k=c.slice(1),l=(0,i.useMemo)(()=>a?.state?function(a,b){let c=[];for(let d of a){let a=d?.name?b[d.name]:void 0;a&&c.push({focus:`state:${d.name}`,box:a})}for(let d of a){let e=d?.name?b[d.name]:void 0;if(e)for(let f of d.transitions??[]){if(!f?.event)continue;let d=f.nextState?b[f.nextState]:void 0;c.push({focus:`event:${f.event}`,box:d&&a.some(a=>a.name===f.nextState)?br([e,d]):e})}}return c}(by(a.state,k),b):[],[a,b,c]);return(0,h.jsx)(ff,{docPath:f,kind:"machine",viewport:d,setViewport:e,boxes:l,boardRef:j,focus:g,level:c[c.length-1],onReveal:a=>{let b=a.map(a8).find(a=>a?.kind==="state");if(!b)return;let c=new URL(window.location.href);c.searchParams.set("focus",`state:${b.name}`),window.history.replaceState(window.history.state,"",c),window.dispatchEvent(new Event(eM))}})}let f_=a=>a.parallel?a.parallel.states:a.states??[];function f0(a,b){if(!a)return null;if(a.name===b)return[a.name];for(let c of f_(a)){let d=f0(c,b);if(d)return[a.name,...d]}return null}function f1(){let a=(0,ek.useRequestedDoc)(),b=eQ("system");(0,i.useEffect)(()=>{if(!a||aQ(a))return;let c=!0,d=new URLSearchParams({doc:a});return b&&d.set("system",b),fetch(`/api/system-of?${d.toString()}`,{cache:"no-store"}).then(a=>a.ok?a.json():null).then(d=>{let e=d?.system;if(!c||!e||e===b||null!==a||null!==b)return;let f=new URL(window.location.href);f.searchParams.set("system",e),window.history.replaceState(window.history.state,"",f),window.dispatchEvent(new Event(eO))}).catch(()=>{}),()=>{c=!1}},[a,b]);let[c,d]=(0,i.useState)(null);(0,i.useEffect)(()=>{let a=!0;return eu().then(b=>{a&&d(b.projectFile?aS(b.projectFile):"machine")}),()=>{a=!1}},[]);let e=a?aS(a):c;if(null===e)return(0,h.jsx)("div",{className:"app-shell bg-gray-950"});let f=a??"default",g="erd"===e?(0,h.jsx)(fq,{},f):"sequence"===e?(0,h.jsx)(fQ,{},f):"system"===e?(0,h.jsx)(fZ,{},f):(0,h.jsx)(f2,{}),j=(0,h.jsx)(eJ,{what:"document",resetKey:a,children:g});return b&&aQ(b)?(0,h.jsx)(fb,{children:(0,h.jsxs)("div",{className:"system-frame",children:[(0,h.jsx)(fU,{systemPath:b}),j]})}):(0,h.jsx)(fb,{children:j})}function f2(){let a,b;a=eT(),b=(0,i.useRef)(null),(0,i.useEffect)(()=>{let c=()=>{let a=b.current;if(!a)return;let c=d_.getState(),d=null;if(d&&c.docPath!==d||a.docAt!==c.docPath&&c.definition===a.defAt)return;b.current=null;let e=a8(a.focus);if(!e)return;let f=null,g=null;if("state"===e.kind)(f=f0(c.definition.state,e.name))&&(g={kind:"state",id:e.name});else if("event"===e.kind){let a=function a(b,c){if(!b)return null;let d=(b.transitions??[]).findIndex(a=>a?.event===c);if(d>=0)return{state:b.name,index:d};for(let d of f_(b)){let b=a(d,c);if(b)return b}return null}(c.definition.state,e.name);a&&(f=f0(c.definition.state,a.state),g={kind:"transition",id:`${a.state}:${a.index}`})}if(!f||!g)return;let h=f.length>1?f.slice(0,-1):f;d_.setState({navigationPath:h,currentParent:h[h.length-1]}),c.select(g.kind,g.id);let i=()=>{let a=d_.getState().layout.positions[f[f.length-1]],b=document.getElementById(d3)?.getBoundingClientRect();if(!a||!b?.width)return;let c=S([a],b.width,b.height,{padding:60,maxScale:1});d_.getState().setViewport(c)};requestAnimationFrame(i),setTimeout(i,450)};if(a.nonce>0){let d=d_.getState();b.current=a.focus?{focus:a.focus,docAt:d.docPath,defAt:d.definition}:null,c()}return d_.subscribe(c)},[a]),(0,i.useEffect)(()=>d_.subscribe((a,b)=>{if(a.selection===b.selection||!a.selection.id)return;let{kind:c,id:d}=a.selection;if("state"===c)eS(`state:${d}`);else if("event"===c)eS(`event:${d}`);else if("transition"===c){let b=function(a,b){let c=b.lastIndexOf(":"),d=f0(a.state,b.slice(0,c));if(!d)return null;let e=a.state;for(let a of d.slice(1))e=f_(e).find(b=>b.name===a);return e?.transitions?.[Number(b.slice(c+1))]?.event??null}(a.definition,d);b&&eS(`event:${b}`)}}),[]);let[c,d]=(0,i.useState)("properties"),[e,f]=(0,i.useState)(!1),g=eL({onClose:()=>f(!1),restVh:70,tallVh:92}),j=d_(a=>a.errors),k=d_(a=>a.contextMenu),l=d_(a=>a.hideContextMenu),m=d_(a=>a.addState),n=d_(a=>a.removeState),o=d_(a=>a.setDrawMode),p=d_(a=>a.setDrawSource),q=[{id:"properties",label:"Properties",icon:(0,h.jsx)(ed,{name:"sliders",size:16})},{id:"events",label:"Events",icon:(0,h.jsx)(ed,{name:"bolt",size:16})},{id:"settings",label:"Settings",icon:(0,h.jsx)(ed,{name:"gear",size:16})},{id:"validation",label:"Errors",icon:(0,h.jsx)(em,{}),badge:j.length||void 0}],r=q.find(a=>a.id===c)?.label??"";return(0,h.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden",onClick:()=>k.visible&&l(),children:[(0,h.jsx)(ev,{}),(0,h.jsx)(eH,{}),(0,h.jsx)(eo,{}),(0,h.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden relative",children:[(0,h.jsxs)("div",{className:"relative flex-1 overflow-hidden",id:"machine-board",children:[(0,h.jsx)(eJ,{what:"state machine",children:(0,h.jsx)(ec,{})}),(0,h.jsx)(f$,{})]}),e&&(0,h.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:g.close,"aria-hidden":"true"}),(0,h.jsxs)("aside",{style:g.sheetStyle,className:`safe-x fixed inset-x-0 bottom-0 z-30 h-[var(--sheet-h)] flex flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-[transform,height] duration-200 ease-out ${e?"translate-y-0":"translate-y-full pointer-events-none"} md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:pointer-events-auto md:rounded-none md:border-t-0 md:border-l md:shadow-none md:transition-none`,children:[(0,h.jsxs)("div",{className:"md:hidden",...g.zoneProps,children:[(0,h.jsx)("div",{className:"flex justify-center pt-2 pb-1",children:(0,h.jsx)("span",{className:"h-1.5 w-12 rounded-full bg-gray-600"})}),(0,h.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,h.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:r}),(0,h.jsx)("button",{onClick:g.close,className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,h.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:q.map(a=>(0,h.jsxs)("button",{onClick:()=>d(a.id),className:`flex-1 text-xs py-2 px-1 text-center transition-colors relative ${c===a.id?"text-blue-400 border-b-2 border-blue-400 bg-gray-800/50":"text-gray-500 hover:text-gray-300"}`,children:[a.label,void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1 bg-red-600 text-white text-[9px] rounded-full px-1 min-w-[14px]",children:a.badge})]},a.id))}),(0,h.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain",children:["properties"===c&&(0,h.jsx)(ef,{}),"events"===c&&(0,h.jsx)(eh,{}),"settings"===c&&(0,h.jsx)(ei,{}),"validation"===c&&(0,h.jsx)(ej,{})]})]}),(0,h.jsx)(ep,{})]}),(0,h.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:q.map(a=>{let b=e&&c===a.id;return(0,h.jsxs)("button",{onClick:()=>{var b;return b=a.id,void(e&&c===b?g.close():f(!0),d(b))},"aria-pressed":b,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${b?"text-blue-400":"text-gray-500"}`,children:[(0,h.jsx)("span",{className:"flex h-4 items-center text-base leading-none",children:a.icon}),(0,h.jsx)("span",{children:a.label}),void 0!==a.badge&&a.badge>0&&(0,h.jsx)("span",{className:"absolute top-1 right-1/2 translate-x-4 rounded-full bg-red-600 px-1 text-[10px] leading-4 text-white min-w-[16px]",children:a.badge}),b&&(0,h.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},a.id)})}),k.visible&&(0,h.jsx)("div",{className:"fixed z-50 bg-gray-900 border border-gray-700 rounded-lg shadow-xl py-1 min-w-[180px] md:min-w-[140px]",style:{left:k.x,top:k.y,maxWidth:"calc(100vw - 1rem)",maxHeight:"calc(100dvh - 1rem)",overflowY:"auto",transform:"translate(0, 0)"},onClick:a=>a.stopPropagation(),children:k.target?.kind==="state"?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{o("transition"),p(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"draw"})," Draw transition from here"]}),(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-red-400 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{k.target?.id&&n(k.target.id),l()},children:[(0,h.jsx)(ed,{name:"trash"})," Delete state"]})]}):(0,h.jsx)(h.Fragment,{children:(0,h.jsxs)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{let a=prompt("State name:");a&&m(null,{name:a,kind:"normal"}),l()},children:[(0,h.jsx)(ed,{name:"plus"})," Add state here"]})})})]})}a.s(["default",()=>f1],95421)}];
16
16
 
17
17
  //# sourceMappingURL=%5Broot-of-the-server%5D__edbb995c._.js.map