lensmcp 1.14.0 → 1.16.0
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/bundled/dashboard.js +111 -9
- package/bundled/flow-app.js +1 -1
- package/bundled/main.js +6 -3
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +39 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/gateway-restart.sh +16 -0
- package/plugin/skills/using-lensmcp/SKILL.md +13 -0
package/bundled/dashboard.js
CHANGED
|
@@ -15453,7 +15453,8 @@ var FlowOriginTypeSchema = external_exports.enum([
|
|
|
15453
15453
|
"intersection-observer",
|
|
15454
15454
|
"mutation-observer",
|
|
15455
15455
|
"backend-response",
|
|
15456
|
-
"hmr-update"
|
|
15456
|
+
"hmr-update",
|
|
15457
|
+
"ai-turn"
|
|
15457
15458
|
]);
|
|
15458
15459
|
var TraceContextSchema = external_exports.object({
|
|
15459
15460
|
sessionId: external_exports.string(),
|
|
@@ -15494,7 +15495,8 @@ var EventSourceSchema = external_exports.enum([
|
|
|
15494
15495
|
"perf",
|
|
15495
15496
|
"security",
|
|
15496
15497
|
"gateway",
|
|
15497
|
-
"external"
|
|
15498
|
+
"external",
|
|
15499
|
+
"ai"
|
|
15498
15500
|
]);
|
|
15499
15501
|
var EventCategorySchema = external_exports.enum([
|
|
15500
15502
|
"build",
|
|
@@ -15513,7 +15515,8 @@ var EventCategorySchema = external_exports.enum([
|
|
|
15513
15515
|
"performance",
|
|
15514
15516
|
"security",
|
|
15515
15517
|
"deps",
|
|
15516
|
-
"cluster"
|
|
15518
|
+
"cluster",
|
|
15519
|
+
"ai"
|
|
15517
15520
|
]);
|
|
15518
15521
|
var SeveritySchema = external_exports.enum([
|
|
15519
15522
|
"debug",
|
|
@@ -19763,6 +19766,8 @@ function createLensSession() {
|
|
|
19763
19766
|
// servers/lensmcp-mcp/dist/flow-shape.js
|
|
19764
19767
|
function areaOf(event) {
|
|
19765
19768
|
const { source, category, title, kind } = event;
|
|
19769
|
+
if (source === "ai")
|
|
19770
|
+
return "ai";
|
|
19766
19771
|
if (kind?.startsWith("memory") || kind === "db-query")
|
|
19767
19772
|
return "data";
|
|
19768
19773
|
if (source === "gateway" || kind === "gateway-request")
|
|
@@ -19847,6 +19852,25 @@ function trimFlowEvent(event) {
|
|
|
19847
19852
|
detail = steps.map((s) => s.replace(/ @\d+ms$/, "")).join(" \u2192 ");
|
|
19848
19853
|
} else if (kind === "egress") {
|
|
19849
19854
|
detail = `${raw["method"] ?? "GET"} ${raw["host"] ?? ""} \u2192 ${raw["status"] ?? "?"}`;
|
|
19855
|
+
} else if (event.source === "ai") {
|
|
19856
|
+
if (kind === "ai-round") {
|
|
19857
|
+
const model = raw["model"] ?? {};
|
|
19858
|
+
const usage = raw["usage"] ?? {};
|
|
19859
|
+
const toolCalls = Array.isArray(raw["toolCalls"]) ? raw["toolCalls"] : [];
|
|
19860
|
+
const tok = `${num(usage["promptTokens"]) ?? "?"}\u2192${num(usage["completionTokens"]) ?? "?"} tok`;
|
|
19861
|
+
const tools = toolCalls.length ? ` \xB7 ${toolCalls.length} tool call${toolCalls.length === 1 ? "" : "s"}` : "";
|
|
19862
|
+
detail = `${model["provider"] ?? ""}/${model["model"] ?? ""} \xB7 ${tok}${tools}`;
|
|
19863
|
+
} else if (kind === "ai-turn-start") {
|
|
19864
|
+
const tools = Array.isArray(raw["tools"]) ? raw["tools"] : [];
|
|
19865
|
+
detail = `skill ${raw["skill"] ?? ""} \xB7 ${raw["output"] ?? ""}${tools.length ? " \xB7 tools: " + tools.join(", ") : ""}`;
|
|
19866
|
+
} else if (kind === "ai-tool-call") {
|
|
19867
|
+
const call = raw["call"] ?? {};
|
|
19868
|
+
const result = raw["result"] ?? {};
|
|
19869
|
+
detail = `${call["name"] ?? "tool"} ${result["error"] != null ? "\u2717 " + String(result["error"]) : "\u2713"}`;
|
|
19870
|
+
} else if (kind === "ai-turn-end") {
|
|
19871
|
+
const usage = raw["usage"] ?? {};
|
|
19872
|
+
detail = `${raw["ok"] === false ? "FAILED" : "ok"} \xB7 ${num(usage["promptTokens"]) ?? "?"}+${num(usage["completionTokens"]) ?? "?"} tok`;
|
|
19873
|
+
}
|
|
19850
19874
|
}
|
|
19851
19875
|
let sig;
|
|
19852
19876
|
if (kind === "db-query" && typeof raw["query"] === "string")
|
|
@@ -19882,6 +19906,11 @@ function trimFlowEvent(event) {
|
|
|
19882
19906
|
// to its own fetch-start (and thus the right gateway leg) even when
|
|
19883
19907
|
// same-URL responses arrive out of order.
|
|
19884
19908
|
...isCompletionMarker && num(raw["startedAt"]) !== void 0 ? { fetchStartedAt: num(raw["startedAt"]) } : {},
|
|
19909
|
+
// AI turns pass their WHOLE `raw` through (full prompt messages + full
|
|
19910
|
+
// completion + model + usage + tool calls, uncut) so the dashboard's AI
|
|
19911
|
+
// panel renders them without a re-fetch. `raw` is unconstrained, never
|
|
19912
|
+
// field-truncated — the full text is retained here and in flow_get.
|
|
19913
|
+
...event.source === "ai" ? { ai: raw } : {},
|
|
19885
19914
|
...detail ? { detail } : {},
|
|
19886
19915
|
...steps ? { steps } : {}
|
|
19887
19916
|
};
|
|
@@ -20563,6 +20592,12 @@ var PAGE = `<!doctype html>
|
|
|
20563
20592
|
.step-timing { color: #8aa0bd; margin: 4px 0 8px; }
|
|
20564
20593
|
.step-detail { color: #9ab27f; white-space: pre-wrap; word-break: break-word; background: #0a0f16; border: 1px solid #1c2430; border-radius: 8px; padding: 8px 10px; margin: 8px 0; max-height: 220px; overflow: auto; font: 11px ui-monospace, Menlo, monospace; }
|
|
20565
20594
|
.step-json { color: #7d92ad; white-space: pre-wrap; word-break: break-word; font: 11px ui-monospace, Menlo, monospace; max-height: 220px; overflow: auto; }
|
|
20595
|
+
/* ---- AI turn panel: readable prompt / completion / model / usage ---- */
|
|
20596
|
+
.ai-label { color: #b98cff; text-transform: uppercase; font-size: 10px; letter-spacing: .8px; margin: 12px 0 4px; font-weight: 700; }
|
|
20597
|
+
.ai-meta { color: #a9b6cd; font-size: 11.5px; margin: 3px 0; word-break: break-word; }
|
|
20598
|
+
.ai-meta b { color: #d9e6f3; font-weight: 600; }
|
|
20599
|
+
.ai-role { color: #7fa3cf; text-transform: uppercase; font-size: 9.5px; letter-spacing: .6px; margin: 8px 0 2px; }
|
|
20600
|
+
.ai-completion { color: #cbb7f0; border-color: #4a3a6e; }
|
|
20566
20601
|
.node-box.current { stroke-width: 2.8; }
|
|
20567
20602
|
.lane-label { font: 600 10px ui-monospace, Menlo, monospace; letter-spacing: 1px; opacity: .85; }
|
|
20568
20603
|
.lane-row { fill: rgba(255,255,255,0.018); }
|
|
@@ -20825,7 +20860,8 @@ var PAGE = `<!doctype html>
|
|
|
20825
20860
|
{ id: 'network', label: 'Network', color: '#b3812f' },
|
|
20826
20861
|
{ id: 'gateway', label: 'Gateway', color: '#2e8f8a' },
|
|
20827
20862
|
{ id: 'services', label: 'Services', color: '#2f8f53' },
|
|
20828
|
-
{ id: 'data', label: 'Data / DB', color: '#a8554e' }
|
|
20863
|
+
{ id: 'data', label: 'Data / DB', color: '#a8554e' },
|
|
20864
|
+
{ id: 'ai', label: 'AI', color: '#a371f7' }
|
|
20829
20865
|
];
|
|
20830
20866
|
function areaIndexOf(ev) {
|
|
20831
20867
|
var id = ev.area || 'browser';
|
|
@@ -21018,6 +21054,66 @@ var PAGE = `<!doctype html>
|
|
|
21018
21054
|
setStep(keepIdx, true);
|
|
21019
21055
|
}
|
|
21020
21056
|
|
|
21057
|
+
// ---- AI turn panel: labelled prompt / completion / model / usage / tools ----
|
|
21058
|
+
// The full (uncut) prompt messages + completion text live on ev.ai (passed
|
|
21059
|
+
// through by flow-shape's trimFlowEvent). This renders them as readable
|
|
21060
|
+
// sections rather than a raw JSON dump.
|
|
21061
|
+
function aiText(v) {
|
|
21062
|
+
if (v == null) return '';
|
|
21063
|
+
if (typeof v === 'string') return v;
|
|
21064
|
+
try { return JSON.stringify(v, null, 2); } catch (e) { return String(v); }
|
|
21065
|
+
}
|
|
21066
|
+
function aiPanel(ev) {
|
|
21067
|
+
var ai = ev.ai || {};
|
|
21068
|
+
var kind = ai.kind;
|
|
21069
|
+
var out = [];
|
|
21070
|
+
function label(t) { out.push(el('div', 'ai-label', t)); }
|
|
21071
|
+
function meta(t) { out.push(el('div', 'ai-meta', t)); }
|
|
21072
|
+
function block(text, cls) { out.push(el('div', cls || 'step-detail', text)); }
|
|
21073
|
+
if (kind === 'ai-round') {
|
|
21074
|
+
var model = ai.model || {};
|
|
21075
|
+
meta('round ' + (ai.round != null ? ai.round : '?') + ' \xB7 ' + (model.provider || '') + '/' + (model.model || '') + (model.promptVersion ? ' \xB7 ' + model.promptVersion : ''));
|
|
21076
|
+
var u = ai.usage || {};
|
|
21077
|
+
meta('tokens: ' + (u.promptTokens != null ? u.promptTokens : '?') + ' prompt \u2192 ' + (u.completionTokens != null ? u.completionTokens : '?') + ' completion' + (u.costCents != null ? ' \xB7 ' + u.costCents + '\xA2' : ''));
|
|
21078
|
+
var prompt = Array.isArray(ai.prompt) ? ai.prompt : [];
|
|
21079
|
+
label('Prompt \xB7 ' + prompt.length + ' message' + (prompt.length === 1 ? '' : 's'));
|
|
21080
|
+
prompt.forEach(function (m) {
|
|
21081
|
+
out.push(el('div', 'ai-role', String((m && m.role) || '?').toUpperCase()));
|
|
21082
|
+
block(aiText(m && m.content != null ? m.content : m));
|
|
21083
|
+
});
|
|
21084
|
+
label('Completion');
|
|
21085
|
+
block(aiText(ai.completion), 'step-detail ai-completion');
|
|
21086
|
+
if (Array.isArray(ai.toolCalls) && ai.toolCalls.length) {
|
|
21087
|
+
label('Tool calls \xB7 ' + ai.toolCalls.length);
|
|
21088
|
+
block(aiText(ai.toolCalls));
|
|
21089
|
+
}
|
|
21090
|
+
} else if (kind === 'ai-turn-start') {
|
|
21091
|
+
meta('skill: ' + (ai.skill || '') + ' \xB7 output: ' + (ai.output || ''));
|
|
21092
|
+
if (Array.isArray(ai.capabilities) && ai.capabilities.length) meta('capabilities: ' + ai.capabilities.join(', '));
|
|
21093
|
+
meta('tenant: ' + (ai.tenantId || '\u2014') + ' \xB7 caller: ' + ((ai.caller && ai.caller.callerKind) || '\u2014') + (ai.caller && ai.caller.userId ? ' (' + ai.caller.userId + ')' : ''));
|
|
21094
|
+
if (Array.isArray(ai.tools) && ai.tools.length) { label('Tools \xB7 ' + ai.tools.length); block(ai.tools.join('\\n')); }
|
|
21095
|
+
if (ai.systemPrompt != null) { label('System prompt' + (ai.promptVersion ? ' \xB7 ' + ai.promptVersion : '')); block(aiText(ai.systemPrompt)); }
|
|
21096
|
+
if (ai.input != null) { label('Input'); block(aiText(ai.input)); }
|
|
21097
|
+
} else if (kind === 'ai-tool-call') {
|
|
21098
|
+
var call = ai.call || {}; var result = ai.result || {};
|
|
21099
|
+
meta('tool: ' + (call.name || '') + ' \xB7 round ' + (ai.round != null ? ai.round : '?'));
|
|
21100
|
+
label('Input'); block(aiText(call.input));
|
|
21101
|
+
if (result.error != null) { label('Error'); block(aiText(result.error)); }
|
|
21102
|
+
else { label('Output'); block(aiText(result.output)); }
|
|
21103
|
+
} else if (kind === 'ai-turn-end') {
|
|
21104
|
+
meta((ai.ok === false ? 'FAILED' : 'ok') + ' \xB7 skill: ' + (ai.skill || ''));
|
|
21105
|
+
var ue = ai.usage || {};
|
|
21106
|
+
meta('totals: ' + (ue.promptTokens != null ? ue.promptTokens : '?') + ' prompt + ' + (ue.completionTokens != null ? ue.completionTokens : '?') + ' completion' + (ue.costCents != null ? ' \xB7 ' + ue.costCents + '\xA2' : ''));
|
|
21107
|
+
if (Array.isArray(ai.modelPins) && ai.modelPins.length) { label('Model pins \xB7 per round'); block(aiText(ai.modelPins)); }
|
|
21108
|
+
if (ai.output != null) { label('Output'); block(aiText(ai.output)); }
|
|
21109
|
+
if (ai.error != null) { label('Error'); block(aiText(ai.error)); }
|
|
21110
|
+
if (ai.toolTrace != null) { label('Tool trace'); block(aiText(ai.toolTrace)); }
|
|
21111
|
+
} else {
|
|
21112
|
+
block(aiText(ai), 'step-json');
|
|
21113
|
+
}
|
|
21114
|
+
return out;
|
|
21115
|
+
}
|
|
21116
|
+
|
|
21021
21117
|
// Module-level step state so navigation survives re-renders of the same flow.
|
|
21022
21118
|
var stepState = null;
|
|
21023
21119
|
function setStep(i, keepScroll) {
|
|
@@ -21066,12 +21162,18 @@ var PAGE = `<!doctype html>
|
|
|
21066
21162
|
el('div', 'step-timing', '+' + Math.round(startAt - stepState.t0) + 'ms from flow start' +
|
|
21067
21163
|
(ev.durationMs != null ? ' \xB7 took ' + Math.round(ev.durationMs) + 'ms' : '')),
|
|
21068
21164
|
];
|
|
21069
|
-
if (ev.
|
|
21070
|
-
|
|
21071
|
-
|
|
21072
|
-
|
|
21165
|
+
if (ev.area === 'ai' && ev.ai) {
|
|
21166
|
+
// AI turn \u2192 readable prompt/completion/model/usage sections (not a dump)
|
|
21167
|
+
var aiNodes = aiPanel(ev);
|
|
21168
|
+
for (var an = 0; an < aiNodes.length; an++) children.push(aiNodes[an]);
|
|
21169
|
+
} else {
|
|
21170
|
+
if (ev.steps && ev.steps.length) {
|
|
21171
|
+
children.push(el('div', 'step-detail', ev.steps.map(function (s, n) { return (n + 1) + '. ' + s; }).join('\\n')));
|
|
21172
|
+
} else if (ev.detail) {
|
|
21173
|
+
children.push(el('div', 'step-detail', ev.detail));
|
|
21174
|
+
}
|
|
21175
|
+
children.push(el('div', 'step-json', JSON.stringify(ev, null, 2)));
|
|
21073
21176
|
}
|
|
21074
|
-
children.push(el('div', 'step-json', JSON.stringify(ev, null, 2)));
|
|
21075
21177
|
body.replaceChildren.apply(body, children);
|
|
21076
21178
|
}
|
|
21077
21179
|
document.getElementById('step-prev').addEventListener('click', function () {
|
package/bundled/flow-app.js
CHANGED
|
@@ -12,7 +12,7 @@ Error generating stack: `+o.message+`
|
|
|
12
12
|
`,`
|
|
13
13
|
+`).split(`
|
|
14
14
|
`)),d=c.reduce((s,f)=>s.concat(...f),[]);return[c,d]}return[[],[]]},[t]);return(0,D.useEffect)(()=>{let u=e?.target??Kb,c=e?.actInsideInputWithModifier??!0;if(t!==null){let d=m=>{if(l.current=m.ctrlKey||m.metaKey||m.shiftKey||m.altKey,(!l.current||l.current&&!c)&&ph(m))return!1;let x=$b(m.code,r);if(a.current.add(m[x]),jb(i,a.current,!1)){let b=m.composedPath?.()?.[0]||m.target,g=b?.nodeName==="BUTTON"||b?.nodeName==="A";e.preventDefault!==!1&&(l.current||!g)&&m.preventDefault(),o(!0)}},s=m=>{let y=$b(m.code,r);jb(i,a.current,!0)?(o(!1),a.current.clear()):a.current.delete(m[y]),m.key==="Meta"&&a.current.clear(),l.current=!1},f=()=>{a.current.clear(),o(!1)};return u?.addEventListener("keydown",d),u?.addEventListener("keyup",s),window.addEventListener("blur",f),window.addEventListener("contextmenu",f),()=>{u?.removeEventListener("keydown",d),u?.removeEventListener("keyup",s),window.removeEventListener("blur",f),window.removeEventListener("contextmenu",f)}}},[t,o]),n}function jb(t,e,n){return t.filter(o=>n||o.length===e.size).some(o=>o.every(l=>e.has(l)))}function $b(t,e){return e.includes(t)?"code":"key"}var jz=()=>{let t=Mt();return(0,D.useMemo)(()=>({zoomIn:async e=>{let{panZoom:n}=t.getState();return n?n.scaleBy(1.2,e):!1},zoomOut:async e=>{let{panZoom:n}=t.getState();return n?n.scaleBy(1/1.2,e):!1},zoomTo:async(e,n)=>{let{panZoom:o}=t.getState();return o?o.scaleTo(e,n):!1},getZoom:()=>t.getState().transform[2],setViewport:async(e,n)=>{let{transform:[o,l,a],panZoom:i}=t.getState();return i?(await i.setViewport({x:e.x??o,y:e.y??l,zoom:e.zoom??a},n),!0):!1},getViewport:()=>{let[e,n,o]=t.getState().transform;return{x:e,y:n,zoom:o}},setCenter:async(e,n,o)=>t.getState().setCenter(e,n,o),fitBounds:async(e,n)=>{let{width:o,height:l,minZoom:a,maxZoom:i,panZoom:r}=t.getState(),u=ji(e,o,l,a,i,n?.padding??.1);return r?(await r.setViewport(u,{duration:n?.duration,ease:n?.ease,interpolate:n?.interpolate}),!0):!1},screenToFlowPosition:(e,n={})=>{let{transform:o,snapGrid:l,snapToGrid:a,domNode:i}=t.getState();if(!i)return e;let{x:r,y:u}=i.getBoundingClientRect(),c={x:e.x-r,y:e.y-u},d=n.snapGrid??l,s=n.snapToGrid??a;return ul(c,o,s,d)},flowToScreenPosition:e=>{let{transform:n,domNode:o}=t.getState();if(!o)return e;let{x:l,y:a}=o.getBoundingClientRect(),i=al(e,n);return{x:i.x+l,y:i.y+a}}}),[])};function mx(t,e){let n=[],o=new Map,l=[];for(let a of t)if(a.type==="add"){l.push(a);continue}else if(a.type==="remove"||a.type==="replace")o.set(a.id,[a]);else{let i=o.get(a.id);i?i.push(a):o.set(a.id,[a])}for(let a of e){let i=o.get(a.id);if(!i){n.push(a);continue}if(i[0].type==="remove")continue;if(i[0].type==="replace"){n.push({...i[0].item});continue}let r={...a};for(let u of i)$z(u,r);n.push(r)}return l.length&&l.forEach(a=>{a.index!==void 0?n.splice(a.index,0,{...a.item}):n.push({...a.item})}),n}function $z(t,e){switch(t.type){case"select":{e.selected=t.selected;break}case"position":{typeof t.position<"u"&&(e.position=t.position),typeof t.dragging<"u"&&(e.dragging=t.dragging);break}case"dimensions":{typeof t.dimensions<"u"&&(e.measured={...t.dimensions},t.setAttributes&&((t.setAttributes===!0||t.setAttributes==="width")&&(e.width=t.dimensions.width),(t.setAttributes===!0||t.setAttributes==="height")&&(e.height=t.dimensions.height))),typeof t.resizing=="boolean"&&(e.resizing=t.resizing);break}}}function Jz(t,e){return mx(t,e)}function Iz(t,e){return mx(t,e)}function cl(t,e){return{id:t,type:"select",selected:e}}function va(t,e=new Set,n=!1){let o=[];for(let[l,a]of t){let i=e.has(l);!(a.selected===void 0&&!i)&&a.selected!==i&&(n&&(a.selected=i),o.push(cl(a.id,i)))}return o}function Jb({items:t=[],lookup:e}){let n=[],o=new Map(t.map(l=>[l.id,l]));for(let[l,a]of t.entries()){let i=e.get(a.id),r=i?.internals?.userNode??i;r!==void 0&&r!==a&&n.push({id:a.id,item:a,type:"replace"}),r===void 0&&n.push({item:a,type:"add",index:l})}for(let[l]of e)o.get(l)===void 0&&n.push({id:l,type:"remove"});return n}function Ib(t){return{id:t.id,type:"remove"}}var Wz=fh("React Flow","https://reactflow.dev/");function Fz(t,e,n={}){return rb(t,e,{...n,onError:n.onError??Wz})}var Wb=t=>F1(t),Pz=t=>ah(t);function px(t){return(0,D.forwardRef)(t)}var t3=typeof window<"u"?D.useLayoutEffect:D.useEffect;function Fb(t){let[e,n]=(0,D.useState)(BigInt(0)),[o]=(0,D.useState)(()=>e3(()=>n(l=>l+BigInt(1))));return t3(()=>{let l=o.get();l.length&&(t(l),o.reset())},[e]),o}function e3(t){let e=[];return{get:()=>e,reset:()=>{e=[]},push:n=>{e.push(n),t()}}}var yx=(0,D.createContext)(null);function n3({children:t}){let e=Mt(),n=(0,D.useCallback)(r=>{let{nodes:u=[],setNodes:c,hasDefaultNodes:d,onNodesChange:s,nodeLookup:f,fitViewQueued:m,onNodesChangeMiddlewareMap:y}=e.getState(),x=u;for(let g of r)x=typeof g=="function"?g(x):g;let b=Jb({items:x,lookup:f});for(let g of y.values())b=g(b);d&&c(x),b.length>0?s?.(b):m&&window.requestAnimationFrame(()=>{let{fitViewQueued:g,nodes:p,setNodes:h}=e.getState();g&&h(p)})},[]),o=Fb(n),l=(0,D.useCallback)(r=>{let{edges:u=[],setEdges:c,hasDefaultEdges:d,onEdgesChange:s,edgeLookup:f}=e.getState(),m=u;for(let y of r)m=typeof y=="function"?y(m):y;d?c(m):s&&s(Jb({items:m,lookup:f}))},[]),a=Fb(l),i=(0,D.useMemo)(()=>({nodeQueue:o,edgeQueue:a}),[]);return(0,O.jsx)(yx.Provider,{value:i,children:t})}function o3(){let t=(0,D.useContext)(yx);if(!t)throw new Error("useBatchContext must be used within a BatchProvider");return t}var l3=t=>!!t.panZoom;function Th(){let t=jz(),e=Mt(),n=o3(),o=ut(l3),l=(0,D.useMemo)(()=>{let a=s=>e.getState().nodeLookup.get(s),i=s=>{n.nodeQueue.push(s)},r=s=>{n.edgeQueue.push(s)},u=s=>{let{nodeLookup:f,nodeOrigin:m}=e.getState(),y=Wb(s)?s:f.get(s.id),x=y.parentId?hh(y.position,y.measured,y.parentId,f,m):y.position,b={...y,position:x,width:y.measured?.width??y.width,height:y.measured?.height??y.height};return rl(b)},c=(s,f,m={replace:!1})=>{i(y=>y.map(x=>{if(x.id===s){let b=typeof f=="function"?f(x):f;return m.replace&&Wb(b)?b:{...x,...b}}return x}))},d=(s,f,m={replace:!1})=>{r(y=>y.map(x=>{if(x.id===s){let b=typeof f=="function"?f(x):f;return m.replace&&Pz(b)?b:{...x,...b}}return x}))};return{getNodes:()=>e.getState().nodes.map(s=>({...s})),getNode:s=>a(s)?.internals.userNode,getInternalNode:a,getEdges:()=>{let{edges:s=[]}=e.getState();return s.map(f=>({...f}))},getEdge:s=>e.getState().edgeLookup.get(s),setNodes:i,setEdges:r,addNodes:s=>{let f=Array.isArray(s)?s:[s];n.nodeQueue.push(m=>[...m,...f])},addEdges:s=>{let f=Array.isArray(s)?s:[s];n.edgeQueue.push(m=>[...m,...f])},toObject:()=>{let{nodes:s=[],edges:f=[],transform:m}=e.getState(),[y,x,b]=m;return{nodes:s.map(g=>({...g})),edges:f.map(g=>({...g})),viewport:{x:y,y:x,zoom:b}}},deleteElements:async({nodes:s=[],edges:f=[]})=>{let{nodes:m,edges:y,onNodesDelete:x,onEdgesDelete:b,triggerNodeChanges:g,triggerEdgeChanges:p,onDelete:h,onBeforeDelete:v}=e.getState(),{nodes:_,edges:E}=await eb({nodesToRemove:s,edgesToRemove:f,nodes:m,edges:y,onBeforeDelete:v}),w=E.length>0,M=_.length>0;if(w){let N=E.map(Ib);b?.(E),p(N)}if(M){let N=_.map(Ib);x?.(_),g(N)}return(M||w)&&h?.({nodes:_,edges:E}),{deletedNodes:_,deletedEdges:E}},getIntersectingNodes:(s,f=!0,m)=>{let y=sh(s),x=y?s:u(s),b=m!==void 0;return x?(m||e.getState().nodes).filter(g=>{let p=e.getState().nodeLookup.get(g.id);if(p&&!y&&(g.id===s.id||!p.internals.positionAbsolute))return!1;let h=rl(b?g:p),v=ga(h,x);return f&&v>0||v>=h.width*h.height||v>=x.width*x.height}):[]},isNodeIntersecting:(s,f,m=!0)=>{let x=sh(s)?s:u(s);if(!x)return!1;let b=ga(x,f);return m&&b>0||b>=f.width*f.height||b>=x.width*x.height},updateNode:c,updateNodeData:(s,f,m={replace:!1})=>{c(s,y=>{let x=typeof f=="function"?f(y):f;return m.replace?{...y,data:x}:{...y,data:{...y.data,...x}}},m)},updateEdge:d,updateEdgeData:(s,f,m={replace:!1})=>{d(s,y=>{let x=typeof f=="function"?f(y):f;return m.replace?{...y,data:x}:{...y,data:{...y.data,...x}}},m)},getNodesBounds:s=>{let{nodeLookup:f,nodeOrigin:m}=e.getState();return rh(s,{nodeLookup:f,nodeOrigin:m})},getHandleConnections:({type:s,id:f,nodeId:m})=>Array.from(e.getState().connectionLookup.get(`${m}-${s}${f?`-${f}`:""}`)?.values()??[]),getNodeConnections:({type:s,handleId:f,nodeId:m})=>Array.from(e.getState().connectionLookup.get(`${m}${s?f?`-${s}-${f}`:`-${s}`:""}`)?.values()??[]),fitView:async s=>{let f=e.getState().fitViewResolver??ob();return e.setState({fitViewQueued:!0,fitViewOptions:s,fitViewResolver:f}),n.nodeQueue.push(m=>[...m]),f.promise}}},[]);return(0,D.useMemo)(()=>({...l,...t,viewportInitialized:o}),[o])}var Pb=t=>t.selected,a3=typeof window<"u"?window:void 0;function i3({deleteKeyCode:t,multiSelectionKeyCode:e}){let n=Mt(),{deleteElements:o}=Th(),l=Ji(t,{actInsideInputWithModifier:!1}),a=Ji(e,{target:a3});(0,D.useEffect)(()=>{if(l){let{edges:i,nodes:r}=n.getState();o({nodes:r.filter(Pb),edges:i.filter(Pb)}),n.setState({nodesSelectionActive:!1})}},[l]),(0,D.useEffect)(()=>{n.setState({multiSelectionActive:a})},[a])}function r3(t){let e=Mt();(0,D.useEffect)(()=>{let n=()=>{if(!t.current||!(t.current.checkVisibility?.()??!0))return!1;let o=hc(t.current);(o.height===0||o.width===0)&&e.getState().onError?.("004",Ee.error004()),e.setState({width:o.width||500,height:o.height||500})};if(t.current){n(),window.addEventListener("resize",n);let o=new ResizeObserver(()=>n());return o.observe(t.current),()=>{window.removeEventListener("resize",n),o&&t.current&&o.unobserve(t.current)}}},[])}var Ac={position:"absolute",width:"100%",height:"100%",top:0,left:0},u3=t=>({userSelectionActive:t.userSelectionActive,lib:t.lib,connectionInProgress:t.connection.inProgress});function c3({onPaneContextMenu:t,zoomOnScroll:e=!0,zoomOnPinch:n=!0,panOnScroll:o=!1,panOnScrollSpeed:l=.5,panOnScrollMode:a=Un.Free,zoomOnDoubleClick:i=!0,panOnDrag:r=!0,defaultViewport:u,translateExtent:c,minZoom:d,maxZoom:s,zoomActivationKeyCode:f,preventScrolling:m=!0,children:y,noWheelClassName:x,noPanClassName:b,onViewportChange:g,isControlledViewport:p,paneClickDistance:h,selectionOnDrag:v}){let _=Mt(),E=(0,D.useRef)(null),{userSelectionActive:w,lib:M,connectionInProgress:N}=ut(u3,_t),R=Ji(f),T=(0,D.useRef)();r3(E);let U=(0,D.useCallback)(Y=>{g?.({x:Y[0],y:Y[1],zoom:Y[2]}),p||_.setState({transform:Y})},[g,p]);return(0,D.useEffect)(()=>{if(E.current){T.current=Eb({domNode:E.current,minZoom:d,maxZoom:s,translateExtent:c,viewport:u,onDraggingChange:z=>_.setState(C=>C.paneDragging===z?C:{paneDragging:z}),onPanZoomStart:(z,C)=>{let{onViewportChangeStart:B,onMoveStart:H}=_.getState();H?.(z,C),B?.(C)},onPanZoom:(z,C)=>{let{onViewportChange:B,onMove:H}=_.getState();H?.(z,C),B?.(C)},onPanZoomEnd:(z,C)=>{let{onViewportChangeEnd:B,onMoveEnd:H}=_.getState();H?.(z,C),B?.(C)}});let{x:Y,y:S,zoom:A}=T.current.getViewport();return _.setState({panZoom:T.current,transform:[Y,S,A],domNode:E.current.closest(".react-flow")}),()=>{T.current?.destroy()}}},[]),(0,D.useEffect)(()=>{T.current?.update({onPaneContextMenu:t,zoomOnScroll:e,zoomOnPinch:n,panOnScroll:o,panOnScrollSpeed:l,panOnScrollMode:a,zoomOnDoubleClick:i,panOnDrag:r,zoomActivationKeyPressed:R,preventScrolling:m,noPanClassName:b,userSelectionActive:w,noWheelClassName:x,lib:M,onTransformChange:U,connectionInProgress:N,selectionOnDrag:v,paneClickDistance:h})},[t,e,n,o,l,a,i,r,R,m,b,w,x,M,U,N,v,h]),(0,O.jsx)("div",{className:"react-flow__renderer",ref:E,style:Ac,children:y})}var s3=t=>({userSelectionActive:t.userSelectionActive,userSelectionRect:t.userSelectionRect});function f3(){let{userSelectionActive:t,userSelectionRect:e}=ut(s3,_t);return t&&e?(0,O.jsx)("div",{className:"react-flow__selection react-flow__container",style:{width:e.width,height:e.height,transform:`translate(${e.x}px, ${e.y}px)`}}):null}var Nh=(t,e)=>n=>{n.target===e.current&&t?.(n)},d3=t=>({userSelectionActive:t.userSelectionActive,elementsSelectable:t.elementsSelectable,connectionInProgress:t.connection.inProgress,dragging:t.paneDragging,panBy:t.panBy,autoPanSpeed:t.autoPanSpeed});function h3({isSelecting:t,selectionKeyPressed:e,selectionMode:n=ol.Full,panOnDrag:o,autoPanOnSelection:l,paneClickDistance:a,selectionOnDrag:i,onSelectionStart:r,onSelectionEnd:u,onPaneClick:c,onPaneContextMenu:d,onPaneScroll:s,onPaneMouseEnter:f,onPaneMouseMove:m,onPaneMouseLeave:y,children:x}){let b=(0,D.useRef)(0),g=Mt(),{userSelectionActive:p,elementsSelectable:h,dragging:v,connectionInProgress:_,panBy:E,autoPanSpeed:w}=ut(d3,_t),M=h&&(t||p),N=(0,D.useRef)(null),R=(0,D.useRef)(),T=(0,D.useRef)(new Set),U=(0,D.useRef)(new Set),Y=(0,D.useRef)(!1),S=(0,D.useRef)({x:0,y:0}),A=(0,D.useRef)(!1),z=L=>{if(Y.current||_){Y.current=!1;return}c?.(L),g.getState().resetSelectedElements(),g.setState({nodesSelectionActive:!1})},C=L=>{if(Array.isArray(o)&&o?.includes(2)){L.preventDefault();return}d?.(L)},B=s?L=>s(L):void 0,H=L=>{Y.current&&(L.stopPropagation(),Y.current=!1)},q=L=>{let{domNode:Z,transform:et}=g.getState();if(R.current=Z?.getBoundingClientRect(),!R.current)return;let P=L.target===N.current;if(!P&&!!L.target.closest(".nokey")||!t||!(i&&P||e)||L.button!==0||!L.isPrimary)return;L.target?.setPointerCapture?.(L.pointerId),Y.current=!1;let{x:rt,y:ft}=Le(L.nativeEvent,R.current),Ct=ul({x:rt,y:ft},et);g.setState({userSelectionRect:{width:0,height:0,startX:Ct.x,startY:Ct.y,x:rt,y:ft}}),P||(L.stopPropagation(),L.preventDefault())};function X(L,Z){let{userSelectionRect:et}=g.getState();if(!et)return;let{transform:P,nodeLookup:j,edgeLookup:I,connectionLookup:rt,triggerNodeChanges:ft,triggerEdgeChanges:Ct,defaultEdgeOptions:le}=g.getState(),rn={x:et.startX,y:et.startY},{x:je,y:$e}=al(rn,P),un={startX:rn.x,startY:rn.y,x:L<je?L:je,y:Z<$e?Z:$e,width:Math.abs(L-je),height:Math.abs(Z-$e)},ba=T.current,wo=U.current;T.current=new Set(cc(j,un,P,n===ol.Partial,!0).map(Ve=>Ve.id)),U.current=new Set;let Eo=le?.selectable??!0;for(let Ve of T.current){let cn=rt.get(Ve);if(cn)for(let{edgeId:sn}of cn.values()){let Mo=I.get(sn);Mo&&(Mo.selectable??Eo)&&U.current.add(sn)}}if(!gh(ba,T.current)){let Ve=va(j,T.current,!0);ft(Ve)}if(!gh(wo,U.current)){let Ve=va(I,U.current);Ct(Ve)}g.setState({userSelectionRect:un,userSelectionActive:!0,nodesSelectionActive:!1})}function V(){if(!l||!R.current)return;let[L,Z]=sc(S.current,R.current,w);E({x:L,y:Z}).then(et=>{if(!Y.current||!et){b.current=requestAnimationFrame(V);return}let{x:P,y:j}=S.current;X(P,j),b.current=requestAnimationFrame(V)})}let K=()=>{cancelAnimationFrame(b.current),b.current=0,A.current=!1};(0,D.useEffect)(()=>()=>K(),[]);let G=L=>{let{userSelectionRect:Z,transform:et,resetSelectedElements:P}=g.getState();if(!R.current||!Z)return;let{x:j,y:I}=Le(L.nativeEvent,R.current);S.current={x:j,y:I};let rt=al({x:Z.startX,y:Z.startY},et);if(!Y.current){let ft=e?0:a;if(Math.hypot(j-rt.x,I-rt.y)<=ft)return;P(),r?.(L)}Y.current=!0,A.current||(V(),A.current=!0),X(j,I)},J=L=>{L.button===0&&(L.target?.releasePointerCapture?.(L.pointerId),!p&&L.target===N.current&&g.getState().userSelectionRect&&z?.(L),g.setState({userSelectionActive:!1,userSelectionRect:null}),Y.current&&(u?.(L),g.setState({nodesSelectionActive:T.current.size>0})),K())},nt=L=>{L.target?.releasePointerCapture?.(L.pointerId),K()},$=o===!0||Array.isArray(o)&&o.includes(0);return(0,O.jsxs)("div",{className:At(["react-flow__pane",{draggable:$,dragging:v,selection:t}]),onClick:M?void 0:Nh(z,N),onContextMenu:Nh(C,N),onWheel:Nh(B,N),onPointerEnter:M?void 0:f,onPointerMove:M?G:m,onPointerUp:M?J:void 0,onPointerCancel:M?nt:void 0,onPointerDownCapture:M?q:void 0,onClickCapture:M?H:void 0,onPointerLeave:y,ref:N,style:Ac,children:[x,(0,O.jsx)(f3,{})]})}function Ah({id:t,store:e,unselect:n=!1,nodeRef:o}){let{addSelectedNodes:l,unselectNodesAndEdges:a,multiSelectionActive:i,nodeLookup:r,onError:u}=e.getState(),c=r.get(t);if(!c){u?.("012",Ee.error012(t));return}e.setState({nodesSelectionActive:!1}),c.selected?(n||c.selected&&i)&&(a({nodes:[c],edges:[]}),requestAnimationFrame(()=>o?.current?.blur())):l([t])}function vx({nodeRef:t,disabled:e=!1,noDragClassName:n,handleSelector:o,nodeId:l,isSelectable:a,nodeClickDistance:i}){let r=Mt(),[u,c]=(0,D.useState)(!1),d=(0,D.useRef)();return(0,D.useEffect)(()=>{d.current=pb({getStoreItems:()=>r.getState(),onNodeMouseDown:s=>{Ah({id:s,store:r,nodeRef:t})},onDragStart:()=>{c(!0)},onDragStop:()=>{c(!1)}})},[]),(0,D.useEffect)(()=>{if(!(e||!t.current||!d.current))return d.current.update({noDragClassName:n,handleSelector:o,domNode:t.current,isSelectable:a,nodeId:l,nodeClickDistance:i}),()=>{d.current?.destroy()}},[n,o,e,a,t,l,i]),u}var g3=t=>e=>e.selected&&(e.draggable||t&&typeof e.draggable>"u");function bx(){let t=Mt();return(0,D.useCallback)(n=>{let{nodeExtent:o,snapToGrid:l,snapGrid:a,nodesDraggable:i,onError:r,updateNodePositions:u,nodeLookup:c,nodeOrigin:d}=t.getState(),s=new Map,f=g3(i),m=l?a[0]:5,y=l?a[1]:5,x=n.direction.x*m*n.factor,b=n.direction.y*y*n.factor;for(let[,g]of c){if(!f(g))continue;let p={x:g.internals.positionAbsolute.x+x,y:g.internals.positionAbsolute.y+b};l&&(p=ma(p,a));let{position:h,positionAbsolute:v}=uh({nodeId:g.id,nextPosition:p,nodeLookup:c,nodeExtent:o,nodeOrigin:d,onError:r});g.position=h,g.internals.positionAbsolute=v,s.set(g.id,g)}u(s)},[])}var Ch=(0,D.createContext)(null),m3=Ch.Provider;Ch.Consumer;var xx=()=>(0,D.useContext)(Ch),p3=t=>({connectOnClick:t.connectOnClick,noPanClassName:t.noPanClassName,rfId:t.rfId}),y3=(t,e,n)=>o=>{let{connectionClickStartHandle:l,connectionMode:a,connection:i}=o,{fromHandle:r,toHandle:u,isValid:c}=i,d=u?.nodeId===t&&u?.id===e&&u?.type===n;return{connectingFrom:r?.nodeId===t&&r?.id===e&&r?.type===n,connectingTo:d,clickConnecting:l?.nodeId===t&&l?.id===e&&l?.type===n,isPossibleEndHandle:a===vo.Strict?r?.type!==n:t!==r?.nodeId||e!==r?.id,connectionInProcess:!!r,clickConnectionInProcess:!!l,valid:d&&c}};function v3({type:t="source",position:e=Q.Top,isValidConnection:n,isConnectable:o=!0,isConnectableStart:l=!0,isConnectableEnd:a=!0,id:i,onConnect:r,children:u,className:c,onMouseDown:d,onTouchStart:s,...f},m){let y=i||null,x=t==="target",b=Mt(),g=xx(),{connectOnClick:p,noPanClassName:h,rfId:v}=ut(p3,_t),{connectingFrom:_,connectingTo:E,clickConnecting:w,isPossibleEndHandle:M,connectionInProcess:N,clickConnectionInProcess:R,valid:T}=ut(y3(g,y,t),_t);g||b.getState().onError?.("010",Ee.error010());let U=A=>{let{defaultEdgeOptions:z,onConnect:C,hasDefaultEdges:B}=b.getState(),H={...z,...A};if(B){let{edges:q,setEdges:X,onError:V}=b.getState();X(Fz(H,q,{onError:V}))}C?.(H),r?.(H)},Y=A=>{if(!g)return;let z=yh(A.nativeEvent);if(l&&(z&&A.button===0||!z)){let C=b.getState();xc.onPointerDown(A.nativeEvent,{handleDomNode:A.currentTarget,autoPanOnConnect:C.autoPanOnConnect,connectionMode:C.connectionMode,connectionRadius:C.connectionRadius,domNode:C.domNode,nodeLookup:C.nodeLookup,lib:C.lib,isTarget:x,handleId:y,nodeId:g,flowId:C.rfId,panBy:C.panBy,cancelConnection:C.cancelConnection,onConnectStart:C.onConnectStart,onConnectEnd:(...B)=>b.getState().onConnectEnd?.(...B),updateConnection:C.updateConnection,onConnect:U,isValidConnection:n||((...B)=>b.getState().isValidConnection?.(...B)??!0),getTransform:()=>b.getState().transform,getFromHandle:()=>b.getState().connection.fromHandle,autoPanSpeed:C.autoPanSpeed,dragThreshold:C.connectionDragThreshold})}z?d?.(A):s?.(A)},S=A=>{let{onClickConnectStart:z,onClickConnectEnd:C,connectionClickStartHandle:B,connectionMode:H,isValidConnection:q,lib:X,rfId:V,nodeLookup:K,connection:G}=b.getState();if(!g||!B&&!l)return;if(!B){z?.(A.nativeEvent,{nodeId:g,handleId:y,handleType:t}),b.setState({connectionClickStartHandle:{nodeId:g,type:t,id:y}});return}let J=mh(A.target),nt=n||q,{connection:$,isValid:L}=xc.isValid(A.nativeEvent,{handle:{nodeId:g,id:y,type:t},connectionMode:H,fromNodeId:B.nodeId,fromHandleId:B.id||null,fromType:B.type,isValidConnection:nt,flowId:V,doc:J,lib:X,nodeLookup:K});L&&$&&U($);let Z=structuredClone(G);delete Z.inProgress,Z.toPosition=Z.toHandle?Z.toHandle.position:null,C?.(A,Z),b.setState({connectionClickStartHandle:null})};return(0,O.jsx)("div",{"data-handleid":y,"data-nodeid":g,"data-handlepos":e,"data-id":`${v}-${g}-${y}-${t}`,className:At(["react-flow__handle",`react-flow__handle-${e}`,"nodrag",h,c,{source:!x,target:x,connectable:o,connectablestart:l,connectableend:a,clickconnecting:w,connectingfrom:_,connectingto:E,valid:T,connectionindicator:o&&(!N||M)&&(N||R?a:l)}]),onMouseDown:Y,onTouchStart:Y,onClick:p?S:void 0,ref:m,...f,children:u})}var sl=(0,D.memo)(px(v3));function b3({data:t,isConnectable:e,sourcePosition:n=Q.Bottom}){return(0,O.jsxs)(O.Fragment,{children:[t?.label,(0,O.jsx)(sl,{type:"source",position:n,isConnectable:e})]})}function x3({data:t,isConnectable:e,targetPosition:n=Q.Top,sourcePosition:o=Q.Bottom}){return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(sl,{type:"target",position:n,isConnectable:e}),t?.label,(0,O.jsx)(sl,{type:"source",position:o,isConnectable:e})]})}function S3(){return null}function _3({data:t,isConnectable:e,targetPosition:n=Q.Top}){return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(sl,{type:"target",position:n,isConnectable:e}),t?.label]})}var Mc={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},tx={input:b3,default:x3,output:_3,group:S3};function w3(t){return t.internals.handleBounds===void 0?{width:t.width??t.initialWidth??t.style?.width,height:t.height??t.initialHeight??t.style?.height}:{width:t.width??t.style?.width,height:t.height??t.style?.height}}var E3=t=>{let{width:e,height:n,x:o,y:l}=ha(t.nodeLookup,{filter:a=>!!a.selected});return{width:ke(e)?e:null,height:ke(n)?n:null,userSelectionActive:t.userSelectionActive,transformString:`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]}) translate(${o}px,${l}px)`}};function M3({onSelectionContextMenu:t,noPanClassName:e,disableKeyboardA11y:n}){let o=Mt(),{width:l,height:a,transformString:i,userSelectionActive:r}=ut(E3,_t),u=bx(),c=(0,D.useRef)(null);(0,D.useEffect)(()=>{n||c.current?.focus({preventScroll:!0})},[n]);let d=!r&&l!==null&&a!==null;if(vx({nodeRef:c,disabled:!d}),!d)return null;let s=t?m=>{let y=o.getState().nodes.filter(x=>x.selected);t(m,y)}:void 0,f=m=>{Object.prototype.hasOwnProperty.call(Mc,m.key)&&(m.preventDefault(),u({direction:Mc[m.key],factor:m.shiftKey?4:1}))};return(0,O.jsx)("div",{className:At(["react-flow__nodesselection","react-flow__container",e]),style:{transform:i},children:(0,O.jsx)("div",{ref:c,className:"react-flow__nodesselection-rect",onContextMenu:s,tabIndex:n?void 0:-1,onKeyDown:n?void 0:f,style:{width:l,height:a}})})}var ex=typeof window<"u"?window:void 0,N3=t=>({nodesSelectionActive:t.nodesSelectionActive,userSelectionActive:t.userSelectionActive});function Sx({children:t,onPaneClick:e,onPaneMouseEnter:n,onPaneMouseMove:o,onPaneMouseLeave:l,onPaneContextMenu:a,onPaneScroll:i,paneClickDistance:r,deleteKeyCode:u,selectionKeyCode:c,selectionOnDrag:d,selectionMode:s,onSelectionStart:f,onSelectionEnd:m,multiSelectionKeyCode:y,panActivationKeyCode:x,zoomActivationKeyCode:b,elementsSelectable:g,zoomOnScroll:p,zoomOnPinch:h,panOnScroll:v,panOnScrollSpeed:_,panOnScrollMode:E,zoomOnDoubleClick:w,panOnDrag:M,autoPanOnSelection:N,defaultViewport:R,translateExtent:T,minZoom:U,maxZoom:Y,preventScrolling:S,onSelectionContextMenu:A,noWheelClassName:z,noPanClassName:C,disableKeyboardA11y:B,onViewportChange:H,isControlledViewport:q}){let{nodesSelectionActive:X,userSelectionActive:V}=ut(N3,_t),K=Ji(c,{target:ex}),G=Ji(x,{target:ex}),J=G||M,nt=G||v,$=d&&J!==!0,L=K||V||$;return i3({deleteKeyCode:u,multiSelectionKeyCode:y}),(0,O.jsx)(c3,{onPaneContextMenu:a,elementsSelectable:g,zoomOnScroll:p,zoomOnPinch:h,panOnScroll:nt,panOnScrollSpeed:_,panOnScrollMode:E,zoomOnDoubleClick:w,panOnDrag:!K&&J,defaultViewport:R,translateExtent:T,minZoom:U,maxZoom:Y,zoomActivationKeyCode:b,preventScrolling:S,noWheelClassName:z,noPanClassName:C,onViewportChange:H,isControlledViewport:q,paneClickDistance:r,selectionOnDrag:$,children:(0,O.jsxs)(h3,{onSelectionStart:f,onSelectionEnd:m,onPaneClick:e,onPaneMouseEnter:n,onPaneMouseMove:o,onPaneMouseLeave:l,onPaneContextMenu:a,onPaneScroll:i,panOnDrag:J,autoPanOnSelection:N,isSelecting:!!L,selectionMode:s,selectionKeyPressed:K,paneClickDistance:r,selectionOnDrag:$,children:[t,X&&(0,O.jsx)(M3,{onSelectionContextMenu:A,noPanClassName:C,disableKeyboardA11y:B})]})})}Sx.displayName="FlowRenderer";var z3=(0,D.memo)(Sx),A3=t=>e=>t?cc(e.nodeLookup,{x:0,y:0,width:e.width,height:e.height},e.transform,!0).map(n=>n.id):Array.from(e.nodeLookup.keys());function T3(t){return ut((0,D.useCallback)(A3(t),[t]),_t)}var C3=t=>t.updateNodeInternals;function O3(){let t=ut(C3),[e]=(0,D.useState)(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(n=>{let o=new Map;n.forEach(l=>{let a=l.target.getAttribute("data-id");o.set(a,{id:a,nodeElement:l.target,force:!0})}),t(o)}));return(0,D.useEffect)(()=>()=>{e?.disconnect()},[e]),e}function D3({node:t,nodeType:e,hasDimensions:n,resizeObserver:o}){let l=Mt(),a=(0,D.useRef)(null),i=(0,D.useRef)(null),r=(0,D.useRef)(t.sourcePosition),u=(0,D.useRef)(t.targetPosition),c=(0,D.useRef)(e),d=n&&!!t.internals.handleBounds;return(0,D.useEffect)(()=>{a.current&&!t.hidden&&(!d||i.current!==a.current)&&(i.current&&o?.unobserve(i.current),o?.observe(a.current),i.current=a.current)},[d,t.hidden]),(0,D.useEffect)(()=>()=>{i.current&&(o?.unobserve(i.current),i.current=null)},[]),(0,D.useEffect)(()=>{if(a.current){let s=c.current!==e,f=r.current!==t.sourcePosition,m=u.current!==t.targetPosition;(s||f||m)&&(c.current=e,r.current=t.sourcePosition,u.current=t.targetPosition,l.getState().updateNodeInternals(new Map([[t.id,{id:t.id,nodeElement:a.current,force:!0}]])))}},[t.id,e,t.sourcePosition,t.targetPosition]),a}function H3({id:t,onClick:e,onMouseEnter:n,onMouseMove:o,onMouseLeave:l,onContextMenu:a,onDoubleClick:i,nodesDraggable:r,elementsSelectable:u,nodesConnectable:c,nodesFocusable:d,resizeObserver:s,noDragClassName:f,noPanClassName:m,disableKeyboardA11y:y,rfId:x,nodeTypes:b,nodeClickDistance:g,onError:p}){let{node:h,internals:v,isParent:_}=ut(L=>{let Z=L.nodeLookup.get(t),et=L.parentLookup.has(t);return{node:Z,internals:Z.internals,isParent:et}},_t),E=h.type||"default",w=b?.[E]||tx[E];w===void 0&&(p?.("003",Ee.error003(E)),E="default",w=b?.default||tx.default);let M=!!(h.draggable||r&&typeof h.draggable>"u"),N=!!(h.selectable||u&&typeof h.selectable>"u"),R=!!(h.connectable||c&&typeof h.connectable>"u"),T=!!(h.focusable||d&&typeof h.focusable>"u"),U=Mt(),Y=dh(h),S=D3({node:h,nodeType:E,hasDimensions:Y,resizeObserver:s}),A=vx({nodeRef:S,disabled:h.hidden||!M,noDragClassName:f,handleSelector:h.dragHandle,nodeId:t,isSelectable:N,nodeClickDistance:g}),z=bx();if(h.hidden)return null;let C=an(h),B=w3(h),H=N||M||e||n||o||l,q=n?L=>n(L,{...v.userNode}):void 0,X=o?L=>o(L,{...v.userNode}):void 0,V=l?L=>l(L,{...v.userNode}):void 0,K=a?L=>a(L,{...v.userNode}):void 0,G=i?L=>i(L,{...v.userNode}):void 0,J=L=>{let{selectNodesOnDrag:Z,nodeDragThreshold:et}=U.getState();N&&(!Z||!M||et>0)&&Ah({id:t,store:U,nodeRef:S}),e&&e(L,{...v.userNode})},nt=L=>{if(!(ph(L.nativeEvent)||y)){if(eh.includes(L.key)&&N){let Z=L.key==="Escape";Ah({id:t,store:U,unselect:Z,nodeRef:S})}else if(M&&h.selected&&Object.prototype.hasOwnProperty.call(Mc,L.key)){L.preventDefault();let{ariaLabelConfig:Z}=U.getState();U.setState({ariaLiveMessage:Z["node.a11yDescription.ariaLiveMessage"]({direction:L.key.replace("Arrow","").toLowerCase(),x:~~v.positionAbsolute.x,y:~~v.positionAbsolute.y})}),z({direction:Mc[L.key],factor:L.shiftKey?4:1})}}},$=()=>{if(y||!S.current?.matches(":focus-visible"))return;let{transform:L,width:Z,height:et,autoPanOnNodeFocus:P,setCenter:j}=U.getState();if(!P)return;cc(new Map([[t,h]]),{x:0,y:0,width:Z,height:et},L,!0).length>0||j(h.position.x+C.width/2,h.position.y+C.height/2,{zoom:L[2]})};return(0,O.jsx)("div",{className:At(["react-flow__node",`react-flow__node-${E}`,{[m]:M},h.className,{selected:h.selected,selectable:N,parent:_,draggable:M,dragging:A}]),ref:S,style:{zIndex:v.z,transform:`translate(${v.positionAbsolute.x}px,${v.positionAbsolute.y}px)`,pointerEvents:H?"all":"none",visibility:Y?"visible":"hidden",...h.style,...B},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:q,onMouseMove:X,onMouseLeave:V,onContextMenu:K,onClick:J,onDoubleClick:G,onKeyDown:T?nt:void 0,tabIndex:T?0:void 0,onFocus:T?$:void 0,role:h.ariaRole??(T?"group":void 0),"aria-roledescription":"node","aria-describedby":y?void 0:`${dx}-${x}`,"aria-label":h.ariaLabel,...h.domAttributes,children:(0,O.jsx)(m3,{value:t,children:(0,O.jsx)(w,{id:t,data:h.data,type:E,positionAbsoluteX:v.positionAbsolute.x,positionAbsoluteY:v.positionAbsolute.y,selected:h.selected??!1,selectable:N,draggable:M,deletable:h.deletable??!0,isConnectable:R,sourcePosition:h.sourcePosition,targetPosition:h.targetPosition,dragging:A,dragHandle:h.dragHandle,zIndex:v.z,parentId:h.parentId,...C})})})}var R3=(0,D.memo)(H3),B3=t=>({nodesDraggable:t.nodesDraggable,nodesConnectable:t.nodesConnectable,nodesFocusable:t.nodesFocusable,elementsSelectable:t.elementsSelectable,onError:t.onError});function _x(t){let{nodesDraggable:e,nodesConnectable:n,nodesFocusable:o,elementsSelectable:l,onError:a}=ut(B3,_t),i=T3(t.onlyRenderVisibleElements),r=O3();return(0,O.jsx)("div",{className:"react-flow__nodes",style:Ac,children:i.map(u=>(0,O.jsx)(R3,{id:u,nodeTypes:t.nodeTypes,nodeExtent:t.nodeExtent,onClick:t.onNodeClick,onMouseEnter:t.onNodeMouseEnter,onMouseMove:t.onNodeMouseMove,onMouseLeave:t.onNodeMouseLeave,onContextMenu:t.onNodeContextMenu,onDoubleClick:t.onNodeDoubleClick,noDragClassName:t.noDragClassName,noPanClassName:t.noPanClassName,rfId:t.rfId,disableKeyboardA11y:t.disableKeyboardA11y,resizeObserver:r,nodesDraggable:e,nodesConnectable:n,nodesFocusable:o,elementsSelectable:l,nodeClickDistance:t.nodeClickDistance,onError:a},u))})}_x.displayName="NodeRenderer";var U3=(0,D.memo)(_x);function k3(t){return ut((0,D.useCallback)(n=>{if(!t)return n.edges.map(l=>l.id);let o=[];if(n.width&&n.height)for(let l of n.edges){let a=n.nodeLookup.get(l.source),i=n.nodeLookup.get(l.target);a&&i&&ib({sourceNode:a,targetNode:i,width:n.width,height:n.height,transform:n.transform})&&o.push(l.id)}return o},[t]),_t)}var L3=({color:t="none",strokeWidth:e=1})=>{let n={strokeWidth:e,...t&&{stroke:t}};return(0,O.jsx)("polyline",{className:"arrow",style:n,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},Y3=({color:t="none",strokeWidth:e=1})=>{let n={strokeWidth:e,...t&&{stroke:t,fill:t}};return(0,O.jsx)("polyline",{className:"arrowclosed",style:n,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},nx={[sa.Arrow]:L3,[sa.ArrowClosed]:Y3};function V3(t){let e=Mt();return(0,D.useMemo)(()=>Object.prototype.hasOwnProperty.call(nx,t)?nx[t]:(e.getState().onError?.("009",Ee.error009(t)),null),[t])}var q3=({id:t,type:e,color:n,width:o=12.5,height:l=12.5,markerUnits:a="strokeWidth",strokeWidth:i,orient:r="auto-start-reverse"})=>{let u=V3(e);return u?(0,O.jsx)("marker",{className:"react-flow__arrowhead",id:t,markerWidth:`${o}`,markerHeight:`${l}`,viewBox:"-10 -10 20 20",markerUnits:a,orient:r,refX:"0",refY:"0",children:(0,O.jsx)(u,{color:n,strokeWidth:i})}):null},wx=({defaultColor:t,rfId:e})=>{let n=ut(a=>a.edges),o=ut(a=>a.defaultEdgeOptions),l=(0,D.useMemo)(()=>cb(n,{id:e,defaultColor:t,defaultMarkerStart:o?.markerStart,defaultMarkerEnd:o?.markerEnd}),[n,o,e,t]);return l.length?(0,O.jsx)("svg",{className:"react-flow__marker","aria-hidden":"true",children:(0,O.jsx)("defs",{children:l.map(a=>(0,O.jsx)(q3,{id:a.id,type:a.type,color:a.color,width:a.width,height:a.height,markerUnits:a.markerUnits,strokeWidth:a.strokeWidth,orient:a.orient},a.id))})}):null};wx.displayName="MarkerDefinitions";var X3=(0,D.memo)(wx);function Ex({x:t,y:e,label:n,labelStyle:o,labelShowBg:l=!0,labelBgStyle:a,labelBgPadding:i=[2,4],labelBgBorderRadius:r=2,children:u,className:c,...d}){let[s,f]=(0,D.useState)({x:1,y:0,width:0,height:0}),m=At(["react-flow__edge-textwrapper",c]),y=(0,D.useRef)(null);return(0,D.useEffect)(()=>{if(y.current){let x=y.current.getBBox();f({x:x.x,y:x.y,width:x.width,height:x.height})}},[n]),n?(0,O.jsxs)("g",{transform:`translate(${t-s.width/2} ${e-s.height/2})`,className:m,visibility:s.width?"visible":"hidden",...d,children:[l&&(0,O.jsx)("rect",{width:s.width+2*i[0],x:-i[0],y:-i[1],height:s.height+2*i[1],className:"react-flow__edge-textbg",style:a,rx:r,ry:r}),(0,O.jsx)("text",{className:"react-flow__edge-text",y:s.height/2,dy:"0.3em",ref:y,style:o,children:n}),u]}):null}Ex.displayName="EdgeText";var Z3=(0,D.memo)(Ex);function Tc({path:t,labelX:e,labelY:n,label:o,labelStyle:l,labelShowBg:a,labelBgStyle:i,labelBgPadding:r,labelBgBorderRadius:u,interactionWidth:c=20,...d}){return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)("path",{...d,d:t,fill:"none",className:At(["react-flow__edge-path",d.className])}),c?(0,O.jsx)("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:c,className:"react-flow__edge-interaction"}):null,o&&ke(e)&&ke(n)?(0,O.jsx)(Z3,{x:e,y:n,label:o,labelStyle:l,labelShowBg:a,labelBgStyle:i,labelBgPadding:r,labelBgBorderRadius:u}):null]})}function ox({pos:t,x1:e,y1:n,x2:o,y2:l}){return t===Q.Left||t===Q.Right?[.5*(e+o),n]:[e,.5*(n+l)]}function Mx({sourceX:t,sourceY:e,sourcePosition:n=Q.Bottom,targetX:o,targetY:l,targetPosition:a=Q.Top}){let[i,r]=ox({pos:n,x1:t,y1:e,x2:o,y2:l}),[u,c]=ox({pos:a,x1:o,y1:l,x2:t,y2:e}),[d,s,f,m]=gc({sourceX:t,sourceY:e,targetX:o,targetY:l,sourceControlX:i,sourceControlY:r,targetControlX:u,targetControlY:c});return[`M${t},${e} C${i},${r} ${u},${c} ${o},${l}`,d,s,f,m]}function Nx(t){return(0,D.memo)(({id:e,sourceX:n,sourceY:o,targetX:l,targetY:a,sourcePosition:i,targetPosition:r,label:u,labelStyle:c,labelShowBg:d,labelBgStyle:s,labelBgPadding:f,labelBgBorderRadius:m,style:y,markerEnd:x,markerStart:b,interactionWidth:g})=>{let[p,h,v]=Mx({sourceX:n,sourceY:o,sourcePosition:i,targetX:l,targetY:a,targetPosition:r}),_=t.isInternal?void 0:e;return(0,O.jsx)(Tc,{id:_,path:p,labelX:h,labelY:v,label:u,labelStyle:c,labelShowBg:d,labelBgStyle:s,labelBgPadding:f,labelBgBorderRadius:m,style:y,markerEnd:x,markerStart:b,interactionWidth:g})})}var G3=Nx({isInternal:!1}),zx=Nx({isInternal:!0});G3.displayName="SimpleBezierEdge";zx.displayName="SimpleBezierEdgeInternal";function Ax(t){return(0,D.memo)(({id:e,sourceX:n,sourceY:o,targetX:l,targetY:a,label:i,labelStyle:r,labelShowBg:u,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:s,style:f,sourcePosition:m=Q.Bottom,targetPosition:y=Q.Top,markerEnd:x,markerStart:b,pathOptions:g,interactionWidth:p})=>{let[h,v,_]=$i({sourceX:n,sourceY:o,sourcePosition:m,targetX:l,targetY:a,targetPosition:y,borderRadius:g?.borderRadius,offset:g?.offset,stepPosition:g?.stepPosition}),E=t.isInternal?void 0:e;return(0,O.jsx)(Tc,{id:E,path:h,labelX:v,labelY:_,label:i,labelStyle:r,labelShowBg:u,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:s,style:f,markerEnd:x,markerStart:b,interactionWidth:p})})}var Tx=Ax({isInternal:!1}),Cx=Ax({isInternal:!0});Tx.displayName="SmoothStepEdge";Cx.displayName="SmoothStepEdgeInternal";function Ox(t){return(0,D.memo)(({id:e,...n})=>{let o=t.isInternal?void 0:e;return(0,O.jsx)(Tx,{...n,id:o,pathOptions:(0,D.useMemo)(()=>({borderRadius:0,offset:n.pathOptions?.offset}),[n.pathOptions?.offset])})})}var Q3=Ox({isInternal:!1}),Dx=Ox({isInternal:!0});Q3.displayName="StepEdge";Dx.displayName="StepEdgeInternal";function Hx(t){return(0,D.memo)(({id:e,sourceX:n,sourceY:o,targetX:l,targetY:a,label:i,labelStyle:r,labelShowBg:u,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:s,style:f,markerEnd:m,markerStart:y,interactionWidth:x})=>{let[b,g,p]=pc({sourceX:n,sourceY:o,targetX:l,targetY:a}),h=t.isInternal?void 0:e;return(0,O.jsx)(Tc,{id:h,path:b,labelX:g,labelY:p,label:i,labelStyle:r,labelShowBg:u,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:s,style:f,markerEnd:m,markerStart:y,interactionWidth:x})})}var K3=Hx({isInternal:!1}),Rx=Hx({isInternal:!0});K3.displayName="StraightEdge";Rx.displayName="StraightEdgeInternal";function Bx(t){return(0,D.memo)(({id:e,sourceX:n,sourceY:o,targetX:l,targetY:a,sourcePosition:i=Q.Bottom,targetPosition:r=Q.Top,label:u,labelStyle:c,labelShowBg:d,labelBgStyle:s,labelBgPadding:f,labelBgBorderRadius:m,style:y,markerEnd:x,markerStart:b,pathOptions:g,interactionWidth:p})=>{let[h,v,_]=mc({sourceX:n,sourceY:o,sourcePosition:i,targetX:l,targetY:a,targetPosition:r,curvature:g?.curvature}),E=t.isInternal?void 0:e;return(0,O.jsx)(Tc,{id:E,path:h,labelX:v,labelY:_,label:u,labelStyle:c,labelShowBg:d,labelBgStyle:s,labelBgPadding:f,labelBgBorderRadius:m,style:y,markerEnd:x,markerStart:b,interactionWidth:p})})}var j3=Bx({isInternal:!1}),Ux=Bx({isInternal:!0});j3.displayName="BezierEdge";Ux.displayName="BezierEdgeInternal";var lx={default:Ux,straight:Rx,step:Dx,smoothstep:Cx,simplebezier:zx},ax={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},$3=(t,e,n)=>n===Q.Left?t-e:n===Q.Right?t+e:t,J3=(t,e,n)=>n===Q.Top?t-e:n===Q.Bottom?t+e:t,ix="react-flow__edgeupdater";function rx({position:t,centerX:e,centerY:n,radius:o=10,onMouseDown:l,onMouseEnter:a,onMouseOut:i,type:r}){return(0,O.jsx)("circle",{onMouseDown:l,onMouseEnter:a,onMouseOut:i,className:At([ix,`${ix}-${r}`]),cx:$3(e,o,t),cy:J3(n,o,t),r:o,stroke:"transparent",fill:"transparent"})}function I3({isReconnectable:t,reconnectRadius:e,edge:n,sourceX:o,sourceY:l,targetX:a,targetY:i,sourcePosition:r,targetPosition:u,onReconnect:c,onReconnectStart:d,onReconnectEnd:s,setReconnecting:f,setUpdateHover:m}){let y=Mt(),x=(v,_)=>{if(v.button!==0)return;let{autoPanOnConnect:E,domNode:w,connectionMode:M,connectionRadius:N,lib:R,onConnectStart:T,cancelConnection:U,nodeLookup:Y,rfId:S,panBy:A,updateConnection:z}=y.getState(),C=_.type==="target",B=(X,V)=>{f(!1),s?.(X,n,_.type,V)},H=X=>c?.(n,X),q=(X,V)=>{f(!0),d?.(v,n,_.type),T?.(X,V)};xc.onPointerDown(v.nativeEvent,{autoPanOnConnect:E,connectionMode:M,connectionRadius:N,domNode:w,handleId:_.id,nodeId:_.nodeId,nodeLookup:Y,isTarget:C,edgeUpdaterType:_.type,lib:R,flowId:S,cancelConnection:U,panBy:A,isValidConnection:(...X)=>y.getState().isValidConnection?.(...X)??!0,onConnect:H,onConnectStart:q,onConnectEnd:(...X)=>y.getState().onConnectEnd?.(...X),onReconnectEnd:B,updateConnection:z,getTransform:()=>y.getState().transform,getFromHandle:()=>y.getState().connection.fromHandle,dragThreshold:y.getState().connectionDragThreshold,handleDomNode:v.currentTarget})},b=v=>x(v,{nodeId:n.target,id:n.targetHandle??null,type:"target"}),g=v=>x(v,{nodeId:n.source,id:n.sourceHandle??null,type:"source"}),p=()=>m(!0),h=()=>m(!1);return(0,O.jsxs)(O.Fragment,{children:[(t===!0||t==="source")&&(0,O.jsx)(rx,{position:r,centerX:o,centerY:l,radius:e,onMouseDown:b,onMouseEnter:p,onMouseOut:h,type:"source"}),(t===!0||t==="target")&&(0,O.jsx)(rx,{position:u,centerX:a,centerY:i,radius:e,onMouseDown:g,onMouseEnter:p,onMouseOut:h,type:"target"})]})}function W3({id:t,edgesFocusable:e,edgesReconnectable:n,elementsSelectable:o,onClick:l,onDoubleClick:a,onContextMenu:i,onMouseEnter:r,onMouseMove:u,onMouseLeave:c,reconnectRadius:d,onReconnect:s,onReconnectStart:f,onReconnectEnd:m,rfId:y,edgeTypes:x,noPanClassName:b,onError:g,disableKeyboardA11y:p}){let h=ut(j=>j.edgeLookup.get(t)),v=ut(j=>j.defaultEdgeOptions);h=v?{...v,...h}:h;let _=h.type||"default",E=x?.[_]||lx[_];E===void 0&&(g?.("011",Ee.error011(_)),_="default",E=x?.default||lx.default);let w=!!(h.focusable||e&&typeof h.focusable>"u"),M=typeof s<"u"&&(h.reconnectable||n&&typeof h.reconnectable>"u"),N=!!(h.selectable||o&&typeof h.selectable>"u"),R=(0,D.useRef)(null),[T,U]=(0,D.useState)(!1),[Y,S]=(0,D.useState)(!1),A=Mt(),{zIndex:z,sourceX:C,sourceY:B,targetX:H,targetY:q,sourcePosition:X,targetPosition:V}=ut((0,D.useCallback)(j=>{let I=j.nodeLookup.get(h.source),rt=j.nodeLookup.get(h.target);if(!I||!rt)return{zIndex:h.zIndex,...ax};let ft=ub({id:t,sourceNode:I,targetNode:rt,sourceHandle:h.sourceHandle||null,targetHandle:h.targetHandle||null,connectionMode:j.connectionMode,onError:g});return{zIndex:ab({selected:h.selected,zIndex:h.zIndex,sourceNode:I,targetNode:rt,elevateOnSelect:j.elevateEdgesOnSelect,zIndexMode:j.zIndexMode}),...ft||ax}},[h.source,h.target,h.sourceHandle,h.targetHandle,h.selected,h.zIndex]),_t),K=(0,D.useMemo)(()=>h.markerStart?`url('#${yc(h.markerStart,y)}')`:void 0,[h.markerStart,y]),G=(0,D.useMemo)(()=>h.markerEnd?`url('#${yc(h.markerEnd,y)}')`:void 0,[h.markerEnd,y]);if(h.hidden||C===null||B===null||H===null||q===null)return null;let J=j=>{let{addSelectedEdges:I,unselectNodesAndEdges:rt,multiSelectionActive:ft}=A.getState();N&&(A.setState({nodesSelectionActive:!1}),h.selected&&ft?(rt({nodes:[],edges:[h]}),R.current?.blur()):I([t])),l&&l(j,h)},nt=a?j=>{a(j,{...h})}:void 0,$=i?j=>{i(j,{...h})}:void 0,L=r?j=>{r(j,{...h})}:void 0,Z=u?j=>{u(j,{...h})}:void 0,et=c?j=>{c(j,{...h})}:void 0,P=j=>{if(!p&&eh.includes(j.key)&&N){let{unselectNodesAndEdges:I,addSelectedEdges:rt}=A.getState();j.key==="Escape"?(R.current?.blur(),I({edges:[h]})):rt([t])}};return(0,O.jsx)("svg",{style:{zIndex:z},children:(0,O.jsxs)("g",{className:At(["react-flow__edge",`react-flow__edge-${_}`,h.className,b,{selected:h.selected,animated:h.animated,inactive:!N&&!l,updating:T,selectable:N}]),onClick:J,onDoubleClick:nt,onContextMenu:$,onMouseEnter:L,onMouseMove:Z,onMouseLeave:et,onKeyDown:w?P:void 0,tabIndex:w?0:void 0,role:h.ariaRole??(w?"group":"img"),"aria-roledescription":"edge","data-id":t,"data-testid":`rf__edge-${t}`,"aria-label":h.ariaLabel===null?void 0:h.ariaLabel||`Edge from ${h.source} to ${h.target}`,"aria-describedby":w?`${hx}-${y}`:void 0,ref:R,...h.domAttributes,children:[!Y&&(0,O.jsx)(E,{id:t,source:h.source,target:h.target,type:h.type,selected:h.selected,animated:h.animated,selectable:N,deletable:h.deletable??!0,label:h.label,labelStyle:h.labelStyle,labelShowBg:h.labelShowBg,labelBgStyle:h.labelBgStyle,labelBgPadding:h.labelBgPadding,labelBgBorderRadius:h.labelBgBorderRadius,sourceX:C,sourceY:B,targetX:H,targetY:q,sourcePosition:X,targetPosition:V,data:h.data,style:h.style,sourceHandleId:h.sourceHandle,targetHandleId:h.targetHandle,markerStart:K,markerEnd:G,pathOptions:"pathOptions"in h?h.pathOptions:void 0,interactionWidth:h.interactionWidth}),M&&(0,O.jsx)(I3,{edge:h,isReconnectable:M,reconnectRadius:d,onReconnect:s,onReconnectStart:f,onReconnectEnd:m,sourceX:C,sourceY:B,targetX:H,targetY:q,sourcePosition:X,targetPosition:V,setUpdateHover:U,setReconnecting:S})]})})}var F3=(0,D.memo)(W3),P3=t=>({edgesFocusable:t.edgesFocusable,edgesReconnectable:t.edgesReconnectable,elementsSelectable:t.elementsSelectable,connectionMode:t.connectionMode,onError:t.onError});function kx({defaultMarkerColor:t,onlyRenderVisibleElements:e,rfId:n,edgeTypes:o,noPanClassName:l,onReconnect:a,onEdgeContextMenu:i,onEdgeMouseEnter:r,onEdgeMouseMove:u,onEdgeMouseLeave:c,onEdgeClick:d,reconnectRadius:s,onEdgeDoubleClick:f,onReconnectStart:m,onReconnectEnd:y,disableKeyboardA11y:x}){let{edgesFocusable:b,edgesReconnectable:g,elementsSelectable:p,onError:h}=ut(P3,_t),v=k3(e);return(0,O.jsxs)("div",{className:"react-flow__edges",children:[(0,O.jsx)(X3,{defaultColor:t,rfId:n}),v.map(_=>(0,O.jsx)(F3,{id:_,edgesFocusable:b,edgesReconnectable:g,elementsSelectable:p,noPanClassName:l,onReconnect:a,onContextMenu:i,onMouseEnter:r,onMouseMove:u,onMouseLeave:c,onClick:d,reconnectRadius:s,onDoubleClick:f,onReconnectStart:m,onReconnectEnd:y,rfId:n,onError:h,edgeTypes:o,disableKeyboardA11y:x},_))]})}kx.displayName="EdgeRenderer";var tA=(0,D.memo)(kx),eA=t=>`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]})`;function nA({children:t}){let e=ut(eA);return(0,O.jsx)("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:e},children:t})}function oA(t){let e=Th(),n=(0,D.useRef)(!1);(0,D.useEffect)(()=>{!n.current&&e.viewportInitialized&&t&&(setTimeout(()=>t(e),1),n.current=!0)},[t,e.viewportInitialized])}var lA=t=>t.panZoom?.syncViewport;function aA(t){let e=ut(lA),n=Mt();return(0,D.useEffect)(()=>{t&&(e?.(t),n.setState({transform:[t.x,t.y,t.zoom]}))},[t,e]),null}function ux(t){return t.connection.inProgress?{...t.connection,to:ul(t.connection.to,t.transform)}:{...t.connection}}function iA(t){return t?n=>{let o=ux(n);return t(o)}:ux}function rA(t){let e=iA(t);return ut(e,_t)}var uA=t=>({nodesConnectable:t.nodesConnectable,isValid:t.connection.isValid,inProgress:t.connection.inProgress,width:t.width,height:t.height});function cA({containerStyle:t,style:e,type:n,component:o}){let{nodesConnectable:l,width:a,height:i,isValid:r,inProgress:u}=ut(uA,_t);return!(a&&l&&u)?null:(0,O.jsx)("svg",{style:t,width:a,height:i,className:"react-flow__connectionline react-flow__container",children:(0,O.jsx)("g",{className:At(["react-flow__connection",lh(r)]),children:(0,O.jsx)(Lx,{style:e,type:n,CustomComponent:o,isValid:r})})})}var Lx=({style:t,type:e=ln.Bezier,CustomComponent:n,isValid:o})=>{let{inProgress:l,from:a,fromNode:i,fromHandle:r,fromPosition:u,to:c,toNode:d,toHandle:s,toPosition:f,pointer:m}=rA();if(!l)return;if(n)return(0,O.jsx)(n,{connectionLineType:e,connectionLineStyle:t,fromNode:i,fromHandle:r,fromX:a.x,fromY:a.y,toX:c.x,toY:c.y,fromPosition:u,toPosition:f,connectionStatus:lh(o),toNode:d,toHandle:s,pointer:m});let y="",x={sourceX:a.x,sourceY:a.y,sourcePosition:u,targetX:c.x,targetY:c.y,targetPosition:f};switch(e){case ln.Bezier:[y]=mc(x);break;case ln.SimpleBezier:[y]=Mx(x);break;case ln.Step:[y]=$i({...x,borderRadius:0});break;case ln.SmoothStep:[y]=$i(x);break;default:[y]=pc(x)}return(0,O.jsx)("path",{d:y,fill:"none",className:"react-flow__connection-path",style:t})};Lx.displayName="ConnectionLine";var sA={};function cx(t=sA){let e=(0,D.useRef)(t),n=Mt();(0,D.useEffect)(()=>{},[t])}function fA(){let t=Mt(),e=(0,D.useRef)(!1);(0,D.useEffect)(()=>{},[])}function Yx({nodeTypes:t,edgeTypes:e,onInit:n,onNodeClick:o,onEdgeClick:l,onNodeDoubleClick:a,onEdgeDoubleClick:i,onNodeMouseEnter:r,onNodeMouseMove:u,onNodeMouseLeave:c,onNodeContextMenu:d,onSelectionContextMenu:s,onSelectionStart:f,onSelectionEnd:m,connectionLineType:y,connectionLineStyle:x,connectionLineComponent:b,connectionLineContainerStyle:g,selectionKeyCode:p,selectionOnDrag:h,selectionMode:v,multiSelectionKeyCode:_,panActivationKeyCode:E,zoomActivationKeyCode:w,deleteKeyCode:M,onlyRenderVisibleElements:N,elementsSelectable:R,defaultViewport:T,translateExtent:U,minZoom:Y,maxZoom:S,preventScrolling:A,defaultMarkerColor:z,zoomOnScroll:C,zoomOnPinch:B,panOnScroll:H,panOnScrollSpeed:q,panOnScrollMode:X,zoomOnDoubleClick:V,panOnDrag:K,autoPanOnSelection:G,onPaneClick:J,onPaneMouseEnter:nt,onPaneMouseMove:$,onPaneMouseLeave:L,onPaneScroll:Z,onPaneContextMenu:et,paneClickDistance:P,nodeClickDistance:j,onEdgeContextMenu:I,onEdgeMouseEnter:rt,onEdgeMouseMove:ft,onEdgeMouseLeave:Ct,reconnectRadius:le,onReconnect:rn,onReconnectStart:je,onReconnectEnd:$e,noDragClassName:un,noWheelClassName:ba,noPanClassName:wo,disableKeyboardA11y:Eo,nodeExtent:Ve,rfId:cn,viewport:sn,onViewportChange:Mo}){return cx(t),cx(e),fA(),oA(n),aA(sn),(0,O.jsx)(z3,{onPaneClick:J,onPaneMouseEnter:nt,onPaneMouseMove:$,onPaneMouseLeave:L,onPaneContextMenu:et,onPaneScroll:Z,paneClickDistance:P,deleteKeyCode:M,selectionKeyCode:p,selectionOnDrag:h,selectionMode:v,onSelectionStart:f,onSelectionEnd:m,multiSelectionKeyCode:_,panActivationKeyCode:E,zoomActivationKeyCode:w,elementsSelectable:R,zoomOnScroll:C,zoomOnPinch:B,zoomOnDoubleClick:V,panOnScroll:H,panOnScrollSpeed:q,panOnScrollMode:X,panOnDrag:K,autoPanOnSelection:G,defaultViewport:T,translateExtent:U,minZoom:Y,maxZoom:S,onSelectionContextMenu:s,preventScrolling:A,noDragClassName:un,noWheelClassName:ba,noPanClassName:wo,disableKeyboardA11y:Eo,onViewportChange:Mo,isControlledViewport:!!sn,children:(0,O.jsxs)(nA,{children:[(0,O.jsx)(tA,{edgeTypes:e,onEdgeClick:l,onEdgeDoubleClick:i,onReconnect:rn,onReconnectStart:je,onReconnectEnd:$e,onlyRenderVisibleElements:N,onEdgeContextMenu:I,onEdgeMouseEnter:rt,onEdgeMouseMove:ft,onEdgeMouseLeave:Ct,reconnectRadius:le,defaultMarkerColor:z,noPanClassName:wo,disableKeyboardA11y:Eo,rfId:cn}),(0,O.jsx)(cA,{style:x,type:y,component:b,containerStyle:g}),(0,O.jsx)("div",{className:"react-flow__edgelabel-renderer"}),(0,O.jsx)(U3,{nodeTypes:t,onNodeClick:o,onNodeDoubleClick:a,onNodeMouseEnter:r,onNodeMouseMove:u,onNodeMouseLeave:c,onNodeContextMenu:d,nodeClickDistance:j,onlyRenderVisibleElements:N,noPanClassName:wo,noDragClassName:un,disableKeyboardA11y:Eo,nodeExtent:Ve,rfId:cn}),(0,O.jsx)("div",{className:"react-flow__viewport-portal"})]})})}Yx.displayName="GraphView";var dA=(0,D.memo)(Yx),hA=fh("React Flow","https://reactflow.dev/"),sx=({nodes:t,edges:e,defaultNodes:n,defaultEdges:o,width:l,height:a,fitView:i,fitViewOptions:r,minZoom:u=.5,maxZoom:c=2,nodeOrigin:d,nodeExtent:s,zIndexMode:f="basic"}={})=>{let m=new Map,y=new Map,x=new Map,b=new Map,g=o??e??[],p=n??t??[],h=d??[0,0],v=s??da;wh(x,b,g);let{nodesInitialized:_}=vc(p,m,y,{nodeOrigin:h,nodeExtent:v,zIndexMode:f}),E=[0,0,1];if(i&&l&&a){let w=ha(m,{filter:T=>!!((T.width||T.initialWidth)&&(T.height||T.initialHeight))}),{x:M,y:N,zoom:R}=ji(w,l,a,u,c,r?.padding??.1);E=[M,N,R]}return{rfId:"1",width:l??0,height:a??0,transform:E,nodes:p,nodesInitialized:_,nodeLookup:m,parentLookup:y,edges:g,edgeLookup:b,connectionLookup:x,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:n!==void 0,hasDefaultEdges:o!==void 0,panZoom:null,minZoom:u,maxZoom:c,translateExtent:da,nodeExtent:v,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:vo.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:h,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:i??!1,fitViewOptions:r,fitViewResolver:null,connection:{...oh},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:hA,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:nh,zIndexMode:f,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},gA=({nodes:t,edges:e,defaultNodes:n,defaultEdges:o,width:l,height:a,fitView:i,fitViewOptions:r,minZoom:u,maxZoom:c,nodeOrigin:d,nodeExtent:s,zIndexMode:f})=>qb((m,y)=>{async function x(){let{nodeLookup:b,panZoom:g,fitViewOptions:p,fitViewResolver:h,width:v,height:_,minZoom:E,maxZoom:w}=y();g&&(await tb({nodes:b,width:v,height:_,panZoom:g,minZoom:E,maxZoom:w},p),h?.resolve(!0),m({fitViewResolver:null}))}return{...sx({nodes:t,edges:e,width:l,height:a,fitView:i,fitViewOptions:r,minZoom:u,maxZoom:c,nodeOrigin:d,nodeExtent:s,defaultNodes:n,defaultEdges:o,zIndexMode:f}),setNodes:b=>{let{nodeLookup:g,parentLookup:p,nodeOrigin:h,elevateNodesOnSelect:v,fitViewQueued:_,zIndexMode:E,nodesSelectionActive:w}=y(),{nodesInitialized:M,hasSelectedNodes:N}=vc(b,g,p,{nodeOrigin:h,nodeExtent:s,elevateNodesOnSelect:v,checkEquality:!0,zIndexMode:E}),R=w&&N;_&&M?(x(),m({nodes:b,nodesInitialized:M,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:R})):m({nodes:b,nodesInitialized:M,nodesSelectionActive:R})},setEdges:b=>{let{connectionLookup:g,edgeLookup:p}=y();wh(g,p,b),m({edges:b})},setDefaultNodesAndEdges:(b,g)=>{if(b){let{setNodes:p}=y();p(b),m({hasDefaultNodes:!0})}if(g){let{setEdges:p}=y();p(g),m({hasDefaultEdges:!0})}},updateNodeInternals:b=>{let{triggerNodeChanges:g,nodeLookup:p,parentLookup:h,domNode:v,nodeOrigin:_,nodeExtent:E,debug:w,fitViewQueued:M,zIndexMode:N}=y(),{changes:R,updatedInternals:T}=hb(b,p,h,v,_,E,N);T&&(fb(p,h,{nodeOrigin:_,nodeExtent:E,zIndexMode:N}),M?(x(),m({fitViewQueued:!1,fitViewOptions:void 0})):m({}),R?.length>0&&(w&&console.log("React Flow: trigger node changes",R),g?.(R)))},updateNodePositions:(b,g=!1)=>{let p=[],h=[],{nodeLookup:v,triggerNodeChanges:_,connection:E,updateConnection:w,onNodesChangeMiddlewareMap:M}=y();for(let[N,R]of b){let T=v.get(N),U=!!(T?.expandParent&&T?.parentId&&R?.position),Y={id:N,type:"position",position:U?{x:Math.max(0,R.position.x),y:Math.max(0,R.position.y)}:R.position,dragging:g};if(T&&E.inProgress&&E.fromNode.id===T.id){let S=bo(T,E.fromHandle,Q.Left,!0);w({...E,from:S})}U&&T.parentId&&p.push({id:N,parentId:T.parentId,rect:{...R.internals.positionAbsolute,width:R.measured.width??0,height:R.measured.height??0}}),h.push(Y)}if(p.length>0){let{parentLookup:N,nodeOrigin:R}=y(),T=bc(p,v,N,R);h.push(...T)}for(let N of M.values())h=N(h);_(h)},triggerNodeChanges:b=>{let{onNodesChange:g,setNodes:p,nodes:h,hasDefaultNodes:v,debug:_}=y();if(b?.length){if(v){let E=Jz(b,h);p(E)}_&&console.log("React Flow: trigger node changes",b),g?.(b)}},triggerEdgeChanges:b=>{let{onEdgesChange:g,setEdges:p,edges:h,hasDefaultEdges:v,debug:_}=y();if(b?.length){if(v){let E=Iz(b,h);p(E)}_&&console.log("React Flow: trigger edge changes",b),g?.(b)}},addSelectedNodes:b=>{let{multiSelectionActive:g,edgeLookup:p,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:_}=y();if(g){let E=b.map(w=>cl(w,!0));v(E);return}v(va(h,new Set([...b]),!0)),_(va(p))},addSelectedEdges:b=>{let{multiSelectionActive:g,edgeLookup:p,nodeLookup:h,triggerNodeChanges:v,triggerEdgeChanges:_}=y();if(g){let E=b.map(w=>cl(w,!0));_(E);return}_(va(p,new Set([...b]))),v(va(h,new Set,!0))},unselectNodesAndEdges:({nodes:b,edges:g}={})=>{let{edges:p,nodes:h,nodeLookup:v,triggerNodeChanges:_,triggerEdgeChanges:E}=y(),w=b||h,M=g||p,N=[];for(let T of w){if(!T.selected)continue;let U=v.get(T.id);U&&(U.selected=!1),N.push(cl(T.id,!1))}let R=[];for(let T of M)T.selected&&R.push(cl(T.id,!1));_(N),E(R)},setMinZoom:b=>{let{panZoom:g,maxZoom:p}=y();g?.setScaleExtent([b,p]),m({minZoom:b})},setMaxZoom:b=>{let{panZoom:g,minZoom:p}=y();g?.setScaleExtent([p,b]),m({maxZoom:b})},setTranslateExtent:b=>{y().panZoom?.setTranslateExtent(b),m({translateExtent:b})},resetSelectedElements:()=>{let{edges:b,nodes:g,triggerNodeChanges:p,triggerEdgeChanges:h,elementsSelectable:v}=y();if(!v)return;let _=g.reduce((w,M)=>M.selected?[...w,cl(M.id,!1)]:w,[]),E=b.reduce((w,M)=>M.selected?[...w,cl(M.id,!1)]:w,[]);p(_),h(E)},setNodeExtent:b=>{let{nodes:g,nodeLookup:p,parentLookup:h,nodeOrigin:v,elevateNodesOnSelect:_,nodeExtent:E,zIndexMode:w}=y();b[0][0]===E[0][0]&&b[0][1]===E[0][1]&&b[1][0]===E[1][0]&&b[1][1]===E[1][1]||(vc(g,p,h,{nodeOrigin:v,nodeExtent:b,elevateNodesOnSelect:_,checkEquality:!1,zIndexMode:w}),m({nodeExtent:b}))},panBy:b=>{let{transform:g,width:p,height:h,panZoom:v,translateExtent:_}=y();return gb({delta:b,panZoom:v,transform:g,translateExtent:_,width:p,height:h})},setCenter:async(b,g,p)=>{let{width:h,height:v,maxZoom:_,panZoom:E}=y();if(!E)return!1;let w=typeof p?.zoom<"u"?p.zoom:_;return await E.setViewport({x:h/2-b*w,y:v/2-g*w,zoom:w},{duration:p?.duration,ease:p?.ease,interpolate:p?.interpolate}),!0},cancelConnection:()=>{m({connection:{...oh}})},updateConnection:b=>{m({connection:b})},reset:()=>m({...sx()})}},Object.is);function mA({initialNodes:t,initialEdges:e,defaultNodes:n,defaultEdges:o,initialWidth:l,initialHeight:a,initialMinZoom:i,initialMaxZoom:r,initialFitViewOptions:u,fitView:c,nodeOrigin:d,nodeExtent:s,zIndexMode:f,children:m}){let[y]=(0,D.useState)(()=>gA({nodes:t,edges:e,defaultNodes:n,defaultEdges:o,width:l,height:a,fitView:c,minZoom:i,maxZoom:r,fitViewOptions:u,nodeOrigin:d,nodeExtent:s,zIndexMode:f}));return(0,O.jsx)(Tz,{value:y,children:(0,O.jsx)(n3,{children:m})})}function pA({children:t,nodes:e,edges:n,defaultNodes:o,defaultEdges:l,width:a,height:i,fitView:r,fitViewOptions:u,minZoom:c,maxZoom:d,nodeOrigin:s,nodeExtent:f,zIndexMode:m}){return(0,D.useContext)(Nc)?(0,O.jsx)(O.Fragment,{children:t}):(0,O.jsx)(mA,{initialNodes:e,initialEdges:n,defaultNodes:o,defaultEdges:l,initialWidth:a,initialHeight:i,fitView:r,initialFitViewOptions:u,initialMinZoom:c,initialMaxZoom:d,nodeOrigin:s,nodeExtent:f,zIndexMode:m,children:t})}var yA={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function vA({nodes:t,edges:e,defaultNodes:n,defaultEdges:o,className:l,nodeTypes:a,edgeTypes:i,onNodeClick:r,onEdgeClick:u,onInit:c,onMove:d,onMoveStart:s,onMoveEnd:f,onConnect:m,onConnectStart:y,onConnectEnd:x,onClickConnectStart:b,onClickConnectEnd:g,onNodeMouseEnter:p,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:_,onNodeDoubleClick:E,onNodeDragStart:w,onNodeDrag:M,onNodeDragStop:N,onNodesDelete:R,onEdgesDelete:T,onDelete:U,onSelectionChange:Y,onSelectionDragStart:S,onSelectionDrag:A,onSelectionDragStop:z,onSelectionContextMenu:C,onSelectionStart:B,onSelectionEnd:H,onBeforeDelete:q,connectionMode:X,connectionLineType:V=ln.Bezier,connectionLineStyle:K,connectionLineComponent:G,connectionLineContainerStyle:J,deleteKeyCode:nt="Backspace",selectionKeyCode:$="Shift",selectionOnDrag:L=!1,selectionMode:Z=ol.Full,panActivationKeyCode:et="Space",multiSelectionKeyCode:P=pa()?"Meta":"Control",zoomActivationKeyCode:j=pa()?"Meta":"Control",snapToGrid:I,snapGrid:rt,onlyRenderVisibleElements:ft=!1,selectNodesOnDrag:Ct,nodesDraggable:le,autoPanOnNodeFocus:rn,nodesConnectable:je,nodesFocusable:$e,nodeOrigin:un=gx,edgesFocusable:ba,edgesReconnectable:wo,elementsSelectable:Eo=!0,defaultViewport:Ve=Xz,minZoom:cn=.5,maxZoom:sn=2,translateExtent:Mo=da,preventScrolling:Wx=!0,nodeExtent:Dc,defaultMarkerColor:Fx="#b1b1b7",zoomOnScroll:Px=!0,zoomOnPinch:tS=!0,panOnScroll:eS=!1,panOnScrollSpeed:nS=.5,panOnScrollMode:oS=Un.Free,zoomOnDoubleClick:lS=!0,panOnDrag:aS=!0,onPaneClick:iS,onPaneMouseEnter:rS,onPaneMouseMove:uS,onPaneMouseLeave:cS,onPaneScroll:sS,onPaneContextMenu:fS,paneClickDistance:dS=1,nodeClickDistance:hS=0,children:gS,onReconnect:mS,onReconnectStart:pS,onReconnectEnd:yS,onEdgeContextMenu:vS,onEdgeDoubleClick:bS,onEdgeMouseEnter:xS,onEdgeMouseMove:SS,onEdgeMouseLeave:_S,reconnectRadius:wS=10,onNodesChange:ES,onEdgesChange:MS,noDragClassName:NS="nodrag",noWheelClassName:zS="nowheel",noPanClassName:Hh="nopan",fitView:Rh,fitViewOptions:Bh,connectOnClick:AS,attributionPosition:TS,proOptions:CS,defaultEdgeOptions:OS,elevateNodesOnSelect:DS=!0,elevateEdgesOnSelect:HS=!1,disableKeyboardA11y:Uh=!1,autoPanOnConnect:RS,autoPanOnNodeDrag:BS,autoPanOnSelection:US=!0,autoPanSpeed:kS,connectionRadius:LS,isValidConnection:YS,onError:VS,style:qS,id:kh,nodeDragThreshold:XS,connectionDragThreshold:ZS,viewport:GS,onViewportChange:QS,width:KS,height:jS,colorMode:$S="light",debug:JS,onScroll:Lh,ariaLabelConfig:IS,zIndexMode:Yh="basic",...WS},FS){let Hc=kh||"1",PS=Kz($S),t_=(0,D.useCallback)(Vh=>{Vh.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Lh?.(Vh)},[Lh]);return(0,O.jsx)("div",{"data-testid":"rf__wrapper",...WS,onScroll:t_,style:{...qS,...yA},ref:FS,className:At(["react-flow",l,PS]),id:kh,role:"application",children:(0,O.jsxs)(pA,{nodes:t,edges:e,width:KS,height:jS,fitView:Rh,fitViewOptions:Bh,minZoom:cn,maxZoom:sn,nodeOrigin:un,nodeExtent:Dc,zIndexMode:Yh,children:[(0,O.jsx)(Qz,{nodes:t,edges:e,defaultNodes:n,defaultEdges:o,onConnect:m,onConnectStart:y,onConnectEnd:x,onClickConnectStart:b,onClickConnectEnd:g,nodesDraggable:le,autoPanOnNodeFocus:rn,nodesConnectable:je,nodesFocusable:$e,edgesFocusable:ba,edgesReconnectable:wo,elementsSelectable:Eo,elevateNodesOnSelect:DS,elevateEdgesOnSelect:HS,minZoom:cn,maxZoom:sn,nodeExtent:Dc,onNodesChange:ES,onEdgesChange:MS,snapToGrid:I,snapGrid:rt,connectionMode:X,translateExtent:Mo,connectOnClick:AS,defaultEdgeOptions:OS,fitView:Rh,fitViewOptions:Bh,onNodesDelete:R,onEdgesDelete:T,onDelete:U,onNodeDragStart:w,onNodeDrag:M,onNodeDragStop:N,onSelectionDrag:A,onSelectionDragStart:S,onSelectionDragStop:z,onMove:d,onMoveStart:s,onMoveEnd:f,noPanClassName:Hh,nodeOrigin:un,rfId:Hc,autoPanOnConnect:RS,autoPanOnNodeDrag:BS,autoPanSpeed:kS,onError:VS,connectionRadius:LS,isValidConnection:YS,selectNodesOnDrag:Ct,nodeDragThreshold:XS,connectionDragThreshold:ZS,onBeforeDelete:q,debug:JS,ariaLabelConfig:IS,zIndexMode:Yh}),(0,O.jsx)(dA,{onInit:c,onNodeClick:r,onEdgeClick:u,onNodeMouseEnter:p,onNodeMouseMove:h,onNodeMouseLeave:v,onNodeContextMenu:_,onNodeDoubleClick:E,nodeTypes:a,edgeTypes:i,connectionLineType:V,connectionLineStyle:K,connectionLineComponent:G,connectionLineContainerStyle:J,selectionKeyCode:$,selectionOnDrag:L,selectionMode:Z,deleteKeyCode:nt,multiSelectionKeyCode:P,panActivationKeyCode:et,zoomActivationKeyCode:j,onlyRenderVisibleElements:ft,defaultViewport:Ve,translateExtent:Mo,minZoom:cn,maxZoom:sn,preventScrolling:Wx,zoomOnScroll:Px,zoomOnPinch:tS,zoomOnDoubleClick:lS,panOnScroll:eS,panOnScrollSpeed:nS,panOnScrollMode:oS,panOnDrag:aS,autoPanOnSelection:US,onPaneClick:iS,onPaneMouseEnter:rS,onPaneMouseMove:uS,onPaneMouseLeave:cS,onPaneScroll:sS,onPaneContextMenu:fS,paneClickDistance:dS,nodeClickDistance:hS,onSelectionContextMenu:C,onSelectionStart:B,onSelectionEnd:H,onReconnect:mS,onReconnectStart:pS,onReconnectEnd:yS,onEdgeContextMenu:vS,onEdgeDoubleClick:bS,onEdgeMouseEnter:xS,onEdgeMouseMove:SS,onEdgeMouseLeave:_S,reconnectRadius:wS,defaultMarkerColor:Fx,noDragClassName:NS,noWheelClassName:zS,noPanClassName:Hh,rfId:Hc,disableKeyboardA11y:Uh,nodeExtent:Dc,viewport:GS,onViewportChange:QS}),(0,O.jsx)(qz,{onSelectionChange:Y}),gS,(0,O.jsx)(Uz,{proOptions:CS,position:TS}),(0,O.jsx)(Bz,{rfId:Hc,disableKeyboardA11y:Uh})]})})}var Vx=px(vA);var C6=Ee.error014();function bA({dimensions:t,lineWidth:e,variant:n,className:o}){return(0,O.jsx)("path",{strokeWidth:e,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`,className:At(["react-flow__background-pattern",n,o])})}function xA({radius:t,className:e}){return(0,O.jsx)("circle",{cx:t,cy:t,r:t,className:At(["react-flow__background-pattern","dots",e])})}var So;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(So||(So={}));var SA={[So.Dots]:1,[So.Lines]:1,[So.Cross]:6},_A=t=>({transform:t.transform,patternId:`pattern-${t.rfId}`});function qx({id:t,variant:e=So.Dots,gap:n=20,size:o,lineWidth:l=1,offset:a=0,color:i,bgColor:r,style:u,className:c,patternClassName:d}){let s=(0,D.useRef)(null),{transform:f,patternId:m}=ut(_A,_t),y=o||SA[e],x=e===So.Dots,b=e===So.Cross,g=Array.isArray(n)?n:[n,n],p=[g[0]*f[2]||1,g[1]*f[2]||1],h=y*f[2],v=Array.isArray(a)?a:[a,a],_=b?[h,h]:p,E=[v[0]*f[2]||1+_[0]/2,v[1]*f[2]||1+_[1]/2],w=`${m}${t||""}`;return(0,O.jsxs)("svg",{className:At(["react-flow__background",c]),style:{...u,...Ac,"--xy-background-color-props":r,"--xy-background-pattern-color-props":i},ref:s,"data-testid":"rf__background",children:[(0,O.jsx)("pattern",{id:w,x:f[0]%p[0],y:f[1]%p[1],width:p[0],height:p[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${E[0]},-${E[1]})`,children:x?(0,O.jsx)(xA,{radius:h/2,className:d}):(0,O.jsx)(bA,{dimensions:_,lineWidth:l,variant:e,className:d})}),(0,O.jsx)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${w})`})]})}qx.displayName="Background";var Xx=(0,D.memo)(qx);function wA(){return(0,O.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:(0,O.jsx)("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function EA(){return(0,O.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:(0,O.jsx)("path",{d:"M0 0h32v4.2H0z"})})}function MA(){return(0,O.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:(0,O.jsx)("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function NA(){return(0,O.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:(0,O.jsx)("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function zA(){return(0,O.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:(0,O.jsx)("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function Ec({children:t,className:e,...n}){return(0,O.jsx)("button",{type:"button",className:At(["react-flow__controls-button",e]),...n,children:t})}var AA=t=>({isInteractive:t.nodesDraggable||t.nodesConnectable||t.elementsSelectable,minZoomReached:t.transform[2]<=t.minZoom,maxZoomReached:t.transform[2]>=t.maxZoom,ariaLabelConfig:t.ariaLabelConfig});function Zx({style:t,showZoom:e=!0,showFitView:n=!0,showInteractive:o=!0,fitViewOptions:l,onZoomIn:a,onZoomOut:i,onFitView:r,onInteractiveChange:u,className:c,children:d,position:s="bottom-left",orientation:f="vertical","aria-label":m}){let y=Mt(),{isInteractive:x,minZoomReached:b,maxZoomReached:g,ariaLabelConfig:p}=ut(AA,_t),{zoomIn:h,zoomOut:v,fitView:_}=Th(),E=()=>{h(),a?.()},w=()=>{v(),i?.()},M=()=>{_(l),r?.()},N=()=>{y.setState({nodesDraggable:!x,nodesConnectable:!x,elementsSelectable:!x}),u?.(!x)};return(0,O.jsxs)(zc,{className:At(["react-flow__controls",f==="horizontal"?"horizontal":"vertical",c]),position:s,style:t,"data-testid":"rf__controls","aria-label":m??p["controls.ariaLabel"],children:[e&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(Ec,{onClick:E,className:"react-flow__controls-zoomin",title:p["controls.zoomIn.ariaLabel"],"aria-label":p["controls.zoomIn.ariaLabel"],disabled:g,children:(0,O.jsx)(wA,{})}),(0,O.jsx)(Ec,{onClick:w,className:"react-flow__controls-zoomout",title:p["controls.zoomOut.ariaLabel"],"aria-label":p["controls.zoomOut.ariaLabel"],disabled:b,children:(0,O.jsx)(EA,{})})]}),n&&(0,O.jsx)(Ec,{className:"react-flow__controls-fitview",onClick:M,title:p["controls.fitView.ariaLabel"],"aria-label":p["controls.fitView.ariaLabel"],children:(0,O.jsx)(MA,{})}),o&&(0,O.jsx)(Ec,{className:"react-flow__controls-interactive",onClick:N,title:p["controls.interactive.ariaLabel"],"aria-label":p["controls.interactive.ariaLabel"],children:x?(0,O.jsx)(zA,{}):(0,O.jsx)(NA,{})}),d]})}Zx.displayName="Controls";var O6=(0,D.memo)(Zx);function TA({id:t,x:e,y:n,width:o,height:l,style:a,color:i,strokeColor:r,strokeWidth:u,className:c,borderRadius:d,shapeRendering:s,selected:f,onClick:m}){let{background:y,backgroundColor:x}=a||{},b=i||y||x;return(0,O.jsx)("rect",{className:At(["react-flow__minimap-node",{selected:f},c]),x:e,y:n,rx:d,ry:d,width:o,height:l,style:{fill:b,stroke:r,strokeWidth:u},shapeRendering:s,onClick:m?g=>m(g,t):void 0})}var CA=(0,D.memo)(TA),OA=t=>t.nodes.map(e=>e.id),zh=t=>t instanceof Function?t:()=>t;function DA({nodeStrokeColor:t,nodeColor:e,nodeClassName:n="",nodeBorderRadius:o=5,nodeStrokeWidth:l,nodeComponent:a=CA,onClick:i}){let r=ut(OA,_t),u=zh(e),c=zh(t),d=zh(n),s=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return(0,O.jsx)(O.Fragment,{children:r.map(f=>(0,O.jsx)(RA,{id:f,nodeColorFunc:u,nodeStrokeColorFunc:c,nodeClassNameFunc:d,nodeBorderRadius:o,nodeStrokeWidth:l,NodeComponent:a,onClick:i,shapeRendering:s},f))})}function HA({id:t,nodeColorFunc:e,nodeStrokeColorFunc:n,nodeClassNameFunc:o,nodeBorderRadius:l,nodeStrokeWidth:a,shapeRendering:i,NodeComponent:r,onClick:u}){let{node:c,x:d,y:s,width:f,height:m}=ut(y=>{let x=y.nodeLookup.get(t);if(!x)return{node:void 0,x:0,y:0,width:0,height:0};let b=x.internals.userNode,{x:g,y:p}=x.internals.positionAbsolute,{width:h,height:v}=an(b);return{node:b,x:g,y:p,width:h,height:v}},_t);return!c||c.hidden||!dh(c)?null:(0,O.jsx)(r,{x:d,y:s,width:f,height:m,style:c.style,selected:!!c.selected,className:o(c),color:e(c),borderRadius:l,strokeColor:n(c),strokeWidth:a,shapeRendering:i,onClick:u,id:c.id})}var RA=(0,D.memo)(HA),BA=(0,D.memo)(DA),UA=200,kA=150,LA=t=>!t.hidden,YA=t=>{let e={x:-t.transform[0]/t.transform[2],y:-t.transform[1]/t.transform[2],width:t.width/t.transform[2],height:t.height/t.transform[2]};return{viewBB:e,boundingRect:t.nodeLookup.size>0?ch(ha(t.nodeLookup,{filter:LA}),e):e,rfId:t.rfId,panZoom:t.panZoom,translateExtent:t.translateExtent,flowWidth:t.width,flowHeight:t.height,ariaLabelConfig:t.ariaLabelConfig}},VA="react-flow__minimap-desc";function Gx({style:t,className:e,nodeStrokeColor:n,nodeColor:o,nodeClassName:l="",nodeBorderRadius:a=5,nodeStrokeWidth:i,nodeComponent:r,bgColor:u,maskColor:c,maskStrokeColor:d,maskStrokeWidth:s,position:f="bottom-right",onClick:m,onNodeClick:y,pannable:x=!1,zoomable:b=!1,ariaLabel:g,inversePan:p,zoomStep:h=1,offsetScale:v=5}){let _=Mt(),E=(0,D.useRef)(null),{boundingRect:w,viewBB:M,rfId:N,panZoom:R,translateExtent:T,flowWidth:U,flowHeight:Y,ariaLabelConfig:S}=ut(YA,_t),A=t?.width??UA,z=t?.height??kA,C=w.width/A,B=w.height/z,H=Math.max(C,B),q=H*A,X=H*z,V=v*H,K=w.x-(q-w.width)/2-V,G=w.y-(X-w.height)/2-V,J=q+V*2,nt=X+V*2,$=`${VA}-${N}`,L=(0,D.useRef)(0),Z=(0,D.useRef)();L.current=H,(0,D.useEffect)(()=>{if(E.current&&R)return Z.current=Sb({domNode:E.current,panZoom:R,getTransform:()=>_.getState().transform,getViewScale:()=>L.current}),()=>{Z.current?.destroy()}},[R]),(0,D.useEffect)(()=>{Z.current?.update({translateExtent:T,width:U,height:Y,inversePan:p,pannable:x,zoomStep:h,zoomable:b})},[x,b,p,h,T,U,Y]);let et=m?I=>{let[rt,ft]=Z.current?.pointer(I)||[0,0];m(I,{x:rt,y:ft})}:void 0,P=y?(0,D.useCallback)((I,rt)=>{let ft=_.getState().nodeLookup.get(rt).internals.userNode;y(I,ft)},[]):void 0,j=g??S["minimap.ariaLabel"];return(0,O.jsx)(zc,{position:f,style:{...t,"--xy-minimap-background-color-props":typeof u=="string"?u:void 0,"--xy-minimap-mask-background-color-props":typeof c=="string"?c:void 0,"--xy-minimap-mask-stroke-color-props":typeof d=="string"?d:void 0,"--xy-minimap-mask-stroke-width-props":typeof s=="number"?s*H:void 0,"--xy-minimap-node-background-color-props":typeof o=="string"?o:void 0,"--xy-minimap-node-stroke-color-props":typeof n=="string"?n:void 0,"--xy-minimap-node-stroke-width-props":typeof i=="number"?i:void 0},className:At(["react-flow__minimap",e]),"data-testid":"rf__minimap",children:(0,O.jsxs)("svg",{width:A,height:z,viewBox:`${K} ${G} ${J} ${nt}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":$,ref:E,onClick:et,children:[j&&(0,O.jsx)("title",{id:$,children:j}),(0,O.jsx)(BA,{onClick:P,nodeColor:o,nodeStrokeColor:n,nodeBorderRadius:a,nodeClassName:l,nodeStrokeWidth:i,nodeComponent:r}),(0,O.jsx)("path",{className:"react-flow__minimap-mask",d:`M${K-V},${G-V}h${J+V*2}v${nt+V*2}h${-J-V*2}z
|
|
15
|
-
M${M.x},${M.y}h${M.width}v${M.height}h${-M.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}Gx.displayName="MiniMap";var D6=(0,D.memo)(Gx),qA=t=>e=>t?`${Math.max(1/e.transform[2],1)}`:void 0,XA={[xo.Line]:"right",[xo.Handle]:"bottom-right"};function ZA({nodeId:t,position:e,variant:n=xo.Handle,className:o,style:l=void 0,children:a,color:i,minWidth:r=10,minHeight:u=10,maxWidth:c=Number.MAX_VALUE,maxHeight:d=Number.MAX_VALUE,keepAspectRatio:s=!1,resizeDirection:f,autoScale:m=!0,shouldResize:y,onResizeStart:x,onResize:b,onResizeEnd:g}){let p=xx(),h=typeof t=="string"?t:p,v=Mt(),_=(0,D.useRef)(null),E=n===xo.Handle,w=ut((0,D.useCallback)(qA(E&&m),[E,m]),_t),M=(0,D.useRef)(null),N=e??XA[n];(0,D.useEffect)(()=>{if(!(!_.current||!h))return M.current||(M.current=Nb({domNode:_.current,nodeId:h,getStoreItems:()=>{let{nodeLookup:T,transform:U,snapGrid:Y,snapToGrid:S,nodeOrigin:A,domNode:z}=v.getState();return{nodeLookup:T,transform:U,snapGrid:Y,snapToGrid:S,nodeOrigin:A,paneDomNode:z}},onChange:(T,U)=>{let{triggerNodeChanges:Y,nodeLookup:S,parentLookup:A,nodeOrigin:z}=v.getState(),C=[],B={x:T.x,y:T.y},H=S.get(h);if(H&&H.expandParent&&H.parentId){let q=H.origin??z,X=T.width??H.measured.width??0,V=T.height??H.measured.height??0,K={id:H.id,parentId:H.parentId,rect:{width:X,height:V,...hh({x:T.x??H.position.x,y:T.y??H.position.y},{width:X,height:V},H.parentId,S,q)}},G=bc([K],S,A,z);C.push(...G),B.x=T.x?Math.max(q[0]*X,T.x):void 0,B.y=T.y?Math.max(q[1]*V,T.y):void 0}if(B.x!==void 0&&B.y!==void 0){let q={id:h,type:"position",position:{...B}};C.push(q)}if(T.width!==void 0&&T.height!==void 0){let X={id:h,type:"dimensions",resizing:!0,setAttributes:f?f==="horizontal"?"width":"height":!0,dimensions:{width:T.width,height:T.height}};C.push(X)}for(let q of U){let X={...q,type:"position"};C.push(X)}Y(C)},onEnd:({width:T,height:U})=>{let Y={id:h,type:"dimensions",resizing:!1,dimensions:{width:T,height:U}};v.getState().triggerNodeChanges([Y])}})),M.current.update({controlPosition:N,boundaries:{minWidth:r,minHeight:u,maxWidth:c,maxHeight:d},keepAspectRatio:s,resizeDirection:f,onResizeStart:x,onResize:b,onResizeEnd:g,shouldResize:y}),()=>{M.current?.destroy()}},[N,r,u,c,d,s,x,b,g,y]);let R=N.split("-");return(0,O.jsx)("div",{className:At(["react-flow__resize-control","nodrag",...R,n,o]),ref:_,style:{...l,scale:w,...i&&{[E?"backgroundColor":"borderColor"]:i}},children:a})}var H6=(0,D.memo)(ZA);var Me=Je(Cu(),1),GA={browser:"#3d6ea5",state:"#7c5cb0",network:"#b3812f",gateway:"#2e8f8a",services:"#2f8f53",data:"#a8554e"},QA={browser:"#3d6ea5",gateway:"#2e8f8a",data:"#a8554e"},Ye=Rd({detail:null,selected:0,rev:0,centerTick:0}),_o=null,Qx="";function Kx(t){return t.group==="browser"?"browser":t.kind==="gateway-request"?"gateway":t.kind==="queue-process"||t.kind==="queue-active"||t.kind==="queue-completed"||t.kind==="queue-failed"?"svc:"+(t.project??"worker"):t.source==="nestjs"||t.source==="nest"?"svc:"+(t.project??"service"):t.source==="db"||t.source==="redis"||t.source==="queue"||t.source==="external"?"data":"browser"}function KA(t){return t==="browser"?"\u{1F310} Browser":t==="gateway"?"\u21C4 Gateway":t==="data"?"\u{1F6E2} Data stores":"\u2B21 "+t.slice(4)+" service"}function jA(t){return QA[t]??"#2f8f53"}var Oh=252,$A=26,jx=80,$x=36,Cc=230,Dh=64;function JA(t){let e=t.events,n=[];for(let s of e){let f=Kx(s);n.includes(f)||n.push(f)}let o=new Map(n.map((s,f)=>[s,f*(Oh+$A)])),l=$x+e.length*jx+14,a=n.map(s=>({id:"box:"+s,type:"layerBox",position:{x:o.get(s),y:0},data:{label:KA(s),color:jA(s)},style:{width:Oh,height:l},draggable:!1,selectable:!1,zIndex:0})),i=e.length?Math.min(...e.map(s=>s.start??s.t)):0;e.forEach((s,f)=>{a.push({id:s.id,type:"ev",parentId:"box:"+Kx(s),extent:"parent",position:{x:(Oh-Cc)/2,y:$x+f*jx},width:Cc,height:Dh,data:{ev:s,idx:f,t0:i},draggable:!1,zIndex:2})});let r=[],u=new Map(e.map((s,f)=>[s.id,f])),c={type:"smoothstep",zIndex:3};for(let s of e)s.parent&&u.has(s.parent)&&r.push({id:"tree:"+s.id,source:s.parent,target:s.id,...c,style:{stroke:"#5b7ba6",strokeWidth:1.6},markerEnd:"arrow"});for(let s of["browser","server"]){let f=null;for(let m of e)m.group!==s||m.parent||m.kind==="gateway-request"||(f&&r.push({id:"spine:"+m.id,source:f.id,target:m.id,...c,style:{stroke:"#41618f",strokeWidth:1.2,strokeDasharray:"6 5"},markerEnd:"arrow"}),f=m)}let d={stroke:"#5b9dd9",strokeWidth:1.4,strokeDasharray:"6 5"};for(let s of e)s.kind==="gateway-request"&&(s.fetchStartId&&u.has(s.fetchStartId)&&r.push({id:"x:req:"+s.id,source:s.fetchStartId,target:s.id,...c,style:d,markerEnd:"arrow",label:"request",labelStyle:{fill:"#5b9dd9",fontSize:10},labelBgStyle:{fill:"#0d121b"}}),s.fetchDoneId&&u.has(s.fetchDoneId)&&(u.get(s.fetchDoneId)??0)>(u.get(s.id)??0)&&r.push({id:"x:res:"+s.id,source:s.id,target:s.fetchDoneId,...c,style:d,markerEnd:"arrow",label:"response",labelStyle:{fill:"#5b9dd9",fontSize:10},labelBgStyle:{fill:"#0d121b"}}));return{nodes:a,edges:r}}function IA({data:t}){let e=t;return(0,Me.jsx)("div",{style:{width:"100%",height:"100%",borderRadius:12,border:`1px solid ${e.color}55`,background:`${e.color}0d`},children:(0,Me.jsx)("div",{style:{padding:"8px 12px",font:"600 12px ui-monospace, Menlo, monospace",color:e.color,letterSpacing:1,borderBottom:`1px solid ${e.color}33`},children:e.label.toUpperCase()})})}function WA({data:t}){let e=t,n=e.ev,o=Ud(Ye).selected===e.idx,l=n.severity==="error"?"#c5484f":n.severity==="warning"?"#d9a23c":GA[n.area??"browser"]??"#3d6ea5",a=n.start??n.t;return(0,Me.jsxs)("div",{onClick:()=>{Ye.selected=e.idx;let i=window.__lensmcpOnStepSelect;typeof i=="function"&&i(e.idx)},style:{width:Cc,height:Dh,borderRadius:9,cursor:"pointer",background:o?"#18243a":"#121925",border:`${o?2.4:1.2}px solid ${l}`,boxShadow:o?`0 0 14px ${l}66`:"none",padding:"7px 10px",overflow:"hidden"},children:[(0,Me.jsx)(sl,{type:"target",position:Q.Top,style:{opacity:0}}),(0,Me.jsx)("div",{style:{font:"600 11px ui-monospace, Menlo, monospace",color:"#dbe6f3",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:n.title}),(0,Me.jsxs)("div",{style:{font:"10px ui-monospace, Menlo, monospace",color:"#7d92ad",marginTop:3},children:[n.kind||n.category," \xB7 +",Math.round(a-e.t0),"ms",n.durationMs!=null?` \xB7 ${Math.round(n.durationMs)}ms`:""]}),n.detail?(0,Me.jsx)("div",{title:n.detail,style:{font:"10px ui-monospace, Menlo, monospace",color:"#9ab27f",marginTop:3,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:n.detail}):null,(0,Me.jsx)(sl,{type:"source",position:Q.Bottom,style:{opacity:0}})]})}var FA={layerBox:IA,ev:WA};function PA(){let t=Ud(Ye),e=t.detail,n=(0,Oc.useMemo)(()=>e?JA(e):{nodes:[],edges:[]},[t.rev]);return(0,Oc.useEffect)(()=>{if(t.centerTick===0)return;let o=Ye.detail;if(!_o||!o)return;let l=o.events[Ye.selected];if(!l)return;let a=l.id;requestAnimationFrame(()=>{let i=_o?.getInternalNode(a)?.internals.positionAbsolute;if(!i||!_o)return;let r=_o.getZoom()<.6?.8:_o.getZoom();_o.setCenter(i.x+Cc/2,i.y+Dh/2,{zoom:r,duration:240})})},[t.centerTick]),e?(0,Me.jsx)(Vx,{nodes:n.nodes,edges:n.edges,nodeTypes:FA,onInit:o=>{_o=o,o.fitView({padding:.15,maxZoom:1})},proOptions:{hideAttribution:!0},minZoom:.2,nodesConnectable:!1,onlyRenderVisibleElements:!0,style:{background:"#0d121b"},children:(0,Me.jsx)(Xx,{gap:24,color:"#16202e"})}):null}var Jx=document.getElementById("flow-root");if(Jx){let t=window;t.__lensmcpRenderFlow=(e,n)=>{let o=e.flowId!==Qx;Qx=e.flowId,Ye.detail=e,typeof n=="number"?Ye.selected=n:Ye.selected>=e.events.length&&(Ye.selected=0),Ye.rev+=1,o&&requestAnimationFrame(()=>_o?.fitView({padding:.15,maxZoom:1}))},t.__lensmcpHighlightStep=(e,n=!0)=>{Ye.selected=e,n&&(Ye.centerTick+=1)},(0,Ix.createRoot)(Jx).render((0,Me.jsx)(PA,{}))}})();
|
|
15
|
+
M${M.x},${M.y}h${M.width}v${M.height}h${-M.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}Gx.displayName="MiniMap";var D6=(0,D.memo)(Gx),qA=t=>e=>t?`${Math.max(1/e.transform[2],1)}`:void 0,XA={[xo.Line]:"right",[xo.Handle]:"bottom-right"};function ZA({nodeId:t,position:e,variant:n=xo.Handle,className:o,style:l=void 0,children:a,color:i,minWidth:r=10,minHeight:u=10,maxWidth:c=Number.MAX_VALUE,maxHeight:d=Number.MAX_VALUE,keepAspectRatio:s=!1,resizeDirection:f,autoScale:m=!0,shouldResize:y,onResizeStart:x,onResize:b,onResizeEnd:g}){let p=xx(),h=typeof t=="string"?t:p,v=Mt(),_=(0,D.useRef)(null),E=n===xo.Handle,w=ut((0,D.useCallback)(qA(E&&m),[E,m]),_t),M=(0,D.useRef)(null),N=e??XA[n];(0,D.useEffect)(()=>{if(!(!_.current||!h))return M.current||(M.current=Nb({domNode:_.current,nodeId:h,getStoreItems:()=>{let{nodeLookup:T,transform:U,snapGrid:Y,snapToGrid:S,nodeOrigin:A,domNode:z}=v.getState();return{nodeLookup:T,transform:U,snapGrid:Y,snapToGrid:S,nodeOrigin:A,paneDomNode:z}},onChange:(T,U)=>{let{triggerNodeChanges:Y,nodeLookup:S,parentLookup:A,nodeOrigin:z}=v.getState(),C=[],B={x:T.x,y:T.y},H=S.get(h);if(H&&H.expandParent&&H.parentId){let q=H.origin??z,X=T.width??H.measured.width??0,V=T.height??H.measured.height??0,K={id:H.id,parentId:H.parentId,rect:{width:X,height:V,...hh({x:T.x??H.position.x,y:T.y??H.position.y},{width:X,height:V},H.parentId,S,q)}},G=bc([K],S,A,z);C.push(...G),B.x=T.x?Math.max(q[0]*X,T.x):void 0,B.y=T.y?Math.max(q[1]*V,T.y):void 0}if(B.x!==void 0&&B.y!==void 0){let q={id:h,type:"position",position:{...B}};C.push(q)}if(T.width!==void 0&&T.height!==void 0){let X={id:h,type:"dimensions",resizing:!0,setAttributes:f?f==="horizontal"?"width":"height":!0,dimensions:{width:T.width,height:T.height}};C.push(X)}for(let q of U){let X={...q,type:"position"};C.push(X)}Y(C)},onEnd:({width:T,height:U})=>{let Y={id:h,type:"dimensions",resizing:!1,dimensions:{width:T,height:U}};v.getState().triggerNodeChanges([Y])}})),M.current.update({controlPosition:N,boundaries:{minWidth:r,minHeight:u,maxWidth:c,maxHeight:d},keepAspectRatio:s,resizeDirection:f,onResizeStart:x,onResize:b,onResizeEnd:g,shouldResize:y}),()=>{M.current?.destroy()}},[N,r,u,c,d,s,x,b,g,y]);let R=N.split("-");return(0,O.jsx)("div",{className:At(["react-flow__resize-control","nodrag",...R,n,o]),ref:_,style:{...l,scale:w,...i&&{[E?"backgroundColor":"borderColor"]:i}},children:a})}var H6=(0,D.memo)(ZA);var Me=Je(Cu(),1),GA={browser:"#3d6ea5",state:"#7c5cb0",network:"#b3812f",gateway:"#2e8f8a",services:"#2f8f53",data:"#a8554e",ai:"#a371f7"},QA={browser:"#3d6ea5",gateway:"#2e8f8a",data:"#a8554e",ai:"#a371f7"},Ye=Rd({detail:null,selected:0,rev:0,centerTick:0}),_o=null,Qx="";function Kx(t){return t.source==="ai"||t.area==="ai"?"ai":t.group==="browser"?"browser":t.kind==="gateway-request"?"gateway":t.kind==="queue-process"||t.kind==="queue-active"||t.kind==="queue-completed"||t.kind==="queue-failed"?"svc:"+(t.project??"worker"):t.source==="nestjs"||t.source==="nest"?"svc:"+(t.project??"service"):t.source==="db"||t.source==="redis"||t.source==="queue"||t.source==="external"?"data":"browser"}function KA(t){return t==="browser"?"\u{1F310} Browser":t==="gateway"?"\u21C4 Gateway":t==="data"?"\u{1F6E2} Data stores":t==="ai"?"\u{1F9E0} AI turn":"\u2B21 "+t.slice(4)+" service"}function jA(t){return QA[t]??"#2f8f53"}var Oh=252,$A=26,jx=80,$x=36,Cc=230,Dh=64;function JA(t){let e=t.events,n=[];for(let s of e){let f=Kx(s);n.includes(f)||n.push(f)}let o=new Map(n.map((s,f)=>[s,f*(Oh+$A)])),l=$x+e.length*jx+14,a=n.map(s=>({id:"box:"+s,type:"layerBox",position:{x:o.get(s),y:0},data:{label:KA(s),color:jA(s)},style:{width:Oh,height:l},draggable:!1,selectable:!1,zIndex:0})),i=e.length?Math.min(...e.map(s=>s.start??s.t)):0;e.forEach((s,f)=>{a.push({id:s.id,type:"ev",parentId:"box:"+Kx(s),extent:"parent",position:{x:(Oh-Cc)/2,y:$x+f*jx},width:Cc,height:Dh,data:{ev:s,idx:f,t0:i},draggable:!1,zIndex:2})});let r=[],u=new Map(e.map((s,f)=>[s.id,f])),c={type:"smoothstep",zIndex:3};for(let s of e)s.parent&&u.has(s.parent)&&r.push({id:"tree:"+s.id,source:s.parent,target:s.id,...c,style:{stroke:"#5b7ba6",strokeWidth:1.6},markerEnd:"arrow"});for(let s of["browser","server"]){let f=null;for(let m of e)m.group!==s||m.parent||m.kind==="gateway-request"||(f&&r.push({id:"spine:"+m.id,source:f.id,target:m.id,...c,style:{stroke:"#41618f",strokeWidth:1.2,strokeDasharray:"6 5"},markerEnd:"arrow"}),f=m)}let d={stroke:"#5b9dd9",strokeWidth:1.4,strokeDasharray:"6 5"};for(let s of e)s.kind==="gateway-request"&&(s.fetchStartId&&u.has(s.fetchStartId)&&r.push({id:"x:req:"+s.id,source:s.fetchStartId,target:s.id,...c,style:d,markerEnd:"arrow",label:"request",labelStyle:{fill:"#5b9dd9",fontSize:10},labelBgStyle:{fill:"#0d121b"}}),s.fetchDoneId&&u.has(s.fetchDoneId)&&(u.get(s.fetchDoneId)??0)>(u.get(s.id)??0)&&r.push({id:"x:res:"+s.id,source:s.id,target:s.fetchDoneId,...c,style:d,markerEnd:"arrow",label:"response",labelStyle:{fill:"#5b9dd9",fontSize:10},labelBgStyle:{fill:"#0d121b"}}));return{nodes:a,edges:r}}function IA({data:t}){let e=t;return(0,Me.jsx)("div",{style:{width:"100%",height:"100%",borderRadius:12,border:`1px solid ${e.color}55`,background:`${e.color}0d`},children:(0,Me.jsx)("div",{style:{padding:"8px 12px",font:"600 12px ui-monospace, Menlo, monospace",color:e.color,letterSpacing:1,borderBottom:`1px solid ${e.color}33`},children:e.label.toUpperCase()})})}function WA({data:t}){let e=t,n=e.ev,o=Ud(Ye).selected===e.idx,l=n.severity==="error"?"#c5484f":n.severity==="warning"?"#d9a23c":GA[n.area??"browser"]??"#3d6ea5",a=n.start??n.t;return(0,Me.jsxs)("div",{onClick:()=>{Ye.selected=e.idx;let i=window.__lensmcpOnStepSelect;typeof i=="function"&&i(e.idx)},style:{width:Cc,height:Dh,borderRadius:9,cursor:"pointer",background:o?"#18243a":"#121925",border:`${o?2.4:1.2}px solid ${l}`,boxShadow:o?`0 0 14px ${l}66`:"none",padding:"7px 10px",overflow:"hidden"},children:[(0,Me.jsx)(sl,{type:"target",position:Q.Top,style:{opacity:0}}),(0,Me.jsx)("div",{style:{font:"600 11px ui-monospace, Menlo, monospace",color:"#dbe6f3",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:n.title}),(0,Me.jsxs)("div",{style:{font:"10px ui-monospace, Menlo, monospace",color:"#7d92ad",marginTop:3},children:[n.kind||n.category," \xB7 +",Math.round(a-e.t0),"ms",n.durationMs!=null?` \xB7 ${Math.round(n.durationMs)}ms`:""]}),n.detail?(0,Me.jsx)("div",{title:n.detail,style:{font:"10px ui-monospace, Menlo, monospace",color:"#9ab27f",marginTop:3,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:n.detail}):null,(0,Me.jsx)(sl,{type:"source",position:Q.Bottom,style:{opacity:0}})]})}var FA={layerBox:IA,ev:WA};function PA(){let t=Ud(Ye),e=t.detail,n=(0,Oc.useMemo)(()=>e?JA(e):{nodes:[],edges:[]},[t.rev]);return(0,Oc.useEffect)(()=>{if(t.centerTick===0)return;let o=Ye.detail;if(!_o||!o)return;let l=o.events[Ye.selected];if(!l)return;let a=l.id;requestAnimationFrame(()=>{let i=_o?.getInternalNode(a)?.internals.positionAbsolute;if(!i||!_o)return;let r=_o.getZoom()<.6?.8:_o.getZoom();_o.setCenter(i.x+Cc/2,i.y+Dh/2,{zoom:r,duration:240})})},[t.centerTick]),e?(0,Me.jsx)(Vx,{nodes:n.nodes,edges:n.edges,nodeTypes:FA,onInit:o=>{_o=o,o.fitView({padding:.15,maxZoom:1})},proOptions:{hideAttribution:!0},minZoom:.2,nodesConnectable:!1,onlyRenderVisibleElements:!0,style:{background:"#0d121b"},children:(0,Me.jsx)(Xx,{gap:24,color:"#16202e"})}):null}var Jx=document.getElementById("flow-root");if(Jx){let t=window;t.__lensmcpRenderFlow=(e,n)=>{let o=e.flowId!==Qx;Qx=e.flowId,Ye.detail=e,typeof n=="number"?Ye.selected=n:Ye.selected>=e.events.length&&(Ye.selected=0),Ye.rev+=1,o&&requestAnimationFrame(()=>_o?.fitView({padding:.15,maxZoom:1}))},t.__lensmcpHighlightStep=(e,n=!0)=>{Ye.selected=e,n&&(Ye.centerTick+=1)},(0,Ix.createRoot)(Jx).render((0,Me.jsx)(PA,{}))}})();
|
|
16
16
|
/*! Bundled license information:
|
|
17
17
|
|
|
18
18
|
react/cjs/react.production.js:
|
package/bundled/main.js
CHANGED
|
@@ -15463,7 +15463,8 @@ var FlowOriginTypeSchema = external_exports.enum([
|
|
|
15463
15463
|
"intersection-observer",
|
|
15464
15464
|
"mutation-observer",
|
|
15465
15465
|
"backend-response",
|
|
15466
|
-
"hmr-update"
|
|
15466
|
+
"hmr-update",
|
|
15467
|
+
"ai-turn"
|
|
15467
15468
|
]);
|
|
15468
15469
|
var TraceContextSchema = external_exports.object({
|
|
15469
15470
|
sessionId: external_exports.string(),
|
|
@@ -15504,7 +15505,8 @@ var EventSourceSchema = external_exports.enum([
|
|
|
15504
15505
|
"perf",
|
|
15505
15506
|
"security",
|
|
15506
15507
|
"gateway",
|
|
15507
|
-
"external"
|
|
15508
|
+
"external",
|
|
15509
|
+
"ai"
|
|
15508
15510
|
]);
|
|
15509
15511
|
var EventCategorySchema = external_exports.enum([
|
|
15510
15512
|
"build",
|
|
@@ -15523,7 +15525,8 @@ var EventCategorySchema = external_exports.enum([
|
|
|
15523
15525
|
"performance",
|
|
15524
15526
|
"security",
|
|
15525
15527
|
"deps",
|
|
15526
|
-
"cluster"
|
|
15528
|
+
"cluster",
|
|
15529
|
+
"ai"
|
|
15527
15530
|
]);
|
|
15528
15531
|
var SeveritySchema = external_exports.enum([
|
|
15529
15532
|
"debug",
|
package/lib/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gEAAgE;IAChE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gEAAgE;IAChE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAqED,wBAAsB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAwChE"}
|
package/lib/cli.js
CHANGED
|
@@ -33,7 +33,11 @@ Commands:
|
|
|
33
33
|
apps/services under their hosts) AND the per-workspace
|
|
34
34
|
lens dashboard at https://lensmcp.local/<key>/. \`start\`
|
|
35
35
|
spawns it detached (pid+log in .lensmcp/); \`stop\` ends it;
|
|
36
|
-
\`status\` reports liveness.
|
|
36
|
+
\`status\` reports liveness. \`restart\` does stop→start AND
|
|
37
|
+
refreshes the nx project graph (resets the daemon) so a
|
|
38
|
+
lib/app added since boot resolves — fixing the Vite
|
|
39
|
+
"Failed to resolve import" error after adding a module.
|
|
40
|
+
Binding :443 needs privilege.
|
|
37
41
|
bridge [--cwd <dir>] [--host <h>] [--port <n>]
|
|
38
42
|
Run the standalone browser-event bridge for hosts with
|
|
39
43
|
no LensMCP build plugin (webpack, Next.js, no build).
|
|
@@ -270,6 +274,11 @@ function runGateway(ctx, args, out, err) {
|
|
|
270
274
|
return stop();
|
|
271
275
|
case 'restart':
|
|
272
276
|
stop();
|
|
277
|
+
// The nx DAEMON survives `stop()` (the gateway never owned it), so the relaunched Vite/dev
|
|
278
|
+
// servers would re-read the SAME stale project graph — a lib/app added since boot still fails
|
|
279
|
+
// to resolve (`Failed to resolve import "@scope/new-lib"`). Bust the daemon graph here so the
|
|
280
|
+
// freshly-spawned `gateway:serve` recomputes it and newly-added projects resolve.
|
|
281
|
+
refreshNxGraph(cwd, ctx.env, out);
|
|
273
282
|
return start();
|
|
274
283
|
case 'status':
|
|
275
284
|
return status();
|
|
@@ -278,6 +287,35 @@ function runGateway(ctx, args, out, err) {
|
|
|
278
287
|
return { exitCode: 2 };
|
|
279
288
|
}
|
|
280
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Bust the nx project graph before the gateway relaunches its dev servers.
|
|
292
|
+
*
|
|
293
|
+
* The dev gateway spawns each app's Vite/dev server, whose `nxViteTsPaths` alias resolver reads the
|
|
294
|
+
* nx project graph from the long-running nx DAEMON — a process the gateway never owns. So a plain
|
|
295
|
+
* `restart` (kill the gateway tree, respawn `gateway:serve`) leaves the daemon — and its STALE
|
|
296
|
+
* in-memory graph — running: the fresh Vite asks the same daemon and a lib/app added since the daemon
|
|
297
|
+
* booted still 404s (`[plugin:vite:import-analysis] Failed to resolve import "@scope/new-lib"`).
|
|
298
|
+
* (`tsc` resolves it from tsconfig paths, which is why typecheck passes while Vite fails.)
|
|
299
|
+
*
|
|
300
|
+
* Stopping the daemon (+ clearing its cached graph) forces the very next nx invocation — the
|
|
301
|
+
* relaunched `gateway:serve` — to recompute the graph from disk, so new projects resolve. We prefer
|
|
302
|
+
* the targeted `nx reset --only-daemon` (keeps the computation cache → fast) and fall back to
|
|
303
|
+
* `nx daemon --stop` on older nx. Best-effort: a failure never blocks the restart.
|
|
304
|
+
*/
|
|
305
|
+
function refreshNxGraph(cwd, env, out) {
|
|
306
|
+
const nxBin = findNxBinary(cwd);
|
|
307
|
+
if (!nxBin) {
|
|
308
|
+
out(' (graph refresh skipped — no nx binary found in the workspace)');
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const runEnv = { ...process.env, ...(env ?? {}) };
|
|
312
|
+
const tryNx = (args) => spawnSync(nxBin, args, { cwd, env: runEnv, stdio: 'ignore' }).status === 0;
|
|
313
|
+
if (tryNx(['reset', '--only-daemon']) || tryNx(['daemon', '--stop'])) {
|
|
314
|
+
out(' nx project graph refreshed — a lib/app added since boot will now resolve.');
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
out(' (graph refresh best-effort failed — if a new project does not resolve, run `nx reset`)');
|
|
318
|
+
}
|
|
281
319
|
/** Scan every project.json for the first project carrying a target whose executor
|
|
282
320
|
* is `executor`. An explicit project+target short-circuits the scan; a partial
|
|
283
321
|
* override fills the missing half from the match. */
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "lensmcp",
|
|
3
3
|
"displayName": "LensMCP",
|
|
4
4
|
"description": "The observability lens for coding agents. One command brings up the dev cluster gateway (every project.json `cluster` decl → its host on :443), the per-project lens dashboard at https://lensmcp.local/<project>/, and the MCP server your agent connects to — scoped automatically to whatever project you opened Claude Code in.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.16.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "David Antoon",
|
|
8
8
|
"email": "davidmantoon@gmail.com"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Restart the LensMCP dev cluster gateway for the current project — and REFRESH the nx project
|
|
3
|
+
# graph (reset the daemon) so a lib/app added since the gateway booted actually resolves. Fixes the
|
|
4
|
+
# Vite `[plugin:vite:import-analysis] Failed to resolve import "@scope/new-lib"` error you hit after
|
|
5
|
+
# adding a new module (a plain restart re-reads the same stale daemon graph; this one busts it).
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$PWD}"
|
|
9
|
+
BIN="$PROJECT_DIR/node_modules/lensmcp/bin.js"
|
|
10
|
+
|
|
11
|
+
if [ ! -f "$BIN" ]; then
|
|
12
|
+
echo "✗ lensmcp is not installed in $PROJECT_DIR." >&2
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
exec node "$BIN" gateway restart --cwd "$PROJECT_DIR"
|
|
@@ -10,6 +10,19 @@ server and the dashboard both read that file. **Project isolation is automatic**
|
|
|
10
10
|
server is launched with `--cwd ${CLAUDE_PROJECT_DIR}`, so it always reads the flows of the
|
|
11
11
|
project Claude Code is open in. Different project → different event file → different flows.
|
|
12
12
|
|
|
13
|
+
## Reach for the lens FIRST on a runtime-behaviour question
|
|
14
|
+
|
|
15
|
+
The moment the task is **"why did the running app just DO that?"** — a UI that
|
|
16
|
+
redirected/hung/rendered wrong, a click that fired the wrong request, a re-render storm, a
|
|
17
|
+
slow route, a memory leak, "trace this flow" — the lens is the FIRST tool, before curl,
|
|
18
|
+
`console.log`-reading, or code-guessing. The lens sees the *actual* runtime (the flow graph,
|
|
19
|
+
the state updates, the re-render cause, the network a click caused, the frames); static
|
|
20
|
+
analysis + curl answer the *narrower* question "is the backend/contract correct?". Do the
|
|
21
|
+
curl to RULE OUT a server cause — but a green curl never explains an FE symptom, and a
|
|
22
|
+
plausible code story is not a diagnosis. Don't ship a root-cause claim for a runtime symptom
|
|
23
|
+
the lens could confirm without having looked. (This is enforced in workspaces that adopt the
|
|
24
|
+
`lens-first-diagnosis` rule.)
|
|
25
|
+
|
|
13
26
|
## First: is the lens set up?
|
|
14
27
|
|
|
15
28
|
LensMCP gates its tools until the workspace has been set up **once per machine** (and again
|