fractostate 4.3.2 → 4.3.4

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
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import { store } from '../store.js';
4
- import { Database, X, Search, Zap, Shield, HardDrive, RefreshCw, ChevronRight, Activity, Info, Terminal, Clock } from 'lucide-react';
4
+ import { Database, X, Search, Zap, Shield, HardDrive, RefreshCw, Trash2, ChevronRight, Activity, Info, Terminal, Clock } from 'lucide-react';
5
5
  import './PluginManager.css.js';
6
6
 
7
7
  const PluginManager = ({ snapshot, onClose, }) => {
@@ -37,7 +37,7 @@ const PluginManager = ({ snapshot, onClose, }) => {
37
37
  return (jsx("div", { className: "plugin-architect-overlay", children: jsxs("div", { className: `plugin-architect-window ${selectedPlugin ? "with-inspector" : ""}`, children: [jsxs("div", { className: "architect-main", children: [jsxs("div", { className: "plugin-architect-header", children: [jsxs("div", { className: "header-left", children: [jsx("div", { className: "logo-box", children: jsx(Database, { size: 20, className: "text-brand" }) }), jsxs("div", { children: [jsx("h2", { children: "Plugin Architect" }), jsx("p", { children: "Global plugin tracking & runtime control" })] })] }), jsx("button", { className: "close-btn", onClick: onClose, children: jsx(X, { size: 20 }) })] }), jsx("div", { className: "plugin-architect-toolbar", children: jsxs("div", { className: "search-box", children: [jsx(Search, { size: 16 }), jsx("input", { type: "text", placeholder: "Filter flows with plugins...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }) }), jsx("div", { className: "plugin-architect-content", children: filteredFlows.length === 0 ? (jsxs("div", { className: "empty-state", children: [jsx(Zap, { size: 48, className: "opacity-20 mb-4" }), jsx("p", { children: "No active flows found with attached plugins." })] })) : (jsx("div", { className: "plugin-flow-grid", children: filteredFlows.map(([key, data]) => (jsxs("div", { className: "flow-plugin-card", children: [jsxs("div", { className: "card-header", children: [jsx("span", { className: "flow-key", children: key }), jsxs("span", { className: "plugin-count", children: [data.meta.plugins.length, " active"] })] }), jsx("div", { className: "card-plugins", children: data.meta.plugins.map((plugin) => (jsxs("div", { className: `plugin-row ${selectedPlugin?.flowKey === key && selectedPlugin?.pluginName === plugin.name ? "selected" : ""}`, onClick: () => setSelectedPlugin({
38
38
  flowKey: key,
39
39
  pluginName: plugin.name,
40
- }), children: [jsxs("div", { className: "plugin-info", children: [jsx(Shield, { size: 14, className: "text-brand-light" }), jsx("span", { className: "plugin-name", children: plugin.name })] }), jsxs("div", { className: "plugin-row-actions", children: [plugin.name === "persist" && (jsxs("div", { className: "plugin-actions", onClick: (e) => e.stopPropagation(), children: [jsx("button", { onClick: () => handlePluginAction(key, "persist", "update"), title: "Force Sync to Disk", children: jsx(HardDrive, { size: 14 }) }), jsx("button", { onClick: () => handlePluginAction(key, "persist", "refresh"), title: "Refresh from Disk", children: jsx(RefreshCw, { size: 14 }) })] })), jsx(ChevronRight, { size: 14, className: "opacity-40" })] })] }, plugin.name))) })] }, key))) })) }), jsxs("div", { className: "plugin-architect-footer", children: [jsx("span", { children: "Engine: FractoState v5.2" }), jsxs("span", { children: [filteredFlows.length, " flows mapped"] })] })] }), selectedPlugin && (jsxs("div", { className: "architect-inspector", children: [jsxs("div", { className: "inspector-header", children: [jsxs("div", { className: "inspector-title", children: [jsx(Activity, { size: 18, className: "text-brand" }), jsxs("h3", { children: ["Activity: ", selectedPlugin.pluginName] })] }), jsx("button", { className: "inspector-close", onClick: () => setSelectedPlugin(null), children: jsx(X, { size: 16 }) })] }), jsxs("div", { className: "inspector-sub", children: [jsx(Info, { size: 12 }), jsxs("span", { children: ["Target Flow: ", jsx("strong", { children: selectedPlugin.flowKey })] })] }), jsx("div", { className: "inspector-scroll", children: jsx("div", { className: "log-timeline", children: pluginLogs.length === 0 ? (jsxs("div", { className: "no-logs", children: [jsx(Terminal, { size: 32, className: "opacity-10 mb-2" }), jsx("p", { children: "No activity recorded yet." })] })) : (pluginLogs.map((log, i) => (jsxs("div", { className: "log-entry", children: [jsxs("div", { className: "log-meta", children: [jsx(Clock, { size: 10 }), jsx("span", { children: new Date(log.timestamp).toLocaleTimeString() }), jsx("span", { className: "log-action", children: log.action })] }), jsx("p", { className: "log-desc", children: log.description }), log.data && (jsx("pre", { className: "log-data", children: JSON.stringify(log.data, null, 2) }))] }, i)))) }) })] }))] }) }));
40
+ }), children: [jsxs("div", { className: "plugin-info", children: [jsx(Shield, { size: 14, className: "text-brand-light" }), jsx("span", { className: "plugin-name", children: plugin.name })] }), jsxs("div", { className: "plugin-row-actions", children: [plugin.name === "persist" && (jsxs("div", { className: "plugin-actions", onClick: (e) => e.stopPropagation(), children: [jsx("button", { onClick: () => handlePluginAction(key, "persist", "update"), title: "Force Sync to Disk", children: jsx(HardDrive, { size: 14 }) }), jsx("button", { onClick: () => handlePluginAction(key, "persist", "refresh"), title: "Refresh from Disk", children: jsx(RefreshCw, { size: 14 }) }), jsx("button", { onClick: () => handlePluginAction(key, "persist", "clear"), title: "Clear Persistence", className: "text-red-500", children: jsx(Trash2, { size: 14 }) })] })), jsx(ChevronRight, { size: 14, className: "opacity-40" })] })] }, plugin.name))) })] }, key))) })) }), jsxs("div", { className: "plugin-architect-footer", children: [jsx("span", { children: "Engine: FractoState v5.2" }), jsxs("span", { children: [filteredFlows.length, " flows mapped"] })] })] }), selectedPlugin && (jsxs("div", { className: "architect-inspector", children: [jsxs("div", { className: "inspector-header", children: [jsxs("div", { className: "inspector-title", children: [jsx(Activity, { size: 18, className: "text-brand" }), jsxs("h3", { children: ["Activity: ", selectedPlugin.pluginName] })] }), jsx("button", { className: "inspector-close", onClick: () => setSelectedPlugin(null), children: jsx(X, { size: 16 }) })] }), jsxs("div", { className: "inspector-sub", children: [jsx(Info, { size: 12 }), jsxs("span", { children: ["Target Flow: ", jsx("strong", { children: selectedPlugin.flowKey })] })] }), jsx("div", { className: "inspector-scroll", children: jsx("div", { className: "log-timeline", children: pluginLogs.length === 0 ? (jsxs("div", { className: "no-logs", children: [jsx(Terminal, { size: 32, className: "opacity-10 mb-2" }), jsx("p", { children: "No activity recorded yet." })] })) : (pluginLogs.map((log, i) => (jsxs("div", { className: "log-entry", children: [jsxs("div", { className: "log-meta", children: [jsx(Clock, { size: 10 }), jsx("span", { children: new Date(log.timestamp).toLocaleTimeString() }), jsx("span", { className: "log-action", children: log.action })] }), jsx("p", { className: "log-desc", children: log.description }), log.data && (jsx("pre", { className: "log-data", children: JSON.stringify(log.data, null, 2) }))] }, i)))) }) })] }))] }) }));
41
41
  };
42
42
 
43
43
  export { PluginManager };
@@ -1 +1 @@
1
- {"version":3,"file":"PluginManager.js","sources":["../../../../src/devtools/PluginManager.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n/* *****************************************************************************\n * FractoSate - Plugin Architect\n * ***************************************************************************** */\n\nimport React from \"react\";\nimport { store } from \"../store\";\nimport {\n X,\n Zap,\n Shield,\n HardDrive,\n RefreshCw,\n Database,\n Search,\n Activity,\n Info,\n ChevronRight,\n Clock,\n Terminal,\n} from \"lucide-react\";\nimport \"./PluginManager.css\";\n\ninterface PluginManagerProps {\n snapshot: Record<string, any>;\n onClose: () => void;\n}\n\nexport const PluginManager: React.FC<PluginManagerProps> = ({\n snapshot,\n onClose,\n}) => {\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [selectedPlugin, setSelectedPlugin] = React.useState<{\n flowKey: string;\n pluginName: string;\n } | null>(null);\n\n const filteredFlows = Object.entries(snapshot).filter(([key, data]) => {\n const hasPlugins = data.meta.plugins && data.meta.plugins.length > 0;\n if (!hasPlugins) return false;\n\n if (searchQuery.trim()) {\n return key.toLowerCase().includes(searchQuery.toLowerCase());\n }\n return true;\n });\n\n const handlePluginAction = (\n flowKey: string,\n pluginName: string,\n action: string,\n ) => {\n const flowOps = store.getPluginOps(flowKey);\n if (pluginName === \"persist\") {\n if (action === \"update\") flowOps?._persist?.update?.();\n if (action === \"refresh\") flowOps?._persist?.refresh?.();\n if (action === \"clear\") {\n if (confirm(`Clear persistence for flow \"${flowKey}\"?`)) {\n flowOps?._persist?.clear?.();\n }\n }\n }\n };\n\n const selectedFlowData = selectedPlugin\n ? snapshot[selectedPlugin.flowKey]\n : null;\n const pluginLogs =\n selectedFlowData?.meta?.pluginLogs?.filter(\n (l: any) => l.plugin === selectedPlugin?.pluginName,\n ) || [];\n\n return (\n <div className=\"plugin-architect-overlay\">\n <div\n className={`plugin-architect-window ${selectedPlugin ? \"with-inspector\" : \"\"}`}\n >\n {/* Main Panel */}\n <div className=\"architect-main\">\n {/* Header */}\n <div className=\"plugin-architect-header\">\n <div className=\"header-left\">\n <div className=\"logo-box\">\n <Database size={20} className=\"text-brand\" />\n </div>\n <div>\n <h2>Plugin Architect</h2>\n <p>Global plugin tracking & runtime control</p>\n </div>\n </div>\n <button className=\"close-btn\" onClick={onClose}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"plugin-architect-toolbar\">\n <div className=\"search-box\">\n <Search size={16} />\n <input\n type=\"text\"\n placeholder=\"Filter flows with plugins...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"plugin-architect-content\">\n {filteredFlows.length === 0 ? (\n <div className=\"empty-state\">\n <Zap size={48} className=\"opacity-20 mb-4\" />\n <p>No active flows found with attached plugins.</p>\n </div>\n ) : (\n <div className=\"plugin-flow-grid\">\n {filteredFlows.map(([key, data]) => (\n <div key={key} className=\"flow-plugin-card\">\n <div className=\"card-header\">\n <span className=\"flow-key\">{key}</span>\n <span className=\"plugin-count\">\n {data.meta.plugins.length} active\n </span>\n </div>\n\n <div className=\"card-plugins\">\n {data.meta.plugins.map((plugin: any) => (\n <div\n key={plugin.name}\n className={`plugin-row ${selectedPlugin?.flowKey === key && selectedPlugin?.pluginName === plugin.name ? \"selected\" : \"\"}`}\n onClick={() =>\n setSelectedPlugin({\n flowKey: key,\n pluginName: plugin.name,\n })\n }\n >\n <div className=\"plugin-info\">\n <Shield size={14} className=\"text-brand-light\" />\n <span className=\"plugin-name\">{plugin.name}</span>\n </div>\n\n <div className=\"plugin-row-actions\">\n {plugin.name === \"persist\" && (\n <div\n className=\"plugin-actions\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={() =>\n handlePluginAction(key, \"persist\", \"update\")\n }\n title=\"Force Sync to Disk\"\n >\n <HardDrive size={14} />\n </button>\n <button\n onClick={() =>\n handlePluginAction(\n key,\n \"persist\",\n \"refresh\",\n )\n }\n title=\"Refresh from Disk\"\n >\n <RefreshCw size={14} />\n </button>\n </div>\n )}\n <ChevronRight size={14} className=\"opacity-40\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"plugin-architect-footer\">\n <span>Engine: FractoState v5.2</span>\n <span>{filteredFlows.length} flows mapped</span>\n </div>\n </div>\n\n {/* Inspector Panel */}\n {selectedPlugin && (\n <div className=\"architect-inspector\">\n <div className=\"inspector-header\">\n <div className=\"inspector-title\">\n <Activity size={18} className=\"text-brand\" />\n <h3>Activity: {selectedPlugin.pluginName}</h3>\n </div>\n <button\n className=\"inspector-close\"\n onClick={() => setSelectedPlugin(null)}\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"inspector-sub\">\n <Info size={12} />\n <span>\n Target Flow: <strong>{selectedPlugin.flowKey}</strong>\n </span>\n </div>\n\n <div className=\"inspector-scroll\">\n <div className=\"log-timeline\">\n {pluginLogs.length === 0 ? (\n <div className=\"no-logs\">\n <Terminal size={32} className=\"opacity-10 mb-2\" />\n <p>No activity recorded yet.</p>\n </div>\n ) : (\n pluginLogs.map((log: any, i: number) => (\n <div key={i} className=\"log-entry\">\n <div className=\"log-meta\">\n <Clock size={10} />\n <span>\n {new Date(log.timestamp).toLocaleTimeString()}\n </span>\n <span className=\"log-action\">{log.action}</span>\n </div>\n <p className=\"log-desc\">{log.description}</p>\n {log.data && (\n <pre className=\"log-data\">\n {JSON.stringify(log.data, null, 2)}\n </pre>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;AAuDO,MAAM,aAAa,GAAiC,CAAC,EAC1D,QAAQ,EACR,OAAO,GACR,KAAI;AACH,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;AACxD,IAAA,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAGhD,IAAI,CAAC;AAEf,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAI;AACpE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;AACpE,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAE7B,QAAA,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAC9D;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CACzB,OAAe,EACf,UAAkB,EAClB,MAAc,KACZ;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;AAC3C,QAA8B;YAC5B,IAAI,MAAM,KAAK,QAAQ;AAAE,gBAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI;YACtD,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI;AACxD,YAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AACtB,gBAAA,IAAI,OAAO,CAAC,CAAA,4BAAA,EAA+B,OAAO,CAAA,EAAA,CAAI,CAAC,EAAE;AACvD,oBAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI;gBAC9B;YACF;QACF;AACF,IAAA,CAAC;IAED,MAAM,gBAAgB,GAAG;AACvB,UAAE,QAAQ,CAAC,cAAc,CAAC,OAAO;UAC/B,IAAI;IACR,MAAM,UAAU,GACd,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CACxC,CAAC,CAAM,KAAK,CAAC,CAAC,MAAM,KAAK,cAAc,EAAE,UAAU,CACpD,IAAI,EAAE;AAET,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EACvCC,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,wBAAA,EAA2B,cAAc,GAAG,gBAAgB,GAAG,EAAE,CAAA,CAAE,EAAA,QAAA,EAAA,CAG9EA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAE7BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EACvBA,GAAA,CAAC,QAAQ,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,EAAA,CAAG,EAAA,CACzC,EACNC,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACED,2CAAyB,EACzBA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,0CAAA,EAAA,CAA+C,CAAA,EAAA,CAC3C,CAAA,EAAA,CACF,EACNA,GAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAC5CA,GAAA,CAAC,CAAC,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EAAA,CACR,CAAA,EAAA,CACL,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EACvCC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,YAAY,EAAA,QAAA,EAAA,CACzBD,GAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EACpBA,eACE,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,8BAA8B,EAC1C,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAA,CAC/C,CAAA,EAAA,CACE,EAAA,CACF,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EACtC,aAAa,CAAC,MAAM,KAAK,CAAC,IACzBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAC,GAAG,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,EAAA,CAAG,EAC7CA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,CAAmD,CAAA,EAAA,CAC/C,KAENA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAC9B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,MAC7BC,IAAA,CAAA,KAAA,EAAA,EAAe,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,CACzCA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,UAAU,EAAA,QAAA,EAAE,GAAG,EAAA,CAAQ,EACvCC,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,CAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAA,SAAA,CAAA,EAAA,CACpB,CAAA,EAAA,CACH,EAEND,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,EAAA,QAAA,EAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAW,MACjCC,IAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAE,CAAA,WAAA,EAAc,cAAc,EAAE,OAAO,KAAK,GAAG,IAAI,cAAc,EAAE,UAAU,KAAK,MAAM,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,CAAA,CAAE,EAC1H,OAAO,EAAE,MACP,iBAAiB,CAAC;AAChB,oDAAA,OAAO,EAAE,GAAG;oDACZ,UAAU,EAAE,MAAM,CAAC,IAAI;iDACxB,CAAC,EAAA,QAAA,EAAA,CAGJA,cAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,kBAAkB,GAAG,EACjDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,aAAa,YAAE,MAAM,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,CAC9C,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CAChC,MAAM,CAAC,IAAI,KAAK,SAAS,KACxBA,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,gBAAgB,EAC1B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,QAAA,EAAA,CAEnCD,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MACP,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,EAE9C,KAAK,EAAC,oBAAoB,EAAA,QAAA,EAE1BA,IAAC,SAAS,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAAA,CAChB,EACTA,gBACE,OAAO,EAAE,MACP,kBAAkB,CAChB,GAAG,EACH,SAAS,EACT,SAAS,CACV,EAEH,KAAK,EAAC,mBAAmB,EAAA,QAAA,EAEzBA,IAAC,SAAS,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAAA,CAChB,CAAA,EAAA,CACL,CACP,EACDA,GAAA,CAAC,YAAY,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,CAAA,EAAA,CAC7C,CAAA,EAAA,EA3CD,MAAM,CAAC,IAAI,CA4CZ,CACP,CAAC,GACE,CAAA,EAAA,EAzDE,GAAG,CA0DP,CACP,CAAC,EAAA,CACE,CACP,EAAA,CACG,EAGNC,cAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCD,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,CAAqC,EACrCC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAO,aAAa,CAAC,MAAM,EAAA,eAAA,CAAA,EAAA,CAAqB,IAC5C,CAAA,EAAA,CACF,EAGL,cAAc,KACbA,cAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAClCA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,aAC/BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAC9BD,IAAC,QAAQ,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,EAAA,CAAG,EAC7CC,IAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,CAAA,YAAA,EAAe,cAAc,CAAC,UAAU,IAAM,CAAA,EAAA,CAC1C,EACND,gBACE,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAA,QAAA,EAEtCA,IAAC,CAAC,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAAA,CACR,CAAA,EAAA,CACL,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAC5BD,IAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAClBC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,eAAA,EACeD,0BAAS,cAAc,CAAC,OAAO,EAAA,CAAU,CAAA,EAAA,CACjD,CAAA,EAAA,CACH,EAENA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAC/BA,aAAK,SAAS,EAAC,cAAc,EAAA,QAAA,EAC1B,UAAU,CAAC,MAAM,KAAK,CAAC,IACtBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,SAAS,aACtBD,GAAA,CAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,EAAA,CAAG,EAClDA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,CAAgC,CAAA,EAAA,CAC5B,KAEN,UAAU,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,CAAS,MACjCC,IAAA,CAAA,KAAA,EAAA,EAAa,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CAChCA,cAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EAAA,CACvBD,GAAA,CAAC,KAAK,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EACnBA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EACG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GACxC,EACPA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,YAAY,YAAE,GAAG,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,CAC5C,EACNA,WAAG,SAAS,EAAC,UAAU,EAAA,QAAA,EAAE,GAAG,CAAC,WAAW,EAAA,CAAK,EAC5C,GAAG,CAAC,IAAI,KACPA,aAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAA,CAC9B,CACP,CAAA,EAAA,EAbO,CAAC,CAcL,CACP,CAAC,CACH,EAAA,CACG,EAAA,CACF,IACF,CACP,CAAA,EAAA,CACG,EAAA,CACF;AAEV;;;;"}
1
+ {"version":3,"file":"PluginManager.js","sources":["../../../../src/devtools/PluginManager.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n/* *****************************************************************************\n * FractoSate - Plugin Architect\n * ***************************************************************************** */\n\nimport React from \"react\";\nimport { store } from \"../store\";\nimport {\n X,\n Zap,\n Shield,\n HardDrive,\n RefreshCw,\n Database,\n Search,\n Activity,\n Info,\n ChevronRight,\n Clock,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport \"./PluginManager.css\";\n\ninterface PluginManagerProps {\n snapshot: Record<string, any>;\n onClose: () => void;\n}\n\nexport const PluginManager: React.FC<PluginManagerProps> = ({\n snapshot,\n onClose,\n}) => {\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [selectedPlugin, setSelectedPlugin] = React.useState<{\n flowKey: string;\n pluginName: string;\n } | null>(null);\n\n const filteredFlows = Object.entries(snapshot).filter(([key, data]) => {\n const hasPlugins = data.meta.plugins && data.meta.plugins.length > 0;\n if (!hasPlugins) return false;\n\n if (searchQuery.trim()) {\n return key.toLowerCase().includes(searchQuery.toLowerCase());\n }\n return true;\n });\n\n const handlePluginAction = (\n flowKey: string,\n pluginName: string,\n action: string,\n ) => {\n const flowOps = store.getPluginOps(flowKey);\n if (pluginName === \"persist\") {\n if (action === \"update\") flowOps?._persist?.update?.();\n if (action === \"refresh\") flowOps?._persist?.refresh?.();\n if (action === \"clear\") {\n if (confirm(`Clear persistence for flow \"${flowKey}\"?`)) {\n flowOps?._persist?.clear?.();\n }\n }\n }\n };\n\n const selectedFlowData = selectedPlugin\n ? snapshot[selectedPlugin.flowKey]\n : null;\n const pluginLogs =\n selectedFlowData?.meta?.pluginLogs?.filter(\n (l: any) => l.plugin === selectedPlugin?.pluginName,\n ) || [];\n\n return (\n <div className=\"plugin-architect-overlay\">\n <div\n className={`plugin-architect-window ${selectedPlugin ? \"with-inspector\" : \"\"}`}\n >\n {/* Main Panel */}\n <div className=\"architect-main\">\n {/* Header */}\n <div className=\"plugin-architect-header\">\n <div className=\"header-left\">\n <div className=\"logo-box\">\n <Database size={20} className=\"text-brand\" />\n </div>\n <div>\n <h2>Plugin Architect</h2>\n <p>Global plugin tracking & runtime control</p>\n </div>\n </div>\n <button className=\"close-btn\" onClick={onClose}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"plugin-architect-toolbar\">\n <div className=\"search-box\">\n <Search size={16} />\n <input\n type=\"text\"\n placeholder=\"Filter flows with plugins...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"plugin-architect-content\">\n {filteredFlows.length === 0 ? (\n <div className=\"empty-state\">\n <Zap size={48} className=\"opacity-20 mb-4\" />\n <p>No active flows found with attached plugins.</p>\n </div>\n ) : (\n <div className=\"plugin-flow-grid\">\n {filteredFlows.map(([key, data]) => (\n <div key={key} className=\"flow-plugin-card\">\n <div className=\"card-header\">\n <span className=\"flow-key\">{key}</span>\n <span className=\"plugin-count\">\n {data.meta.plugins.length} active\n </span>\n </div>\n\n <div className=\"card-plugins\">\n {data.meta.plugins.map((plugin: any) => (\n <div\n key={plugin.name}\n className={`plugin-row ${selectedPlugin?.flowKey === key && selectedPlugin?.pluginName === plugin.name ? \"selected\" : \"\"}`}\n onClick={() =>\n setSelectedPlugin({\n flowKey: key,\n pluginName: plugin.name,\n })\n }\n >\n <div className=\"plugin-info\">\n <Shield size={14} className=\"text-brand-light\" />\n <span className=\"plugin-name\">{plugin.name}</span>\n </div>\n\n <div className=\"plugin-row-actions\">\n {plugin.name === \"persist\" && (\n <div\n className=\"plugin-actions\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={() =>\n handlePluginAction(key, \"persist\", \"update\")\n }\n title=\"Force Sync to Disk\"\n >\n <HardDrive size={14} />\n </button>\n <button\n onClick={() =>\n handlePluginAction(\n key,\n \"persist\",\n \"refresh\",\n )\n }\n title=\"Refresh from Disk\"\n >\n <RefreshCw size={14} />\n </button>\n <button\n onClick={() =>\n handlePluginAction(key, \"persist\", \"clear\")\n }\n title=\"Clear Persistence\"\n className=\"text-red-500\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n <ChevronRight size={14} className=\"opacity-40\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"plugin-architect-footer\">\n <span>Engine: FractoState v5.2</span>\n <span>{filteredFlows.length} flows mapped</span>\n </div>\n </div>\n\n {/* Inspector Panel */}\n {selectedPlugin && (\n <div className=\"architect-inspector\">\n <div className=\"inspector-header\">\n <div className=\"inspector-title\">\n <Activity size={18} className=\"text-brand\" />\n <h3>Activity: {selectedPlugin.pluginName}</h3>\n </div>\n <button\n className=\"inspector-close\"\n onClick={() => setSelectedPlugin(null)}\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"inspector-sub\">\n <Info size={12} />\n <span>\n Target Flow: <strong>{selectedPlugin.flowKey}</strong>\n </span>\n </div>\n\n <div className=\"inspector-scroll\">\n <div className=\"log-timeline\">\n {pluginLogs.length === 0 ? (\n <div className=\"no-logs\">\n <Terminal size={32} className=\"opacity-10 mb-2\" />\n <p>No activity recorded yet.</p>\n </div>\n ) : (\n pluginLogs.map((log: any, i: number) => (\n <div key={i} className=\"log-entry\">\n <div className=\"log-meta\">\n <Clock size={10} />\n <span>\n {new Date(log.timestamp).toLocaleTimeString()}\n </span>\n <span className=\"log-action\">{log.action}</span>\n </div>\n <p className=\"log-desc\">{log.description}</p>\n {log.data && (\n <pre className=\"log-data\">\n {JSON.stringify(log.data, null, 2)}\n </pre>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
3
+ import { ReactFlow, ConnectionLineType, Background, Controls } from '@xyflow/react';
4
+ import { GitBranch, Info } from 'lucide-react';
5
+ import { FlowNode } from './FlowNodes.js';
6
+ import { FiberEdge } from '../../MapUtils.js';
7
+
8
+ const nodeTypes = {
9
+ flow: FlowNode,
10
+ };
11
+ const edgeTypes = {
12
+ fiber: FiberEdge,
13
+ };
14
+ const FlowGenealogy = ({ snapshot, onSelectFlow, }) => {
15
+ const { nodes, edges } = useMemo(() => {
16
+ const newNodes = [];
17
+ const newEdges = [];
18
+ const flowEntries = Object.entries(snapshot);
19
+ const childrenMap = {};
20
+ const roots = [];
21
+ // 1. Build hierarchy
22
+ flowEntries.forEach(([key, data]) => {
23
+ const parent = data.meta.parent;
24
+ if (parent && snapshot[parent]) {
25
+ if (!childrenMap[parent])
26
+ childrenMap[parent] = [];
27
+ childrenMap[parent].push(key);
28
+ }
29
+ else {
30
+ roots.push(key);
31
+ }
32
+ });
33
+ const nodePositions = {};
34
+ // 2. Recursive layout calculation with width awareness
35
+ const calculateSubtreeWidth = (key) => {
36
+ const children = childrenMap[key] || [];
37
+ if (children.length === 0)
38
+ return 400; // Leaf node width
39
+ return children.reduce((acc, child) => acc + calculateSubtreeWidth(child), 0);
40
+ };
41
+ const layoutNode = (key, level, leftOffset) => {
42
+ const width = calculateSubtreeWidth(key);
43
+ const x = leftOffset + width / 2 - 120; // Center node
44
+ const y = level * 400;
45
+ nodePositions[key] = { x, y };
46
+ let currentLeft = leftOffset;
47
+ const children = childrenMap[key] || [];
48
+ children.forEach((child) => {
49
+ const childWidth = calculateSubtreeWidth(child);
50
+ layoutNode(child, level + 1, currentLeft);
51
+ currentLeft += childWidth;
52
+ });
53
+ return width;
54
+ };
55
+ let totalOffset = 0;
56
+ roots.forEach((root) => {
57
+ totalOffset += layoutNode(root, 0, totalOffset);
58
+ });
59
+ // 3. Create nodes and edges
60
+ flowEntries.forEach(([key, data]) => {
61
+ const pos = nodePositions[key] || { x: 0, y: 0 };
62
+ newNodes.push({
63
+ id: `gen-flow-${key}`,
64
+ type: "flow",
65
+ position: pos,
66
+ data: {
67
+ label: key.toUpperCase(), // Sync uppercase
68
+ value: data.value,
69
+ onClick: () => onSelectFlow(key),
70
+ },
71
+ });
72
+ const parent = data.meta.parent;
73
+ if (parent && snapshot[parent]) {
74
+ newEdges.push({
75
+ id: `gen-edge-${parent}-${key}`,
76
+ source: `gen-flow-${parent}`,
77
+ sourceHandle: "gen-source",
78
+ target: `gen-flow-${key}`,
79
+ targetHandle: "gen-target",
80
+ type: "fiber",
81
+ animated: true,
82
+ label: "DERIVED FROM",
83
+ labelStyle: { fill: "#94a3b8", fontSize: 10, fontWeight: 700 },
84
+ labelBgStyle: { fill: "#16213e", fillOpacity: 0.8 },
85
+ labelBgPadding: [4, 2],
86
+ labelBgBorderRadius: 4,
87
+ style: { stroke: "#f59e0b" }, // Amber/Yellow for Genealogy links
88
+ });
89
+ }
90
+ });
91
+ return { nodes: newNodes, edges: newEdges };
92
+ }, [snapshot, onSelectFlow]);
93
+ return (jsxs("div", { className: "genealogy-wrapper", style: { width: "100%", height: "100%", position: "relative" }, children: [jsxs("div", { className: "genealogy-header-overlay", children: [jsxs("div", { className: "gen-badge", children: [jsx(GitBranch, { size: 14 }), jsx("span", { children: "Logic Genealogy Tree" })] }), jsxs("p", { className: "mt-2 flex items-center gap-2", children: [jsx(Info, { size: 14, className: "text-brand" }), "This view shows how state flows from ", jsx("strong", { children: "Parents" }), " to", " ", jsx("strong", { children: "Derived Children" }), "."] })] }), jsxs(ReactFlow, { nodes: nodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: ConnectionLineType.Bezier, fitView: true, colorMode: "dark", children: [jsx(Background, { color: "#0f172a", gap: 20 }), jsx(Controls, { showInteractive: false })] })] }));
94
+ };
95
+
96
+ export { FlowGenealogy };
97
+ //# sourceMappingURL=FlowGenealogy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowGenealogy.js","sources":["../../../../../../src/devtools/mmap/components/FlowGenealogy.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n ConnectionLineType,\n Node,\n Edge,\n} from \"@xyflow/react\";\nimport { GitBranch, Info } from \"lucide-react\";\nimport { FlowNode } from \"./FlowNodes\";\nimport { FiberEdge } from \"../../MapUtils\";\n\nconst nodeTypes = {\n flow: FlowNode,\n};\n\nconst edgeTypes = {\n fiber: FiberEdge,\n};\n\ninterface FlowGenealogyProps {\n snapshot: any;\n onSelectFlow: (key: string) => void;\n}\n\nexport const FlowGenealogy: React.FC<FlowGenealogyProps> = ({\n snapshot,\n onSelectFlow,\n}) => {\n const { nodes, edges } = useMemo(() => {\n const newNodes: Node[] = [];\n const newEdges: Edge[] = [];\n\n const flowEntries = Object.entries(snapshot);\n const childrenMap: Record<string, string[]> = {};\n const roots: string[] = [];\n\n // 1. Build hierarchy\n flowEntries.forEach(([key, data]: [string, any]) => {\n const parent = data.meta.parent;\n if (parent && snapshot[parent]) {\n if (!childrenMap[parent]) childrenMap[parent] = [];\n childrenMap[parent].push(key);\n } else {\n roots.push(key);\n }\n });\n\n const nodePositions: Record<string, { x: number; y: number }> = {};\n\n // 2. Recursive layout calculation with width awareness\n const calculateSubtreeWidth = (key: string): number => {\n const children = childrenMap[key] || [];\n if (children.length === 0) return 400; // Leaf node width\n return children.reduce(\n (acc, child) => acc + calculateSubtreeWidth(child),\n 0,\n );\n };\n\n const layoutNode = (\n key: string,\n level: number,\n leftOffset: number,\n ): number => {\n const width = calculateSubtreeWidth(key);\n const x = leftOffset + width / 2 - 120; // Center node\n const y = level * 400;\n\n nodePositions[key] = { x, y };\n\n let currentLeft = leftOffset;\n const children = childrenMap[key] || [];\n children.forEach((child) => {\n const childWidth = calculateSubtreeWidth(child);\n layoutNode(child, level + 1, currentLeft);\n currentLeft += childWidth;\n });\n\n return width;\n };\n\n let totalOffset = 0;\n roots.forEach((root) => {\n totalOffset += layoutNode(root, 0, totalOffset);\n });\n\n // 3. Create nodes and edges\n flowEntries.forEach(([key, data]: [string, any]) => {\n const pos = nodePositions[key] || { x: 0, y: 0 };\n\n newNodes.push({\n id: `gen-flow-${key}`,\n type: \"flow\",\n position: pos,\n data: {\n label: key.toUpperCase(), // Sync uppercase\n value: data.value,\n onClick: () => onSelectFlow(key),\n },\n });\n\n const parent = data.meta.parent;\n if (parent && snapshot[parent]) {\n newEdges.push({\n id: `gen-edge-${parent}-${key}`,\n source: `gen-flow-${parent}`,\n sourceHandle: \"gen-source\",\n target: `gen-flow-${key}`,\n targetHandle: \"gen-target\",\n type: \"fiber\",\n animated: true,\n label: \"DERIVED FROM\",\n labelStyle: { fill: \"#94a3b8\", fontSize: 10, fontWeight: 700 },\n labelBgStyle: { fill: \"#16213e\", fillOpacity: 0.8 },\n labelBgPadding: [4, 2],\n labelBgBorderRadius: 4,\n style: { stroke: \"#f59e0b\" }, // Amber/Yellow for Genealogy links\n });\n }\n });\n\n return { nodes: newNodes, edges: newEdges };\n }, [snapshot, onSelectFlow]);\n\n return (\n <div\n className=\"genealogy-wrapper\"\n style={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n >\n <div className=\"genealogy-header-overlay\">\n <div className=\"gen-badge\">\n <GitBranch size={14} />\n <span>Logic Genealogy Tree</span>\n </div>\n <p className=\"mt-2 flex items-center gap-2\">\n <Info size={14} className=\"text-brand\" />\n This view shows how state flows from <strong>Parents</strong> to{\" \"}\n <strong>Derived Children</strong>.\n </p>\n </div>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionLineType={ConnectionLineType.Bezier}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#0f172a\" gap={20} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Handle, Position } from '@xyflow/react';
3
+ import { Zap, User, Database } from 'lucide-react';
4
+
5
+ const FlowNode = ({ data }) => (jsxs("div", { className: `m2-node-flow nodrag ${data.isActive ? "active" : ""} ${data.isHot ? "is-hot" : ""}`, style: { cursor: "pointer" }, onClick: () => data.onClick?.(), children: [jsx(Handle, { type: "target", position: Position.Top, style: { opacity: 0 }, id: "gen-target" }), jsx(Handle, { type: "source", position: Position.Bottom, style: { opacity: 0 }, id: "gen-source" }), jsx(Handle, { type: "target", position: Position.Left, style: { opacity: 0 }, id: "actor-target" }), jsx(Handle, { type: "source", position: Position.Right, style: { opacity: 0 }, id: "listener-source" }), jsxs("div", { className: "m2-node-flow-header", children: [jsx("div", { className: "m2-node-icon", children: jsx(Database, { size: 18 }) }), jsx("div", { className: "m2-node-title", children: data.label })] }), jsx("div", { className: "m2-node-preview", style: { overflowY: "hidden" }, children: data.value !== undefined ? (jsx("pre", { style: { margin: 0 }, children: JSON.stringify(data.value, null, 2).slice(0, 150) })) : (jsx("span", { style: { opacity: 0.5 }, children: "Empty state" })) })] }));
6
+ const ActorNode = ({ data }) => (jsxs("div", { className: `m2-node-actor nodrag ${data.isActive ? "active" : ""} ${data.isHot ? "is-hot" : ""}`, children: [jsx("div", { className: "m2-actor-avatar", children: data.isAnonymous ? (jsx(User, { size: 14 })) : (data.label.charAt(0).toUpperCase()) }), jsx("div", { className: "m2-actor-name", children: data.label }), jsx(Handle, { type: "source", position: Position.Right, style: { opacity: 0 } })] }));
7
+ const ListenerNode = ({ data }) => (jsxs("div", { className: `m2-node-listener nodrag ${data.isActive ? "active" : ""} ${data.isHot ? "is-hot" : ""}`, children: [jsx(Handle, { type: "target", position: Position.Left, style: { opacity: 0 } }), jsx("div", { className: "m2-listener-icon", children: jsx(Zap, { size: 14, className: data.isHot ? "text-white" : "text-yellow-400" }) }), jsxs("div", { className: "m2-listener-name", children: ["-->", " ", data.label] })] }));
8
+
9
+ export { ActorNode, FlowNode, ListenerNode };
10
+ //# sourceMappingURL=FlowNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowNodes.js","sources":["../../../../../../src/devtools/mmap/components/FlowNodes.tsx"],"sourcesContent":["import { Handle, Position } from \"@xyflow/react\";\nimport { Database, User, Zap } from \"lucide-react\";\n\nexport const FlowNode = ({ data }: any) => (\n <div\n className={`m2-node-flow nodrag ${data.isActive ? \"active\" : \"\"} ${data.isHot ? \"is-hot\" : \"\"}`}\n style={{ cursor: \"pointer\" }}\n onClick={() => data.onClick?.()}\n >\n {/* Genealogy Handles (Top/Bottom) */}\n <Handle\n type=\"target\"\n position={Position.Top}\n style={{ opacity: 0 }}\n id=\"gen-target\"\n />\n <Handle\n type=\"source\"\n position={Position.Bottom}\n style={{ opacity: 0 }}\n id=\"gen-source\"\n />\n\n {/* Live Graph Handles (Left/Right) */}\n {/* Actors enter from the LEFT */}\n <Handle\n type=\"target\"\n position={Position.Left}\n style={{ opacity: 0 }}\n id=\"actor-target\"\n />\n {/* Listeners exit to the RIGHT */}\n <Handle\n type=\"source\"\n position={Position.Right}\n style={{ opacity: 0 }}\n id=\"listener-source\"\n />\n\n <div className=\"m2-node-flow-header\">\n <div className=\"m2-node-icon\">\n <Database size={18} />\n </div>\n <div className=\"m2-node-title\">{data.label}</div>\n </div>\n\n <div className=\"m2-node-preview\" style={{ overflowY: \"hidden\" }}>\n {data.value !== undefined ? (\n <pre style={{ margin: 0 }}>\n {JSON.stringify(data.value, null, 2).slice(0, 150)}\n </pre>\n ) : (\n <span style={{ opacity: 0.5 }}>Empty state</span>\n )}\n </div>\n </div>\n);\n\nexport const ActorNode = ({ data }: any) => (\n <div\n className={`m2-node-actor nodrag ${data.isActive ? \"active\" : \"\"} ${data.isHot ? \"is-hot\" : \"\"}`}\n >\n <div className=\"m2-actor-avatar\">\n {data.isAnonymous ? (\n <User size={14} />\n ) : (\n data.label.charAt(0).toUpperCase()\n )}\n </div>\n <div className=\"m2-actor-name\">{data.label}</div>\n {/* Actors connect to the flow on their RIGHT side */}\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n </div>\n);\n\nexport const ListenerNode = ({ data }: any) => (\n <div\n className={`m2-node-listener nodrag ${data.isActive ? \"active\" : \"\"} ${data.isHot ? \"is-hot\" : \"\"}`}\n >\n {/* Listeners receive from the flow on their LEFT side */}\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div className=\"m2-listener-icon\">\n <Zap\n size={14}\n className={data.isHot ? \"text-white\" : \"text-yellow-400\"}\n />\n </div>\n <div className=\"m2-listener-name\">\n {\"-->\"} {data.label}\n </div>\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { AnimatePresence, motion } from 'framer-motion';
3
+
4
+ const MMapLedger = ({ snapshot, selectedFlow, isLedgerVisible, }) => {
5
+ if (!isLedgerVisible)
6
+ return null;
7
+ const traces = selectedFlow
8
+ ? [...snapshot[selectedFlow].meta.traces].reverse()
9
+ : Object.entries(snapshot)
10
+ .flatMap(([key, data]) => (data.meta.traces || []).map((t) => ({
11
+ ...t,
12
+ flow: key,
13
+ })))
14
+ .sort((a, b) => b.timestamp - a.timestamp)
15
+ .slice(0, 50);
16
+ return (jsxs("aside", { className: `m2-ledger`, children: [jsxs("div", { className: "m2-ledger-controls", children: [jsx("div", { className: "m2-ledger-title", children: "Activity Trace Ledger (Real-time)" }), jsx("div", { className: "m2-filter-tabs", children: jsx("div", { className: "m2-tab active", children: "REAL-TIME EXECUTION" }) })] }), jsx("div", { className: "m2-trace-list", children: jsx(AnimatePresence, { mode: "popLayout", children: traces.map((trace, i) => (jsxs(motion.div, { layout: true, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsx("div", { className: "m2-trace-dot" }), jsxs("div", { className: "m2-trace-header", children: [jsxs("span", { className: "m2-trace-actor-lbl", children: [trace.flow && (jsxs("span", { style: { color: "var(--m2-accent-cyan)" }, children: ["[", trace.flow, "]"] })), " ", trace.actor] }), jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxs("div", { className: "m2-trace-op-info", children: [jsx("span", { className: "m2-op-type", children: trace.type }), trace.path && (jsx("span", { className: "m2-path-tag", children: trace.path.join(" → ") }))] }), jsx("div", { className: "m2-trace-data", children: jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, selectedFlow ? `${selectedFlow}-${i}` : `global-${i}`))) }) })] }));
17
+ };
18
+
19
+ export { MMapLedger };
20
+ //# sourceMappingURL=MMapLedger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MMapLedger.js","sources":["../../../../../../src/devtools/mmap/components/MMapLedger.tsx"],"sourcesContent":["import React from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { MMapSnapshot } from \"../MMapTypes\";\n\ninterface MMapLedgerProps {\n snapshot: MMapSnapshot;\n selectedFlow: string | null;\n isLedgerVisible: boolean;\n}\n\nexport const MMapLedger: React.FC<MMapLedgerProps> = ({\n snapshot,\n selectedFlow,\n isLedgerVisible,\n}) => {\n if (!isLedgerVisible) return null;\n\n const traces = selectedFlow\n ? [...snapshot[selectedFlow].meta.traces].reverse()\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\n return (\n <aside className={`m2-ledger`}>\n <div className=\"m2-ledger-controls\">\n <div className=\"m2-ledger-title\">Activity Trace Ledger (Real-time)</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 {traces.map((trace, i) => (\n <motion.div\n key={selectedFlow ? `${selectedFlow}-${i}` : `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 {trace.flow && (\n <span style={{ color: \"var(--m2-accent-cyan)\" }}>\n [{trace.flow}]\n </span>\n )}{\" \"}\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\">{trace.path.join(\" → \")}</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 </AnimatePresence>\n </div>\n </aside>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { AnimatePresence, motion } from 'framer-motion';
3
+
4
+ const MMapSidebar = ({ filteredFlows, selectedFlow, setSelectedFlow, activeFlows, }) => {
5
+ return (jsxs("aside", { className: "m2-sidebar", children: [jsx("div", { className: "m2-sec-header", children: "Flow System Registry" }), jsx("div", { className: "m2-list", children: jsx(AnimatePresence, { mode: "popLayout", children: filteredFlows.map(([key, data]) => {
6
+ const isActiveNow = activeFlows.has(key);
7
+ return (jsxs(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: [jsx("div", { className: "m2-flow-indicator" }), jsxs("div", { className: "m2-flow-info", children: [jsx("span", { className: "m2-flow-name", children: key }), jsxs("span", { className: "m2-flow-stats", children: [data.meta.traces.length, " events \u2022", " ", data.meta.listeners.length, " listeners"] })] })] }, key));
8
+ }) }) })] }));
9
+ };
10
+
11
+ export { MMapSidebar };
12
+ //# sourceMappingURL=MMapSidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MMapSidebar.js","sources":["../../../../../../src/devtools/mmap/components/MMapSidebar.tsx"],"sourcesContent":["import { motion, AnimatePresence } from \"framer-motion\";\n\nimport { MMapSnapshot } from \"../MMapTypes\";\n\ninterface MMapSidebarProps {\n filteredFlows: Array<[string, MMapSnapshot[string]]>;\n selectedFlow: string | null;\n setSelectedFlow: (key: string) => void;\n activeFlows: Set<string>;\n}\n\nexport const MMapSidebar: React.FC<MMapSidebarProps> = ({\n filteredFlows,\n selectedFlow,\n setSelectedFlow,\n activeFlows,\n}) => {\n return (\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.length} listeners\n </span>\n </div>\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n </aside>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;AAWO,MAAM,WAAW,GAA+B,CAAC,EACtD,aAAa,EACb,YAAY,EACZ,eAAe,EACf,WAAW,GACZ,KAAI;AACH,IAAA,QACEA,IAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,YAAY,EAAA,QAAA,EAAA,CAC3BC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,sBAAA,EAAA,CAA2B,EACzDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,SAAS,EAAA,QAAA,EACtBA,GAAA,CAAC,eAAe,IAAC,IAAI,EAAC,WAAW,EAAA,QAAA,EAC9B,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAI;wBACjC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;wBACxC,QACED,IAAA,CAAC,MAAM,CAAC,GAAG,EAAA,EAET,MAAM,EAAA,IAAA,EACN,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAC/B,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7B,SAAS,EAAE,CAAA,aAAA,EAAgB,YAAY,KAAK,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAA,EAAI,WAAW,GAAG,eAAe,GAAG,EAAE,CAAA,CAAE,EACvG,OAAO,EAAE,MAAM,eAAe,CAAC,GAAG,CAAC,EAAA,QAAA,EAAA,CAEnCC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,GAAG,EACrCD,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,CAC3BC,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,cAAc,EAAA,QAAA,EAAE,GAAG,EAAA,CAAQ,EAC3CD,eAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAA,gBAAA,EAAW,GAAG,EACrC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAA,YAAA,CAAA,EAAA,CACtB,CAAA,EAAA,CACH,CAAA,EAAA,EAdD,GAAG,CAeG;AAEjB,oBAAA,CAAC,CAAC,EAAA,CACc,EAAA,CACd,CAAA,EAAA,CACA;AAEZ;;;;"}
@@ -70,6 +70,19 @@ class StorageAdapter {
70
70
  req.onsuccess = () => resolve();
71
71
  });
72
72
  }
73
+ setCookie(name, value, days = 7) {
74
+ const expires = new Date(Date.now() + days * 864e5).toUTCString();
75
+ document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;
76
+ }
77
+ getCookie(name) {
78
+ return document.cookie.split("; ").reduce((r, v) => {
79
+ const parts = v.split("=");
80
+ return parts[0] === name ? decodeURIComponent(parts[1]) : r;
81
+ }, "");
82
+ }
83
+ deleteCookie(name) {
84
+ this.setCookie(name, "", -1);
85
+ }
73
86
  persist($key, type) {
74
87
  if (!type)
75
88
  throw new Error("No storage type provided");
@@ -96,6 +109,10 @@ class StorageAdapter {
96
109
  }
97
110
  if (typeof window === "undefined")
98
111
  return done(undefined);
112
+ if (type === "cookie") {
113
+ const raw = this.getCookie(storageKey);
114
+ return done(raw ? JSON.parse(raw) : undefined);
115
+ }
99
116
  const raw = window[type].getItem(storageKey);
100
117
  return done(raw ? JSON.parse(raw) : undefined);
101
118
  },
@@ -106,7 +123,12 @@ class StorageAdapter {
106
123
  this.idbSet(storageKey, json);
107
124
  }
108
125
  else if (typeof window !== "undefined") {
109
- window[type].setItem(storageKey, json);
126
+ if (type === "cookie") {
127
+ this.setCookie(storageKey, json);
128
+ }
129
+ else {
130
+ window[type].setItem(storageKey, json);
131
+ }
110
132
  }
111
133
  store.logPluginActivity?.(hkey, {
112
134
  plugin: "persist",
@@ -127,7 +149,12 @@ class StorageAdapter {
127
149
  });
128
150
  }
129
151
  else if (typeof window !== "undefined") {
130
- window[type].removeItem(storageKey);
152
+ if (type === "cookie") {
153
+ this.deleteCookie(storageKey);
154
+ }
155
+ else {
156
+ window[type].removeItem(storageKey);
157
+ }
131
158
  }
132
159
  store.logPluginActivity(hkey, {
133
160
  plugin: "persist",
@@ -142,7 +169,12 @@ class StorageAdapter {
142
169
  this.idbSet(storageKey, json);
143
170
  }
144
171
  else if (typeof window !== "undefined") {
145
- window[type].setItem(storageKey, json);
172
+ if (type === "cookie") {
173
+ this.setCookie(storageKey, json);
174
+ }
175
+ else {
176
+ window[type].setItem(storageKey, json);
177
+ }
146
178
  }
147
179
  store.logPluginActivity(hkey, {
148
180
  plugin: "persist",
@@ -158,7 +190,9 @@ class StorageAdapter {
158
190
  data = raw ? JSON.parse(raw) : undefined;
159
191
  }
160
192
  else if (typeof window !== "undefined") {
161
- const raw = window[type].getItem(storageKey);
193
+ const raw = type === "cookie"
194
+ ? this.getCookie(storageKey)
195
+ : window[type].getItem(storageKey);
162
196
  data = raw ? JSON.parse(raw) : undefined;
163
197
  }
164
198
  if (data !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n public persist(\n $key: string | undefined,\n type: PersistOptions[\"storage\"],\n ): FlowPlugin {\n if (!type) throw new Error(\"No storage type provided\");\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Notify engine of async task\n (store as any).__hydrating__?.add($key);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete($key);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n const raw = window[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n const json = JSON.stringify(next);\n\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n clear: () => {\n if (type === \"indexedDB\") {\n this.IDB_NAME &&\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n window[type].removeItem(storageKey);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw = window[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n private setCookie(name: string, value: string, days = 7) {\n const expires = new Date(Date.now() + days * 864e5).toUTCString();\n document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;\n }\n\n private getCookie(name: string) {\n return document.cookie.split(\"; \").reduce((r, v) => {\n const parts = v.split(\"=\");\n return parts[0] === name ? decodeURIComponent(parts[1]) : r;\n }, \"\");\n }\n\n private deleteCookie(name: string) {\n this.setCookie(name, \"\", -1);\n }\n\n public persist(\n $key: string | undefined,\n type: PersistOptions[\"storage\"],\n ): FlowPlugin {\n if (!type) throw new Error(\"No storage type provided\");\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Notify engine of async task\n (store as any).__hydrating__?.add($key);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete($key);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n\n if (type === \"cookie\") {\n const raw = this.getCookie(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n }\n\n const raw = (window as any)[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n const json = JSON.stringify(next);\n\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n clear: () => {\n if (type === \"indexedDB\") {\n this.IDB_NAME &&\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.deleteCookie(storageKey);\n } else {\n (window as any)[type].removeItem(storageKey);\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n if (type === \"cookie\") {\n this.setCookie(storageKey, json);\n } else {\n (window as any)[type].setItem(storageKey, json);\n }\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw =\n type === \"cookie\"\n ? this.getCookie(storageKey)\n : (window as any)[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -52,6 +52,12 @@ class MemoryVault {
52
52
  getPluginLogs(key) {
53
53
  return this.pluginLogs.get(key) || [];
54
54
  }
55
+ setParent(key, parentKey) {
56
+ this.parents.set(key, parentKey);
57
+ }
58
+ getParent(key) {
59
+ return this.parents.get(key);
60
+ }
55
61
  constructor() {
56
62
  Object.defineProperty(this, "vault", {
57
63
  enumerable: true,
@@ -101,6 +107,12 @@ class MemoryVault {
101
107
  writable: true,
102
108
  value: new Map()
103
109
  }); // flowKey -> Set of actor names
110
+ Object.defineProperty(this, "parents", {
111
+ enumerable: true,
112
+ configurable: true,
113
+ writable: true,
114
+ value: new Map()
115
+ }); // flowKey -> parent flowKey
104
116
  // Use Set for O(1) deduplication and fast iteration
105
117
  Object.defineProperty(this, "batchQueue", {
106
118
  enumerable: true,
@@ -181,8 +193,8 @@ class MemoryVault {
181
193
  setupAutoCleanup() {
182
194
  if (typeof setInterval !== "undefined") {
183
195
  setInterval(() => {
184
- this.listeners.forEach((set, key) => {
185
- if (set.size === 0 && !this.vault.has(key)) {
196
+ this.listeners.forEach((map, key) => {
197
+ if (map.size === 0 && !this.vault.has(key)) {
186
198
  this.listeners.delete(key);
187
199
  }
188
200
  });
@@ -441,23 +453,32 @@ class MemoryVault {
441
453
  /**
442
454
  * Connects a listener to a specific flow key.
443
455
  */
444
- subscribe(key, listener, actor) {
445
- if (actor) {
456
+ subscribe(key, listener, metadataOrActor) {
457
+ const label = typeof metadataOrActor === "string"
458
+ ? metadataOrActor
459
+ : metadataOrActor?.label || "Anonymous Subscriber";
460
+ if (typeof metadataOrActor === "string") {
446
461
  let flowConsumers = this.consumers.get(key);
447
462
  if (!flowConsumers) {
448
463
  flowConsumers = new Set();
449
464
  this.consumers.set(key, flowConsumers);
450
465
  }
451
- flowConsumers.add(actor);
466
+ flowConsumers.add(metadataOrActor);
452
467
  }
453
- let set = this.listeners.get(key);
454
- if (!set) {
455
- set = new Set();
456
- this.listeners.set(key, set);
468
+ let map = this.listeners.get(key);
469
+ if (!map) {
470
+ map = new Map();
471
+ this.listeners.set(key, map);
457
472
  }
458
- set.add(listener);
473
+ map.set(listener, { label, timestamp: Date.now() });
459
474
  return () => {
460
- set?.delete(listener);
475
+ const currentMap = this.listeners.get(key);
476
+ if (currentMap) {
477
+ currentMap.delete(listener);
478
+ if (currentMap.size === 0 && !this.vault.has(key)) {
479
+ this.listeners.delete(key);
480
+ }
481
+ }
461
482
  };
462
483
  }
463
484
  /**
@@ -498,11 +519,12 @@ class MemoryVault {
498
519
  meta: {
499
520
  historySize: this.histories.get(key)?.length() || 0,
500
521
  redoSize: this.redoStacks.get(key)?.length || 0,
501
- listeners: this.listeners.get(key)?.size || 0,
522
+ listeners: Array.from(this.listeners.get(key)?.values() || []),
502
523
  isDebouncing: this.debounceTimers.has(key),
503
524
  isDirty: !deepEqual(val, initial),
504
525
  traces: this.traces.get(key) || [],
505
526
  consumers: Array.from(this.consumers.get(key) || []),
527
+ parent: this.parents.get(key),
506
528
  plugins: this.getPluginsInfo(key),
507
529
  pluginLogs: this.getPluginLogs(key),
508
530
  },
@@ -528,7 +550,7 @@ class MemoryVault {
528
550
  * Directly notifies all listeners of a specific key.
529
551
  */
530
552
  notify(key) {
531
- this.listeners.get(key)?.forEach((l) => l());
553
+ this.listeners.get(key)?.forEach((_meta, listener) => listener());
532
554
  if (this.hasGlobalListeners) {
533
555
  this.globalListeners.forEach((l) => l());
534
556
  }