cli-jaw 1.7.34 → 1.7.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli-jaw.js +5 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/dashboard.js +78 -0
- package/dist/bin/commands/dashboard.js.map +1 -0
- package/dist/lib/quota-copilot.js +5 -0
- package/dist/lib/quota-copilot.js.map +1 -1
- package/dist/src/agent/args.js +2 -0
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/events.js +43 -1
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/manager/constants.js +9 -0
- package/dist/src/manager/constants.js.map +1 -0
- package/dist/src/manager/metadata.js +35 -0
- package/dist/src/manager/metadata.js.map +1 -0
- package/dist/src/manager/proxy.js +134 -0
- package/dist/src/manager/proxy.js.map +1 -0
- package/dist/src/manager/scan.js +111 -0
- package/dist/src/manager/scan.js.map +1 -0
- package/dist/src/manager/server.js +85 -0
- package/dist/src/manager/server.js.map +1 -0
- package/dist/src/manager/types.js +2 -0
- package/dist/src/manager/types.js.map +1 -0
- package/dist/src/routes/quota.js +42 -0
- package/dist/src/routes/quota.js.map +1 -1
- package/package.json +6 -1
- package/public/css/chat.css +27 -0
- package/public/css/diagram.css +48 -2
- package/public/dist/assets/api-Cl2oljO1.js +1 -0
- package/public/dist/assets/{index-wUWc2M5K.js → app-58Z9R8qM.js} +4 -4
- package/public/dist/assets/app-DWH_NZRE.css +1 -0
- package/public/dist/assets/architecture-YZFGNWBL-D4g_rKok.js +1 -0
- package/public/dist/assets/architectureDiagram-Q4EWVU46-DVbii_Pt.js +1 -0
- package/public/dist/assets/blockDiagram-DXYQGD6D-BStipezp.js +1 -0
- package/public/dist/assets/c4Diagram-AHTNJAMY-BYno4Snw.js +1 -0
- package/public/dist/assets/classDiagram-6PBFFD2Q-QzqRo_9X.js +1 -0
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-CchGqJUH.js +1 -0
- package/public/dist/assets/{constants-BU8a_R5s.js → constants-fUXYKkoK.js} +1 -1
- package/public/dist/assets/cose-bilkent-S5V4N54A-TJS1iaqp.js +1 -0
- package/public/dist/assets/dagre-KV5264BT-C_DCJZ7t.js +1 -0
- package/public/dist/assets/diagram-5BDNPKRD-CKix1NRO.js +1 -0
- package/public/dist/assets/diagram-G4DWMVQ6-CoDTDNnx.js +1 -0
- package/public/dist/assets/diagram-MMDJMWI5-DYx0PwrY.js +1 -0
- package/public/dist/assets/diagram-TYMM5635-Bx1779dG.js +1 -0
- package/public/dist/assets/{employees-p53cgGmH.js → employees-CnA_uLbJ.js} +1 -1
- package/public/dist/assets/erDiagram-SMLLAGMA-C0INYE-d.js +1 -0
- package/public/dist/assets/flowDiagram-DWJPFMVM-DfQIgEdB.js +1 -0
- package/public/dist/assets/ganttDiagram-T4ZO3ILL-B8o_Hblo.js +1 -0
- package/public/dist/assets/gitGraph-7Q5UKJZL-DBMf1L33.js +1 -0
- package/public/dist/assets/gitGraphDiagram-UUTBAWPF-B2nqnLHi.js +1 -0
- package/public/dist/assets/idb-cache-C5ilDI6r.js +1 -0
- package/public/dist/assets/info-OMHHGYJF-C3gtg5Od.js +1 -0
- package/public/dist/assets/infoDiagram-42DDH7IO-Brz9iwrL.js +1 -0
- package/public/dist/assets/ishikawaDiagram-UXIWVN3A-C0YeQJh0.js +1 -0
- package/public/dist/assets/journeyDiagram-VCZTEJTY-BypDthzR.js +1 -0
- package/public/dist/assets/kanban-definition-6JOO6SKY-LkyDUgUP.js +1 -0
- package/public/dist/assets/katex-BL3z5Bli.js +1 -0
- package/public/dist/assets/manager-D4L7R_7R.css +1 -0
- package/public/dist/assets/manager-DtTAKPgY.js +9 -0
- package/public/dist/assets/memory-BN3grLR7.js +1 -0
- package/public/dist/assets/{memory-C2i7ZIvv.js → memory-RKpZbPTW.js} +1 -1
- package/public/dist/assets/mermaid.core-D6PDYVgC.js +1 -0
- package/public/dist/assets/mindmap-definition-QFDTVHPH-rV1Hipx-.js +1 -0
- package/public/dist/assets/packet-4T2RLAQJ-BuK6y2B7.js +1 -0
- package/public/dist/assets/pie-ZZUOXDRM-x8CPu972.js +1 -0
- package/public/dist/assets/pieDiagram-DEJITSTG-DpxKH4h4.js +1 -0
- package/public/dist/assets/quadrantDiagram-34T5L4WZ-BkRLuqoa.js +1 -0
- package/public/dist/assets/radar-PYXPWWZC-CsTAKlcV.js +1 -0
- package/public/dist/assets/render-D9bnLVR_.js +30 -0
- package/public/dist/assets/requirementDiagram-MS252O5E-BdqZlJ0O.js +1 -0
- package/public/dist/assets/sankeyDiagram-XADWPNL6-b3SwMAxC.js +1 -0
- package/public/dist/assets/sequenceDiagram-FGHM5R23-BmjI6n81.js +1 -0
- package/public/dist/assets/{settings-BUEiZgkm.js → settings-B8oUfDm4.js} +8 -8
- package/public/dist/assets/settings-DvGS6X_5.js +1 -0
- package/public/dist/assets/{skills-CSuSbBWa.js → skills-CHB_WsxF.js} +1 -1
- package/public/dist/assets/skills-WhnGcvvJ.js +1 -0
- package/public/dist/assets/{slash-commands-D-v0DlbY.js → slash-commands-CbsN2LqT.js} +1 -1
- package/public/dist/assets/slash-commands-DOh3zvJ7.js +1 -0
- package/public/dist/assets/stateDiagram-FHFEXIEX-DRsIDvF8.js +1 -0
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-IJMg9fYC.js +1 -0
- package/public/dist/assets/timeline-definition-GMOUNBTQ-B-0E30rh.js +1 -0
- package/public/dist/assets/treeView-SZITEDCU-CRgtpI0K.js +1 -0
- package/public/dist/assets/treemap-W4RFUUIX-DB5B-smF.js +1 -0
- package/public/dist/assets/ui-Cg8zuDaT.js +131 -0
- package/public/dist/assets/ui-HckqJaBX.js +1 -0
- package/public/dist/assets/{vendor-mermaid-UktBx7L0.js → vendor-mermaid-DHVxHqbi.js} +6 -6
- package/public/dist/assets/{vendor-render-D2YP6GiF.js → vendor-render-BaFgDHeH.js} +1 -1
- package/public/dist/assets/vennDiagram-DHZGUBPP-BBd9TC4D.js +1 -0
- package/public/dist/assets/wardley-RL74JXVD-BzCH0WF9.js +1 -0
- package/public/dist/assets/wardleyDiagram-NUSXRM2D-DgenAPEz.js +1 -0
- package/public/dist/assets/ws-DSntry14.js +14 -0
- package/public/dist/assets/xychartDiagram-5P7HB3ND-BmvcJ6sg.js +1 -0
- package/public/dist/index.html +2 -2
- package/public/dist/manager/index.html +14 -0
- package/public/js/diagram/iframe-renderer.ts +196 -77
- package/public/js/features/process-block.ts +2 -2
- package/public/js/features/settings-cli-status.ts +20 -1
- package/public/js/features/settings-types.ts +1 -1
- package/public/js/render.ts +16 -3
- package/public/js/ui.ts +42 -0
- package/public/js/ws.ts +20 -4
- package/public/manager/index.html +13 -0
- package/public/manager/src/App.tsx +185 -0
- package/public/manager/src/InstancePreview.tsx +72 -0
- package/public/manager/src/api.ts +8 -0
- package/public/manager/src/main.tsx +9 -0
- package/public/manager/src/preview.ts +35 -0
- package/public/manager/src/styles.css +309 -0
- package/public/manager/src/types.ts +44 -0
- package/public/dist/assets/api-COrKYKcO.js +0 -1
- package/public/dist/assets/architecture-YZFGNWBL-B2Nc8YC_.js +0 -1
- package/public/dist/assets/architectureDiagram-Q4EWVU46-EML5rtmP.js +0 -1
- package/public/dist/assets/blockDiagram-DXYQGD6D-Ds9bBl-N.js +0 -1
- package/public/dist/assets/c4Diagram-AHTNJAMY-BVpUT3Om.js +0 -1
- package/public/dist/assets/classDiagram-6PBFFD2Q-DG8IYzhr.js +0 -1
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-B5j0d5gs.js +0 -1
- package/public/dist/assets/cose-bilkent-S5V4N54A-kNrexiHE.js +0 -1
- package/public/dist/assets/dagre-KV5264BT-Ylb1W0yQ.js +0 -1
- package/public/dist/assets/diagram-5BDNPKRD-CPxqMVrp.js +0 -1
- package/public/dist/assets/diagram-G4DWMVQ6-Dm1xfj8I.js +0 -1
- package/public/dist/assets/diagram-MMDJMWI5-VsjfxFEK.js +0 -1
- package/public/dist/assets/diagram-TYMM5635-CrMZri_r.js +0 -1
- package/public/dist/assets/erDiagram-SMLLAGMA-Felxus25.js +0 -1
- package/public/dist/assets/flowDiagram-DWJPFMVM-kQrkSkw2.js +0 -1
- package/public/dist/assets/ganttDiagram-T4ZO3ILL-CulD-LkD.js +0 -1
- package/public/dist/assets/gitGraph-7Q5UKJZL-DbbbZYM5.js +0 -1
- package/public/dist/assets/gitGraphDiagram-UUTBAWPF-oTUYJsKL.js +0 -1
- package/public/dist/assets/idb-cache-C7z4qE00.js +0 -1
- package/public/dist/assets/index-CLKLbGzn.css +0 -1
- package/public/dist/assets/info-OMHHGYJF-auV0JwD8.js +0 -1
- package/public/dist/assets/infoDiagram-42DDH7IO-B2XOJXrL.js +0 -1
- package/public/dist/assets/ishikawaDiagram-UXIWVN3A-CsmszxH_.js +0 -1
- package/public/dist/assets/journeyDiagram-VCZTEJTY-MmzEBROj.js +0 -1
- package/public/dist/assets/kanban-definition-6JOO6SKY-DcbxzAKu.js +0 -1
- package/public/dist/assets/katex-Bh3QhMKY.js +0 -1
- package/public/dist/assets/memory-6zLEr-qI.js +0 -1
- package/public/dist/assets/mermaid.core-CoRN09Dx.js +0 -1
- package/public/dist/assets/mindmap-definition-QFDTVHPH-CMqZWcUf.js +0 -1
- package/public/dist/assets/packet-4T2RLAQJ-C_PFKo5G.js +0 -1
- package/public/dist/assets/pie-ZZUOXDRM-CcqLxwbG.js +0 -1
- package/public/dist/assets/pieDiagram-DEJITSTG-C9r3BQ9f.js +0 -1
- package/public/dist/assets/quadrantDiagram-34T5L4WZ-Du4pEL4T.js +0 -1
- package/public/dist/assets/radar-PYXPWWZC-BWOF5omS.js +0 -1
- package/public/dist/assets/render-CulTuvJs.js +0 -30
- package/public/dist/assets/requirementDiagram-MS252O5E-Dyz9eEFP.js +0 -1
- package/public/dist/assets/sankeyDiagram-XADWPNL6-DLgUCKs2.js +0 -1
- package/public/dist/assets/sequenceDiagram-FGHM5R23-c0nA9K_Q.js +0 -1
- package/public/dist/assets/settings-BhrOslae.js +0 -1
- package/public/dist/assets/skills-CgwxEvFx.js +0 -1
- package/public/dist/assets/slash-commands-Bo8jvBfI.js +0 -1
- package/public/dist/assets/stateDiagram-FHFEXIEX-D2aVOdby.js +0 -1
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DuwdzBLR.js +0 -1
- package/public/dist/assets/timeline-definition-GMOUNBTQ-PuaZYI31.js +0 -1
- package/public/dist/assets/treeView-SZITEDCU-D8mODguI.js +0 -1
- package/public/dist/assets/treemap-W4RFUUIX-DqqBuiM1.js +0 -1
- package/public/dist/assets/ui-4JiRyxJy.js +0 -131
- package/public/dist/assets/ui-Dx0MwI23.js +0 -1
- package/public/dist/assets/vennDiagram-DHZGUBPP-4blQ8E1z.js +0 -1
- package/public/dist/assets/wardley-RL74JXVD-Dn1IRCw2.js +0 -1
- package/public/dist/assets/wardleyDiagram-NUSXRM2D-OUBAKNJu.js +0 -1
- package/public/dist/assets/ws-DKtFfZsY.js +0 -14
- package/public/dist/assets/xychartDiagram-5P7HB3ND-CyZD7ovz.js +0 -1
- /package/public/dist/assets/{api-DygAf_G_.js → api-CnBOYa3F.js} +0 -0
- /package/public/dist/assets/{idb-cache-DbK81tgv.js → idb-cache-CjnC_K0x.js} +0 -0
- /package/public/dist/assets/{locale-CxI5nTcf.js → locale-heAuYK-3.js} +0 -0
- /package/public/dist/assets/{rolldown-runtime-FhOqtrmT.js → rolldown-runtime-DE9SaGGd.js} +0 -0
- /package/public/dist/assets/{state-O6NVkWcL.js → state-CPF7TImo.js} +0 -0
- /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-
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},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};
|
package/public/dist/index.html
CHANGED
|
@@ -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/
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
}
|
|
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 =
|
|
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
|
-
|
|
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('',
|
|
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:
|
|
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 =
|
|
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[];
|
package/public/js/render.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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();
|