fractostate 4.3.2 → 4.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cjs/index.js +5 -2
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/src/devtools/FractoDevTools.js +3 -1
  4. package/dist/cjs/src/devtools/FractoDevTools.js.map +1 -1
  5. package/dist/cjs/src/devtools/MapUtils.js +3 -11
  6. package/dist/cjs/src/devtools/MapUtils.js.map +1 -1
  7. package/dist/cjs/src/devtools/MentalMap.css.js +1 -1
  8. package/dist/cjs/src/devtools/MentalMap.js +141 -80
  9. package/dist/cjs/src/devtools/MentalMap.js.map +1 -1
  10. package/dist/cjs/src/devtools/PluginManager.js +1 -1
  11. package/dist/cjs/src/devtools/PluginManager.js.map +1 -1
  12. package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js +99 -0
  13. package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
  14. package/dist/cjs/src/devtools/mmap/components/FlowNodes.js +14 -0
  15. package/dist/cjs/src/devtools/mmap/components/FlowNodes.js.map +1 -0
  16. package/dist/cjs/src/devtools/mmap/components/MMapLedger.js +22 -0
  17. package/dist/cjs/src/devtools/mmap/components/MMapLedger.js.map +1 -0
  18. package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js +14 -0
  19. package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
  20. package/dist/cjs/src/plugins/storage/StorageAdapter.js +38 -4
  21. package/dist/cjs/src/plugins/storage/StorageAdapter.js.map +1 -1
  22. package/dist/cjs/src/store.js +35 -13
  23. package/dist/cjs/src/store.js.map +1 -1
  24. package/dist/esm/index.js +5 -2
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/src/devtools/FractoDevTools.js +3 -1
  27. package/dist/esm/src/devtools/FractoDevTools.js.map +1 -1
  28. package/dist/esm/src/devtools/MapUtils.js +5 -11
  29. package/dist/esm/src/devtools/MapUtils.js.map +1 -1
  30. package/dist/esm/src/devtools/MentalMap.css.js +1 -1
  31. package/dist/esm/src/devtools/MentalMap.js +141 -80
  32. package/dist/esm/src/devtools/MentalMap.js.map +1 -1
  33. package/dist/esm/src/devtools/PluginManager.js +2 -2
  34. package/dist/esm/src/devtools/PluginManager.js.map +1 -1
  35. package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js +97 -0
  36. package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
  37. package/dist/esm/src/devtools/mmap/components/FlowNodes.js +10 -0
  38. package/dist/esm/src/devtools/mmap/components/FlowNodes.js.map +1 -0
  39. package/dist/esm/src/devtools/mmap/components/MMapLedger.js +20 -0
  40. package/dist/esm/src/devtools/mmap/components/MMapLedger.js.map +1 -0
  41. package/dist/esm/src/devtools/mmap/components/MMapSidebar.js +12 -0
  42. package/dist/esm/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
  43. package/dist/esm/src/plugins/storage/StorageAdapter.js +38 -4
  44. package/dist/esm/src/plugins/storage/StorageAdapter.js.map +1 -1
  45. package/dist/esm/src/store.js +35 -13
  46. package/dist/esm/src/store.js.map +1 -1
  47. package/dist/plugins.d.ts +1 -1
  48. package/package.json +1 -1
@@ -7,11 +7,16 @@ require('@xyflow/react/dist/style.css');
7
7
  var framerMotion = require('framer-motion');
8
8
  var lucideReact = require('lucide-react');
9
9
  require('./MentalMap.css.js');
10
+ var FlowNodes = require('./mmap/components/FlowNodes.js');
10
11
  var MapUtils = require('./MapUtils.js');
12
+ var MMapSidebar = require('./mmap/components/MMapSidebar.js');
13
+ var MMapLedger = require('./mmap/components/MMapLedger.js');
14
+ var FlowGenealogy = require('./mmap/components/FlowGenealogy.js');
11
15
 
12
16
  const nodeTypes = {
13
- flow: MapUtils.FlowNode,
14
- actor: MapUtils.ActorNode,
17
+ flow: FlowNodes.FlowNode,
18
+ actor: FlowNodes.ActorNode,
19
+ listener: FlowNodes.ListenerNode,
15
20
  };
16
21
  const edgeTypes = {
17
22
  fiber: MapUtils.FiberEdge,
@@ -25,10 +30,11 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
25
30
  const [isMinimized, setIsMinimized] = React.useState(false);
26
31
  const [isFullscreen, setIsFullscreen] = React.useState(false);
27
32
  const [isLedgerVisible, setIsLedgerVisible] = React.useState(true);
33
+ const [viewMode, setViewMode] = React.useState("live");
28
34
  React.useEffect(() => {
29
35
  onMinimizeChange?.(isMinimized);
30
36
  }, [isMinimized, onMinimizeChange]);
31
- // Dragging logic for minimized state
37
+ // Logic pour le drag du logo réduit
32
38
  const [minimizedPos, setMinimizedPos] = React.useState({
33
39
  x: minimizedSide === "right" ? window.innerWidth - 100 : 40,
34
40
  y: window.innerHeight - 100,
@@ -70,112 +76,177 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
70
76
  window.removeEventListener("mouseup", handleMouseUp);
71
77
  };
72
78
  }, [isDraggingLogo, dragOffset]);
73
- // Track flows that changed recently
74
79
  const [activeFlows, setActiveFlows] = React.useState(new Set());
75
- React.useEffect(() => {
80
+ // Detect recent activity
81
+ const recentActivity = React.useMemo(() => {
76
82
  const now = Date.now();
77
- const active = new Set();
83
+ const activityMap = {};
78
84
  Object.entries(snapshot).forEach(([key, data]) => {
79
85
  const traces = data.meta.traces || [];
80
- const hasRecent = traces.some((t) => now - t.timestamp < 3000);
81
- if (hasRecent)
82
- active.add(key);
86
+ const lastTrace = traces[traces.length - 1];
87
+ if (lastTrace && now - lastTrace.timestamp < 1000) {
88
+ activityMap[key] = {
89
+ active: true,
90
+ actor: lastTrace.actor,
91
+ type: lastTrace.type,
92
+ };
93
+ }
83
94
  });
84
- setActiveFlows(active);
95
+ return activityMap;
85
96
  }, [snapshot]);
86
- // Filter flows based on search query (Smart Search: Key, Actors, Data)
97
+ React.useEffect(() => {
98
+ const active = new Set();
99
+ Object.keys(recentActivity).forEach((key) => active.add(key));
100
+ setActiveFlows(active);
101
+ }, [recentActivity]);
87
102
  const filteredFlows = React.useMemo(() => {
88
103
  const query = searchQuery.toLowerCase().trim();
104
+ const entries = Object.entries(snapshot);
89
105
  if (!query)
90
- return Object.entries(snapshot);
91
- return Object.entries(snapshot).filter(([key, data]) => {
92
- // 1. Match Flow Name
106
+ return entries;
107
+ return entries.filter(([key, data]) => {
93
108
  if (key.toLowerCase().includes(query))
94
109
  return true;
95
- // 2. Match Actors (Consumers)
96
110
  const consumers = data.meta.consumers || [];
97
111
  if (consumers.some((c) => c.toLowerCase().includes(query)))
98
112
  return true;
99
- // 3. Match Data (Values)
100
113
  try {
101
114
  if (JSON.stringify(data.value).toLowerCase().includes(query))
102
115
  return true;
103
116
  }
104
- catch (e) {
105
- // ignore circular structure issues
106
- }
117
+ catch (e) { }
107
118
  return false;
108
119
  });
109
120
  }, [snapshot, searchQuery]);
110
- // Process data for React Flow
111
121
  React.useEffect(() => {
112
- // Use the filtered list for the map!
122
+ if (viewMode !== "live")
123
+ return;
113
124
  const flowEntries = filteredFlows;
114
125
  const newNodes = [];
115
126
  const newEdges = [];
116
- const actorsSeen = new Set();
117
- const flowX = 400;
118
127
  const actorX = 50;
128
+ const flowX = 500;
129
+ const listenerX = 950;
119
130
  let flowY = 100;
120
131
  let actorY = 100;
132
+ let listenerY = 100;
121
133
  flowEntries.forEach(([key, data]) => {
134
+ const activity = recentActivity[key];
135
+ const isFlowHot = !!activity;
136
+ // --- Node FLOW (Center) ---
122
137
  newNodes.push({
123
138
  id: `flow-${key}`,
124
139
  type: "flow",
125
140
  position: { x: flowX, y: flowY },
126
141
  data: {
127
- label: key,
142
+ label: key.toUpperCase(),
128
143
  value: data.value,
129
144
  isActive: selectedFlow === key,
145
+ isHot: isFlowHot,
130
146
  onClick: () => setOverlayFlow(key),
131
147
  },
132
148
  });
133
- const consumers = data.meta.consumers || [];
134
- consumers.forEach((actorName) => {
135
- if (!actorName)
136
- return;
137
- const actorId = `actor-${actorName}`;
138
- if (!actorsSeen.has(actorId)) {
139
- newNodes.push({
140
- id: actorId,
141
- type: "actor",
142
- position: { x: actorX, y: actorY },
143
- data: {
144
- label: actorName,
145
- isActive: selectedFlow === key,
146
- },
147
- });
148
- actorsSeen.add(actorId);
149
- actorY += 100;
149
+ // Split Listeners: Named (Actors) vs Anonymous (UI)
150
+ const rawListeners = data.meta.listeners || [];
151
+ const namedActors = [];
152
+ const uiListeners = [];
153
+ rawListeners.forEach((l) => {
154
+ const isUI = l.label.startsWith("useFlow(") || l.label === "Anonymous Subscriber";
155
+ if (isUI)
156
+ uiListeners.push(l);
157
+ else
158
+ namedActors.push(l);
159
+ });
160
+ // Mix in the explicit consumers (those who wrote in the past)
161
+ const explicitConsumers = data.meta.consumers || [];
162
+ explicitConsumers.forEach((name) => {
163
+ if (!namedActors.find((a) => a.label === name)) {
164
+ namedActors.push({ label: name, isExplicit: true });
150
165
  }
166
+ });
167
+ // --- Node ACTORS (Left) ---
168
+ namedActors.forEach((actor, i) => {
169
+ const actorId = `actor-${actor.label}-${key}`;
170
+ const isActorHot = isFlowHot && activity.actor === actor.label;
171
+ newNodes.push({
172
+ id: actorId,
173
+ type: "actor",
174
+ position: { x: actorX, y: actorY },
175
+ data: {
176
+ label: actor.label,
177
+ isActive: selectedFlow === key,
178
+ isHot: isActorHot,
179
+ },
180
+ });
151
181
  newEdges.push({
152
- id: `edge-${actorName}-${key}`,
182
+ id: `edge-${actor.label}-${key}`,
153
183
  source: actorId,
154
184
  target: `flow-${key}`,
185
+ targetHandle: "actor-target",
155
186
  type: "fiber",
156
187
  animated: true,
188
+ style: {
189
+ stroke: isActorHot ? "#fbbf24" : "#a855f7",
190
+ strokeWidth: isActorHot ? 4 : 2,
191
+ },
157
192
  });
193
+ actorY += 120;
158
194
  });
159
- flowY += 180;
195
+ // --- Node UI LISTENERS (Right) ---
196
+ // Group UI Listeners by label to avoid redundancy
197
+ const groupedUI = uiListeners.reduce((acc, curr) => {
198
+ if (!acc[curr.label]) {
199
+ acc[curr.label] = { ...curr, count: 0 };
200
+ }
201
+ acc[curr.label].count += 1;
202
+ return acc;
203
+ }, {});
204
+ Object.values(groupedUI).forEach((group, i) => {
205
+ const listenerId = `listener-${key}-${group.label}`;
206
+ const isListenerHot = isFlowHot && (activity.type === "read" || activity.type === "write");
207
+ newNodes.push({
208
+ id: listenerId,
209
+ type: "listener",
210
+ position: { x: listenerX, y: listenerY },
211
+ data: {
212
+ label: group.count > 1
213
+ ? `${group.label} (x${group.count})`
214
+ : group.label,
215
+ isActive: selectedFlow === key,
216
+ isHot: isListenerHot,
217
+ },
218
+ });
219
+ newEdges.push({
220
+ id: `edge-flow-listener-${key}-${group.label}`,
221
+ source: `flow-${key}`,
222
+ sourceHandle: "listener-source",
223
+ target: listenerId,
224
+ type: "fiber",
225
+ animated: true,
226
+ style: {
227
+ stroke: isListenerHot ? "#fbbf24" : "#00d4ff",
228
+ strokeWidth: isListenerHot ? 3 : 2,
229
+ },
230
+ });
231
+ listenerY += 100;
232
+ });
233
+ const maxRowHeight = Math.max(250, namedActors.length * 120, Object.keys(groupedUI).length * 100);
234
+ flowY += maxRowHeight + 50;
235
+ if (actorY < flowY)
236
+ actorY = flowY;
237
+ if (listenerY < flowY)
238
+ listenerY = flowY;
160
239
  });
161
240
  setNodes(newNodes);
162
241
  setEdges(newEdges);
163
- }, [filteredFlows, selectedFlow, setNodes, setEdges]);
164
- // --- Handlers ---
165
- const handleRefresh = () => {
166
- // Simple way to trigger re-layout or re-fetch (already handled by snapshot prop)
167
- window.location.reload();
168
- };
169
- const toggleFullscreen = () => {
170
- if (!document.fullscreenElement) {
171
- document.documentElement.requestFullscreen();
172
- setIsFullscreen(true);
173
- }
174
- else {
175
- document.exitFullscreen();
176
- setIsFullscreen(false);
177
- }
178
- };
242
+ }, [
243
+ filteredFlows,
244
+ selectedFlow,
245
+ viewMode,
246
+ recentActivity,
247
+ setNodes,
248
+ setEdges,
249
+ ]);
179
250
  return (jsxRuntime.jsx(framerMotion.motion.div, { className: "mental-map-overlay", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, children: jsxRuntime.jsxs("div", { className: `mental-map-container ${isMinimized ? "minimized" : ""}`, style: isMinimized
180
251
  ? {
181
252
  left: minimizedPos.x,
@@ -184,36 +255,26 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
184
255
  right: "auto",
185
256
  }
186
257
  : {}, onMouseDown: handleLogoMouseDown, onClick: () => {
187
- if (!wasDragged.current && isMinimized) {
258
+ if (!wasDragged.current && isMinimized)
188
259
  setIsMinimized(false);
189
- }
190
- }, children: [jsxRuntime.jsxs("div", { className: `m2-minimized-logo ${activeFlows.size > 0 ? "pulse" : ""}`, children: ["F", jsxRuntime.jsx("span", { className: "m2-minimized-badge", children: "FTE" })] }), jsxRuntime.jsxs("header", { className: "m2-header", children: [jsxRuntime.jsxs("div", { className: "m2-logo-group", children: [jsxRuntime.jsx("div", { className: "m2-logo-icon", children: jsxRuntime.jsx(lucideReact.Cpu, { color: "white", size: 28 }) }), jsxRuntime.jsxs("div", { className: "m2-header-titles", children: [jsxRuntime.jsx("h1", { children: "Mental Map & Trace Engine" }), jsxRuntime.jsxs("div", { className: "m2-header-meta", children: [jsxRuntime.jsx("span", { className: "m2-engine-badge", children: "FM2/FTE5" }), jsxRuntime.jsx("span", { style: { fontSize: 10, opacity: 0.5, fontWeight: 700 }, children: "NEHONIX FCE" })] })] })] }), jsxRuntime.jsxs("div", { className: "m2-controls", children: [jsxRuntime.jsxs("div", { className: "m2-search-wrapper", children: [jsxRuntime.jsx(lucideReact.Search, { className: "m2-search-icon", size: 18 }), jsxRuntime.jsx("input", { type: "text", className: "m2-search-input", placeholder: "Search flows, actors or data patterns...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "m2-action-btns", children: [jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Refresh Graph", onClick: handleRefresh, children: jsxRuntime.jsx(lucideReact.RefreshCcw, { size: 20 }) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Minimize", onClick: (e) => {
260
+ }, children: [jsxRuntime.jsxs("div", { className: `m2-minimized-logo ${activeFlows.size > 0 ? "pulse" : ""}`, children: ["F", jsxRuntime.jsx("span", { className: "m2-minimized-badge", children: "FTE" })] }), jsxRuntime.jsxs("header", { className: "m2-header", children: [jsxRuntime.jsxs("div", { className: "m2-logo-group", children: [jsxRuntime.jsx("div", { className: "m2-logo-icon", children: jsxRuntime.jsx(lucideReact.Cpu, { color: "white", size: 28 }) }), jsxRuntime.jsxs("div", { className: "m2-header-titles", children: [jsxRuntime.jsx("h1", { children: "Mental Map & Trace Engine" }), jsxRuntime.jsxs("div", { className: "m2-header-meta", children: [jsxRuntime.jsx("span", { className: "m2-engine-badge", children: "FM2/FTE5" }), jsxRuntime.jsx("span", { style: { fontSize: 10, opacity: 0.5, fontWeight: 700 }, children: "NEHONIX FCE" })] })] })] }), jsxRuntime.jsxs("div", { className: "m2-controls", children: [jsxRuntime.jsxs("div", { className: "m2-view-switcher", style: { display: "flex", gap: 8, marginRight: 16 }, children: [jsxRuntime.jsxs("button", { className: `view-toggle-btn ${viewMode === "live" ? "active" : ""}`, onClick: () => setViewMode("live"), children: [jsxRuntime.jsx(lucideReact.Network, { size: 16 }), " Live Graph"] }), jsxRuntime.jsxs("button", { className: `view-toggle-btn ${viewMode === "genealogy" ? "active" : ""}`, onClick: () => setViewMode("genealogy"), children: [jsxRuntime.jsx(lucideReact.GitBranch, { size: 16 }), " Genealogy"] })] }), jsxRuntime.jsxs("div", { className: "m2-search-wrapper", children: [jsxRuntime.jsx(lucideReact.Search, { className: "m2-search-icon", size: 18 }), jsxRuntime.jsx("input", { type: "text", className: "m2-search-input", placeholder: "Search flows, actors or data patterns...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "m2-action-btns", children: [jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Refresh", onClick: () => window.location.reload(), children: jsxRuntime.jsx(lucideReact.RefreshCcw, { size: 20 }) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Minimize", style: { color: "blue" }, onClick: (e) => {
191
261
  e.stopPropagation();
192
262
  setIsMinimized(true);
193
263
  setIsOpen(false);
194
- }, children: jsxRuntime.jsx(lucideReact.Minimize2, { size: 20 }) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: isFullscreen ? "Exit Fullscreen" : "Fullscreen", onClick: toggleFullscreen, children: isFullscreen ? (jsxRuntime.jsx(lucideReact.Minimize2, { size: 20 })) : (jsxRuntime.jsx(lucideReact.Maximize2, { size: 20 })) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: isLedgerVisible ? "Hide Ledger" : "Show Ledger", onClick: () => setIsLedgerVisible(!isLedgerVisible), children: isLedgerVisible ? (jsxRuntime.jsx(lucideReact.PanelRightClose, { size: 20 })) : (jsxRuntime.jsx(lucideReact.PanelRight, { size: 20 })) }), jsxRuntime.jsx("button", { className: "m2-icon-btn m2-close-btn force-visible", onClick: (e) => {
264
+ }, children: jsxRuntime.jsx(lucideReact.Minimize2, { size: 20 }) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Fullscreen", onClick: () => {
265
+ if (!document.fullscreenElement)
266
+ document.documentElement.requestFullscreen();
267
+ else
268
+ document.exitFullscreen();
269
+ }, children: jsxRuntime.jsx(lucideReact.Maximize2, { size: 20 }) }), jsxRuntime.jsx("button", { className: "m2-icon-btn", title: "Toggle Ledger", onClick: () => setIsLedgerVisible(!isLedgerVisible), children: isLedgerVisible ? (jsxRuntime.jsx(lucideReact.PanelRightClose, { size: 20 })) : (jsxRuntime.jsx(lucideReact.PanelRight, { size: 20 })) }), jsxRuntime.jsx("button", { className: "m2-icon-btn m2-close-btn force-visible", onClick: (e) => {
195
270
  e.stopPropagation();
196
271
  onClose();
197
- }, title: "Close", children: jsxRuntime.jsx(lucideReact.X, { size: 24 }) })] })] })] }), jsxRuntime.jsxs("div", { className: "m2-layout", children: [jsxRuntime.jsxs("aside", { className: "m2-sidebar", children: [jsxRuntime.jsx("div", { className: "m2-sec-header", children: "Flow System Registry" }), jsxRuntime.jsx("div", { className: "m2-list", children: jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "popLayout", children: filteredFlows.map(([key, data]) => {
198
- const isActiveNow = activeFlows.has(key);
199
- return (jsxRuntime.jsxs(framerMotion.motion.div, { layout: true, initial: { opacity: 0, x: -20 }, animate: { opacity: 1, x: 0 }, className: `m2-flow-card ${selectedFlow === key ? "active" : ""} ${isActiveNow ? "is-active-now" : ""}`, onClick: () => setSelectedFlow(key), children: [jsxRuntime.jsx("div", { className: "m2-flow-indicator" }), jsxRuntime.jsxs("div", { className: "m2-flow-info", children: [jsxRuntime.jsx("span", { className: "m2-flow-name", children: key }), jsxRuntime.jsxs("span", { className: "m2-flow-stats", children: [data.meta.traces.length, " events \u2022", " ", data.meta.listeners, " listeners"] })] })] }, key));
200
- }) }) })] }), jsxRuntime.jsx("main", { className: "m2-canvas", children: jsxRuntime.jsxs(react.ReactFlow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: react.ConnectionLineType.Bezier, onNodeClick: (_, node) => {
272
+ }, title: "Close", children: jsxRuntime.jsx(lucideReact.X, { size: 24 }) })] })] })] }), jsxRuntime.jsxs("div", { className: "m2-layout", children: [jsxRuntime.jsx(MMapSidebar.MMapSidebar, { filteredFlows: filteredFlows, selectedFlow: selectedFlow, setSelectedFlow: setSelectedFlow, activeFlows: activeFlows }), jsxRuntime.jsx("main", { className: "m2-canvas", children: viewMode === "live" ? (jsxRuntime.jsxs(react.ReactFlow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: react.ConnectionLineType.Bezier, onNodeClick: (_, node) => {
201
273
  if (node.type === "flow")
202
274
  setOverlayFlow(node.id.replace("flow-", ""));
203
- }, fitView: true, colorMode: "dark", children: [jsxRuntime.jsx(react.Background, { color: "#1e293b", gap: 20 }), jsxRuntime.jsx(react.Controls, { showInteractive: false })] }) }), jsxRuntime.jsxs("aside", { className: `m2-ledger ${!isLedgerVisible ? "hidden" : ""}`, children: [jsxRuntime.jsxs("div", { className: "m2-ledger-controls", children: [jsxRuntime.jsx("div", { className: "m2-ledger-title", children: "Activity Trace Ledger (Real-time)" }), jsxRuntime.jsx("div", { className: "m2-filter-tabs", children: jsxRuntime.jsx("div", { className: "m2-tab active", children: "REAL-TIME EXECUTION" }) })] }), jsxRuntime.jsx("div", { className: "m2-trace-list", children: jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "popLayout", children: selectedFlow
204
- ? [...snapshot[selectedFlow].meta.traces]
205
- .reverse()
206
- .map((trace, i) => (jsxRuntime.jsxs(framerMotion.motion.div, { layout: true, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsxRuntime.jsx("div", { className: "m2-trace-dot" }), jsxRuntime.jsxs("div", { className: "m2-trace-header", children: [jsxRuntime.jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsxRuntime.jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxRuntime.jsxs("div", { className: "m2-trace-op-info", children: [jsxRuntime.jsx("span", { className: "m2-op-type", children: trace.type }), trace.path && (jsxRuntime.jsx("span", { className: "m2-path-tag", children: trace.path.join(" → ") }))] }), jsxRuntime.jsx("div", { className: "m2-trace-data", children: jsxRuntime.jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, `${selectedFlow}-${i}`)))
207
- : Object.entries(snapshot)
208
- .flatMap(([key, data]) => (data.meta.traces || []).map((t) => ({
209
- ...t,
210
- flow: key,
211
- })))
212
- .sort((a, b) => b.timestamp - a.timestamp)
213
- .slice(0, 50)
214
- .map((trace, i) => (jsxRuntime.jsxs(framerMotion.motion.div, { layout: true, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsxRuntime.jsx("div", { className: "m2-trace-dot" }), jsxRuntime.jsxs("div", { className: "m2-trace-header", children: [jsxRuntime.jsxs("span", { className: "m2-trace-actor-lbl", children: [jsxRuntime.jsxs("span", { style: { color: "var(--m2-accent-cyan)" }, children: ["[", trace.flow, "]"] }), " ", trace.actor] }), jsxRuntime.jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxRuntime.jsx("div", { className: "m2-trace-op-info", children: jsxRuntime.jsx("span", { className: "m2-op-type", children: trace.type }) }), jsxRuntime.jsx("div", { className: "m2-trace-data", children: jsxRuntime.jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, `global-${i}`))) }) })] })] }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: overlayFlow && (jsxRuntime.jsx(framerMotion.motion.div, { className: "m2-flow-overlay-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: () => setOverlayFlow(null), children: jsxRuntime.jsxs(framerMotion.motion.div, { className: "m2-flow-overlay", onClick: (e) => e.stopPropagation(), layoutId: `flow-${overlayFlow}`, children: [jsxRuntime.jsxs("div", { className: "m2-overlay-header", children: [jsxRuntime.jsxs("div", { className: "m2-overlay-title", children: [jsxRuntime.jsx(lucideReact.Database, { color: "#00d4ff", size: 24 }), jsxRuntime.jsxs("h2", { children: [overlayFlow, " Activity"] })] }), jsxRuntime.jsx("button", { className: "m2-icon-btn m2-close-btn", onClick: () => setOverlayFlow(null), children: jsxRuntime.jsx(lucideReact.X, { size: 20 }) })] }), jsxRuntime.jsx("div", { className: "m2-overlay-content", children: snapshot[overlayFlow].meta.traces.length === 0 ? (jsxRuntime.jsxs("div", { className: "m2-empty-state", children: [jsxRuntime.jsx(lucideReact.Activity, { size: 48, className: "m2-empty-icon" }), jsxRuntime.jsx("h3", { children: "No Activity Detected" }), jsxRuntime.jsxs("p", { children: ["This flow hasn't emitted any events yet. Interact with the features controlled by", " ", jsxRuntime.jsx("strong", { children: overlayFlow }), " to see real-time traces here."] })] })) : (jsxRuntime.jsx("div", { className: "m2-trace-list", style: { padding: 0 }, children: [...snapshot[overlayFlow].meta.traces]
275
+ }, fitView: true, colorMode: "dark", children: [jsxRuntime.jsx(react.Background, { color: "#1e293b", gap: 20 }), " ", jsxRuntime.jsx(react.Controls, { showInteractive: false })] })) : (jsxRuntime.jsx(FlowGenealogy.FlowGenealogy, { snapshot: snapshot, onSelectFlow: setOverlayFlow })) }), jsxRuntime.jsx(MMapLedger.MMapLedger, { snapshot: snapshot, selectedFlow: selectedFlow, isLedgerVisible: isLedgerVisible })] }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: overlayFlow && (jsxRuntime.jsx(framerMotion.motion.div, { className: "m2-flow-overlay-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: () => setOverlayFlow(null), children: jsxRuntime.jsxs("div", { className: "m2-flow-overlay", onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsxs("div", { className: "m2-overlay-header", children: [jsxRuntime.jsxs("div", { className: "m2-overlay-title", children: [jsxRuntime.jsx(lucideReact.Database, { color: "#00d4ff", size: 24 }), jsxRuntime.jsxs("h2", { children: [overlayFlow, " Activity"] })] }), jsxRuntime.jsx("button", { className: "m2-icon-btn m2-close-btn", onClick: () => setOverlayFlow(null), children: jsxRuntime.jsx(lucideReact.X, { size: 20 }) })] }), jsxRuntime.jsx("div", { className: "m2-overlay-content", children: snapshot[overlayFlow].meta.traces.length === 0 ? (jsxRuntime.jsxs("div", { className: "m2-empty-state", children: [jsxRuntime.jsx(lucideReact.Activity, { size: 48, className: "m2-empty-icon" }), jsxRuntime.jsx("h3", { children: "No Activity Detected" }), jsxRuntime.jsx("p", { children: "This flow hasn't emitted any events yet." })] })) : (jsxRuntime.jsx("div", { className: "m2-trace-list", children: [...snapshot[overlayFlow].meta.traces]
215
276
  .reverse()
216
- .map((trace, i) => (jsxRuntime.jsxs("div", { className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsxRuntime.jsx("div", { className: "m2-trace-dot" }), jsxRuntime.jsxs("div", { className: "m2-trace-header", children: [jsxRuntime.jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsxRuntime.jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxRuntime.jsx("div", { className: "m2-trace-op-info", children: jsxRuntime.jsx("span", { className: "m2-op-type", children: trace.type }) }), jsxRuntime.jsx("div", { className: "m2-trace-data", children: jsxRuntime.jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, i))) })) })] }) }, "overlay-backdrop")) })] }) }));
277
+ .map((trace, i) => (jsxRuntime.jsxs("div", { className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsxRuntime.jsx("div", { className: "m2-trace-dot" }), jsxRuntime.jsxs("div", { className: "m2-trace-header", children: [jsxRuntime.jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsxRuntime.jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxRuntime.jsx("div", { className: "m2-trace-op-info", children: jsxRuntime.jsx("span", { className: "m2-op-type", children: trace.type }) }), jsxRuntime.jsx("div", { className: "m2-trace-data", children: jsxRuntime.jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, i))) })) })] }) })) })] }) }));
217
278
  };
218
279
 
219
280
  exports.MentalMap = MentalMap;
@@ -1 +1 @@
1
- {"version":3,"file":"MentalMap.js","sources":["../../../../src/devtools/MentalMap.tsx"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Edge,\n Node,\n useNodesState,\n useEdgesState,\n ConnectionLineType,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Database,\n Search,\n X,\n RefreshCcw,\n Maximize2,\n Cpu,\n Minimize2,\n PanelRightClose,\n PanelRight,\n Activity,\n} from \"lucide-react\";\nimport \"./MentalMap.css\";\nimport { MentalMapProps } from \"./MentalMapProps\";\nimport { FlowNode, ActorNode, FiberEdge } from \"./MapUtils\";\n\nconst nodeTypes = {\n flow: FlowNode,\n actor: ActorNode,\n};\n\nconst edgeTypes = {\n fiber: FiberEdge,\n};\n\nexport const MentalMap = ({\n snapshot,\n onClose,\n onMinimizeChange,\n minimizedSide = \"right\",\n setIsOpen,\n}: MentalMapProps) => {\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [selectedFlow, setSelectedFlow] = useState<string | null>(null);\n const [overlayFlow, setOverlayFlow] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isMinimized, setIsMinimized] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLedgerVisible, setIsLedgerVisible] = useState(true);\n\n useEffect(() => {\n onMinimizeChange?.(isMinimized);\n }, [isMinimized, onMinimizeChange]);\n\n // Dragging logic for minimized state\n const [minimizedPos, setMinimizedPos] = useState({\n x: minimizedSide === \"right\" ? window.innerWidth - 100 : 40,\n y: window.innerHeight - 100,\n });\n const [isDraggingLogo, setIsDraggingLogo] = useState(false);\n const wasDragged = useRef(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n\n const handleLogoMouseDown = (e: React.MouseEvent) => {\n if (!isMinimized) return;\n setIsDraggingLogo(true);\n wasDragged.current = false;\n setDragOffset({\n x: e.clientX - minimizedPos.x,\n y: e.clientY - minimizedPos.y,\n });\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingLogo) {\n wasDragged.current = true;\n setMinimizedPos({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n });\n }\n };\n const handleMouseUp = () => {\n setTimeout(() => {\n setIsDraggingLogo(false);\n }, 0);\n };\n\n if (isDraggingLogo) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDraggingLogo, dragOffset]);\n\n // Track flows that changed recently\n const [activeFlows, setActiveFlows] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const now = Date.now();\n const active = new Set<string>();\n Object.entries(snapshot).forEach(([key, data]) => {\n const traces = data.meta.traces || [];\n const hasRecent = traces.some((t: any) => now - t.timestamp < 3000);\n if (hasRecent) active.add(key);\n });\n setActiveFlows(active);\n }, [snapshot]);\n\n // Filter flows based on search query (Smart Search: Key, Actors, Data)\n const filteredFlows = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n if (!query) return Object.entries(snapshot);\n\n return Object.entries(snapshot).filter(([key, data]) => {\n // 1. Match Flow Name\n if (key.toLowerCase().includes(query)) return true;\n\n // 2. Match Actors (Consumers)\n const consumers = data.meta.consumers || [];\n if (consumers.some((c: any) => c.toLowerCase().includes(query)))\n return true;\n\n // 3. Match Data (Values)\n try {\n if (JSON.stringify(data.value).toLowerCase().includes(query))\n return true;\n } catch (e) {\n // ignore circular structure issues\n }\n\n return false;\n });\n }, [snapshot, searchQuery]);\n\n // Process data for React Flow\n useEffect(() => {\n // Use the filtered list for the map!\n const flowEntries = filteredFlows;\n const newNodes: Node[] = [];\n const newEdges: Edge[] = [];\n const actorsSeen = new Set<string>();\n\n const flowX = 400;\n const actorX = 50;\n let flowY = 100;\n let actorY = 100;\n\n flowEntries.forEach(([key, data]) => {\n newNodes.push({\n id: `flow-${key}`,\n type: \"flow\",\n position: { x: flowX, y: flowY },\n data: {\n label: key,\n value: data.value,\n isActive: selectedFlow === key,\n onClick: () => setOverlayFlow(key),\n },\n });\n\n const consumers = data.meta.consumers || [];\n consumers.forEach((actorName: string) => {\n if (!actorName) return;\n\n const actorId = `actor-${actorName}`;\n if (!actorsSeen.has(actorId)) {\n newNodes.push({\n id: actorId,\n type: \"actor\",\n position: { x: actorX, y: actorY },\n data: {\n label: actorName,\n isActive: selectedFlow === key,\n },\n });\n actorsSeen.add(actorId);\n actorY += 100;\n }\n\n newEdges.push({\n id: `edge-${actorName}-${key}`,\n source: actorId,\n target: `flow-${key}`,\n type: \"fiber\",\n animated: true,\n });\n });\n\n flowY += 180;\n });\n\n setNodes(newNodes);\n setEdges(newEdges);\n }, [filteredFlows, selectedFlow, setNodes, setEdges]);\n\n // --- Handlers ---\n const handleRefresh = () => {\n // Simple way to trigger re-layout or re-fetch (already handled by snapshot prop)\n window.location.reload();\n };\n\n const toggleFullscreen = () => {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n };\n\n return (\n <motion.div\n className=\"mental-map-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n >\n <div\n className={`mental-map-container ${isMinimized ? \"minimized\" : \"\"}`}\n style={\n isMinimized\n ? {\n left: minimizedPos.x,\n top: minimizedPos.y,\n bottom: \"auto\",\n right: \"auto\",\n }\n : {}\n }\n onMouseDown={handleLogoMouseDown}\n onClick={() => {\n if (!wasDragged.current && isMinimized) {\n setIsMinimized(false);\n }\n }}\n >\n {/* --- Minimized Logo --- */}\n <div\n className={`m2-minimized-logo ${activeFlows.size > 0 ? \"pulse\" : \"\"}`}\n >\n F<span className=\"m2-minimized-badge\">FTE</span>\n </div>\n\n {/* --- Header --- */}\n <header className=\"m2-header\">\n <div className=\"m2-logo-group\">\n <div className=\"m2-logo-icon\">\n <Cpu color=\"white\" size={28} />\n </div>\n <div className=\"m2-header-titles\">\n <h1>Mental Map & Trace Engine</h1>\n <div className=\"m2-header-meta\">\n <span className=\"m2-engine-badge\">FM2/FTE5</span>\n <span style={{ fontSize: 10, opacity: 0.5, fontWeight: 700 }}>\n NEHONIX FCE\n {/* NEHONIX FCE = NEHONIX FractoCore Engine */}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"m2-controls\">\n <div className=\"m2-search-wrapper\">\n <Search className=\"m2-search-icon\" size={18} />\n <input\n type=\"text\"\n className=\"m2-search-input\"\n placeholder=\"Search flows, actors or data patterns...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n <div className=\"m2-action-btns\">\n <button\n className=\"m2-icon-btn\"\n title=\"Refresh Graph\"\n onClick={handleRefresh}\n >\n <RefreshCcw size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Minimize\"\n onClick={(e) => {\n e.stopPropagation();\n setIsMinimized(true);\n setIsOpen(false);\n }}\n >\n <Minimize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title={isFullscreen ? \"Exit Fullscreen\" : \"Fullscreen\"}\n onClick={toggleFullscreen}\n >\n {isFullscreen ? (\n <Minimize2 size={20} />\n ) : (\n <Maximize2 size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn\"\n title={isLedgerVisible ? \"Hide Ledger\" : \"Show Ledger\"}\n onClick={() => setIsLedgerVisible(!isLedgerVisible)}\n >\n {isLedgerVisible ? (\n <PanelRightClose size={20} />\n ) : (\n <PanelRight size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn m2-close-btn force-visible\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n title=\"Close\"\n >\n <X size={24} />\n </button>\n </div>\n </div>\n </header>\n\n <div className=\"m2-layout\">\n {/* --- Sidebar --- */}\n <aside className=\"m2-sidebar\">\n <div className=\"m2-sec-header\">Flow System Registry</div>\n <div className=\"m2-list\">\n <AnimatePresence mode=\"popLayout\">\n {filteredFlows.map(([key, data]) => {\n const isActiveNow = activeFlows.has(key);\n return (\n <motion.div\n key={key}\n layout\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n className={`m2-flow-card ${selectedFlow === key ? \"active\" : \"\"} ${isActiveNow ? \"is-active-now\" : \"\"}`}\n onClick={() => setSelectedFlow(key)}\n >\n <div className=\"m2-flow-indicator\" />\n <div className=\"m2-flow-info\">\n <span className=\"m2-flow-name\">{key}</span>\n <span className=\"m2-flow-stats\">\n {data.meta.traces.length} events •{\" \"}\n {data.meta.listeners} listeners\n </span>\n </div>\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n </aside>\n\n {/* --- Main Canvas --- */}\n <main className=\"m2-canvas\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionLineType={ConnectionLineType.Bezier}\n onNodeClick={(_, node) => {\n if (node.type === \"flow\")\n setOverlayFlow(node.id.replace(\"flow-\", \"\"));\n }}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#1e293b\" gap={20} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </main>\n\n {/* --- Activity Ledger --- */}\n <aside className={`m2-ledger ${!isLedgerVisible ? \"hidden\" : \"\"}`}>\n <div className=\"m2-ledger-controls\">\n <div className=\"m2-ledger-title\">\n Activity Trace Ledger (Real-time)\n </div>\n <div className=\"m2-filter-tabs\">\n <div className=\"m2-tab active\">REAL-TIME EXECUTION</div>\n </div>\n </div>\n\n <div className=\"m2-trace-list\">\n <AnimatePresence mode=\"popLayout\">\n {selectedFlow\n ? [...snapshot[selectedFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <motion.div\n key={`${selectedFlow}-${i}`}\n layout\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n {trace.path && (\n <span className=\"m2-path-tag\">\n {trace.path.join(\" → \")}\n </span>\n )}\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </motion.div>\n ))\n : Object.entries(snapshot)\n .flatMap(([key, data]) =>\n (data.meta.traces || []).map((t: any) => ({\n ...t,\n flow: key,\n })),\n )\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, 50)\n .map((trace, i) => (\n <motion.div\n key={`global-${i}`}\n layout\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n <span style={{ color: \"var(--m2-accent-cyan)\" }}>\n [{trace.flow}]\n </span>{\" \"}\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n </aside>\n </div>\n\n {/* --- Flow Data Overlay --- */}\n <AnimatePresence>\n {overlayFlow && (\n <motion.div\n key=\"overlay-backdrop\"\n className=\"m2-flow-overlay-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={() => setOverlayFlow(null)}\n >\n <motion.div\n className=\"m2-flow-overlay\"\n onClick={(e) => e.stopPropagation()}\n layoutId={`flow-${overlayFlow}`}\n >\n <div className=\"m2-overlay-header\">\n <div className=\"m2-overlay-title\">\n <Database color=\"#00d4ff\" size={24} />\n <h2>{overlayFlow} Activity</h2>\n </div>\n <button\n className=\"m2-icon-btn m2-close-btn\"\n onClick={() => setOverlayFlow(null)}\n >\n <X size={20} />\n </button>\n </div>\n <div className=\"m2-overlay-content\">\n {snapshot[overlayFlow].meta.traces.length === 0 ? (\n <div className=\"m2-empty-state\">\n <Activity size={48} className=\"m2-empty-icon\" />\n <h3>No Activity Detected</h3>\n <p>\n This flow hasn't emitted any events yet. Interact with\n the features controlled by{\" \"}\n <strong>{overlayFlow}</strong> to see real-time traces\n here.\n </p>\n </div>\n ) : (\n <div className=\"m2-trace-list\" style={{ padding: 0 }}>\n {[...snapshot[overlayFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <div\n key={i}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n );\n};\n"],"names":["FlowNode","ActorNode","FiberEdge","useNodesState","useEdgesState","useState","useEffect","useRef","useMemo","_jsx","motion","_jsxs","Cpu","Search","RefreshCcw","Minimize2","Maximize2","PanelRightClose","PanelRight","X","AnimatePresence","ReactFlow","ConnectionLineType","Background","Controls","Database","Activity"],"mappings":"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"}
1
+ {"version":3,"file":"MentalMap.js","sources":["../../../../src/devtools/MentalMap.tsx"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Edge,\n Node,\n useNodesState,\n useEdgesState,\n ConnectionLineType,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Database,\n Search,\n X,\n RefreshCcw,\n Maximize2,\n Cpu,\n Minimize2,\n PanelRightClose,\n PanelRight,\n Activity,\n GitBranch,\n Network,\n} from \"lucide-react\";\nimport \"./MentalMap.css\";\nimport { MMapProps } from \"./mmap/MMapTypes\";\nimport { FlowNode, ActorNode, ListenerNode } from \"./mmap/components/FlowNodes\";\nimport { FiberEdge } from \"./MapUtils\";\nimport { MMapSidebar } from \"./mmap/components/MMapSidebar\";\nimport { MMapLedger } from \"./mmap/components/MMapLedger\";\nimport { FlowGenealogy } from \"./mmap/components/FlowGenealogy\";\n\nconst nodeTypes = {\n flow: FlowNode,\n actor: ActorNode,\n listener: ListenerNode,\n};\n\nconst edgeTypes = {\n fiber: FiberEdge,\n};\n\nexport const MentalMap = ({\n snapshot,\n onClose,\n onMinimizeChange,\n minimizedSide = \"right\",\n setIsOpen,\n}: MMapProps) => {\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [selectedFlow, setSelectedFlow] = useState<string | null>(null);\n const [overlayFlow, setOverlayFlow] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isMinimized, setIsMinimized] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLedgerVisible, setIsLedgerVisible] = useState(true);\n const [viewMode, setViewMode] = useState<\"live\" | \"genealogy\">(\"live\");\n\n useEffect(() => {\n onMinimizeChange?.(isMinimized);\n }, [isMinimized, onMinimizeChange]);\n\n // Logic pour le drag du logo réduit\n const [minimizedPos, setMinimizedPos] = useState({\n x: minimizedSide === \"right\" ? window.innerWidth - 100 : 40,\n y: window.innerHeight - 100,\n });\n const [isDraggingLogo, setIsDraggingLogo] = useState(false);\n const wasDragged = useRef(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n\n const handleLogoMouseDown = (e: React.MouseEvent) => {\n if (!isMinimized) return;\n setIsDraggingLogo(true);\n wasDragged.current = false;\n setDragOffset({\n x: e.clientX - minimizedPos.x,\n y: e.clientY - minimizedPos.y,\n });\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingLogo) {\n wasDragged.current = true;\n setMinimizedPos({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n });\n }\n };\n const handleMouseUp = () => {\n setTimeout(() => {\n setIsDraggingLogo(false);\n }, 0);\n };\n\n if (isDraggingLogo) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDraggingLogo, dragOffset]);\n\n const [activeFlows, setActiveFlows] = useState<Set<string>>(new Set());\n\n // Detect recent activity\n const recentActivity = useMemo(() => {\n const now = Date.now();\n const activityMap: Record<\n string,\n { active: boolean; actor?: string; type?: string }\n > = {};\n\n Object.entries(snapshot).forEach(([key, data]) => {\n const traces = data.meta.traces || [];\n const lastTrace = traces[traces.length - 1];\n if (lastTrace && now - lastTrace.timestamp < 1000) {\n activityMap[key] = {\n active: true,\n actor: lastTrace.actor,\n type: lastTrace.type,\n };\n }\n });\n return activityMap;\n }, [snapshot]);\n\n useEffect(() => {\n const active = new Set<string>();\n Object.keys(recentActivity).forEach((key) => active.add(key));\n setActiveFlows(active);\n }, [recentActivity]);\n\n const filteredFlows = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const entries = Object.entries(snapshot);\n if (!query) return entries;\n\n return entries.filter(([key, data]) => {\n if (key.toLowerCase().includes(query)) return true;\n const consumers = data.meta.consumers || [];\n if (consumers.some((c: any) => c.toLowerCase().includes(query)))\n return true;\n try {\n if (JSON.stringify(data.value).toLowerCase().includes(query))\n return true;\n } catch (e) {}\n return false;\n });\n }, [snapshot, searchQuery]);\n\n useEffect(() => {\n if (viewMode !== \"live\") return;\n\n const flowEntries = filteredFlows;\n const newNodes: Node[] = [];\n const newEdges: Edge[] = [];\n\n const actorX = 50;\n const flowX = 500;\n const listenerX = 950;\n\n let flowY = 100;\n let actorY = 100;\n let listenerY = 100;\n\n flowEntries.forEach(([key, data]) => {\n const activity = recentActivity[key];\n const isFlowHot = !!activity;\n\n // --- Node FLOW (Center) ---\n newNodes.push({\n id: `flow-${key}`,\n type: \"flow\",\n position: { x: flowX, y: flowY },\n data: {\n label: key.toUpperCase(),\n value: data.value,\n isActive: selectedFlow === key,\n isHot: isFlowHot,\n onClick: () => setOverlayFlow(key),\n },\n });\n\n // Split Listeners: Named (Actors) vs Anonymous (UI)\n const rawListeners = data.meta.listeners || [];\n const namedActors: any[] = [];\n const uiListeners: any[] = [];\n\n rawListeners.forEach((l: any) => {\n const isUI =\n l.label.startsWith(\"useFlow(\") || l.label === \"Anonymous Subscriber\";\n if (isUI) uiListeners.push(l);\n else namedActors.push(l);\n });\n\n // Mix in the explicit consumers (those who wrote in the past)\n const explicitConsumers = data.meta.consumers || [];\n explicitConsumers.forEach((name: string) => {\n if (!namedActors.find((a) => a.label === name)) {\n namedActors.push({ label: name, isExplicit: true });\n }\n });\n\n // --- Node ACTORS (Left) ---\n namedActors.forEach((actor, i) => {\n const actorId = `actor-${actor.label}-${key}`;\n const isActorHot = isFlowHot && activity.actor === actor.label;\n\n newNodes.push({\n id: actorId,\n type: \"actor\",\n position: { x: actorX, y: actorY },\n data: {\n label: actor.label,\n isActive: selectedFlow === key,\n isHot: isActorHot,\n },\n });\n\n newEdges.push({\n id: `edge-${actor.label}-${key}`,\n source: actorId,\n target: `flow-${key}`,\n targetHandle: \"actor-target\",\n type: \"fiber\",\n animated: true,\n style: {\n stroke: isActorHot ? \"#fbbf24\" : \"#a855f7\",\n strokeWidth: isActorHot ? 4 : 2,\n },\n });\n\n actorY += 120;\n });\n\n // --- Node UI LISTENERS (Right) ---\n // Group UI Listeners by label to avoid redundancy\n const groupedUI = uiListeners.reduce((acc: any, curr: any) => {\n if (!acc[curr.label]) {\n acc[curr.label] = { ...curr, count: 0 };\n }\n acc[curr.label].count += 1;\n return acc;\n }, {});\n\n Object.values(groupedUI).forEach((group: any, i: number) => {\n const listenerId = `listener-${key}-${group.label}`;\n const isListenerHot =\n isFlowHot && (activity.type === \"read\" || activity.type === \"write\");\n\n newNodes.push({\n id: listenerId,\n type: \"listener\",\n position: { x: listenerX, y: listenerY },\n data: {\n label:\n group.count > 1\n ? `${group.label} (x${group.count})`\n : group.label,\n isActive: selectedFlow === key,\n isHot: isListenerHot,\n },\n });\n\n newEdges.push({\n id: `edge-flow-listener-${key}-${group.label}`,\n source: `flow-${key}`,\n sourceHandle: \"listener-source\",\n target: listenerId,\n type: \"fiber\",\n animated: true,\n style: {\n stroke: isListenerHot ? \"#fbbf24\" : \"#00d4ff\",\n strokeWidth: isListenerHot ? 3 : 2,\n },\n });\n\n listenerY += 100;\n });\n\n const maxRowHeight = Math.max(\n 250,\n namedActors.length * 120,\n Object.keys(groupedUI).length * 100,\n );\n flowY += maxRowHeight + 50;\n if (actorY < flowY) actorY = flowY;\n if (listenerY < flowY) listenerY = flowY;\n });\n\n setNodes(newNodes);\n setEdges(newEdges);\n }, [\n filteredFlows,\n selectedFlow,\n viewMode,\n recentActivity,\n setNodes,\n setEdges,\n ]);\n\n return (\n <motion.div\n className=\"mental-map-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n >\n {/* ... reste du header identique ... */}\n <div\n className={`mental-map-container ${isMinimized ? \"minimized\" : \"\"}`}\n style={\n isMinimized\n ? {\n left: minimizedPos.x,\n top: minimizedPos.y,\n bottom: \"auto\",\n right: \"auto\",\n }\n : {}\n }\n onMouseDown={handleLogoMouseDown}\n onClick={() => {\n if (!wasDragged.current && isMinimized) setIsMinimized(false);\n }}\n >\n <div\n className={`m2-minimized-logo ${activeFlows.size > 0 ? \"pulse\" : \"\"}`}\n >\n F<span className=\"m2-minimized-badge\">FTE</span>\n </div>\n\n <header className=\"m2-header\">\n <div className=\"m2-logo-group\">\n <div className=\"m2-logo-icon\">\n <Cpu color=\"white\" size={28} />\n </div>\n <div className=\"m2-header-titles\">\n <h1>Mental Map & Trace Engine</h1>\n <div className=\"m2-header-meta\">\n <span className=\"m2-engine-badge\">FM2/FTE5</span>\n <span style={{ fontSize: 10, opacity: 0.5, fontWeight: 700 }}>\n NEHONIX FCE\n </span>\n </div>\n </div>\n </div>\n <div className=\"m2-controls\">\n <div\n className=\"m2-view-switcher\"\n style={{ display: \"flex\", gap: 8, marginRight: 16 }}\n >\n <button\n className={`view-toggle-btn ${viewMode === \"live\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"live\")}\n >\n <Network size={16} /> Live Graph\n </button>\n <button\n className={`view-toggle-btn ${viewMode === \"genealogy\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"genealogy\")}\n >\n <GitBranch size={16} /> Genealogy\n </button>\n </div>\n <div className=\"m2-search-wrapper\">\n <Search className=\"m2-search-icon\" size={18} />\n <input\n type=\"text\"\n className=\"m2-search-input\"\n placeholder=\"Search flows, actors or data patterns...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n <div className=\"m2-action-btns\">\n <button\n className=\"m2-icon-btn\"\n title=\"Refresh\"\n onClick={() => window.location.reload()}\n >\n <RefreshCcw size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Minimize\"\n style={{color: \"blue\"}}\n\n onClick={(e) => {\n e.stopPropagation();\n setIsMinimized(true);\n setIsOpen(false);\n }}\n >\n <Minimize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Fullscreen\"\n onClick={() => {\n if (!document.fullscreenElement)\n document.documentElement.requestFullscreen();\n else document.exitFullscreen();\n }}\n >\n <Maximize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Toggle Ledger\"\n onClick={() => setIsLedgerVisible(!isLedgerVisible)}\n >\n {isLedgerVisible ? (\n <PanelRightClose size={20} />\n ) : (\n <PanelRight size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn m2-close-btn force-visible\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n title=\"Close\"\n >\n <X size={24} />\n </button>\n </div>\n </div>\n </header>\n\n <div className=\"m2-layout\">\n <MMapSidebar\n filteredFlows={filteredFlows}\n selectedFlow={selectedFlow}\n setSelectedFlow={setSelectedFlow}\n activeFlows={activeFlows}\n />\n <main className=\"m2-canvas\">\n {viewMode === \"live\" ? (\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionLineType={ConnectionLineType.Bezier}\n onNodeClick={(_, node) => {\n if (node.type === \"flow\")\n setOverlayFlow(node.id.replace(\"flow-\", \"\"));\n }}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#1e293b\" gap={20} />{\" \"}\n <Controls showInteractive={false} />\n </ReactFlow>\n ) : (\n <FlowGenealogy\n snapshot={snapshot}\n onSelectFlow={setOverlayFlow}\n />\n )}\n </main>\n <MMapLedger\n snapshot={snapshot}\n selectedFlow={selectedFlow}\n isLedgerVisible={isLedgerVisible}\n />\n </div>\n\n <AnimatePresence>\n {overlayFlow && (\n <motion.div\n className=\"m2-flow-overlay-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={() => setOverlayFlow(null)}\n >\n <div\n className=\"m2-flow-overlay\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"m2-overlay-header\">\n <div className=\"m2-overlay-title\">\n <Database color=\"#00d4ff\" size={24} />\n <h2>{overlayFlow} Activity</h2>\n </div>\n <button\n className=\"m2-icon-btn m2-close-btn\"\n onClick={() => setOverlayFlow(null)}\n >\n <X size={20} />\n </button>\n </div>\n <div className=\"m2-overlay-content\">\n {snapshot[overlayFlow].meta.traces.length === 0 ? (\n <div className=\"m2-empty-state\">\n <Activity size={48} className=\"m2-empty-icon\" />\n <h3>No Activity Detected</h3>\n <p>This flow hasn't emitted any events yet.</p>\n </div>\n ) : (\n <div className=\"m2-trace-list\">\n {[...snapshot[overlayFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <div\n key={i}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n );\n};\n"],"names":["FlowNode","ActorNode","ListenerNode","FiberEdge","useNodesState","useEdgesState","useState","useEffect","useRef","useMemo","_jsx","motion","_jsxs","Cpu","Network","GitBranch","Search","RefreshCcw","Minimize2","Maximize2","PanelRightClose","PanelRight","X","MMapSidebar","ReactFlow","ConnectionLineType","Background","Controls","FlowGenealogy","MMapLedger","AnimatePresence","Database","Activity"],"mappings":"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"}
@@ -39,7 +39,7 @@ const PluginManager = ({ snapshot, onClose, }) => {
39
39
  return (jsxRuntime.jsx("div", { className: "plugin-architect-overlay", children: jsxRuntime.jsxs("div", { className: `plugin-architect-window ${selectedPlugin ? "with-inspector" : ""}`, children: [jsxRuntime.jsxs("div", { className: "architect-main", children: [jsxRuntime.jsxs("div", { className: "plugin-architect-header", children: [jsxRuntime.jsxs("div", { className: "header-left", children: [jsxRuntime.jsx("div", { className: "logo-box", children: jsxRuntime.jsx(lucideReact.Database, { size: 20, className: "text-brand" }) }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { children: "Plugin Architect" }), jsxRuntime.jsx("p", { children: "Global plugin tracking & runtime control" })] })] }), jsxRuntime.jsx("button", { className: "close-btn", onClick: onClose, children: jsxRuntime.jsx(lucideReact.X, { size: 20 }) })] }), jsxRuntime.jsx("div", { className: "plugin-architect-toolbar", children: jsxRuntime.jsxs("div", { className: "search-box", children: [jsxRuntime.jsx(lucideReact.Search, { size: 16 }), jsxRuntime.jsx("input", { type: "text", placeholder: "Filter flows with plugins...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }) }), jsxRuntime.jsx("div", { className: "plugin-architect-content", children: filteredFlows.length === 0 ? (jsxRuntime.jsxs("div", { className: "empty-state", children: [jsxRuntime.jsx(lucideReact.Zap, { size: 48, className: "opacity-20 mb-4" }), jsxRuntime.jsx("p", { children: "No active flows found with attached plugins." })] })) : (jsxRuntime.jsx("div", { className: "plugin-flow-grid", children: filteredFlows.map(([key, data]) => (jsxRuntime.jsxs("div", { className: "flow-plugin-card", children: [jsxRuntime.jsxs("div", { className: "card-header", children: [jsxRuntime.jsx("span", { className: "flow-key", children: key }), jsxRuntime.jsxs("span", { className: "plugin-count", children: [data.meta.plugins.length, " active"] })] }), jsxRuntime.jsx("div", { className: "card-plugins", children: data.meta.plugins.map((plugin) => (jsxRuntime.jsxs("div", { className: `plugin-row ${selectedPlugin?.flowKey === key && selectedPlugin?.pluginName === plugin.name ? "selected" : ""}`, onClick: () => setSelectedPlugin({
40
40
  flowKey: key,
41
41
  pluginName: plugin.name,
42
- }), children: [jsxRuntime.jsxs("div", { className: "plugin-info", children: [jsxRuntime.jsx(lucideReact.Shield, { size: 14, className: "text-brand-light" }), jsxRuntime.jsx("span", { className: "plugin-name", children: plugin.name })] }), jsxRuntime.jsxs("div", { className: "plugin-row-actions", children: [plugin.name === "persist" && (jsxRuntime.jsxs("div", { className: "plugin-actions", onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsx("button", { onClick: () => handlePluginAction(key, "persist", "update"), title: "Force Sync to Disk", children: jsxRuntime.jsx(lucideReact.HardDrive, { size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => handlePluginAction(key, "persist", "refresh"), title: "Refresh from Disk", children: jsxRuntime.jsx(lucideReact.RefreshCw, { size: 14 }) })] })), jsxRuntime.jsx(lucideReact.ChevronRight, { size: 14, className: "opacity-40" })] })] }, plugin.name))) })] }, key))) })) }), jsxRuntime.jsxs("div", { className: "plugin-architect-footer", children: [jsxRuntime.jsx("span", { children: "Engine: FractoState v5.2" }), jsxRuntime.jsxs("span", { children: [filteredFlows.length, " flows mapped"] })] })] }), selectedPlugin && (jsxRuntime.jsxs("div", { className: "architect-inspector", children: [jsxRuntime.jsxs("div", { className: "inspector-header", children: [jsxRuntime.jsxs("div", { className: "inspector-title", children: [jsxRuntime.jsx(lucideReact.Activity, { size: 18, className: "text-brand" }), jsxRuntime.jsxs("h3", { children: ["Activity: ", selectedPlugin.pluginName] })] }), jsxRuntime.jsx("button", { className: "inspector-close", onClick: () => setSelectedPlugin(null), children: jsxRuntime.jsx(lucideReact.X, { size: 16 }) })] }), jsxRuntime.jsxs("div", { className: "inspector-sub", children: [jsxRuntime.jsx(lucideReact.Info, { size: 12 }), jsxRuntime.jsxs("span", { children: ["Target Flow: ", jsxRuntime.jsx("strong", { children: selectedPlugin.flowKey })] })] }), jsxRuntime.jsx("div", { className: "inspector-scroll", children: jsxRuntime.jsx("div", { className: "log-timeline", children: pluginLogs.length === 0 ? (jsxRuntime.jsxs("div", { className: "no-logs", children: [jsxRuntime.jsx(lucideReact.Terminal, { size: 32, className: "opacity-10 mb-2" }), jsxRuntime.jsx("p", { children: "No activity recorded yet." })] })) : (pluginLogs.map((log, i) => (jsxRuntime.jsxs("div", { className: "log-entry", children: [jsxRuntime.jsxs("div", { className: "log-meta", children: [jsxRuntime.jsx(lucideReact.Clock, { size: 10 }), jsxRuntime.jsx("span", { children: new Date(log.timestamp).toLocaleTimeString() }), jsxRuntime.jsx("span", { className: "log-action", children: log.action })] }), jsxRuntime.jsx("p", { className: "log-desc", children: log.description }), log.data && (jsxRuntime.jsx("pre", { className: "log-data", children: JSON.stringify(log.data, null, 2) }))] }, i)))) }) })] }))] }) }));
42
+ }), children: [jsxRuntime.jsxs("div", { className: "plugin-info", children: [jsxRuntime.jsx(lucideReact.Shield, { size: 14, className: "text-brand-light" }), jsxRuntime.jsx("span", { className: "plugin-name", children: plugin.name })] }), jsxRuntime.jsxs("div", { className: "plugin-row-actions", children: [plugin.name === "persist" && (jsxRuntime.jsxs("div", { className: "plugin-actions", onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsx("button", { onClick: () => handlePluginAction(key, "persist", "update"), title: "Force Sync to Disk", children: jsxRuntime.jsx(lucideReact.HardDrive, { size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => handlePluginAction(key, "persist", "refresh"), title: "Refresh from Disk", children: jsxRuntime.jsx(lucideReact.RefreshCw, { size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => handlePluginAction(key, "persist", "clear"), title: "Clear Persistence", className: "text-red-500", children: jsxRuntime.jsx(lucideReact.Trash2, { size: 14 }) })] })), jsxRuntime.jsx(lucideReact.ChevronRight, { size: 14, className: "opacity-40" })] })] }, plugin.name))) })] }, key))) })) }), jsxRuntime.jsxs("div", { className: "plugin-architect-footer", children: [jsxRuntime.jsx("span", { children: "Engine: FractoState v5.2" }), jsxRuntime.jsxs("span", { children: [filteredFlows.length, " flows mapped"] })] })] }), selectedPlugin && (jsxRuntime.jsxs("div", { className: "architect-inspector", children: [jsxRuntime.jsxs("div", { className: "inspector-header", children: [jsxRuntime.jsxs("div", { className: "inspector-title", children: [jsxRuntime.jsx(lucideReact.Activity, { size: 18, className: "text-brand" }), jsxRuntime.jsxs("h3", { children: ["Activity: ", selectedPlugin.pluginName] })] }), jsxRuntime.jsx("button", { className: "inspector-close", onClick: () => setSelectedPlugin(null), children: jsxRuntime.jsx(lucideReact.X, { size: 16 }) })] }), jsxRuntime.jsxs("div", { className: "inspector-sub", children: [jsxRuntime.jsx(lucideReact.Info, { size: 12 }), jsxRuntime.jsxs("span", { children: ["Target Flow: ", jsxRuntime.jsx("strong", { children: selectedPlugin.flowKey })] })] }), jsxRuntime.jsx("div", { className: "inspector-scroll", children: jsxRuntime.jsx("div", { className: "log-timeline", children: pluginLogs.length === 0 ? (jsxRuntime.jsxs("div", { className: "no-logs", children: [jsxRuntime.jsx(lucideReact.Terminal, { size: 32, className: "opacity-10 mb-2" }), jsxRuntime.jsx("p", { children: "No activity recorded yet." })] })) : (pluginLogs.map((log, i) => (jsxRuntime.jsxs("div", { className: "log-entry", children: [jsxRuntime.jsxs("div", { className: "log-meta", children: [jsxRuntime.jsx(lucideReact.Clock, { size: 10 }), jsxRuntime.jsx("span", { children: new Date(log.timestamp).toLocaleTimeString() }), jsxRuntime.jsx("span", { className: "log-action", children: log.action })] }), jsxRuntime.jsx("p", { className: "log-desc", children: log.description }), log.data && (jsxRuntime.jsx("pre", { className: "log-data", children: JSON.stringify(log.data, null, 2) }))] }, i)))) }) })] }))] }) }));
43
43
  };
44
44
 
45
45
  exports.PluginManager = PluginManager;