cli-jaw 1.7.34 → 1.7.36

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 (169) hide show
  1. package/dist/bin/cli-jaw.js +5 -1
  2. package/dist/bin/cli-jaw.js.map +1 -1
  3. package/dist/bin/commands/dashboard.js +78 -0
  4. package/dist/bin/commands/dashboard.js.map +1 -0
  5. package/dist/lib/quota-copilot.js +5 -0
  6. package/dist/lib/quota-copilot.js.map +1 -1
  7. package/dist/src/agent/args.js +2 -4
  8. package/dist/src/agent/args.js.map +1 -1
  9. package/dist/src/agent/events.js +43 -1
  10. package/dist/src/agent/events.js.map +1 -1
  11. package/dist/src/manager/constants.js +9 -0
  12. package/dist/src/manager/constants.js.map +1 -0
  13. package/dist/src/manager/metadata.js +35 -0
  14. package/dist/src/manager/metadata.js.map +1 -0
  15. package/dist/src/manager/proxy.js +134 -0
  16. package/dist/src/manager/proxy.js.map +1 -0
  17. package/dist/src/manager/scan.js +111 -0
  18. package/dist/src/manager/scan.js.map +1 -0
  19. package/dist/src/manager/server.js +85 -0
  20. package/dist/src/manager/server.js.map +1 -0
  21. package/dist/src/manager/types.js +2 -0
  22. package/dist/src/manager/types.js.map +1 -0
  23. package/dist/src/routes/quota.js +134 -3
  24. package/dist/src/routes/quota.js.map +1 -1
  25. package/dist/src/routes/settings.js +5 -4
  26. package/dist/src/routes/settings.js.map +1 -1
  27. package/package.json +6 -1
  28. package/public/css/chat.css +27 -0
  29. package/public/css/diagram.css +48 -2
  30. package/public/dist/assets/api-Cl2oljO1.js +1 -0
  31. package/public/dist/assets/{index-wUWc2M5K.js → app-58Z9R8qM.js} +4 -4
  32. package/public/dist/assets/app-DWH_NZRE.css +1 -0
  33. package/public/dist/assets/architecture-YZFGNWBL-D4g_rKok.js +1 -0
  34. package/public/dist/assets/architectureDiagram-Q4EWVU46-DVbii_Pt.js +1 -0
  35. package/public/dist/assets/blockDiagram-DXYQGD6D-BStipezp.js +1 -0
  36. package/public/dist/assets/c4Diagram-AHTNJAMY-BYno4Snw.js +1 -0
  37. package/public/dist/assets/classDiagram-6PBFFD2Q-QzqRo_9X.js +1 -0
  38. package/public/dist/assets/classDiagram-v2-HSJHXN6E-CchGqJUH.js +1 -0
  39. package/public/dist/assets/{constants-BU8a_R5s.js → constants-fUXYKkoK.js} +1 -1
  40. package/public/dist/assets/cose-bilkent-S5V4N54A-TJS1iaqp.js +1 -0
  41. package/public/dist/assets/dagre-KV5264BT-C_DCJZ7t.js +1 -0
  42. package/public/dist/assets/diagram-5BDNPKRD-CKix1NRO.js +1 -0
  43. package/public/dist/assets/diagram-G4DWMVQ6-CoDTDNnx.js +1 -0
  44. package/public/dist/assets/diagram-MMDJMWI5-DYx0PwrY.js +1 -0
  45. package/public/dist/assets/diagram-TYMM5635-Bx1779dG.js +1 -0
  46. package/public/dist/assets/{employees-p53cgGmH.js → employees-CnA_uLbJ.js} +1 -1
  47. package/public/dist/assets/erDiagram-SMLLAGMA-C0INYE-d.js +1 -0
  48. package/public/dist/assets/flowDiagram-DWJPFMVM-DfQIgEdB.js +1 -0
  49. package/public/dist/assets/ganttDiagram-T4ZO3ILL-B8o_Hblo.js +1 -0
  50. package/public/dist/assets/gitGraph-7Q5UKJZL-DBMf1L33.js +1 -0
  51. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-B2nqnLHi.js +1 -0
  52. package/public/dist/assets/idb-cache-C5ilDI6r.js +1 -0
  53. package/public/dist/assets/info-OMHHGYJF-C3gtg5Od.js +1 -0
  54. package/public/dist/assets/infoDiagram-42DDH7IO-Brz9iwrL.js +1 -0
  55. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-C0YeQJh0.js +1 -0
  56. package/public/dist/assets/journeyDiagram-VCZTEJTY-BypDthzR.js +1 -0
  57. package/public/dist/assets/kanban-definition-6JOO6SKY-LkyDUgUP.js +1 -0
  58. package/public/dist/assets/katex-BL3z5Bli.js +1 -0
  59. package/public/dist/assets/manager-D4L7R_7R.css +1 -0
  60. package/public/dist/assets/manager-DtTAKPgY.js +9 -0
  61. package/public/dist/assets/memory-BN3grLR7.js +1 -0
  62. package/public/dist/assets/{memory-C2i7ZIvv.js → memory-RKpZbPTW.js} +1 -1
  63. package/public/dist/assets/mermaid.core-D6PDYVgC.js +1 -0
  64. package/public/dist/assets/mindmap-definition-QFDTVHPH-rV1Hipx-.js +1 -0
  65. package/public/dist/assets/packet-4T2RLAQJ-BuK6y2B7.js +1 -0
  66. package/public/dist/assets/pie-ZZUOXDRM-x8CPu972.js +1 -0
  67. package/public/dist/assets/pieDiagram-DEJITSTG-DpxKH4h4.js +1 -0
  68. package/public/dist/assets/quadrantDiagram-34T5L4WZ-BkRLuqoa.js +1 -0
  69. package/public/dist/assets/radar-PYXPWWZC-CsTAKlcV.js +1 -0
  70. package/public/dist/assets/render-D9bnLVR_.js +30 -0
  71. package/public/dist/assets/requirementDiagram-MS252O5E-BdqZlJ0O.js +1 -0
  72. package/public/dist/assets/sankeyDiagram-XADWPNL6-b3SwMAxC.js +1 -0
  73. package/public/dist/assets/sequenceDiagram-FGHM5R23-BmjI6n81.js +1 -0
  74. package/public/dist/assets/{settings-BUEiZgkm.js → settings-B8oUfDm4.js} +8 -8
  75. package/public/dist/assets/settings-DvGS6X_5.js +1 -0
  76. package/public/dist/assets/{skills-CSuSbBWa.js → skills-CHB_WsxF.js} +1 -1
  77. package/public/dist/assets/skills-WhnGcvvJ.js +1 -0
  78. package/public/dist/assets/{slash-commands-D-v0DlbY.js → slash-commands-CbsN2LqT.js} +1 -1
  79. package/public/dist/assets/slash-commands-DOh3zvJ7.js +1 -0
  80. package/public/dist/assets/stateDiagram-FHFEXIEX-DRsIDvF8.js +1 -0
  81. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-IJMg9fYC.js +1 -0
  82. package/public/dist/assets/timeline-definition-GMOUNBTQ-B-0E30rh.js +1 -0
  83. package/public/dist/assets/treeView-SZITEDCU-CRgtpI0K.js +1 -0
  84. package/public/dist/assets/treemap-W4RFUUIX-DB5B-smF.js +1 -0
  85. package/public/dist/assets/ui-Cg8zuDaT.js +131 -0
  86. package/public/dist/assets/ui-HckqJaBX.js +1 -0
  87. package/public/dist/assets/{vendor-mermaid-UktBx7L0.js → vendor-mermaid-DHVxHqbi.js} +6 -6
  88. package/public/dist/assets/{vendor-render-D2YP6GiF.js → vendor-render-BaFgDHeH.js} +1 -1
  89. package/public/dist/assets/vennDiagram-DHZGUBPP-BBd9TC4D.js +1 -0
  90. package/public/dist/assets/wardley-RL74JXVD-BzCH0WF9.js +1 -0
  91. package/public/dist/assets/wardleyDiagram-NUSXRM2D-DgenAPEz.js +1 -0
  92. package/public/dist/assets/ws-DSntry14.js +14 -0
  93. package/public/dist/assets/xychartDiagram-5P7HB3ND-BmvcJ6sg.js +1 -0
  94. package/public/dist/index.html +2 -2
  95. package/public/dist/manager/index.html +14 -0
  96. package/public/js/diagram/iframe-renderer.ts +196 -77
  97. package/public/js/features/process-block.ts +2 -2
  98. package/public/js/features/settings-cli-status.ts +20 -1
  99. package/public/js/features/settings-types.ts +1 -1
  100. package/public/js/render.ts +16 -3
  101. package/public/js/ui.ts +42 -0
  102. package/public/js/ws.ts +20 -4
  103. package/public/manager/index.html +13 -0
  104. package/public/manager/src/App.tsx +185 -0
  105. package/public/manager/src/InstancePreview.tsx +72 -0
  106. package/public/manager/src/api.ts +8 -0
  107. package/public/manager/src/main.tsx +9 -0
  108. package/public/manager/src/preview.ts +35 -0
  109. package/public/manager/src/styles.css +309 -0
  110. package/public/manager/src/types.ts +44 -0
  111. package/public/dist/assets/api-COrKYKcO.js +0 -1
  112. package/public/dist/assets/architecture-YZFGNWBL-B2Nc8YC_.js +0 -1
  113. package/public/dist/assets/architectureDiagram-Q4EWVU46-EML5rtmP.js +0 -1
  114. package/public/dist/assets/blockDiagram-DXYQGD6D-Ds9bBl-N.js +0 -1
  115. package/public/dist/assets/c4Diagram-AHTNJAMY-BVpUT3Om.js +0 -1
  116. package/public/dist/assets/classDiagram-6PBFFD2Q-DG8IYzhr.js +0 -1
  117. package/public/dist/assets/classDiagram-v2-HSJHXN6E-B5j0d5gs.js +0 -1
  118. package/public/dist/assets/cose-bilkent-S5V4N54A-kNrexiHE.js +0 -1
  119. package/public/dist/assets/dagre-KV5264BT-Ylb1W0yQ.js +0 -1
  120. package/public/dist/assets/diagram-5BDNPKRD-CPxqMVrp.js +0 -1
  121. package/public/dist/assets/diagram-G4DWMVQ6-Dm1xfj8I.js +0 -1
  122. package/public/dist/assets/diagram-MMDJMWI5-VsjfxFEK.js +0 -1
  123. package/public/dist/assets/diagram-TYMM5635-CrMZri_r.js +0 -1
  124. package/public/dist/assets/erDiagram-SMLLAGMA-Felxus25.js +0 -1
  125. package/public/dist/assets/flowDiagram-DWJPFMVM-kQrkSkw2.js +0 -1
  126. package/public/dist/assets/ganttDiagram-T4ZO3ILL-CulD-LkD.js +0 -1
  127. package/public/dist/assets/gitGraph-7Q5UKJZL-DbbbZYM5.js +0 -1
  128. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-oTUYJsKL.js +0 -1
  129. package/public/dist/assets/idb-cache-C7z4qE00.js +0 -1
  130. package/public/dist/assets/index-CLKLbGzn.css +0 -1
  131. package/public/dist/assets/info-OMHHGYJF-auV0JwD8.js +0 -1
  132. package/public/dist/assets/infoDiagram-42DDH7IO-B2XOJXrL.js +0 -1
  133. package/public/dist/assets/ishikawaDiagram-UXIWVN3A-CsmszxH_.js +0 -1
  134. package/public/dist/assets/journeyDiagram-VCZTEJTY-MmzEBROj.js +0 -1
  135. package/public/dist/assets/kanban-definition-6JOO6SKY-DcbxzAKu.js +0 -1
  136. package/public/dist/assets/katex-Bh3QhMKY.js +0 -1
  137. package/public/dist/assets/memory-6zLEr-qI.js +0 -1
  138. package/public/dist/assets/mermaid.core-CoRN09Dx.js +0 -1
  139. package/public/dist/assets/mindmap-definition-QFDTVHPH-CMqZWcUf.js +0 -1
  140. package/public/dist/assets/packet-4T2RLAQJ-C_PFKo5G.js +0 -1
  141. package/public/dist/assets/pie-ZZUOXDRM-CcqLxwbG.js +0 -1
  142. package/public/dist/assets/pieDiagram-DEJITSTG-C9r3BQ9f.js +0 -1
  143. package/public/dist/assets/quadrantDiagram-34T5L4WZ-Du4pEL4T.js +0 -1
  144. package/public/dist/assets/radar-PYXPWWZC-BWOF5omS.js +0 -1
  145. package/public/dist/assets/render-CulTuvJs.js +0 -30
  146. package/public/dist/assets/requirementDiagram-MS252O5E-Dyz9eEFP.js +0 -1
  147. package/public/dist/assets/sankeyDiagram-XADWPNL6-DLgUCKs2.js +0 -1
  148. package/public/dist/assets/sequenceDiagram-FGHM5R23-c0nA9K_Q.js +0 -1
  149. package/public/dist/assets/settings-BhrOslae.js +0 -1
  150. package/public/dist/assets/skills-CgwxEvFx.js +0 -1
  151. package/public/dist/assets/slash-commands-Bo8jvBfI.js +0 -1
  152. package/public/dist/assets/stateDiagram-FHFEXIEX-D2aVOdby.js +0 -1
  153. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DuwdzBLR.js +0 -1
  154. package/public/dist/assets/timeline-definition-GMOUNBTQ-PuaZYI31.js +0 -1
  155. package/public/dist/assets/treeView-SZITEDCU-D8mODguI.js +0 -1
  156. package/public/dist/assets/treemap-W4RFUUIX-DqqBuiM1.js +0 -1
  157. package/public/dist/assets/ui-4JiRyxJy.js +0 -131
  158. package/public/dist/assets/ui-Dx0MwI23.js +0 -1
  159. package/public/dist/assets/vennDiagram-DHZGUBPP-4blQ8E1z.js +0 -1
  160. package/public/dist/assets/wardley-RL74JXVD-Dn1IRCw2.js +0 -1
  161. package/public/dist/assets/wardleyDiagram-NUSXRM2D-OUBAKNJu.js +0 -1
  162. package/public/dist/assets/ws-DKtFfZsY.js +0 -14
  163. package/public/dist/assets/xychartDiagram-5P7HB3ND-CyZD7ovz.js +0 -1
  164. /package/public/dist/assets/{api-DygAf_G_.js → api-CnBOYa3F.js} +0 -0
  165. /package/public/dist/assets/{idb-cache-DbK81tgv.js → idb-cache-CjnC_K0x.js} +0 -0
  166. /package/public/dist/assets/{locale-CxI5nTcf.js → locale-heAuYK-3.js} +0 -0
  167. /package/public/dist/assets/{rolldown-runtime-FhOqtrmT.js → rolldown-runtime-DE9SaGGd.js} +0 -0
  168. /package/public/dist/assets/{state-O6NVkWcL.js → state-CPF7TImo.js} +0 -0
  169. /package/public/dist/assets/{vendor-icons-Bs4t7RP2.js → vendor-icons-D2l6ddC0.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{o as e,t}from"./rolldown-runtime-FhOqtrmT.js";function n(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var r=n();function i(e){r=e}var a={exec:()=>null};function o(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(c.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var s=(()=>{try{return!0}catch{return!1}})(),c={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,`i`),blockquoteBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}>`)},l=/^(?:[ \t]*(?:\n|$))+/,u=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,d=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,f=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,p=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,m=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,h=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,g=o(h).replace(/bull/g,m).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),_=o(h).replace(/bull/g,m).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),v=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,y=/^[^\n]+/,b=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,x=o(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,b).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),S=o(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,m).getRegex(),C=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,w=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,ee=o(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,w).replace(`tag`,C).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),T=o(v).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex(),te={blockquote:o(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,T).getRegex(),code:u,def:x,fences:d,heading:p,hr:f,html:ee,lheading:g,list:S,newline:l,paragraph:T,table:a,text:y},ne=o(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex(),re={...te,lheading:_,table:ne,paragraph:o(v).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,ne).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex()},E={...te,html:o(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,w).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:a,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:o(v).replace(`hr`,f).replace(`heading`,` *#{1,6} *[^
1
+ import{o as e,t}from"./rolldown-runtime-DE9SaGGd.js";function n(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var r=n();function i(e){r=e}var a={exec:()=>null};function o(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(c.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var s=(()=>{try{return!0}catch{return!1}})(),c={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,`i`),blockquoteBeginRegex:e=>RegExp(`^ {0,${Math.min(3,e-1)}}>`)},l=/^(?:[ \t]*(?:\n|$))+/,u=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,d=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,f=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,p=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,m=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,h=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,g=o(h).replace(/bull/g,m).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),_=o(h).replace(/bull/g,m).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),v=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,y=/^[^\n]+/,b=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,x=o(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,b).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),S=o(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,m).getRegex(),C=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,w=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,ee=o(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,w).replace(`tag`,C).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),T=o(v).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex(),te={blockquote:o(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,T).getRegex(),code:u,def:x,fences:d,heading:p,hr:f,html:ee,lheading:g,list:S,newline:l,paragraph:T,table:a,text:y},ne=o(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex(),re={...te,lheading:_,table:ne,paragraph:o(v).replace(`hr`,f).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,ne).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,C).getRegex()},E={...te,html:o(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,w).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:a,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:o(v).replace(`hr`,f).replace(`heading`,` *#{1,6} *[^
2
2
  ]`).replace(`lheading`,g).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},ie=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,D=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ae=/^( {2,}|\\)\n(?!\s*$)/,O=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,oe=/[\p{P}\p{S}]/u,k=/[\s\p{P}\p{S}]/u,se=/[^\s\p{P}\p{S}]/u,ce=o(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,k).getRegex(),le=/(?!~)[\p{P}\p{S}]/u,ue=/(?!~)[\s\p{P}\p{S}]/u,de=/(?:[^\s\p{P}\p{S}]|~)/u,fe=o(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,s?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),pe=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,me=o(pe,`u`).replace(/punct/g,oe).getRegex(),he=o(pe,`u`).replace(/punct/g,le).getRegex(),ge=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,_e=o(ge,`gu`).replace(/notPunctSpace/g,se).replace(/punctSpace/g,k).replace(/punct/g,oe).getRegex(),ve=o(ge,`gu`).replace(/notPunctSpace/g,de).replace(/punctSpace/g,ue).replace(/punct/g,le).getRegex(),ye=o(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,se).replace(/punctSpace/g,k).replace(/punct/g,oe).getRegex(),be=o(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,oe).getRegex(),xe=o(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,se).replace(/punctSpace/g,k).replace(/punct/g,oe).getRegex(),Se=o(/\\(punct)/,`gu`).replace(/punct/g,oe).getRegex(),Ce=o(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),we=o(w).replace(`(?:-->|$)`,`-->`).getRegex(),Te=o(`^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,we).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Ee=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,De=o(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,Ee).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Oe=o(/^!?\[(label)\]\[(ref)\]/).replace(`label`,Ee).replace(`ref`,b).getRegex(),ke=o(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,b).getRegex(),Ae=o(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,Oe).replace(`nolink`,ke).getRegex(),je=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Me={_backpedal:a,anyPunctuation:Se,autolink:Ce,blockSkip:fe,br:ae,code:D,del:a,delLDelim:a,delRDelim:a,emStrongLDelim:me,emStrongRDelimAst:_e,emStrongRDelimUnd:ye,escape:ie,link:De,nolink:ke,punctuation:ce,reflink:Oe,reflinkSearch:Ae,tag:Te,text:O,url:a},Ne={...Me,link:o(/^!?\[(label)\]\((.*?)\)/).replace(`label`,Ee).getRegex(),reflink:o(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,Ee).getRegex()},Pe={...Me,emStrongRDelimAst:ve,emStrongLDelim:he,delLDelim:be,delRDelim:xe,url:o(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`protocol`,je).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:o(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace(`protocol`,je).getRegex()},Fe={...Pe,br:o(ae).replace(`{2,}`,`*`).getRegex(),text:o(Pe.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},Ie={normal:te,gfm:re,pedantic:E},Le={normal:Me,gfm:Pe,breaks:Fe,pedantic:Ne},Re={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},ze=e=>Re[e];function Be(e,t){if(t){if(c.escapeTest.test(e))return e.replace(c.escapeReplace,ze)}else if(c.escapeTestNoEncode.test(e))return e.replace(c.escapeReplaceNoEncode,ze);return e}function Ve(e){try{e=encodeURI(e).replace(c.percentDecode,`%`)}catch{return null}return e}function He(e,t){let n=e.replace(c.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(c.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``);for(;r<n.length;r++)n[r]=n[r].trim().replace(c.slashPipe,`|`);return n}function Ue(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function We(e){let t=e.split(`
3
3
  `),n=t.length-1;for(;n>=0&&!t[n].trim();)n--;return t.length-n<=2?e:t.slice(0,n+1).join(`
4
4
  `)}function Ge(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r<e.length;r++)if(e[r]===`\\`)r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return n>0?-2:-1}function Ke(e,t=0){let n=t,r=``;for(let t of e)if(t===` `){let e=4-n%4;r+=` `.repeat(e),n+=e}else r+=t,n++;return r}function qe(e,t,n,r,i){let a=t.href,o=t.title||null,s=e[1].replace(i.other.outputLinkReplace,`$1`);r.state.inLink=!0;let c={type:e[0].charAt(0)===`!`?`image`:`link`,raw:n,href:a,title:o,text:s,tokens:r.inlineTokens(s)};return r.state.inLink=!1,c}function Je(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(r===null)return t;let i=r[1];return t.split(`
@@ -0,0 +1 @@
1
+ import{i as e}from"./vendor-mermaid-DHVxHqbi.js";export{e as diagram};
@@ -0,0 +1 @@
1
+ import{P as e}from"./vendor-mermaid-DHVxHqbi.js";export{e as createWardleyServices};
@@ -0,0 +1 @@
1
+ import{r as e}from"./vendor-mermaid-DHVxHqbi.js";export{e as diagram};
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./state-CPF7TImo.js";import{r as t}from"./api-CnBOYa3F.js";import{Z as n}from"./vendor-mermaid-DHVxHqbi.js";import{_ as r,l as i,m as a,n as o,t as s}from"./render-D9bnLVR_.js";import{S as c,_ as ee,a as te,b as l,g as u,i as ne,m as re,n as d,o as f,r as ie,t as ae,u as p,v as oe}from"./ui-Cg8zuDaT.js";var se=3e3,m=new Map,h=[],g=(e,t)=>`${e}:${t}`;function _(e=[]){let t=document.getElementById(`pendingQueue`);if(t){if(h=e.slice(),!e.length){x(new Set),t.classList.remove(`visible`),t.innerHTML=``;return}t.classList.add(`visible`),t.innerHTML=`
3
+ <div class="pending-queue-header">
4
+ <span class="pending-queue-title">${i.hourglass} <span data-i18n="queue.pendingTitle">${o(r(`queue.pendingTitle`))}</span> <span class="pending-queue-count">${e.length}</span></span>
5
+ </div>
6
+ <div class="pending-queue-list">
7
+ ${e.map(v).join(``)}
8
+ </div>
9
+ `,x(new Set(e.map(e=>e.id))),le()}}function v(e){let t=(e.prompt||``).replace(/\s+/g,` `).trim(),n=t.length>140?t.slice(0,140)+`…`:t,a=e.source?`<span class="pending-row-source">${o(e.source)}</span>`:``,s=o(r(`queue.steer`)),c=o(r(`queue.delete`));return`<div class="pending-row" data-pending-id="${o(e.id)}" title="${o(t)}">
10
+ <span class="pending-row-text">${o(n)}</span>
11
+ ${a}
12
+ <button class="pending-row-btn pending-row-steer" data-pending-action="steer" data-i18n-title="queue.steer" title="${s}" aria-label="${s}"><span class="pending-arm-fill" aria-hidden="true"></span><span class="pending-btn-content"><span class="pending-steer-arrow" aria-hidden="true">↳</span><span class="pending-steer-label">${s}</span></span></button>
13
+ <button class="pending-row-btn pending-row-delete" data-pending-action="delete" data-i18n-title="queue.delete" title="${c}" aria-label="${c}"><span class="pending-arm-fill" aria-hidden="true"></span><span class="pending-btn-content">${i.trash}</span></button>
14
+ </div>`}function y(e,t){let n=document.querySelector(`.pending-row[data-pending-id="${CSS.escape(e)}"]`);return n?n.querySelector(`[data-pending-action="${t}"]`):null}function ce(e,t){let n=y(e,t);if(!n)return;n.classList.add(`armed`),n.setAttribute(`title`,r(`queue.cancelArm`));let i=n.querySelector(`.pending-arm-fill`);i&&(i.style.animation=`none`,i.offsetWidth,i.style.animation=``)}function b(e,t){let n=y(e,t);n&&(n.classList.remove(`armed`),n.setAttribute(`title`,r(t===`steer`?`queue.steer`:`queue.delete`)))}function le(){for(let e of m.values()){let t=y(e.id,e.action);t&&(t.classList.add(`armed`),t.setAttribute(`title`,r(`queue.cancelArm`)))}}function x(e){for(let[t,n]of m)e.has(n.id)||(clearTimeout(n.timerId),m.delete(t))}function ue(e,t){let n=g(e,t),r=setTimeout(()=>fe(e,t),se);m.set(n,{id:e,action:t,timerId:r}),ce(e,t)}function de(e,t){let n=g(e,t),r=m.get(n);r&&(clearTimeout(r.timerId),m.delete(n),b(e,t))}async function fe(e,n){if(m.delete(g(e,n)),await t(n===`steer`?`/api/orchestrate/queue/${encodeURIComponent(e)}/steer`:`/api/orchestrate/queue/${encodeURIComponent(e)}`,n===`steer`?`POST`:`DELETE`,{})==null){b(e,n);return}h=h.filter(t=>t.id!==e),_(h)}function pe(e,t){if(m.has(g(e,t))){de(e,t);return}ue(e,t)}function S(){let e=document.getElementById(`pendingQueue`);e&&e.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-pending-action]`);if(!t)return;let n=t.closest(`.pending-row`)?.dataset.pendingId;n&&pe(n,t.dataset.pendingAction===`steer`?`steer`:`delete`)})}var me=800,C=64,w=`CLI-JAW`,T=!1,E=0,D=w,O=null,k=``,A=!1,j=0;function M(){return navigator}function he(){return document.visibilityState!==`visible`||!document.hasFocus()}function N(e){return e-j<me}function P(){if(O)return O;let e=document.querySelector(`link[rel~="icon"]`);if(e)return O=e,k=e.href||e.getAttribute(`href`)||``,e;let t=document.createElement(`link`);return t.rel=`icon`,document.head.appendChild(t),O=t,A=!0,t}function F(e){let t=document.createElement(`canvas`);t.width=C,t.height=C;let n=t.getContext(`2d`);return n?(n.clearRect(0,0,C,C),n.font=`44px "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,n.textAlign=`center`,n.textBaseline=`middle`,n.fillText(`🦈`,28,36),n.beginPath(),n.arc(50,15,e>1?12:9,0,Math.PI*2),n.fillStyle=`#ff335f`,n.fill(),n.lineWidth=4,n.strokeStyle=`#ffffff`,n.stroke(),e>1&&(n.fillStyle=`#ffffff`,n.font=`bold 15px sans-serif`,n.textAlign=`center`,n.textBaseline=`middle`,n.fillText(String(Math.min(e,9)),50,16)),t.toDataURL(`image/png`)):k}async function I(e){let t=M();if(typeof t.setAppBadge==`function`)try{await t.setAppBadge(e)}catch{}}async function L(){let e=M();if(typeof e.clearAppBadge==`function`)try{await e.clearAppBadge()}catch{}}function ge(){document.title=`(${E}) ${D}`;let e=P();e&&(e.href=F(E)),I(E)}function _e(){document.title=D}function ve(){if(O){if(A){O.remove(),O=null,A=!1;return}O.href=k}}function ye(){T||(T=!0,D=document.title||w,P(),document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`&&z()}),window.addEventListener(`focus`,()=>z()))}function R(){if(!T||!he())return;let e=Date.now();N(e)||(j=e,E+=1,ge())}function z(){!T||E===0||(E=0,j=0,_e(),ve(),L())}function be(e,t){return!e||!t?!0:e===`all`||e===t}var B=[`P`,`A`,`B`,`C`],V=null;function H(e,t,n){let r=B.indexOf(n);if(r<0)return;let i=e.getBoundingClientRect(),a=t.offsetWidth||36,o=document.getElementById(`dot-${n}`);if(!o)return;let s=B[r+1],c=s?document.getElementById(`dot-${s}`):null;if(c){let e=o.getBoundingClientRect(),n=c.getBoundingClientRect(),r=(e.right+n.left)/2;t.style.left=r-i.left-a/2+`px`}else{let e=o.getBoundingClientRect();t.style.left=e.left-i.left+e.width/2-a/2+`px`}}var U={},W=``,G=0,K=null,q=0,J=!1,xe=750;async function Y(e={}){let t=await(await fetch(`/api/orchestrate/snapshot`)).json();W=String(t.orc.scope||``),Q(t.orc.state),Ce(t.workers),l(t.runtime.queuePending),ne(t.queued||[]),_(t.queued||[]),e.hydrateRun&&p(t.activeRun),u(t.runtime.busy?`running`:`idle`),n(()=>import(`./employees-CnA_uLbJ.js`).then(e=>{typeof e.renderEmployees==`function`&&e.renderEmployees()}),__vite__mapDeps([0]))}function X(e=`manual`,t={}){let n=Date.now();return t.hydrateRun?Y(t):K||(n-q<xe?Promise.resolve():(q=n,K=Y(t).catch(t=>{throw console.warn(`[ws] orchestrate snapshot sync failed (${e})`,t),t}).finally(()=>{K=null}),K))}function Z(e){ee(e),X(e).finally(()=>{re(e)}).catch(()=>{})}function Se(){J||(J=!0,window.addEventListener(`focus`,()=>{Z(`focus`)}),window.addEventListener(`pageshow`,()=>{Z(`pageshow`)}),document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`&&Z(`visibilitychange`)}),document.addEventListener(`resume`,()=>{Z(`resume`)}),`wasDiscarded`in document&&document.wasDiscarded&&Z(`discard`))}function Ce(e){for(let e of Object.keys(U))delete U[e];for(let t of e)t.state===`running`&&t.phase&&(U[t.agentId]={phase:t.phase,phaseLabel:t.phaseLabel||``})}function Q(t,n){let r=new Set([`IDLE`,`P`,`A`,`B`,`C`,`D`]).has(t)?t:`IDLE`;if(e.orcState=r,r===`IDLE`||r===`D`)document.body.removeAttribute(`data-orc-state`),document.body.style.removeProperty(`--orc-glow`);else{document.body.setAttribute(`data-orc-state`,r);let e=`--orc-glow-${r}`,t=getComputedStyle(document.documentElement).getPropertyValue(e).trim();document.body.style.setProperty(`--orc-glow`,t)}document.body.classList.add(`orc-pulse`),setTimeout(()=>document.body.classList.remove(`orc-pulse`),700);let i=document.getElementById(`orcStateBadge`);i&&(i.textContent={IDLE:``,P:`PLAN`,A:`AUDIT`,B:`BUILD`,C:`CHECK`,D:`DONE`}[r],i.style.display=r===`IDLE`?`none`:`inline-block`);let a=document.getElementById(`pabcRoadmap`),o=document.getElementById(`sharkRunner`),s=document.getElementById(`pabcBrand`);if(a&&o){if(!a.dataset.resizeObserved){a.dataset.resizeObserved=`1`,new ResizeObserver(()=>{V&&o.classList.contains(`running`)&&H(a,o,V)}).observe(a);let e=0;window.addEventListener(`resize`,()=>{cancelAnimationFrame(e),e=requestAnimationFrame(()=>{V&&o.classList.contains(`running`)&&H(a,o,V)})})}if(r===`IDLE`)a.classList.remove(`visible`,`shimmer-out`),o.classList.remove(`running`),V=null;else if(r===`D`){B.forEach(e=>{let t=document.getElementById(`dot-${e}`);t&&(t.className=`pabc-dot done`,t.setAttribute(`data-phase`,e))});for(let e=0;e<4;e++){let t=document.getElementById(`pabc-conn-${e}`);t&&(t.className=`pabc-connector done`)}o.classList.remove(`running`),V=null,a.classList.add(`shimmer-out`),setTimeout(()=>a.classList.remove(`visible`,`shimmer-out`),1e3)}else{a.classList.remove(`shimmer-out`),a.classList.add(`visible`),o.classList.add(`running`);let e=B.indexOf(r);B.forEach((t,n)=>{let r=document.getElementById(`dot-${t}`);r&&(r.className=`pabc-dot ${n<e?`done`:n===e?`active`:`future`}`,r.setAttribute(`data-phase`,t))});for(let t=0;t<4;t++){let n=document.getElementById(`pabc-conn-${t}`);n&&(n.className=`pabc-connector ${t<e?`done`:``}`)}V=r,requestAnimationFrame(()=>H(a,o,r))}s&&n&&(s.textContent=n)}}function $(){Se();let t=`ws://${location.host}`;e.ws=new WebSocket(`${t}?lang=${a()}`),e.ws.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[ws] malformed message:`,e.data);return}if(!t||typeof t!=`object`||typeof t.type!=`string`){console.warn(`[ws] invalid message shape:`,t);return}if(t.type===`agent_status`)t.running===void 0?u(t.status||`idle`):u(t.running?`running`:`idle`),t.agentId&&t.phase&&(U[t.agentId]={phase:t.phase,phaseLabel:t.phaseLabel||``},n(()=>import(`./employees-CnA_uLbJ.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])));else if(t.type===`queue_update`)l(t.pending||0),X(`queue_update`).catch(()=>{});else if(t.type===`worklog_created`)d(`${i.clipboard} Worklog: ${o(t.path||``)}`);else if(t.type===`round_start`){let e=t.agentPhases||t.subtasks||[],n=e.map(e=>o(e.agent||e.name||``)).join(`, `);d(r(`ws.roundStart`,{round:t.round||0,count:e.length,names:n}))}else if(t.type===`round_done`)t.action===`complete`?d(r(`ws.roundDone`,{round:t.round||0})):t.action===`next`?d(r(`ws.roundNext`,{round:t.round||0})):d(r(`ws.roundRetry`,{round:t.round||0}));else if(t.type===`agent_tool`){let e=t.isEmployee?`(E) `:``,n=t.toolType===`thinking`?`thinking`:t.toolType===`search`?`search`:t.toolType===`subagent`?`subagent`:`tool`;oe({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,type:n,icon:t.icon||i.tool,rawIcon:t.rawIcon||t.icon||``,label:e+(t.label||``),detail:t.detail||``,stepRef:t.stepRef||``,status:t.status||`running`,startTime:Date.now()})}else if(t.type===`agent_output`)ie(t.text||``);else if(t.type===`agent_retry`)d(r(`ws.retry`,{cli:o(t.cli||``),delay:t.delay||10}),`tool-activity`);else if(t.type===`agent_fallback`)d(r(`ws.fallback`,{from:o(t.from||``),to:o(t.to||``)}),`tool-activity`);else if(t.type===`agent_smoke`)d(`${i.warning} ${o(t.cli||`agent`)}: smoke response detected — auto-continuing`,`tool-activity`);else if(t.type===`agent_done`)f(t.text||``,t.toolLog),R();else if(t.type===`orchestrate_done`)f(t.text||``),R();else if(t.type===`clear`){s(),te(),c().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``),n(()=>import(`./idb-cache-C5ilDI6r.js`).then(e=>e.clearCache()),[]).catch(()=>{})}else if(t.type===`session_reset`)d(`${i.refresh} Session reset — history preserved`,`tool-activity`);else if(t.type===`agent_added`||t.type===`agent_updated`||t.type===`agent_deleted`)n(()=>import(`./employees-CnA_uLbJ.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0]));else if(t.type===`orc_state`){if(!be(t.scope,W))return;Q(typeof t.state==`string`?t.state:`IDLE`,t.title)}else t.type===`memory_status`?n(()=>import(`./memory-BN3grLR7.js`).then(e=>e.refreshMemorySidebar()),__vite__mapDeps([0])):t.type===`new_message`&&(t.source===`telegram`||t.source===`discord`||t.fromQueue===!0)&&ae(t.role===`assistant`?`agent`:t.role||`user`,t.content||``,t.cli)},e.ws.onopen=()=>{console.log(`[ws] connected`);let e=Date.now()-G<1e4;n(()=>import(`./ui-HckqJaBX.js`).then(async t=>{if(t.cleanupToolActivity(),!e)try{await t.loadMessages(),G=Date.now()}catch(e){console.error(`[ws] loadMessages failed`,e)}X(`reconnect`,{hydrateRun:!0}).catch(()=>{}).finally(()=>t.reconcileChatBottomAfterRestore(`reconnect`))}),__vite__mapDeps([0]))},e.ws.onclose=()=>{console.log(`[ws] disconnected, reconnecting in 2s...`),n(()=>import(`./ui-HckqJaBX.js`).then(e=>e.cleanupToolActivity()),__vite__mapDeps([0])),u(`idle`),d(`${i.exec} 연결 끊김 — 재연결 중...`,`tool-activity`),setTimeout($,2e3)}}function we(e){return U[e]||null}export{ye as a,z as i,we as n,S as o,X as r,$ as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./vendor-mermaid-DHVxHqbi.js";export{e as diagram};
@@ -25,9 +25,9 @@
25
25
  href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
26
26
  rel="stylesheet">
27
27
  <!-- Vite handles module bundling in dev (HMR) and production (build) -->
28
- <script type="module" crossorigin src="/dist/assets/index-wUWc2M5K.js"></script>
28
+ <script type="module" crossorigin src="/dist/assets/app-58Z9R8qM.js"></script>
29
29
  <link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
30
- <link rel="stylesheet" crossorigin href="/dist/assets/index-CLKLbGzn.css">
30
+ <link rel="stylesheet" crossorigin href="/dist/assets/app-DWH_NZRE.css">
31
31
  </head>
32
32
 
33
33
  <body>
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="ko">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Jaw Manager</title>
7
+ <script type="module" crossorigin src="/dist/assets/manager-DtTAKPgY.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/dist/assets/manager-D4L7R_7R.css">
9
+ </head>
10
+ <body>
11
+ <div id="manager-root"></div>
12
+ </body>
13
+ </html>
14
+
@@ -26,6 +26,26 @@ function createDiagramSaveBtn(): HTMLButtonElement {
26
26
  return btn;
27
27
  }
28
28
 
29
+ function createDiagramZoomBtn(): HTMLButtonElement {
30
+ const btn = document.createElement('button');
31
+ btn.className = 'diagram-zoom-btn';
32
+ btn.type = 'button';
33
+ btn.ariaLabel = 'Expand diagram';
34
+ btn.title = 'Expand';
35
+ btn.textContent = '⤢';
36
+ return btn;
37
+ }
38
+
39
+ function createDiagramSizeToggleBtn(): HTMLButtonElement {
40
+ const btn = document.createElement('button');
41
+ btn.className = 'diagram-size-toggle-btn';
42
+ btn.type = 'button';
43
+ btn.ariaLabel = 'Expand diagram';
44
+ btn.title = 'Expand';
45
+ btn.textContent = '⤢';
46
+ return btn;
47
+ }
48
+
29
49
  // ── CDN Allowlist (Phase 5 libraries) ──
30
50
  const CDN_ALLOWLIST = [
31
51
  'cdnjs.cloudflare.com',
@@ -42,6 +62,80 @@ const registeredIframes = new Set<Window>();
42
62
  // ── Per-iframe nonces for navigation defense ──
43
63
  const iframeNonces = new Map<Window, string>();
44
64
 
65
+ const widgetLifecycleCleanups = new WeakMap<HTMLElement, () => void>();
66
+
67
+ function cleanupWidgetOwner(owner: HTMLElement): void {
68
+ const cleanup = widgetLifecycleCleanups.get(owner);
69
+ if (!cleanup) return;
70
+ cleanup();
71
+ widgetLifecycleCleanups.delete(owner);
72
+ }
73
+
74
+ function revokeIframeTrust(iframe: HTMLIFrameElement): void {
75
+ if (!iframe.contentWindow) return;
76
+ registeredIframes.delete(iframe.contentWindow);
77
+ iframeNonces.delete(iframe.contentWindow);
78
+ }
79
+
80
+ function attachWidgetIframeLifecycle(input: {
81
+ iframe: HTMLIFrameElement;
82
+ nonce: string;
83
+ owner: HTMLElement;
84
+ onTimeout?: () => void;
85
+ }): void {
86
+ cleanupWidgetOwner(input.owner);
87
+ let initialLoadFired = false;
88
+ let readyReceived = false;
89
+ const gen = Number(input.owner.dataset.gen || '0');
90
+ input.owner.dataset.gen = String(gen);
91
+
92
+ const requestResize = () => {
93
+ input.iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*');
94
+ setTimeout(() => input.iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 300);
95
+ setTimeout(() => input.iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 1000);
96
+ };
97
+
98
+ const onLoad = () => {
99
+ if (!initialLoadFired) {
100
+ initialLoadFired = true;
101
+ if (input.iframe.contentWindow) {
102
+ registeredIframes.add(input.iframe.contentWindow);
103
+ iframeNonces.set(input.iframe.contentWindow, input.nonce);
104
+ requestResize();
105
+ }
106
+ return;
107
+ }
108
+ revokeIframeTrust(input.iframe);
109
+ console.warn('[jaw-diagram] iframe navigated — postMessage channel revoked');
110
+ };
111
+
112
+ const readyHandler = (e: MessageEvent) => {
113
+ if (e.source !== input.iframe.contentWindow || e.data?.type !== 'jaw-widget-ready') return;
114
+ if (e.data.nonce !== input.nonce) return;
115
+ readyReceived = true;
116
+ window.removeEventListener('message', readyHandler);
117
+ };
118
+
119
+ const timeout = window.setTimeout(() => {
120
+ window.removeEventListener('message', readyHandler);
121
+ if (Number(input.owner.dataset.gen || '0') !== gen) return;
122
+ if (readyReceived || !input.owner.isConnected) return;
123
+ revokeIframeTrust(input.iframe);
124
+ input.onTimeout?.();
125
+ }, 10_000);
126
+
127
+ const cleanup = () => {
128
+ window.clearTimeout(timeout);
129
+ window.removeEventListener('message', readyHandler);
130
+ input.iframe.removeEventListener('load', onLoad);
131
+ revokeIframeTrust(input.iframe);
132
+ };
133
+
134
+ input.iframe.addEventListener('load', onLoad);
135
+ window.addEventListener('message', readyHandler);
136
+ widgetLifecycleCleanups.set(input.owner, cleanup);
137
+ }
138
+
45
139
  // ── Cleanup: MutationObserver removes stale iframe refs ──
46
140
  // Scoped to #chatMessages (not document.body) to avoid firing on every DOM mutation.
47
141
  let cleanupObserver: MutationObserver | null = null;
@@ -302,11 +396,7 @@ export function activateWidgets(container?: HTMLElement): void {
302
396
  if (!encoded) return;
303
397
  let htmlCode: string;
304
398
  try {
305
- // Cap widget payload at 512 KB to prevent memory/CPU abuse
306
- if (encoded.length > 524_288) {
307
- throw new Error('Widget payload too large');
308
- }
309
- htmlCode = decodeURIComponent(escape(atob(encoded)));
399
+ htmlCode = decodeWidgetHtml(encoded);
310
400
  } catch {
311
401
  el.replaceWith(Object.assign(document.createElement('div'), {
312
402
  className: 'diagram-error',
@@ -335,72 +425,117 @@ export function activateWidgets(container?: HTMLElement): void {
335
425
  // Preserve source for theme-change reload
336
426
  wrapper.dataset.widgetHtml = encoded;
337
427
 
428
+ wrapper.appendChild(createDiagramZoomBtn());
338
429
  wrapper.appendChild(createDiagramSaveBtn());
339
430
  wrapper.appendChild(createDiagramCopyBtn());
340
431
  const { iframe, nonce } = createWidgetIframe(htmlCode);
341
432
  wrapper.appendChild(iframe);
433
+ bindWidgetZoom(wrapper);
342
434
 
343
435
  el.replaceWith(wrapper);
344
436
 
345
- // Navigation defense: register ONLY on the first load event.
346
- // No pre-load registration — prevents race where widget JS reads
347
- // the nonce and self-navigates before the first load fires.
348
- let initialLoadFired = false;
349
- iframe.addEventListener('load', () => {
350
- if (!initialLoadFired) {
351
- initialLoadFired = true;
352
- if (iframe.contentWindow) {
353
- registeredIframes.add(iframe.contentWindow);
354
- iframeNonces.set(iframe.contentWindow, nonce);
355
- // Request initial resize now that channel is established
356
- iframe.contentWindow.postMessage({ type: 'jaw-request-resize' }, '*');
357
- // Deferred resize for slow CDN loads / async chart renders
358
- setTimeout(() => iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 300);
359
- setTimeout(() => iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 1000);
360
- }
361
- } else {
362
- // Navigation detected — revoke postMessage trust permanently
363
- if (iframe.contentWindow) {
364
- registeredIframes.delete(iframe.contentWindow);
365
- iframeNonces.delete(iframe.contentWindow);
366
- }
367
- console.warn('[jaw-diagram] iframe navigated — postMessage channel revoked');
368
- }
369
- });
370
-
371
- // Timeout: if no jaw-widget-ready within 10s, show error.
372
- // Uses a generation counter to detect iframe recreation (theme toggle).
373
- const gen = Number(wrapper.dataset.gen || '0');
374
- wrapper.dataset.gen = String(gen);
375
- let readyReceived = false;
376
- const readyHandler = (e: MessageEvent) => {
377
- if (e.source === iframe.contentWindow && e.data?.type === 'jaw-widget-ready'
378
- && e.data.nonce === nonce) {
379
- readyReceived = true;
380
- window.removeEventListener('message', readyHandler);
381
- }
382
- };
383
- window.addEventListener('message', readyHandler);
384
-
385
- setTimeout(() => {
386
- window.removeEventListener('message', readyHandler);
387
- // Skip if iframe was recreated (e.g. theme toggle)
388
- if (Number(wrapper.dataset.gen || '0') !== gen) return;
389
- if (!readyReceived && wrapper.isConnected) {
390
- const failedWin = iframe.contentWindow;
391
- if (failedWin) {
392
- registeredIframes.delete(failedWin);
393
- iframeNonces.delete(failedWin);
394
- }
437
+ attachWidgetIframeLifecycle({
438
+ iframe,
439
+ nonce,
440
+ owner: wrapper,
441
+ onTimeout: () => {
395
442
  wrapper.innerHTML = `<div class="diagram-error" role="alert">
396
443
  Widget failed to load within 10 seconds.
397
444
  </div>`;
398
445
  console.warn('[jaw-diagram] Widget timeout — iframe deregistered');
399
- }
400
- }, 10_000);
446
+ },
447
+ });
401
448
  });
402
449
  }
403
450
 
451
+ function bindWidgetZoom(container: HTMLElement): void {
452
+ const btn = container.querySelector('.diagram-zoom-btn') as HTMLButtonElement | null;
453
+ if (!btn || btn.dataset.bound) return;
454
+ btn.dataset.bound = '1';
455
+ btn.addEventListener('click', () => {
456
+ const encoded = container.dataset.widgetHtml;
457
+ if (!encoded) return;
458
+ openWidgetOverlay(encoded);
459
+ });
460
+ }
461
+
462
+ function decodeWidgetHtml(encoded: string): string {
463
+ if (encoded.length > 524_288) throw new Error('Widget payload too large');
464
+ return decodeURIComponent(escape(atob(encoded)));
465
+ }
466
+
467
+ function openWidgetOverlay(encoded: string): void {
468
+ const previousFocus = document.activeElement as HTMLElement | null;
469
+ let htmlCode: string;
470
+ try {
471
+ htmlCode = decodeWidgetHtml(encoded);
472
+ } catch {
473
+ htmlCode = '';
474
+ }
475
+
476
+ const overlay = document.createElement('div');
477
+ overlay.className = 'diagram-overlay diagram-widget-overlay';
478
+ overlay.setAttribute('role', 'dialog');
479
+ overlay.setAttribute('aria-modal', 'true');
480
+ overlay.setAttribute('aria-label', 'Expanded interactive diagram');
481
+
482
+ const content = document.createElement('div');
483
+ content.className = 'diagram-overlay-content';
484
+ const closeBtn = document.createElement('button');
485
+ closeBtn.className = 'diagram-overlay-close';
486
+ closeBtn.type = 'button';
487
+ closeBtn.ariaLabel = 'Close';
488
+ closeBtn.textContent = '✕';
489
+ overlay.append(content, closeBtn);
490
+
491
+ const close = () => {
492
+ cleanupWidgetOwner(content);
493
+ overlay.remove();
494
+ document.removeEventListener('keydown', onKey);
495
+ if (previousFocus?.isConnected) previousFocus.focus();
496
+ };
497
+ const onKey = (e: KeyboardEvent) => {
498
+ if (e.key === 'Escape') { close(); return; }
499
+ if (e.key !== 'Tab') return;
500
+ const focusable = overlay.querySelectorAll<HTMLElement>(
501
+ 'button, [href], iframe, [tabindex]:not([tabindex="-1"])');
502
+ if (!focusable.length) return;
503
+ const first = focusable[0];
504
+ const last = focusable[focusable.length - 1];
505
+ if (e.shiftKey && document.activeElement === first) {
506
+ e.preventDefault(); last.focus();
507
+ } else if (!e.shiftKey && document.activeElement === last) {
508
+ e.preventDefault(); first.focus();
509
+ }
510
+ };
511
+
512
+ const validation = htmlCode ? validateWidgetHtml(htmlCode) : { valid: false, reason: 'Failed to decode widget content', warnings: [] };
513
+ if (!validation.valid) {
514
+ content.innerHTML = `<div class="diagram-error" role="alert">Widget blocked: ${validation.reason}</div>`;
515
+ } else {
516
+ const widget = document.createElement('div');
517
+ widget.className = 'diagram-container diagram-widget diagram-widget-expanded';
518
+ widget.dataset.widgetHtml = encoded;
519
+ const sizeBtn = createDiagramSizeToggleBtn();
520
+ sizeBtn.addEventListener('click', () => {
521
+ const maximized = overlay.classList.toggle('maximized');
522
+ sizeBtn.textContent = maximized ? '⤡' : '⤢';
523
+ sizeBtn.title = maximized ? 'Shrink' : 'Expand';
524
+ sizeBtn.ariaLabel = maximized ? 'Shrink diagram' : 'Expand diagram';
525
+ });
526
+ widget.append(createDiagramSaveBtn(), createDiagramCopyBtn(), sizeBtn);
527
+ const { iframe, nonce } = createWidgetIframe(htmlCode);
528
+ widget.appendChild(iframe);
529
+ content.appendChild(widget);
530
+ attachWidgetIframeLifecycle({ iframe, nonce, owner: content });
531
+ }
532
+
533
+ closeBtn.addEventListener('click', close);
534
+ document.addEventListener('keydown', onKey);
535
+ document.body.appendChild(overlay);
536
+ closeBtn.focus();
537
+ }
538
+
404
539
  // ── Widget Reactivation Observer ──
405
540
  // Only watches direct children of #chatMessages (not subtree) to avoid
406
541
  // firing on every streaming innerHTML update inside message bubbles.
@@ -449,7 +584,7 @@ export function broadcastThemeToIframes(): void {
449
584
  if (!encoded) return;
450
585
  let htmlCode: string;
451
586
  try {
452
- htmlCode = decodeURIComponent(escape(atob(encoded)));
587
+ htmlCode = decodeWidgetHtml(encoded);
453
588
  } catch { return; }
454
589
 
455
590
  // Deregister old iframe
@@ -466,28 +601,12 @@ export function broadcastThemeToIframes(): void {
466
601
  // Recreate with fresh theme tokens
467
602
  const { iframe, nonce } = createWidgetIframe(htmlCode);
468
603
  container.innerHTML = '';
604
+ container.appendChild(createDiagramZoomBtn());
469
605
  container.appendChild(createDiagramSaveBtn());
470
606
  container.appendChild(createDiagramCopyBtn());
471
607
  container.appendChild(iframe);
472
-
473
- let initialLoadFired = false;
474
- iframe.addEventListener('load', () => {
475
- if (!initialLoadFired) {
476
- initialLoadFired = true;
477
- if (iframe.contentWindow) {
478
- registeredIframes.add(iframe.contentWindow);
479
- iframeNonces.set(iframe.contentWindow, nonce);
480
- iframe.contentWindow.postMessage({ type: 'jaw-request-resize' }, '*');
481
- setTimeout(() => iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 300);
482
- setTimeout(() => iframe.contentWindow?.postMessage({ type: 'jaw-request-resize' }, '*'), 1000);
483
- }
484
- } else {
485
- if (iframe.contentWindow) {
486
- registeredIframes.delete(iframe.contentWindow);
487
- iframeNonces.delete(iframe.contentWindow);
488
- }
489
- }
490
- });
608
+ bindWidgetZoom(container as HTMLElement);
609
+ attachWidgetIframeLifecycle({ iframe, nonce, owner: container as HTMLElement });
491
610
  });
492
611
  }
493
612
 
@@ -167,14 +167,14 @@ function updateSummary(pb: ProcessBlockState): void {
167
167
 
168
168
  export function createProcessBlock(parentEl: HTMLElement): ProcessBlockState {
169
169
  const host = document.createElement('div');
170
- host.innerHTML = blockShell('', false);
170
+ host.innerHTML = blockShell('', true);
171
171
  const el = host.firstElementChild as HTMLElement;
172
172
 
173
173
  const content = parentEl.querySelector('.msg-content');
174
174
  if (content) content.before(el);
175
175
  else parentEl.appendChild(el);
176
176
 
177
- return { element: el, steps: [], collapsed: false };
177
+ return { element: el, steps: [], collapsed: true };
178
178
  }
179
179
 
180
180
  export function addStep(pb: ProcessBlockState, step: ProcessStep): void {
@@ -7,6 +7,25 @@ import { ICONS } from '../icons.js';
7
7
  import { providerIcon } from '../provider-icons.js';
8
8
  import type { QuotaEntry } from './settings-types.js';
9
9
 
10
+ export function normalizeQuotaWindowLabel(cliName: string, label: string): string {
11
+ if (cliName === 'gemini') {
12
+ if (label === 'Pro' || label === 'P') return 'P';
13
+ if (label === 'Flash' || label === 'F') return 'F';
14
+ return label;
15
+ }
16
+
17
+ if (cliName === 'copilot') {
18
+ if (label === 'Premium' || label === 'Prem') return '30d';
19
+ if (label.includes('plus monthly subscriber quota')) return '30d';
20
+ }
21
+
22
+ return label
23
+ .replace('-hour', 'h')
24
+ .replace('-day', 'd')
25
+ .replace(' Sonnet', '')
26
+ .replace(' Opus', '');
27
+ }
28
+
10
29
  export async function loadCliStatus(force = false): Promise<void> {
11
30
  const interval = Number(localStorage.getItem('cliStatusInterval') || 300);
12
31
  if (!force && state.cliStatusCache && interval > 0 && (Date.now() - state.cliStatusTs) < interval * 1000) {
@@ -91,7 +110,7 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
91
110
  windowsHtml = q.windows.map(w => {
92
111
  const pct = Math.round(w.percent);
93
112
  const barColor = pct > 80 ? '#ef4444' : pct > 50 ? '#fbbf24' : '#38bdf8';
94
- const shortLabel = w.label.replace('-hour', 'h').replace('-day', 'd').replace(' Sonnet', '').replace(' Opus', '').replace('plus monthly subscriber quota', 'plus').replace('Premium', 'Prem');
113
+ const shortLabel = normalizeQuotaWindowLabel(name, w.label);
95
114
  let resetStr = '';
96
115
  if (w.resetsAt) {
97
116
  const d = new Date(typeof w.resetsAt === 'number' ? w.resetsAt * 1000 : w.resetsAt);
@@ -3,7 +3,7 @@
3
3
  export interface PerCliConfig { model?: string; effort?: string; fastMode?: boolean; contextWindow?: boolean; contextWindowSize?: number; contextCompactLimit?: number; }
4
4
  export interface TelegramConfig { enabled?: boolean; token?: string; allowedChatIds?: number[]; forwardAll?: boolean; mentionOnly?: boolean; }
5
5
  export interface DiscordConfig { enabled?: boolean; token?: string; guildId?: string; channelIds?: string[]; forwardAll?: boolean; allowBots?: boolean; mentionOnly?: boolean; }
6
- export interface QuotaWindow { label: string; percent: number; resetsAt?: string | number | null; }
6
+ export interface QuotaWindow { label: string; percent: number; resetsAt?: string | number | null; modelId?: string; }
7
7
  export interface QuotaEntry {
8
8
  account?: { email?: string; type?: string; plan?: string; tier?: string };
9
9
  windows?: QuotaWindow[];
@@ -336,6 +336,7 @@ export async function rerenderMermaidDiagrams(): Promise<void> {
336
336
  const { svg } = await mm.render(id, code);
337
337
  el.innerHTML = sanitizeMermaidSvg(svg);
338
338
  appendMermaidActionBtns(el as HTMLElement);
339
+ bindDiagramZoom(el as HTMLElement);
339
340
  } catch { /* keep existing render on failure */ }
340
341
  }
341
342
  }
@@ -358,9 +359,18 @@ function ensureMermaidObserver(): void {
358
359
 
359
360
  function appendMermaidActionBtns(el: HTMLElement): void {
360
361
  // Remove existing buttons if present (e.g. re-render)
362
+ el.querySelector('.mermaid-zoom-btn')?.remove();
361
363
  el.querySelector('.mermaid-copy-btn')?.remove();
362
364
  el.querySelector('.mermaid-save-btn')?.remove();
363
365
 
366
+ const zoomBtn = document.createElement('button');
367
+ zoomBtn.className = 'mermaid-zoom-btn';
368
+ zoomBtn.type = 'button';
369
+ zoomBtn.ariaLabel = 'Expand diagram';
370
+ zoomBtn.title = 'Expand';
371
+ zoomBtn.textContent = '⤢';
372
+ el.appendChild(zoomBtn);
373
+
364
374
  const saveBtn = document.createElement('button');
365
375
  saveBtn.className = 'mermaid-save-btn';
366
376
  saveBtn.type = 'button';
@@ -412,6 +422,7 @@ async function renderSingleMermaidImpl(el: HTMLElement): Promise<void> {
412
422
  el.innerHTML = sanitizeMermaidSvg(svg);
413
423
  el.classList.add('mermaid-rendered');
414
424
  appendMermaidActionBtns(el);
425
+ bindDiagramZoom(el);
415
426
  } catch (err: unknown) {
416
427
  const errMsg = (err as { message?: string; str?: string })?.message
417
428
  || (err as { str?: string })?.str || 'Unknown error';
@@ -929,14 +940,16 @@ function unshieldSvgBlocks(html: string, blocks: SvgBlock[]): string {
929
940
 
930
941
  export function bindDiagramZoom(scope?: HTMLElement | Document): void {
931
942
  const root = scope || document;
932
- root.querySelectorAll('.diagram-zoom-btn').forEach(btn => {
943
+ root.querySelectorAll('.diagram-zoom-btn, .mermaid-zoom-btn').forEach(btn => {
933
944
  if ((btn as HTMLElement).dataset.bound) return;
934
945
  (btn as HTMLElement).dataset.bound = '1';
935
946
  btn.addEventListener('click', () => {
936
- const container = btn.closest('.diagram-container');
947
+ if (btn.closest('.diagram-widget')) return;
948
+ const container = btn.closest('.diagram-container, .mermaid-container');
937
949
  if (!container) return;
938
950
  const clone = container.cloneNode(true) as HTMLElement;
939
- clone.querySelectorAll('.diagram-zoom-btn, .diagram-copy-btn, .diagram-save-btn').forEach(b => b.remove());
951
+ clone.querySelectorAll('.diagram-zoom-btn, .mermaid-zoom-btn, .diagram-copy-btn, .diagram-save-btn, .mermaid-copy-btn, .mermaid-save-btn')
952
+ .forEach(b => b.remove());
940
953
  openDiagramOverlay(clone.innerHTML);
941
954
  });
942
955
  });
package/public/js/ui.ts CHANGED
@@ -467,6 +467,8 @@ let scrollRAF: number | null = null;
467
467
  let userNearBottom = true;
468
468
  let scrollTrackingBound = false;
469
469
  const SCROLL_BOTTOM_THRESHOLD = 80; // px
470
+ const RESTORE_INDICATOR_SETTLE_MS = 1100;
471
+ let chatRestoreIndicatorHideTimer: number | null = null;
470
472
 
471
473
  function ensureScrollTracking(): void {
472
474
  if (scrollTrackingBound) return;
@@ -506,7 +508,47 @@ export function reconcileChatBottomAfterLayout(shouldFollow = isChatNearBottom()
506
508
  });
507
509
  }
508
510
 
511
+ export function showChatRestoreIndicator(reason: string): void {
512
+ if (chatRestoreIndicatorHideTimer !== null) {
513
+ window.clearTimeout(chatRestoreIndicatorHideTimer);
514
+ chatRestoreIndicatorHideTimer = null;
515
+ }
516
+ const host = document.querySelector('.chat-area') as HTMLElement | null;
517
+ if (!host) return;
518
+ let indicator = host.querySelector('[data-restore-indicator="true"]') as HTMLElement | null;
519
+ if (!indicator) {
520
+ indicator = document.createElement('div');
521
+ indicator.className = 'chat-restore-indicator';
522
+ indicator.setAttribute('data-restore-indicator', 'true');
523
+ indicator.setAttribute('role', 'status');
524
+ indicator.setAttribute('aria-live', 'polite');
525
+ indicator.innerHTML = '<span class="chat-restore-dot"></span><span class="chat-restore-text">Restoring</span>';
526
+ host.appendChild(indicator);
527
+ }
528
+ indicator.dataset.restoreReason = reason;
529
+ }
530
+
531
+ export function hideChatRestoreIndicator(): void {
532
+ if (chatRestoreIndicatorHideTimer !== null) {
533
+ window.clearTimeout(chatRestoreIndicatorHideTimer);
534
+ chatRestoreIndicatorHideTimer = null;
535
+ }
536
+ document.querySelectorAll('[data-restore-indicator="true"]').forEach(el => el.remove());
537
+ }
538
+
539
+ export function hideChatRestoreIndicatorAfterSettle(delayMs = RESTORE_INDICATOR_SETTLE_MS): void {
540
+ if (chatRestoreIndicatorHideTimer !== null) {
541
+ window.clearTimeout(chatRestoreIndicatorHideTimer);
542
+ }
543
+ chatRestoreIndicatorHideTimer = window.setTimeout(() => {
544
+ chatRestoreIndicatorHideTimer = null;
545
+ hideChatRestoreIndicator();
546
+ }, delayMs);
547
+ }
548
+
509
549
  export function reconcileChatBottomAfterRestore(reason: string): void {
550
+ showChatRestoreIndicator(reason);
551
+ hideChatRestoreIndicatorAfterSettle();
510
552
  ensureScrollTracking();
511
553
  userNearBottom = true;
512
554
  const vs = getVirtualScroll();