@launchsecure/launch-kit 0.0.35 → 0.0.37
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/chart-client/assets/index-DJrjyXbN.css +1 -0
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/index-8eSXr3Ez.css +32 -0
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/index-4K0t2WrZ.css +1 -0
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-BiVx0WO_.js → _baseUniq-Cn5TyL9s.js} +1 -1
- package/dist/deck-client/assets/{arc-DGMkiEzS.js → arc-D61amKYu.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-Y2WRmHtk.js → architectureDiagram-Q4EWVU46-CpKrvC2W.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-_Lbfu5BQ.js → blockDiagram-DXYQGD6D-Yj5OjxvG.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-CTqpYTBX.js → c4Diagram-AHTNJAMY-BIR810Tv.js} +1 -1
- package/dist/deck-client/assets/channel-DrJz2x-n.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-liEIbPHs.js → chunk-4BX2VUAB-BeSHwGvx.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-CCc6lYvL.js → chunk-4TB4RGXK-CCqzsLpg.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-D02jJUR2.js → chunk-55IACEB6-CuW_aq4-.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-BFmGMbLD.js → chunk-EDXVE4YY-Dl35ixYh.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-6wFLOVcJ.js → chunk-FMBD7UC4-TwreZQTv.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-Bnr8RiBf.js → chunk-OYMX7WX6-Ahfw8EUo.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-Ct82MksJ.js → chunk-QZHKN3VN-DlE_zlU-.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-BXmN1diQ.js → chunk-YZCP3GAM-Dj6QWzSg.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-a3tg9w7z.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-a3tg9w7z.js +1 -0
- package/dist/deck-client/assets/clone-Dd7JBCL5.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-CmQCT-mH.js → cose-bilkent-S5V4N54A-BO1z5aOM.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-DDdSa9EX.js → dagre-KV5264BT-DVsw17fE.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-Bccks2xJ.js → diagram-5BDNPKRD-6jYs7oZk.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-CPPNgxmQ.js → diagram-G4DWMVQ6-6DbggeGE.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-KrD300pS.js → diagram-MMDJMWI5-CQtk1cSU.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-DefnLuQf.js → diagram-TYMM5635-BR-gt75b.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-DI9FfnFP.js → erDiagram-SMLLAGMA-C9qMtjdY.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-twKyd3Fx.js → flowDiagram-DWJPFMVM-CdaPhPYb.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-Wau3jhBr.js → ganttDiagram-T4ZO3ILL-BRsZWUy4.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-D9GgYXwb.js → gitGraphDiagram-UUTBAWPF-B8Z90jCj.js} +1 -1
- package/dist/deck-client/assets/{graph-BhNLzyXS.js → graph-my2Zphm4.js} +1 -1
- package/dist/deck-client/assets/index-ByqxPEgU.css +1 -0
- package/dist/deck-client/assets/{index-BtQBaQ7s.js → index-DqAoYZwV.js} +43 -42
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-TylGlSG-.js → infoDiagram-42DDH7IO-Csr9loin.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DAT8icpg.js → ishikawaDiagram-UXIWVN3A-HWdvUNFi.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-D3v_XL72.js → journeyDiagram-VCZTEJTY-CjYHG6EM.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-DNUOBiNr.js → kanban-definition-6JOO6SKY-CX3JdUu7.js} +1 -1
- package/dist/deck-client/assets/{layout-COfodgwF.js → layout-Bcucv5Gi.js} +1 -1
- package/dist/deck-client/assets/{linear-DmTsuIvK.js → linear-CUGM5FJZ.js} +1 -1
- package/dist/deck-client/assets/{min-BW1F7i1D.js → min-Dw4g5w9z.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-CErFzKWl.js → mindmap-definition-QFDTVHPH-C8oo61fg.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-DW5F757o.js → pieDiagram-DEJITSTG-D2WYGkq8.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-B1S2-TfI.js → quadrantDiagram-34T5L4WZ-Vh00GISt.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-BY5BAR-5.js → requirementDiagram-MS252O5E-DxI-DFrN.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-CE1Cp9HS.js → sankeyDiagram-XADWPNL6-QgwyjasI.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-IaHnbKye.js → sequenceDiagram-FGHM5R23-DmOmD5Ni.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-CwPJm9hU.js → stateDiagram-FHFEXIEX-CRwglGg_.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BvZLEWAA.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-DVFGGSgN.js → timeline-definition-GMOUNBTQ-Dj9YGKOh.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-C1194MJi.js → vennDiagram-DHZGUBPP-xzIaOzEU.js} +1 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-CEAay09T.js +162 -0
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-hpwdFfGj.js → wardleyDiagram-NUSXRM2D-BIYYh-JZ.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-DYkotwy8.js → xychartDiagram-5P7HB3ND-Cy9EoJCh.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/cli.js +261 -26
- package/dist/server/council-entry.js +86 -2
- package/dist/server/council-serve.js +81 -2
- package/dist/server/deck-mcp-entry.js +449 -68
- package/dist/server/deck-serve.js +411 -42
- package/dist/server/init-entry.js +732 -237
- package/dist/server/orbit-entry.js +880 -144
- package/dist/server/radar-docker-init-entry.js +371 -37
- package/dist/server/rover-entry.js +108 -20
- package/package.json +1 -1
- package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check/SKILL.md +5 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/kickoff/SKILL.md +20 -4
- package/scaffolds/ls-marketplace/plugins/kit/skills/orbit/SKILL.md +27 -7
- package/dist/chart-client/assets/index-DpKO9p0s.css +0 -1
- package/dist/client/assets/index-Dv6dD2zY.css +0 -32
- package/dist/council-client/assets/index-AqQ9Sei6.css +0 -1
- package/dist/deck-client/assets/channel-DB6LxW_l.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-g944ZyG8.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-g944ZyG8.js +0 -1
- package/dist/deck-client/assets/clone-DiIRH1pI.js +0 -1
- package/dist/deck-client/assets/index-B-YQq5b5.css +0 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-DQYa2M1q.js +0 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-CHZiUbBa.js +0 -162
- /package/dist/chart-client/assets/{index-DFu2xIrM.js → index-BgUxHxwE.js} +0 -0
- /package/dist/client/assets/{index-Cbw6bVdx.js → index-CUivaQnN.js} +0 -0
- /package/dist/council-client/assets/{index-CAsmGTzg.js → index-DN8HN_5K.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as zt,g as Lt,q as Xt,p as At,a as Ct,b as Et,_ as y,l as et,I as Tt,e as Yt,z as Bt,c as H,i as Rt}from"./index-
|
|
1
|
+
import{s as zt,g as Lt,q as Xt,p as At,a as Ct,b as Et,_ as y,l as et,I as Tt,e as Yt,z as Bt,c as H,i as Rt}from"./index-DqAoYZwV.js";import{p as Ft}from"./chunk-4BX2VUAB-BeSHwGvx.js";import{p as It}from"./wardley-RL74JXVD-CEAay09T.js";import"./min-Dw4g5w9z.js";import"./_baseUniq-Cn5TyL9s.js";var q=y((a,r)=>{const e=a<=1?a*100:a;if(e<0||e>100)throw new Error(`${r} must be between 0-1 (decimal) or 0-100 (percentage). Received: ${a}`);return e},"toPercent"),Y=y((a,r,e)=>({x:q(r,`${e} evolution`),y:q(a,`${e} visibility`)}),"toCoordinates"),tt=y(a=>{if(a){if(a==="+<>")return"bidirectional";if(a==="+<")return"backward";if(a==="+>")return"forward"}},"getFlowFromPort"),Ot=y(a=>{if(!(a!=null&&a.startsWith("+")))return{};const r=/^\+'([^']*)'/.exec(a),e=r==null?void 0:r[1];return a.includes("<>")?{flow:"bidirectional",label:e}:a.includes("<")?{flow:"backward",label:e}:a.includes(">")?{flow:"forward",label:e}:{label:e}},"extractFlowFromArrow"),Wt=y((a,r)=>{if(Ft(a,r),a.size&&r.setSize(a.size.width,a.size.height),a.evolution){const e=a.evolution.stages.map(o=>o.secondName?`${o.name.trim()} / ${o.secondName.trim()}`:o.name.trim()),h=a.evolution.stages.filter(o=>o.boundary!==void 0).map(o=>o.boundary);r.updateAxes({stages:e,stageBoundaries:h})}if(a.anchors.forEach(e=>{const h=Y(e.visibility,e.evolution,`Anchor "${e.name}"`);r.addNode(e.name,e.name,h.x,h.y,"anchor")}),a.components.forEach(e=>{var v;const h=Y(e.visibility,e.evolution,`Component "${e.name}"`),o=e.label?(e.label.negX?-1:1)*e.label.offsetX:void 0,d=e.label?(e.label.negY?-1:1)*e.label.offsetY:void 0,m=(v=e.decorator)==null?void 0:v.strategy;r.addNode(e.name,e.name,h.x,h.y,"component",o,d,e.inertia,m)}),a.notes.forEach(e=>{const h=Y(e.visibility,e.evolution,`Note "${e.text}"`);r.addNote(e.text,h.x,h.y)}),a.pipelines.forEach(e=>{const h=r.getNode(e.parent);if(!h||typeof h.y!="number")throw new Error(`Pipeline "${e.parent}" must reference an existing component with coordinates.`);const o=h.y;r.startPipeline(e.parent),e.components.forEach(d=>{const m=`${e.parent}_${d.name}`,v=d.label?(d.label.negX?-1:1)*d.label.offsetX:void 0,g=d.label?(d.label.negY?-1:1)*d.label.offsetY:void 0,A=q(d.evolution,`Pipeline component "${d.name}" evolution`);r.addNode(m,d.name,A,o,"pipeline-component",v,g),r.addPipelineComponent(e.parent,m)})}),a.links.forEach(e=>{const h=!!e.arrow&&(e.arrow.includes("-.->")||e.arrow.includes(".-."));let o=tt(e.fromPort)??tt(e.toPort);const{flow:d,label:m}=Ot(e.arrow);!o&&d&&(o=d);const v=e.linkLabel,g=m??v;r.addLink(e.from,e.to,h,g,o)}),a.evolves.forEach(e=>{const h=r.getNode(e.component);if((h==null?void 0:h.y)!==void 0){const o=q(e.target,`Evolve target for "${e.component}"`);r.addTrend(e.component,o,h.y)}}),a.annotations.length>0){const e=a.annotations[0],h=Y(e.x,e.y,"Annotations box");r.setAnnotationsBox(h.x,h.y)}a.annotation.forEach(e=>{const h=Y(e.x,e.y,`Annotation ${e.number}`);r.addAnnotation(e.number,[{x:h.x,y:h.y}],e.text)}),a.accelerators.forEach(e=>{const h=Y(e.x,e.y,`Accelerator "${e.name}"`);r.addAccelerator(e.name,h.x,h.y)}),a.deaccelerators.forEach(e=>{const h=Y(e.x,e.y,`Deaccelerator "${e.name}"`);r.addDeaccelerator(e.name,h.x,h.y)})},"populateDb"),at={parser:{yy:void 0},parse:y(async a=>{var h;const r=await It("wardley",a);et.debug(r);const e=(h=at.parser)==null?void 0:h.yy;if(!e||typeof e.addNode!="function")throw new Error("parser.parser?.yy was not a WardleyDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Wt(r,e)},"parse")},R,Dt=(R=class{constructor(){this.nodes=new Map,this.links=[],this.trends=new Map,this.pipelines=new Map,this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.axes={}}addNode(r){const e=this.nodes.get(r.id)??{id:r.id,label:r.label},h={...e,...r,className:r.className??e.className,labelOffsetX:r.labelOffsetX??e.labelOffsetX,labelOffsetY:r.labelOffsetY??e.labelOffsetY};this.nodes.set(r.id,h)}addLink(r){this.links.push(r)}addTrend(r){this.trends.set(r.nodeId,r)}startPipeline(r){this.pipelines.set(r,{nodeId:r,componentIds:[]});const e=this.nodes.get(r);e&&(e.isPipelineParent=!0)}addPipelineComponent(r,e){const h=this.pipelines.get(r);h&&h.componentIds.push(e);const o=this.nodes.get(e);o&&(o.inPipeline=!0)}addAnnotation(r){this.annotations.push(r)}addNote(r){this.notes.push(r)}addAccelerator(r){this.accelerators.push(r)}addDeaccelerator(r){this.deaccelerators.push(r)}setAnnotationsBox(r,e){this.annotationsBox={x:r,y:e}}setAxes(r){this.axes={...this.axes,...r}}setSize(r,e){this.size={width:r,height:e}}getNode(r){return this.nodes.get(r)}build(){const r=[];for(const e of this.nodes.values()){if(typeof e.x!="number"||typeof e.y!="number")throw new Error(`Node "${e.label}" is missing coordinates`);r.push(e)}return{nodes:r,links:[...this.links],trends:[...this.trends.values()],pipelines:[...this.pipelines.values()],annotations:[...this.annotations],notes:[...this.notes],accelerators:[...this.accelerators],deaccelerators:[...this.deaccelerators],annotationsBox:this.annotationsBox,axes:{...this.axes},size:this.size}}clear(){this.nodes.clear(),this.links=[],this.trends.clear(),this.pipelines.clear(),this.annotations=[],this.notes=[],this.accelerators=[],this.deaccelerators=[],this.annotationsBox=void 0,this.axes={},this.size=void 0}},y(R,"WardleyBuilder"),R),P=new Dt;function N(a){const r=H();return Rt(a.trim(),r)}y(N,"textSanitizer");function rt(){return H()["wardley-beta"]}y(rt,"getConfig");function ot(a,r,e,h,o,d,m,v,g){P.addNode({id:a,label:N(r),x:e,y:h,className:o,labelOffsetX:d,labelOffsetY:m,inertia:v,sourceStrategy:g})}y(ot,"addNode");function st(a,r,e=!1,h,o){P.addLink({source:a,target:r,dashed:e,label:h,flow:o})}y(st,"addLink");function nt(a,r,e){P.addTrend({nodeId:a,targetX:r,targetY:e})}y(nt,"addTrend");function it(a,r,e){P.addAnnotation({number:a,coordinates:r,text:e?N(e):void 0})}y(it,"addAnnotation");function dt(a,r,e){P.addNote({text:N(a),x:r,y:e})}y(dt,"addNote");function lt(a,r,e){P.addAccelerator({name:N(a),x:r,y:e})}y(lt,"addAccelerator");function ct(a,r,e){P.addDeaccelerator({name:N(a),x:r,y:e})}y(ct,"addDeaccelerator");function pt(a,r){P.setAnnotationsBox(a,r)}y(pt,"setAnnotationsBox");function ht(a,r){P.setSize(a,r)}y(ht,"setSize");function xt(a){P.startPipeline(a)}y(xt,"startPipeline");function ft(a,r){P.addPipelineComponent(a,r)}y(ft,"addPipelineComponent");function gt(a){const r={};a.xLabel&&(r.xLabel=N(a.xLabel)),a.yLabel&&(r.yLabel=N(a.yLabel)),a.stages&&(r.stages=a.stages.map(e=>N(e))),a.stageBoundaries&&(r.stageBoundaries=a.stageBoundaries),P.setAxes(r)}y(gt,"updateAxes");function ut(a){return P.getNode(a)}y(ut,"getNode");function yt(){return P.build()}y(yt,"getWardleyData");function mt(){P.clear(),Bt()}y(mt,"clear");var Gt={getConfig:rt,addNode:ot,addLink:st,addTrend:nt,addAnnotation:it,addNote:dt,addAccelerator:lt,addDeaccelerator:ct,setAnnotationsBox:pt,setSize:ht,startPipeline:xt,addPipelineComponent:ft,updateAxes:gt,getNode:ut,getWardleyData:yt,clear:mt,setAccTitle:Et,getAccTitle:Ct,setDiagramTitle:At,getDiagramTitle:Xt,getAccDescription:Lt,setAccDescription:zt},qt=["Genesis","Custom Built","Product","Commodity"],Ht=y(()=>{var r,e,h,o,d,m,v,g,A,M,b,z;const{themeVariables:a}=H();return{backgroundColor:((r=a.wardley)==null?void 0:r.backgroundColor)??a.background??"#fff",axisColor:((e=a.wardley)==null?void 0:e.axisColor)??"#000",axisTextColor:((h=a.wardley)==null?void 0:h.axisTextColor)??a.primaryTextColor??"#222",gridColor:((o=a.wardley)==null?void 0:o.gridColor)??"rgba(100, 100, 100, 0.2)",componentFill:((d=a.wardley)==null?void 0:d.componentFill)??"#fff",componentStroke:((m=a.wardley)==null?void 0:m.componentStroke)??"#000",componentLabelColor:((v=a.wardley)==null?void 0:v.componentLabelColor)??a.primaryTextColor??"#222",linkStroke:((g=a.wardley)==null?void 0:g.linkStroke)??"#000",evolutionStroke:((A=a.wardley)==null?void 0:A.evolutionStroke)??"#dc3545",annotationStroke:((M=a.wardley)==null?void 0:M.annotationStroke)??"#000",annotationTextColor:((b=a.wardley)==null?void 0:b.annotationTextColor)??a.primaryTextColor??"#222",annotationFill:((z=a.wardley)==null?void 0:z.annotationFill)??a.background??"#fff"}},"getTheme"),jt=y(()=>{const a=H()["wardley-beta"];return{width:(a==null?void 0:a.width)??900,height:(a==null?void 0:a.height)??600,padding:(a==null?void 0:a.padding)??48,nodeRadius:(a==null?void 0:a.nodeRadius)??6,nodeLabelOffset:(a==null?void 0:a.nodeLabelOffset)??8,axisFontSize:(a==null?void 0:a.axisFontSize)??12,labelFontSize:(a==null?void 0:a.labelFontSize)??10,showGrid:(a==null?void 0:a.showGrid)??!1,useMaxWidth:(a==null?void 0:a.useMaxWidth)??!0}},"getConfigValues"),_t=y((a,r,e,h)=>{var K,Q;et.debug(`Rendering Wardley map
|
|
2
2
|
`+a);const o=jt(),d=Ht(),m=o.nodeRadius*1.6,v=h.db,g=v.getWardleyData(),A=v.getDiagramTitle(),M=((K=g.size)==null?void 0:K.width)??o.width,b=((Q=g.size)==null?void 0:Q.height)??o.height,z=Tt(r);z.selectAll("*").remove(),Yt(z,b,M,o.useMaxWidth),z.attr("viewBox",`0 0 ${M} ${b}`);const S=z.append("g").attr("class","wardley-map"),j=z.append("defs");j.append("marker").attr("id",`arrow-${r}`).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerWidth",6).attr("markerHeight",6).attr("orient","auto-start-reverse").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("fill",d.evolutionStroke).attr("stroke","none"),j.append("marker").attr("id",`link-arrow-end-${r}`).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerWidth",5).attr("markerHeight",5).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("fill",d.linkStroke).attr("stroke","none"),j.append("marker").attr("id",`link-arrow-start-${r}`).attr("viewBox","0 0 10 10").attr("refX",1).attr("refY",5).attr("markerWidth",5).attr("markerHeight",5).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z").attr("fill",d.linkStroke).attr("stroke","none"),S.append("rect").attr("class","wardley-background").attr("width",M).attr("height",b).attr("fill",d.backgroundColor);const F=M-o.padding*2,I=b-o.padding*2;A&&S.append("text").attr("class","wardley-title").attr("x",M/2).attr("y",o.padding/2).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize*1.05).attr("font-weight","bold").attr("text-anchor","middle").attr("dominant-baseline","middle").text(A);const C=y(t=>o.padding+t/100*F,"projectX"),E=y(t=>b-o.padding-t/100*I,"projectY"),W=S.append("g").attr("class","wardley-axes");W.append("line").attr("x1",o.padding).attr("x2",M-o.padding).attr("y1",b-o.padding).attr("y2",b-o.padding).attr("stroke",d.axisColor).attr("stroke-width",1),W.append("line").attr("x1",o.padding).attr("x2",o.padding).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke",d.axisColor).attr("stroke-width",1);const wt=g.axes.xLabel??"Evolution",bt=g.axes.yLabel??"Visibility";W.append("text").attr("class","wardley-axis-label wardley-axis-label-x").attr("x",o.padding+F/2).attr("y",b-o.padding/4).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize).attr("font-weight","bold").attr("text-anchor","middle").text(wt),W.append("text").attr("class","wardley-axis-label wardley-axis-label-y").attr("x",o.padding/3).attr("y",o.padding+I/2).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize).attr("font-weight","bold").attr("text-anchor","middle").attr("transform",`rotate(-90 ${o.padding/3} ${o.padding+I/2})`).text(bt);const O=g.axes.stages&&g.axes.stages.length>0?g.axes.stages:qt;if(O.length>0){const t=S.append("g").attr("class","wardley-stages"),n=g.axes.stageBoundaries,s=[];if(n&&n.length===O.length){let i=0;n.forEach(p=>{s.push({start:i,end:p}),i=p})}else{const i=1/O.length;O.forEach((p,l)=>{s.push({start:l*i,end:(l+1)*i})})}O.forEach((i,p)=>{const l=s[p],x=o.padding+l.start*F,f=o.padding+l.end*F,u=(x+f)/2;p>0&&t.append("line").attr("x1",x).attr("x2",x).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke","#000").attr("stroke-width",1).attr("stroke-dasharray","5 5").attr("opacity",.8),t.append("text").attr("class","wardley-stage-label").attr("x",u).attr("y",b-o.padding/1.5).attr("fill",d.axisTextColor).attr("font-size",o.axisFontSize-2).attr("text-anchor","middle").text(i)})}if(o.showGrid){const t=S.append("g").attr("class","wardley-grid");for(let n=1;n<4;n++){const s=n/4,i=o.padding+F*s;t.append("line").attr("x1",i).attr("x2",i).attr("y1",o.padding).attr("y2",b-o.padding).attr("stroke",d.gridColor).attr("stroke-dasharray","2 6"),t.append("line").attr("x1",o.padding).attr("x2",M-o.padding).attr("y1",b-o.padding-I*s).attr("y2",b-o.padding-I*s).attr("stroke",d.gridColor).attr("stroke-dasharray","2 6")}}const c=new Map;if(g.nodes.forEach(t=>{c.set(t.id,{x:C(t.x),y:E(t.y),node:t})}),g.pipelines.length>0){const t=S.append("g").attr("class","wardley-pipelines"),n=S.append("g").attr("class","wardley-pipeline-links");g.pipelines.forEach(s=>{if(s.componentIds.length===0)return;const i=s.componentIds.map(f=>({id:f,pos:c.get(f),node:g.nodes.find(u=>u.id===f)})).filter(f=>f.pos&&f.node).sort((f,u)=>f.node.x-u.node.x);for(let f=0;f<i.length-1;f++){const u=i[f],w=i[f+1];n.append("line").attr("class","wardley-pipeline-evolution-link").attr("x1",u.pos.x).attr("y1",u.pos.y).attr("x2",w.pos.x).attr("y2",w.pos.y).attr("stroke",d.linkStroke).attr("stroke-width",1).attr("stroke-dasharray","4 4")}let p=1/0,l=-1/0,x=0;if(s.componentIds.forEach(f=>{const u=c.get(f);u&&(p=Math.min(p,u.x),l=Math.max(l,u.x),x=u.y)}),p!==1/0&&l!==-1/0){const u=o.nodeRadius*4,w=x-u/2,$=c.get(s.nodeId);if($){const X=(p+l)/2;$.x=X,$.y=w-m/6}t.append("rect").attr("class","wardley-pipeline-box").attr("x",p-15).attr("y",w).attr("width",l-p+15*2).attr("height",u).attr("fill","none").attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("rx",4).attr("ry",4)}})}const Z=S.append("g").attr("class","wardley-links"),U=new Map;g.pipelines.forEach(t=>{U.set(t.nodeId,new Set(t.componentIds))});const J=g.links.filter(t=>{if(!c.has(t.source)||!c.has(t.target))return!1;const n=U.get(t.target);return!(n!=null&&n.has(t.source))});Z.selectAll("line").data(J).enter().append("line").attr("class",t=>`wardley-link${t.dashed?" wardley-link--dashed":""}`).attr("x1",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.source).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x);return n.x+l/f*p}).attr("y1",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.source).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x);return n.y+x/f*p}).attr("x2",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.target).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=n.x-s.x,x=n.y-s.y,f=Math.sqrt(l*l+x*x);return s.x+l/f*p}).attr("y2",t=>{const n=c.get(t.source),s=c.get(t.target),p=g.nodes.find(u=>u.id===t.target).isPipelineParent?m/Math.sqrt(2):o.nodeRadius,l=n.x-s.x,x=n.y-s.y,f=Math.sqrt(l*l+x*x);return s.y+x/f*p}).attr("stroke",d.linkStroke).attr("stroke-width",1).attr("stroke-dasharray",t=>t.dashed?"6 6":null).attr("marker-end",t=>t.flow==="forward"||t.flow==="bidirectional"?`url(#link-arrow-end-${r})`:null).attr("marker-start",t=>t.flow==="backward"||t.flow==="bidirectional"?`url(#link-arrow-start-${r})`:null),Z.selectAll("text").data(J.filter(t=>t.label)).enter().append("text").attr("class","wardley-link-label").attr("x",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.x+s.x)/2,p=s.y-n.y,l=s.x-n.x,x=Math.sqrt(l*l+p*p),f=8,u=p/x;return i+u*f}).attr("y",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.y+s.y)/2,p=s.x-n.x,l=s.y-n.y,x=Math.sqrt(p*p+l*l),f=8,u=-p/x;return i+u*f}).attr("fill",d.axisTextColor).attr("font-size",o.labelFontSize).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform",t=>{const n=c.get(t.source),s=c.get(t.target),i=(n.x+s.x)/2,p=(n.y+s.y)/2,l=s.x-n.x,x=s.y-n.y,f=Math.sqrt(l*l+x*x),u=8,w=x/f,$=-l/f,X=i+w*u,D=p+$*u;let B=Math.atan2(x,l)*180/Math.PI;return(B>90||B<-90)&&(B+=180),`rotate(${B} ${X} ${D})`}).text(t=>t.label);const kt=S.append("g").attr("class","wardley-trends"),Pt=g.trends.map(t=>{const n=c.get(t.nodeId);if(!n)return null;const s=C(t.targetX),i=E(t.targetY),p=s-n.x,l=i-n.y,x=Math.sqrt(p*p+l*l),f=o.nodeRadius+2,u=x>f?s-p/x*f:s,w=x>f?i-l/x*f:i;return{origin:n,targetX:s,targetY:i,adjustedX2:u,adjustedY2:w}}).filter(t=>t!==null);kt.selectAll("line").data(Pt).enter().append("line").attr("class","wardley-trend").attr("x1",t=>t.origin.x).attr("y1",t=>t.origin.y).attr("x2",t=>t.adjustedX2).attr("y2",t=>t.adjustedY2).attr("stroke",d.evolutionStroke).attr("stroke-width",1).attr("stroke-dasharray","4 4").attr("marker-end",`url(#arrow-${r})`);const L=S.append("g").attr("class","wardley-nodes").selectAll("g").data(g.nodes).enter().append("g").attr("class",t=>["wardley-node",t.className?`wardley-node--${t.className}`:""].filter(Boolean).join(" "));L.filter(t=>t.sourceStrategy==="outsource").append("circle").attr("class","wardley-outsource-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#666").attr("stroke",d.componentStroke).attr("stroke-width",1),L.filter(t=>t.sourceStrategy==="buy").append("circle").attr("class","wardley-buy-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#ccc").attr("stroke",d.componentStroke).attr("stroke-width",1),L.filter(t=>t.sourceStrategy==="build").append("circle").attr("class","wardley-build-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","#eee").attr("stroke","#000").attr("stroke-width",1);const T=L.filter(t=>t.sourceStrategy==="market");T.append("circle").attr("class","wardley-market-overlay").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius*2).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",1),L.filter(t=>!t.isPipelineParent&&t.sourceStrategy!=="market"&&t.className!=="anchor").append("circle").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y).attr("r",o.nodeRadius).attr("fill",d.componentFill).attr("stroke",d.componentStroke).attr("stroke-width",1);const _=o.nodeRadius*.7,k=o.nodeRadius*1.2;if(T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x).attr("y1",t=>c.get(t.id).y-k).attr("x2",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("y2",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("y1",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("x2",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("y2",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("line").attr("class","wardley-market-line").attr("x1",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("y1",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("x2",t=>c.get(t.id).x).attr("y2",t=>c.get(t.id).y-k).attr("stroke",d.componentStroke).attr("stroke-width",1),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x).attr("cy",t=>c.get(t.id).y-k).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x-k*Math.cos(Math.PI/6)).attr("cy",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),T.append("circle").attr("class","wardley-market-dot").attr("cx",t=>c.get(t.id).x+k*Math.cos(Math.PI/6)).attr("cy",t=>c.get(t.id).y+k*Math.sin(Math.PI/6)).attr("r",_).attr("fill","white").attr("stroke",d.componentStroke).attr("stroke-width",2),L.filter(t=>t.isPipelineParent===!0).append("rect").attr("x",t=>c.get(t.id).x-m/2).attr("y",t=>c.get(t.id).y-m/2).attr("width",m).attr("height",m).attr("fill",d.componentFill).attr("stroke",d.componentStroke).attr("stroke-width",1),L.filter(t=>t.inertia===!0).append("line").attr("class","wardley-inertia").attr("x1",t=>{const n=c.get(t.id);let s=t.isPipelineParent?m/2+15:o.nodeRadius+15;return t.sourceStrategy&&(s+=o.nodeRadius+10),n.x+s}).attr("y1",t=>{const n=c.get(t.id),s=t.isPipelineParent?m:o.nodeRadius*2;return n.y-s/2}).attr("x2",t=>{const n=c.get(t.id);let s=t.isPipelineParent?m/2+15:o.nodeRadius+15;return t.sourceStrategy&&(s+=o.nodeRadius+10),n.x+s}).attr("y2",t=>{const n=c.get(t.id),s=t.isPipelineParent?m:o.nodeRadius*2;return n.y+s/2}).attr("stroke",d.componentStroke).attr("stroke-width",6),L.append("text").attr("x",t=>{const n=c.get(t.id);if(t.className==="anchor")return t.labelOffsetX!==void 0?n.x+t.labelOffsetX:n.x;let s=o.nodeLabelOffset;t.sourceStrategy&&t.labelOffsetX===void 0&&(s+=10);const i=t.labelOffsetX??s;return n.x+i}).attr("y",t=>{const n=c.get(t.id);if(t.className==="anchor")return t.labelOffsetY!==void 0?n.y+t.labelOffsetY:n.y-3;let s=-o.nodeLabelOffset;t.sourceStrategy&&t.labelOffsetY===void 0&&(s-=10);const i=t.labelOffsetY??s;return n.y+i}).attr("class","wardley-node-label").attr("fill",t=>t.className==="evolved"?d.evolutionStroke:t.className==="anchor"?"#000":d.componentLabelColor).attr("font-size",o.labelFontSize).attr("font-weight",t=>t.className==="anchor"?"bold":"normal").attr("text-anchor",t=>t.className==="anchor"?"middle":"start").attr("dominant-baseline",t=>t.className==="anchor"?"middle":"auto").text(t=>t.label),g.annotations.length>0){const t=S.append("g").attr("class","wardley-annotations");if(g.annotations.forEach(n=>{const s=n.coordinates.map(i=>({x:C(i.x),y:E(i.y)}));if(s.length>1)for(let i=0;i<s.length-1;i++)t.append("line").attr("class","wardley-annotation-line").attr("x1",s[i].x).attr("y1",s[i].y).attr("x2",s[i+1].x).attr("y2",s[i+1].y).attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("stroke-dasharray","4 4");s.forEach(i=>{const p=t.append("g").attr("class","wardley-annotation");p.append("circle").attr("cx",i.x).attr("cy",i.y).attr("r",10).attr("fill","white").attr("stroke",d.axisColor).attr("stroke-width",1.5),p.append("text").attr("x",i.x).attr("y",i.y).attr("text-anchor","middle").attr("dominant-baseline","central").attr("font-size",10).attr("fill",d.axisTextColor).attr("font-weight","bold").text(n.number)})}),g.annotationsBox){let n=C(g.annotationsBox.x),s=E(g.annotationsBox.y);const i=10,p=16,l=11,x=t.append("g").attr("class","wardley-annotations-box"),f=[...g.annotations].filter(w=>w.text).sort((w,$)=>w.number-$.number),u=[];if(f.forEach((w,$)=>{const X=x.append("text").attr("x",n+i).attr("y",s+i+($+1)*p).attr("font-size",l).attr("fill",d.axisTextColor).attr("text-anchor","start").attr("dominant-baseline","middle").text(`${w.number}. ${w.text}`);u.push(X)}),u.length>0){let w=0,$=0;u.forEach(V=>{const G=V.node(),Mt=G.getComputedTextLength();w=Math.max(w,Mt);const Nt=G.getBBox();$=Math.max($,Nt.height)});const X=w+i*2+105,D=f.length*p+i*2+$/2,B=o.padding,vt=M-o.padding-X,St=o.padding,$t=b-o.padding-D;n=Math.max(B,Math.min(n,vt)),s=Math.max(St,Math.min(s,$t)),u.forEach((V,G)=>{V.attr("x",n+i).attr("y",s+i+(G+1)*p)}),x.insert("rect","text").attr("x",n).attr("y",s).attr("width",X).attr("height",D).attr("fill","white").attr("stroke",d.axisColor).attr("stroke-width",1.5).attr("rx",4).attr("ry",4)}}}if(g.notes.length>0){const t=S.append("g").attr("class","wardley-notes");g.notes.forEach(n=>{const s=C(n.x),i=E(n.y);t.append("text").attr("x",s).attr("y",i).attr("text-anchor","start").attr("font-size",11).attr("fill",d.axisTextColor).attr("font-weight","bold").text(n.text)})}if(g.accelerators.length>0){const t=S.append("g").attr("class","wardley-accelerators");g.accelerators.forEach(n=>{const s=C(n.x),i=E(n.y),p=60,l=30,x=20,f=`
|
|
3
3
|
M ${s} ${i-l/2}
|
|
4
4
|
L ${s+p-x} ${i-l/2}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,_ as a,l as Yt,I as mi,e as yi,z as bi,D as _t,i as Ai,F as Nt,G as wi,K as Ci,aC as Si,R as Wt}from"./index-
|
|
1
|
+
import{s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,_ as a,l as Yt,I as mi,e as yi,z as bi,D as _t,i as Ai,F as Nt,G as wi,K as Ci,aC as Si,R as Wt}from"./index-DqAoYZwV.js";import{i as _i}from"./init-Gi6I4Gst.js";import{o as ki}from"./ordinal-Cboi1Yqb.js";import{l as zt}from"./linear-CUGM5FJZ.js";import"./defaultLocale-DX6XiGOO.js";function Ri(e,t,i){e=+e,t=+t,i=(n=arguments.length)<2?(t=e,e=0,1):n<3?1:+i;for(var s=-1,n=Math.max(0,Math.ceil((t-e)/i))|0,o=new Array(n);++s<n;)o[s]=e+s*i;return o}function bt(){var e=ki().unknown(void 0),t=e.domain,i=e.range,s=0,n=1,o,u,p=!1,f=0,T=0,P=.5;delete e.unknown;function _(){var y=t().length,E=n<s,v=E?n:s,L=E?s:n;o=(L-v)/Math.max(1,y-f+T*2),p&&(o=Math.floor(o)),v+=(L-v-o*(y-f))*P,u=o*(1-f),p&&(v=Math.round(v),u=Math.round(u));var I=Ri(y).map(function(m){return v+o*m});return i(E?I.reverse():I)}return e.domain=function(y){return arguments.length?(t(y),_()):t()},e.range=function(y){return arguments.length?([s,n]=y,s=+s,n=+n,_()):[s,n]},e.rangeRound=function(y){return[s,n]=y,s=+s,n=+n,p=!0,_()},e.bandwidth=function(){return u},e.step=function(){return o},e.round=function(y){return arguments.length?(p=!!y,_()):p},e.padding=function(y){return arguments.length?(f=Math.min(1,T=+y),_()):f},e.paddingInner=function(y){return arguments.length?(f=Math.min(1,y),_()):f},e.paddingOuter=function(y){return arguments.length?(T=+y,_()):T},e.align=function(y){return arguments.length?(P=Math.max(0,Math.min(1,y)),_()):P},e.copy=function(){return bt(t(),[s,n]).round(p).paddingInner(f).paddingOuter(T).align(P)},_i.apply(_(),arguments)}var At=function(){var e=a(function(F,h,c,g){for(c=c||{},g=F.length;g--;c[F[g]]=h);return c},"o"),t=[1,10,12,14,16,18,19,21,23],i=[2,6],s=[1,3],n=[1,5],o=[1,6],u=[1,7],p=[1,5,10,12,14,16,18,19,21,23,34,35,36],f=[1,25],T=[1,26],P=[1,28],_=[1,29],y=[1,30],E=[1,31],v=[1,32],L=[1,33],I=[1,34],m=[1,35],R=[1,36],l=[1,37],W=[1,43],O=[1,42],X=[1,47],Y=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],U=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],b=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],w=[1,64],V={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(h,c,g,x,C,r,rt){var d=r.length-1;switch(C){case 5:x.setOrientation(r[d]);break;case 9:x.setDiagramTitle(r[d].text.trim());break;case 12:x.setLineData({text:"",type:"text"},r[d]);break;case 13:x.setLineData(r[d-1],r[d]);break;case 14:x.setBarData({text:"",type:"text"},r[d]);break;case 15:x.setBarData(r[d-1],r[d]);break;case 16:this.$=r[d].trim(),x.setAccTitle(this.$);break;case 17:case 18:this.$=r[d].trim(),x.setAccDescription(this.$);break;case 19:this.$=r[d-1];break;case 20:this.$=[Number(r[d-2]),...r[d]];break;case 21:this.$=[Number(r[d])];break;case 22:x.setXAxisTitle(r[d]);break;case 23:x.setXAxisTitle(r[d-1]);break;case 24:x.setXAxisTitle({type:"text",text:""});break;case 25:x.setXAxisBand(r[d]);break;case 26:x.setXAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 27:this.$=r[d-1];break;case 28:this.$=[r[d-2],...r[d]];break;case 29:this.$=[r[d]];break;case 30:x.setYAxisTitle(r[d]);break;case 31:x.setYAxisTitle(r[d-1]);break;case 32:x.setYAxisTitle({type:"text",text:""});break;case 33:x.setYAxisRangeData(Number(r[d-2]),Number(r[d]));break;case 37:this.$={text:r[d],type:"text"};break;case 38:this.$={text:r[d],type:"text"};break;case 39:this.$={text:r[d],type:"markdown"};break;case 40:this.$=r[d];break;case 41:this.$=r[d-1]+""+r[d];break}},"anonymous"),table:[e(t,i,{3:1,4:2,7:4,5:s,34:n,35:o,36:u}),{1:[3]},e(t,i,{4:2,7:4,3:8,5:s,34:n,35:o,36:u}),e(t,i,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:o,36:u}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},e(p,[2,34]),e(p,[2,35]),e(p,[2,36]),{1:[2,1]},e(t,i,{4:2,7:4,3:21,5:s,34:n,35:o,36:u}),{1:[2,3]},e(p,[2,5]),e(t,[2,7],{4:22,34:n,35:o,36:u}),{11:23,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:39,13:38,24:W,27:O,29:40,30:41,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:45,15:44,27:X,33:46,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:49,17:48,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{11:52,17:51,24:Y,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},{20:[1,53]},{22:[1,54]},e(S,[2,18]),{1:[2,2]},e(S,[2,8]),e(S,[2,9]),e(U,[2,37],{40:55,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l}),e(U,[2,38]),e(U,[2,39]),e(b,[2,40]),e(b,[2,42]),e(b,[2,43]),e(b,[2,44]),e(b,[2,45]),e(b,[2,46]),e(b,[2,47]),e(b,[2,48]),e(b,[2,49]),e(b,[2,50]),e(b,[2,51]),e(S,[2,10]),e(S,[2,22],{30:41,29:56,24:W,27:O}),e(S,[2,24]),e(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,11]),e(S,[2,30],{33:60,27:X}),e(S,[2,32]),{31:[1,61]},e(S,[2,12]),{17:62,24:Y},{25:63,27:w},e(S,[2,14]),{17:65,24:Y},e(S,[2,16]),e(S,[2,17]),e(b,[2,41]),e(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},e(S,[2,31]),{27:[1,69]},e(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},e(S,[2,15]),e(S,[2,26]),e(S,[2,27]),{11:59,32:72,37:24,38:f,39:T,40:27,41:P,42:_,43:y,44:E,45:v,46:L,47:I,48:m,49:R,50:l},e(S,[2,33]),e(S,[2,19]),{25:73,27:w},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(h,c){if(c.recoverable)this.trace(h);else{var g=new Error(h);throw g.hash=c,g}},"parseError"),parse:a(function(h){var c=this,g=[0],x=[],C=[null],r=[],rt=this.table,d="",ct=0,It=0,hi=2,Mt=1,li=r.slice.call(arguments,1),D=Object.create(this.lexer),$={yy:{}};for(var ft in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ft)&&($.yy[ft]=this.yy[ft]);D.setInput(h,$.yy),$.yy.lexer=D,$.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var pt=D.yylloc;r.push(pt);var ci=D.options&&D.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ui(B){g.length=g.length-2*B,C.length=C.length-B,r.length=r.length-B}a(ui,"popStack");function Vt(){var B;return B=x.pop()||D.lex()||Mt,typeof B!="number"&&(B instanceof Array&&(x=B,B=x.pop()),B=c.symbols_[B]||B),B}a(Vt,"lex");for(var M,q,z,mt,G={},ut,N,Bt,gt;;){if(q=g[g.length-1],this.defaultActions[q]?z=this.defaultActions[q]:((M===null||typeof M>"u")&&(M=Vt()),z=rt[q]&&rt[q][M]),typeof z>"u"||!z.length||!z[0]){var yt="";gt=[];for(ut in rt[q])this.terminals_[ut]&&ut>hi&>.push("'"+this.terminals_[ut]+"'");D.showPosition?yt="Parse error on line "+(ct+1)+`:
|
|
2
2
|
`+D.showPosition()+`
|
|
3
3
|
Expecting `+gt.join(", ")+", got '"+(this.terminals_[M]||M)+"'":yt="Parse error on line "+(ct+1)+": Unexpected "+(M==Mt?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(yt,{text:D.match,token:this.terminals_[M]||M,line:D.yylineno,loc:pt,expected:gt})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+M);switch(z[0]){case 1:g.push(M),C.push(D.yytext),r.push(D.yylloc),g.push(z[1]),M=null,It=D.yyleng,d=D.yytext,ct=D.yylineno,pt=D.yylloc;break;case 2:if(N=this.productions_[z[1]][1],G.$=C[C.length-N],G._$={first_line:r[r.length-(N||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(N||1)].first_column,last_column:r[r.length-1].last_column},ci&&(G._$.range=[r[r.length-(N||1)].range[0],r[r.length-1].range[1]]),mt=this.performAction.apply(G,[d,It,ct,$.yy,z[1],C,r].concat(li)),typeof mt<"u")return mt;N&&(g=g.slice(0,-1*N*2),C=C.slice(0,-1*N),r=r.slice(0,-1*N)),g.push(this.productions_[z[1]][0]),C.push(G.$),r.push(G._$),Bt=rt[g[g.length-2]][g[g.length-1]],g.push(Bt);break;case 3:return!0}}return!0},"parse")},k=function(){var F={EOF:1,parseError:a(function(c,g){if(this.yy.parser)this.yy.parser.parseError(c,g);else throw new Error(c)},"parseError"),setInput:a(function(h,c){return this.yy=c||this.yy||{},this._input=h,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var h=this._input[0];this.yytext+=h,this.yyleng++,this.offset++,this.match+=h,this.matched+=h;var c=h.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),h},"input"),unput:a(function(h){var c=h.length,g=h.split(/(?:\r\n?|\n)/g);this._input=h+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var x=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===x.length?this.yylloc.first_column:0)+x[x.length-g.length].length-g[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(h){this.unput(this.match.slice(h))},"less"),pastInput:a(function(){var h=this.matched.substr(0,this.matched.length-this.match.length);return(h.length>20?"...":"")+h.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var h=this.match;return h.length<20&&(h+=this._input.substr(0,20-h.length)),(h.substr(0,20)+(h.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var h=this.pastInput(),c=new Array(h.length+1).join("-");return h+this.upcomingInput()+`
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
if (dark) document.documentElement.classList.add('dark');
|
|
13
13
|
})();
|
|
14
14
|
</script>
|
|
15
|
-
<script type="module" crossorigin src="/assets/index-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
15
|
+
<script type="module" crossorigin src="/assets/index-DqAoYZwV.js"></script>
|
|
16
|
+
<link rel="stylesheet" crossorigin href="/assets/index-ByqxPEgU.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<div id="root"></div>
|
package/dist/server/cli.js
CHANGED
|
@@ -27210,6 +27210,9 @@ function buildAnalyzerMcpConfig() {
|
|
|
27210
27210
|
});
|
|
27211
27211
|
}
|
|
27212
27212
|
function buildAnalyzerPrompt(ctx) {
|
|
27213
|
+
if (ctx.kind === "event") {
|
|
27214
|
+
return buildEventPrompt(ctx);
|
|
27215
|
+
}
|
|
27213
27216
|
const lines = [];
|
|
27214
27217
|
lines.push("New user feedback received via the LaunchSecure beacon. Investigate, fix, test, and commit locally. DO NOT push \u2014 local commits only.");
|
|
27215
27218
|
lines.push("");
|
|
@@ -27307,6 +27310,55 @@ function buildAnalyzerPrompt(ctx) {
|
|
|
27307
27310
|
lines.push(` ${n++}. If any fix is non-trivial, ambiguous, or would touch many files, STOP and either (a) ask via \`AskUserQuestion\`, or (b) write a plan in your final response instead of editing. Better to leave the user a clear next-step than to commit a wrong change.`);
|
|
27308
27311
|
return lines.join("\n");
|
|
27309
27312
|
}
|
|
27313
|
+
function buildEventPrompt(ctx) {
|
|
27314
|
+
const lines = [];
|
|
27315
|
+
const userPrompt = (ctx.rulePrompt ?? "").trim();
|
|
27316
|
+
lines.push(
|
|
27317
|
+
userPrompt || "A LaunchSecure event matched a radar capture rule. Investigate and act on it. Make local commits only \u2014 DO NOT push."
|
|
27318
|
+
);
|
|
27319
|
+
lines.push("");
|
|
27320
|
+
lines.push("OUTPUT FORMAT \u2014 MANDATORY. Your VERY FIRST line of output, before any tool calls or thinking, must be:");
|
|
27321
|
+
lines.push(" `<bug|feature|cosmetic|question|other>: <one short sentence>`");
|
|
27322
|
+
lines.push("");
|
|
27323
|
+
lines.push("CONTEXT \u2014 auto-injected from the event that triggered this rule. Treat it as ground truth for what happened; the instruction above is your task.");
|
|
27324
|
+
if (ctx.eventType) lines.push(`- Event: ${ctx.eventType}`);
|
|
27325
|
+
if (ctx.eventMessage) lines.push(`- Summary: ${ctx.eventMessage}`);
|
|
27326
|
+
const metaLines = formatMetadataLines(ctx.eventMetadata ?? {});
|
|
27327
|
+
if (metaLines.length > 0) {
|
|
27328
|
+
lines.push("- Event fields:");
|
|
27329
|
+
for (const l of metaLines) lines.push(` ${l}`);
|
|
27330
|
+
}
|
|
27331
|
+
if (ctx.enrichedEntity) {
|
|
27332
|
+
lines.push("");
|
|
27333
|
+
lines.push("ENTITY DETAILS (fetched fresh from LaunchSecure at analysis time):");
|
|
27334
|
+
lines.push("```json");
|
|
27335
|
+
lines.push(safeJson(ctx.enrichedEntity));
|
|
27336
|
+
lines.push("```");
|
|
27337
|
+
} else if (ctx.entityRef && ctx.entityRef.kind !== "none") {
|
|
27338
|
+
lines.push(`- Linked ${ctx.entityRef.kind}: ${ctx.entityRef.id ?? "(id unavailable)"} (not prefetched \u2014 fetch via MCP if you need its details)`);
|
|
27339
|
+
}
|
|
27340
|
+
lines.push("");
|
|
27341
|
+
lines.push("TOOL DISCIPLINE \u2014 use the launch-chart MCP as the DEFAULT for code investigation (read_graph / inspect_node / grep_nodes); fall back to Read/Grep/Glob only when chart can't answer.");
|
|
27342
|
+
lines.push("");
|
|
27343
|
+
lines.push("PROCEDURE: emit the category line, carry out the instruction grounded in the CONTEXT above, keep changes minimal and scoped, run any relevant tests, and commit locally with a conventional message. DO NOT push. If the task is ambiguous or wide-reaching, STOP and ask via AskUserQuestion or leave a plan instead of editing.");
|
|
27344
|
+
return lines.join("\n");
|
|
27345
|
+
}
|
|
27346
|
+
function formatMetadataLines(md) {
|
|
27347
|
+
const SKIP = /* @__PURE__ */ new Set(["resourceType", "resourceId", "resource"]);
|
|
27348
|
+
const out = [];
|
|
27349
|
+
for (const [k, v] of Object.entries(md)) {
|
|
27350
|
+
if (SKIP.has(k) || v === null || v === void 0 || typeof v === "object") continue;
|
|
27351
|
+
out.push(`${k}: ${String(v)}`);
|
|
27352
|
+
}
|
|
27353
|
+
return out;
|
|
27354
|
+
}
|
|
27355
|
+
function safeJson(v) {
|
|
27356
|
+
try {
|
|
27357
|
+
return JSON.stringify(v, null, 2).slice(0, 4e3);
|
|
27358
|
+
} catch {
|
|
27359
|
+
return String(v);
|
|
27360
|
+
}
|
|
27361
|
+
}
|
|
27310
27362
|
function formatEventOffset(eventTs, capturedAt) {
|
|
27311
27363
|
if (!capturedAt) return `ts=${eventTs}`;
|
|
27312
27364
|
const diffMs = eventTs - new Date(capturedAt).getTime();
|
|
@@ -27568,6 +27620,131 @@ function parseBody(text) {
|
|
|
27568
27620
|
|
|
27569
27621
|
// src/server/radar/receiver.ts
|
|
27570
27622
|
var import_node_crypto5 = require("node:crypto");
|
|
27623
|
+
|
|
27624
|
+
// src/server/radar/rules.ts
|
|
27625
|
+
var WEBHOOK_LIFECYCLE_EVENTS = [
|
|
27626
|
+
"webhook.activated",
|
|
27627
|
+
"webhook.disabled",
|
|
27628
|
+
"webhook.deleted"
|
|
27629
|
+
];
|
|
27630
|
+
var COMMENT_TYPES = ["COMMENT_CREATED", "COMMENT_REPLY"];
|
|
27631
|
+
var BUILTIN_FEEDBACK_RULE = {
|
|
27632
|
+
id: "builtin-feedback",
|
|
27633
|
+
name: "Beacon feedback",
|
|
27634
|
+
enabled: true,
|
|
27635
|
+
trigger: "COMMENT_CREATED",
|
|
27636
|
+
filters: [],
|
|
27637
|
+
// the feedback predicate is special-cased (OR across sources)
|
|
27638
|
+
enrich: false,
|
|
27639
|
+
// beacon already fat-packs the context
|
|
27640
|
+
prompt: ""
|
|
27641
|
+
// empty → analyze.ts uses the built-in feedback template
|
|
27642
|
+
};
|
|
27643
|
+
function resolveRules(stored) {
|
|
27644
|
+
if (Array.isArray(stored) && stored.length > 0) {
|
|
27645
|
+
return stored;
|
|
27646
|
+
}
|
|
27647
|
+
return [BUILTIN_FEEDBACK_RULE];
|
|
27648
|
+
}
|
|
27649
|
+
function subscribedEventTypes(rules) {
|
|
27650
|
+
const set = new Set(WEBHOOK_LIFECYCLE_EVENTS);
|
|
27651
|
+
for (const rule of rules) {
|
|
27652
|
+
if (!rule.enabled) {
|
|
27653
|
+
continue;
|
|
27654
|
+
}
|
|
27655
|
+
if (COMMENT_TYPES.includes(rule.trigger)) {
|
|
27656
|
+
for (const t of COMMENT_TYPES) {
|
|
27657
|
+
set.add(t);
|
|
27658
|
+
}
|
|
27659
|
+
} else {
|
|
27660
|
+
set.add(rule.trigger);
|
|
27661
|
+
}
|
|
27662
|
+
}
|
|
27663
|
+
return [...set];
|
|
27664
|
+
}
|
|
27665
|
+
function isFeedbackPayload(payload) {
|
|
27666
|
+
if (!COMMENT_TYPES.includes(payload.type)) {
|
|
27667
|
+
return false;
|
|
27668
|
+
}
|
|
27669
|
+
const md = payload.metadata ?? {};
|
|
27670
|
+
const tags = extractTags(md).map((t) => t.toLowerCase());
|
|
27671
|
+
if (tags.includes("feedback") || tags.includes("bug")) {
|
|
27672
|
+
return true;
|
|
27673
|
+
}
|
|
27674
|
+
const resource = md.resource ?? {};
|
|
27675
|
+
if (resource.linkedResourceType === "feedback") {
|
|
27676
|
+
return true;
|
|
27677
|
+
}
|
|
27678
|
+
if (md.linkedResourceType === "feedback") {
|
|
27679
|
+
return true;
|
|
27680
|
+
}
|
|
27681
|
+
return false;
|
|
27682
|
+
}
|
|
27683
|
+
function extractTags(metadata) {
|
|
27684
|
+
const t = metadata?.tags;
|
|
27685
|
+
if (Array.isArray(t)) {
|
|
27686
|
+
return t.filter((x) => typeof x === "string");
|
|
27687
|
+
}
|
|
27688
|
+
return [];
|
|
27689
|
+
}
|
|
27690
|
+
function metaValue(metadata, field) {
|
|
27691
|
+
if (field === "tags") {
|
|
27692
|
+
return extractTags(metadata);
|
|
27693
|
+
}
|
|
27694
|
+
return metadata[field];
|
|
27695
|
+
}
|
|
27696
|
+
function filterMatches(filter, metadata) {
|
|
27697
|
+
const actual = metaValue(metadata, filter.field);
|
|
27698
|
+
switch (filter.op) {
|
|
27699
|
+
case "eq":
|
|
27700
|
+
return typeof filter.value === "string" && String(actual) === filter.value;
|
|
27701
|
+
case "in": {
|
|
27702
|
+
const wanted = Array.isArray(filter.value) ? filter.value : [filter.value];
|
|
27703
|
+
if (Array.isArray(actual)) {
|
|
27704
|
+
return actual.some((a) => wanted.includes(String(a)));
|
|
27705
|
+
}
|
|
27706
|
+
return wanted.includes(String(actual));
|
|
27707
|
+
}
|
|
27708
|
+
case "contains": {
|
|
27709
|
+
const needle = Array.isArray(filter.value) ? filter.value[0] ?? "" : filter.value;
|
|
27710
|
+
if (Array.isArray(actual)) {
|
|
27711
|
+
return actual.map(String).includes(needle);
|
|
27712
|
+
}
|
|
27713
|
+
return typeof actual === "string" && actual.includes(needle);
|
|
27714
|
+
}
|
|
27715
|
+
default:
|
|
27716
|
+
return false;
|
|
27717
|
+
}
|
|
27718
|
+
}
|
|
27719
|
+
function triggerMatches(rule, type) {
|
|
27720
|
+
if (COMMENT_TYPES.includes(rule.trigger)) {
|
|
27721
|
+
return COMMENT_TYPES.includes(type);
|
|
27722
|
+
}
|
|
27723
|
+
return rule.trigger === type;
|
|
27724
|
+
}
|
|
27725
|
+
function matchRule(payload, rules) {
|
|
27726
|
+
const md = payload.metadata ?? {};
|
|
27727
|
+
for (const rule of rules) {
|
|
27728
|
+
if (!rule.enabled) {
|
|
27729
|
+
continue;
|
|
27730
|
+
}
|
|
27731
|
+
if (!triggerMatches(rule, payload.type)) {
|
|
27732
|
+
continue;
|
|
27733
|
+
}
|
|
27734
|
+
if (rule.id === BUILTIN_FEEDBACK_RULE.id) {
|
|
27735
|
+
if (isFeedbackPayload(payload)) {
|
|
27736
|
+
return rule;
|
|
27737
|
+
}
|
|
27738
|
+
continue;
|
|
27739
|
+
}
|
|
27740
|
+
if (rule.filters.every((f) => filterMatches(f, md))) {
|
|
27741
|
+
return rule;
|
|
27742
|
+
}
|
|
27743
|
+
}
|
|
27744
|
+
return null;
|
|
27745
|
+
}
|
|
27746
|
+
|
|
27747
|
+
// src/server/radar/receiver.ts
|
|
27571
27748
|
var SIGNATURE_HEADER = "x-ls-signature";
|
|
27572
27749
|
var EVENT_HEADER = "x-ls-event";
|
|
27573
27750
|
var DELIVERY_HEADER = "x-ls-delivery";
|
|
@@ -27590,23 +27767,22 @@ function verifySignature(secret, signatureHeader, body) {
|
|
|
27590
27767
|
if (a.length !== b.length) return false;
|
|
27591
27768
|
return (0, import_node_crypto5.timingSafeEqual)(a, b);
|
|
27592
27769
|
}
|
|
27593
|
-
function
|
|
27594
|
-
const t = metadata?.tags;
|
|
27595
|
-
if (Array.isArray(t)) return t.filter((x) => typeof x === "string");
|
|
27596
|
-
return [];
|
|
27597
|
-
}
|
|
27598
|
-
function isFeedbackEvent(payload) {
|
|
27599
|
-
if (payload.type !== "COMMENT_CREATED" && payload.type !== "COMMENT_REPLY") return false;
|
|
27770
|
+
function buildEventContext(payload, rule) {
|
|
27600
27771
|
const md = payload.metadata ?? {};
|
|
27601
|
-
const
|
|
27602
|
-
|
|
27603
|
-
|
|
27604
|
-
|
|
27605
|
-
|
|
27606
|
-
|
|
27772
|
+
const isWorkItem = payload.type.startsWith("work_item.");
|
|
27773
|
+
const workItemId = typeof md.workItemId === "string" ? md.workItemId : typeof md.resourceId === "string" ? md.resourceId : void 0;
|
|
27774
|
+
return {
|
|
27775
|
+
kind: "event",
|
|
27776
|
+
eventType: payload.type,
|
|
27777
|
+
eventMessage: payload.message,
|
|
27778
|
+
eventMetadata: md,
|
|
27779
|
+
rulePrompt: rule.prompt,
|
|
27780
|
+
entityRef: rule.enrich && isWorkItem ? { kind: "work_item", id: workItemId } : { kind: "none" },
|
|
27781
|
+
body: payload.message
|
|
27782
|
+
};
|
|
27607
27783
|
}
|
|
27608
27784
|
function createReceiver(params) {
|
|
27609
|
-
const { state, callbacks } = params;
|
|
27785
|
+
const { state, callbacks, getRules } = params;
|
|
27610
27786
|
return (req, res) => {
|
|
27611
27787
|
const chunks = [];
|
|
27612
27788
|
req.on("data", (c) => chunks.push(c));
|
|
@@ -27636,7 +27812,7 @@ function createReceiver(params) {
|
|
|
27636
27812
|
res.end(JSON.stringify({ ok: true }));
|
|
27637
27813
|
const eventHeader = req.headers[EVENT_HEADER] ?? payload.type;
|
|
27638
27814
|
const deliveryId = req.headers[DELIVERY_HEADER] ?? "?";
|
|
27639
|
-
handlePayload(payload, eventHeader, deliveryId, state, callbacks);
|
|
27815
|
+
handlePayload(payload, eventHeader, deliveryId, state, callbacks, getRules);
|
|
27640
27816
|
});
|
|
27641
27817
|
req.on("error", () => {
|
|
27642
27818
|
try {
|
|
@@ -27647,7 +27823,7 @@ function createReceiver(params) {
|
|
|
27647
27823
|
});
|
|
27648
27824
|
};
|
|
27649
27825
|
}
|
|
27650
|
-
function handlePayload(payload, eventType, deliveryId, state, cb) {
|
|
27826
|
+
function handlePayload(payload, eventType, deliveryId, state, cb, getRules) {
|
|
27651
27827
|
switch (eventType) {
|
|
27652
27828
|
case "webhook.activated":
|
|
27653
27829
|
console.log(`[radar] \u25C9 webhook.activated (${deliveryId})`);
|
|
@@ -27661,15 +27837,16 @@ function handlePayload(payload, eventType, deliveryId, state, cb) {
|
|
|
27661
27837
|
console.log(`[radar] \u2717 webhook.deleted (${deliveryId}) \u2014 re-registering`);
|
|
27662
27838
|
cb.onDeleted();
|
|
27663
27839
|
return;
|
|
27664
|
-
default:
|
|
27665
|
-
|
|
27840
|
+
default: {
|
|
27841
|
+
const rule = matchRule(payload, getRules());
|
|
27842
|
+
if (!rule) {
|
|
27666
27843
|
return;
|
|
27667
27844
|
}
|
|
27668
27845
|
if (state.hasSeen(payload.id)) {
|
|
27669
27846
|
console.log(`[radar] dup ${payload.id} \u2014 skipping`);
|
|
27670
27847
|
return;
|
|
27671
27848
|
}
|
|
27672
|
-
const context = buildContext(payload);
|
|
27849
|
+
const context = rule.id === BUILTIN_FEEDBACK_RULE.id ? buildContext(payload) : buildEventContext(payload, rule);
|
|
27673
27850
|
const threadId = extractThreadId(payload);
|
|
27674
27851
|
const ping = {
|
|
27675
27852
|
id: payload.id,
|
|
@@ -27677,14 +27854,17 @@ function handlePayload(payload, eventType, deliveryId, state, cb) {
|
|
|
27677
27854
|
receivedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
27678
27855
|
threadId,
|
|
27679
27856
|
context,
|
|
27680
|
-
state: "queued"
|
|
27857
|
+
state: "queued",
|
|
27681
27858
|
// analyzer flips to 'analyzing' on pickup
|
|
27859
|
+
ruleId: rule.id,
|
|
27860
|
+
ruleName: rule.name
|
|
27682
27861
|
};
|
|
27683
27862
|
const appended = state.appendPingIfNew(ping);
|
|
27684
27863
|
if (appended) {
|
|
27685
|
-
console.log(`[radar] \u25C9 ping: "${ping.title}" (${deliveryId})`);
|
|
27864
|
+
console.log(`[radar] \u25C9 ping [${rule.name}]: "${ping.title}" (${deliveryId})`);
|
|
27686
27865
|
cb.onPing(ping);
|
|
27687
27866
|
}
|
|
27867
|
+
}
|
|
27688
27868
|
}
|
|
27689
27869
|
}
|
|
27690
27870
|
function extractThreadId(payload) {
|
|
@@ -27803,9 +27983,10 @@ async function registerOrRefresh(params) {
|
|
|
27803
27983
|
}
|
|
27804
27984
|
if (existing) {
|
|
27805
27985
|
try {
|
|
27806
|
-
const updated = await params.mcp.call("
|
|
27986
|
+
const updated = await params.mcp.call("launchpod_webhook_update", {
|
|
27807
27987
|
endpoint_id: existing.endpointId,
|
|
27808
|
-
url: receiverUrl
|
|
27988
|
+
url: receiverUrl,
|
|
27989
|
+
event_types: eventTypes
|
|
27809
27990
|
});
|
|
27810
27991
|
params.state.setRegistration({
|
|
27811
27992
|
endpointId: existing.endpointId,
|
|
@@ -28043,6 +28224,12 @@ var RadarState = class {
|
|
|
28043
28224
|
p.context.screenshotLocalPath = path13;
|
|
28044
28225
|
});
|
|
28045
28226
|
}
|
|
28227
|
+
/** Persist entity details fetched (via MCP) for a rule with enrich=true. */
|
|
28228
|
+
setEnrichedEntity(id, entity) {
|
|
28229
|
+
return this.mutate(id, (p) => {
|
|
28230
|
+
p.context.enrichedEntity = entity;
|
|
28231
|
+
});
|
|
28232
|
+
}
|
|
28046
28233
|
/**
|
|
28047
28234
|
* Wipe all analysis-result fields so the ping can be re-enqueued from a
|
|
28048
28235
|
* clean state. Preserves immutable identity fields (id, threadId, title,
|
|
@@ -28678,6 +28865,8 @@ var Radar = class _Radar {
|
|
|
28678
28865
|
}
|
|
28679
28866
|
this.tunnel = tunnel;
|
|
28680
28867
|
this.maxConcurrent = parsePositiveInt(process.env.RADAR_MAX_CONCURRENT_ANALYSES);
|
|
28868
|
+
this.rules = resolveRules(opts.rules);
|
|
28869
|
+
console.log(`[radar] ${this.rules.length} capture rule(s): ${this.rules.map((r) => r.name).join(", ")}`);
|
|
28681
28870
|
const callbacks = {
|
|
28682
28871
|
onLive: () => this.handleLive(),
|
|
28683
28872
|
onDeactivated: () => this.handleDeactivated(),
|
|
@@ -28686,7 +28875,7 @@ var Radar = class _Radar {
|
|
|
28686
28875
|
},
|
|
28687
28876
|
onPing: (ping) => this.handlePing(ping)
|
|
28688
28877
|
};
|
|
28689
|
-
this.receiver = createReceiver({ state: this.state, callbacks });
|
|
28878
|
+
this.receiver = createReceiver({ state: this.state, callbacks, getRules: () => this.rules });
|
|
28690
28879
|
}
|
|
28691
28880
|
static {
|
|
28692
28881
|
// Tunnel provider is hardcoded for now — radar today cannot function
|
|
@@ -28772,7 +28961,8 @@ var Radar = class _Radar {
|
|
|
28772
28961
|
const result = await registerOrRefresh({
|
|
28773
28962
|
mcp: this.mcp,
|
|
28774
28963
|
state: this.state,
|
|
28775
|
-
tunnelUrl: publicUrl
|
|
28964
|
+
tunnelUrl: publicUrl,
|
|
28965
|
+
eventTypes: subscribedEventTypes(this.rules)
|
|
28776
28966
|
});
|
|
28777
28967
|
if (result.approvalStatus === "approved") {
|
|
28778
28968
|
this.status = "live";
|
|
@@ -28862,6 +29052,21 @@ var Radar = class _Radar {
|
|
|
28862
29052
|
}
|
|
28863
29053
|
}
|
|
28864
29054
|
}
|
|
29055
|
+
const ref = ping.context.entityRef;
|
|
29056
|
+
if (ref && ref.kind === "work_item" && ref.id) {
|
|
29057
|
+
try {
|
|
29058
|
+
const item = await this.mcp.call("work_item_get", { item_id: ref.id });
|
|
29059
|
+
if (item && typeof item === "object") {
|
|
29060
|
+
const u = this.state.setEnrichedEntity(ping.id, item);
|
|
29061
|
+
if (u) {
|
|
29062
|
+
ping = u;
|
|
29063
|
+
this.broadcastPingState(u);
|
|
29064
|
+
}
|
|
29065
|
+
}
|
|
29066
|
+
} catch (err2) {
|
|
29067
|
+
console.warn(`[radar] enrichment fetch failed for ${ping.id}: ${err2 instanceof Error ? err2.message : String(err2)}`);
|
|
29068
|
+
}
|
|
29069
|
+
}
|
|
28865
29070
|
const { sessionId } = await spawnAnalysisSession({ ping, projectDir: this.opts.projectRoot });
|
|
28866
29071
|
const updated = this.state.setAnalysisStarted(ping.id, sessionId);
|
|
28867
29072
|
console.log(`[radar] \u25B6 analyzing ${ping.id} \u2192 session ${sessionId.slice(-8)}`);
|
|
@@ -37767,6 +37972,35 @@ if (!__isMcpMode) {
|
|
|
37767
37972
|
console.log(row("Project", `${cfg.orgSlug} ${dim("/")} ${cfg.projectSlug}`));
|
|
37768
37973
|
console.log(row("Active on", localUrl));
|
|
37769
37974
|
console.log("");
|
|
37975
|
+
let radarRules = null;
|
|
37976
|
+
if (process.env.RADAR_RULES) {
|
|
37977
|
+
try {
|
|
37978
|
+
const parsed = JSON.parse(process.env.RADAR_RULES);
|
|
37979
|
+
if (Array.isArray(parsed)) {
|
|
37980
|
+
radarRules = parsed;
|
|
37981
|
+
}
|
|
37982
|
+
} catch {
|
|
37983
|
+
console.warn("[radar] RADAR_RULES is not valid JSON \u2014 using the built-in feedback rule");
|
|
37984
|
+
}
|
|
37985
|
+
} else {
|
|
37986
|
+
try {
|
|
37987
|
+
const bootstrapMcp = new ProjectMcpClient({
|
|
37988
|
+
serverUrl: cfg.serverUrl,
|
|
37989
|
+
pat: cfg.pat,
|
|
37990
|
+
orgSlug: cfg.orgSlug,
|
|
37991
|
+
projectSlug: cfg.projectSlug
|
|
37992
|
+
});
|
|
37993
|
+
const bundle = await bootstrapMcp.call("radar_bootstrap_get", {});
|
|
37994
|
+
if (Array.isArray(bundle?.radarRules) && bundle.radarRules.length > 0) {
|
|
37995
|
+
radarRules = bundle.radarRules;
|
|
37996
|
+
console.log(`[radar] loaded ${radarRules.length} capture rule(s) from rover config`);
|
|
37997
|
+
}
|
|
37998
|
+
} catch (err2) {
|
|
37999
|
+
console.warn(
|
|
38000
|
+
`[radar] could not fetch capture rules from radar_bootstrap_get (${err2 instanceof Error ? err2.message : String(err2)}) \u2014 using the built-in feedback rule`
|
|
38001
|
+
);
|
|
38002
|
+
}
|
|
38003
|
+
}
|
|
37770
38004
|
try {
|
|
37771
38005
|
radar = new Radar({
|
|
37772
38006
|
projectRoot: PROJECT_DIR,
|
|
@@ -37775,7 +38009,8 @@ if (!__isMcpMode) {
|
|
|
37775
38009
|
serverUrl: cfg.serverUrl,
|
|
37776
38010
|
pat: cfg.pat,
|
|
37777
38011
|
orgSlug: cfg.orgSlug,
|
|
37778
|
-
projectSlug: cfg.projectSlug
|
|
38012
|
+
projectSlug: cfg.projectSlug,
|
|
38013
|
+
rules: radarRules
|
|
37779
38014
|
});
|
|
37780
38015
|
} catch (err2) {
|
|
37781
38016
|
console.error(`${err2 instanceof Error ? err2.message : String(err2)}`);
|