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.
- package/dist/cjs/index.js +5 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/src/devtools/FractoDevTools.js +3 -1
- package/dist/cjs/src/devtools/FractoDevTools.js.map +1 -1
- package/dist/cjs/src/devtools/MapUtils.js +3 -11
- package/dist/cjs/src/devtools/MapUtils.js.map +1 -1
- package/dist/cjs/src/devtools/MentalMap.css.js +1 -1
- package/dist/cjs/src/devtools/MentalMap.js +141 -80
- package/dist/cjs/src/devtools/MentalMap.js.map +1 -1
- package/dist/cjs/src/devtools/PluginManager.js +1 -1
- package/dist/cjs/src/devtools/PluginManager.js.map +1 -1
- package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js +99 -0
- package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
- package/dist/cjs/src/devtools/mmap/components/FlowNodes.js +14 -0
- package/dist/cjs/src/devtools/mmap/components/FlowNodes.js.map +1 -0
- package/dist/cjs/src/devtools/mmap/components/MMapLedger.js +22 -0
- package/dist/cjs/src/devtools/mmap/components/MMapLedger.js.map +1 -0
- package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js +14 -0
- package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
- package/dist/cjs/src/plugins/storage/StorageAdapter.js +38 -4
- package/dist/cjs/src/plugins/storage/StorageAdapter.js.map +1 -1
- package/dist/cjs/src/store.js +35 -13
- package/dist/cjs/src/store.js.map +1 -1
- package/dist/esm/index.js +5 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/src/devtools/FractoDevTools.js +3 -1
- package/dist/esm/src/devtools/FractoDevTools.js.map +1 -1
- package/dist/esm/src/devtools/MapUtils.js +5 -11
- package/dist/esm/src/devtools/MapUtils.js.map +1 -1
- package/dist/esm/src/devtools/MentalMap.css.js +1 -1
- package/dist/esm/src/devtools/MentalMap.js +141 -80
- package/dist/esm/src/devtools/MentalMap.js.map +1 -1
- package/dist/esm/src/devtools/PluginManager.js +2 -2
- package/dist/esm/src/devtools/PluginManager.js.map +1 -1
- package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js +97 -0
- package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
- package/dist/esm/src/devtools/mmap/components/FlowNodes.js +10 -0
- package/dist/esm/src/devtools/mmap/components/FlowNodes.js.map +1 -0
- package/dist/esm/src/devtools/mmap/components/MMapLedger.js +20 -0
- package/dist/esm/src/devtools/mmap/components/MMapLedger.js.map +1 -0
- package/dist/esm/src/devtools/mmap/components/MMapSidebar.js +12 -0
- package/dist/esm/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
- package/dist/esm/src/plugins/storage/StorageAdapter.js +38 -4
- package/dist/esm/src/plugins/storage/StorageAdapter.js.map +1 -1
- package/dist/esm/src/store.js +35 -13
- package/dist/esm/src/store.js.map +1 -1
- package/dist/plugins.d.ts +1 -1
- 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":"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"}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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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"}
|
package/dist/esm/src/store.js
CHANGED
|
@@ -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((
|
|
185
|
-
if (
|
|
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,
|
|
445
|
-
|
|
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(
|
|
466
|
+
flowConsumers.add(metadataOrActor);
|
|
452
467
|
}
|
|
453
|
-
let
|
|
454
|
-
if (!
|
|
455
|
-
|
|
456
|
-
this.listeners.set(key,
|
|
468
|
+
let map = this.listeners.get(key);
|
|
469
|
+
if (!map) {
|
|
470
|
+
map = new Map();
|
|
471
|
+
this.listeners.set(key, map);
|
|
457
472
|
}
|
|
458
|
-
set.
|
|
473
|
+
map.set(listener, { label, timestamp: Date.now() });
|
|
459
474
|
return () => {
|
|
460
|
-
|
|
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)?.
|
|
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((
|
|
553
|
+
this.listeners.get(key)?.forEach((_meta, listener) => listener());
|
|
532
554
|
if (this.hasGlobalListeners) {
|
|
533
555
|
this.globalListeners.forEach((l) => l());
|
|
534
556
|
}
|