flexdesk 0.17.12 → 0.17.14
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/CHANGELOG.md +44 -0
- package/LICENSE +0 -0
- package/README.md +0 -0
- package/THIRD_PARTY_LICENSES.md +0 -0
- package/canvas.js +0 -0
- package/charts.js +0 -0
- package/core.js +0 -0
- package/css/base.css +61 -0
- package/css/flexdesk.css +85 -2
- package/css/overrides.css +24 -2
- package/css/reset.css +0 -0
- package/dist/canvas.js +0 -0
- package/dist/canvas.js.map +0 -0
- package/dist/charts.js +3 -3
- package/dist/{chunk-NIJEJAZ7.js → chunk-2PM6ZMNS.js} +2 -2
- package/dist/chunk-3PHCPZHT.js +0 -0
- package/dist/chunk-3PHCPZHT.js.map +0 -0
- package/dist/chunk-FOOS3T5L.js +0 -0
- package/dist/chunk-FOOS3T5L.js.map +0 -0
- package/dist/chunk-GOQLR5WR.js +0 -0
- package/dist/chunk-GOQLR5WR.js.map +0 -0
- package/dist/chunk-HNU6MM2B.js +0 -0
- package/dist/chunk-HNU6MM2B.js.map +0 -0
- package/dist/{chunk-F35XSQWA.js → chunk-IG74S3ZH.js} +2 -2
- package/dist/chunk-JKZLNKG6.js +0 -0
- package/dist/chunk-JKZLNKG6.js.map +0 -0
- package/dist/chunk-JYWURG5T.js +0 -0
- package/dist/chunk-JYWURG5T.js.map +0 -0
- package/dist/{chunk-CVMCZZX2.js → chunk-MADMGRX2.js} +18 -7
- package/dist/chunk-MADMGRX2.js.map +7 -0
- package/dist/chunk-N7HC3ADV.js +0 -0
- package/dist/chunk-N7HC3ADV.js.map +0 -0
- package/dist/{chunk-75FLVAUT.js → chunk-TLIV6QSU.js} +3 -3
- package/dist/{chunk-BE2PU3LL.js → chunk-ZMH3OC7H.js} +2 -2
- package/dist/core.js +3 -18
- package/dist/core.js.map +2 -2
- package/dist/editor.js.map +0 -0
- package/dist/flexdesk.css +85 -2
- package/dist/flow.js +3 -3
- package/dist/flow.js.map +0 -0
- package/dist/host.js +0 -0
- package/dist/host.js.map +0 -0
- package/dist/reset.css +0 -0
- package/dist/tile_registry-6WZPTUZV.js +0 -0
- package/dist/tile_registry-6WZPTUZV.js.map +0 -0
- package/dist/tiles.js +5 -5
- package/dist/widgets.js +31 -22
- package/dist/widgets.js.map +2 -2
- package/dist/wm.js +198 -31
- package/dist/wm.js.map +3 -3
- package/docs/README.md +1 -1
- package/docs/best-practices.md +1 -1
- package/docs/components/command-palette.md +0 -0
- package/docs/components/conversation.md +0 -0
- package/docs/components/data-table-grid.md +0 -0
- package/docs/components/data-table.md +0 -0
- package/docs/components/editor.md +0 -0
- package/docs/components/flow-canvas-editor.md +0 -0
- package/docs/components/flow-editors.md +0 -0
- package/docs/components/flow-lane-editor.md +0 -0
- package/docs/components/flow-outline-editor.md +0 -0
- package/docs/components/forms-and-dialogs.md +0 -0
- package/docs/components/input-fields.md +0 -0
- package/docs/components/keymap.md +66 -3
- package/docs/components/layout-widgets.md +32 -0
- package/docs/components/markdown-and-outline.md +0 -0
- package/docs/components/menus.md +63 -0
- package/docs/components/notifications.md +0 -0
- package/docs/components/panels-and-desktops.md +56 -0
- package/docs/components/record-list-and-fact-table.md +0 -0
- package/docs/components/settings-view.md +0 -0
- package/docs/components/shell.md +0 -0
- package/docs/components/slide-out-panel.md +0 -0
- package/docs/components/wizard.md +0 -0
- package/docs/concepts/building-and-packaging.md +0 -0
- package/docs/concepts/domain-neutrality.md +0 -0
- package/docs/concepts/host-port.md +0 -0
- package/docs/concepts/packages-and-entry-points.md +0 -0
- package/docs/concepts/peer-dependencies.md +0 -0
- package/docs/concepts/state-guard.md +65 -2
- package/docs/concepts/styling.md +24 -6
- package/docs/quickstart.md +0 -0
- package/editor.js +0 -0
- package/flow.js +0 -0
- package/host.js +0 -0
- package/package.json +2 -2
- package/src/canvas/canvas_adapter.js +0 -0
- package/src/canvas/edge_router.js +0 -0
- package/src/canvas/graph/connector_router.js +0 -0
- package/src/canvas/graph/history_service.js +0 -0
- package/src/canvas/graph/node_platform.js +0 -0
- package/src/canvas/index.js +0 -0
- package/src/canvas/layered_layout.js +0 -0
- package/src/charts/data_series_plot_window.js +0 -0
- package/src/charts/downsample.js +0 -0
- package/src/charts/plot_config.js +0 -0
- package/src/charts/plotly_wrapper.js +0 -0
- package/src/core/event_bus.js +0 -0
- package/src/core/logging.js +0 -0
- package/src/core/settings.js +0 -0
- package/src/core/state_guard.js +0 -0
- package/src/core/state_guard_config.js +19 -18
- package/src/core/state_machine.js +0 -0
- package/src/editor/editor_pane.js +0 -0
- package/src/editor/monaco_editor_factory.js +0 -0
- package/src/editor/monaco_loader.js +0 -0
- package/src/editor/notebook_search.js +0 -0
- package/src/editor/notebook_undo_manager.js +0 -0
- package/src/editor/split_pane_container.js +0 -0
- package/src/flow/canvas_editor/connections.js +0 -0
- package/src/flow/canvas_editor/editor.js +0 -0
- package/src/flow/canvas_editor/index.js +0 -0
- package/src/flow/canvas_editor/layout.js +0 -0
- package/src/flow/canvas_editor/strings.js +0 -0
- package/src/flow/kit/always_before.js +0 -0
- package/src/flow/kit/catalogue.js +0 -0
- package/src/flow/kit/chip_input.js +0 -0
- package/src/flow/kit/dom.js +0 -0
- package/src/flow/kit/findings.js +0 -0
- package/src/flow/kit/history.js +0 -0
- package/src/flow/kit/index.js +0 -0
- package/src/flow/kit/keys.js +0 -0
- package/src/flow/kit/logic_graph.js +0 -0
- package/src/flow/kit/references.js +0 -0
- package/src/flow/kit/settings_panel.js +0 -0
- package/src/flow/kit/settings_schema.js +0 -0
- package/src/flow/kit/step_picker.js +0 -0
- package/src/flow/kit/strings.js +0 -0
- package/src/flow/kit/value_picker.js +0 -0
- package/src/flow/kit/widgets.js +0 -0
- package/src/flow/lanes/editor.js +0 -0
- package/src/flow/lanes/index.js +0 -0
- package/src/flow/lanes/layout.js +0 -0
- package/src/flow/lanes/pipeline.js +0 -0
- package/src/flow/lanes/preview.js +0 -0
- package/src/flow/lanes/strings.js +0 -0
- package/src/flow/outline/editor.js +0 -0
- package/src/flow/outline/index.js +0 -0
- package/src/flow/outline/mapping.js +0 -0
- package/src/flow/outline/menu.js +0 -0
- package/src/flow/outline/operations.js +0 -0
- package/src/flow/outline/recognise.js +0 -0
- package/src/flow/outline/strings.js +0 -0
- package/src/help/help_modal.js +0 -0
- package/src/help/help_registry.js +0 -0
- package/src/host/external_links.js +0 -0
- package/src/host/file_picker.js +0 -0
- package/src/host/host.js +0 -0
- package/src/host/photino_host.js +0 -0
- package/src/host/photino_host.md +0 -0
- package/src/host/pywebview_host.js +0 -0
- package/src/tiles/chart_tiles.js +0 -0
- package/src/tiles/config_schema.js +0 -0
- package/src/tiles/figure_tile.js +0 -0
- package/src/tiles/layout_persistence.js +0 -0
- package/src/tiles/list_tiles.js +0 -0
- package/src/tiles/scope_picker.js +0 -0
- package/src/tiles/tile_config_form.js +0 -0
- package/src/tiles/tile_grid.js +0 -0
- package/src/tiles/tile_registry.js +0 -0
- package/src/tiling/bottom_panel_tabs.js +0 -0
- package/src/tiling/command_palette.js +0 -0
- package/src/tiling/content_registry.js +0 -0
- package/src/tiling/desktops.js +79 -16
- package/src/tiling/entity_sources.js +0 -0
- package/src/tiling/keymap.js +70 -2
- package/src/tiling/kind_taxonomy.js +0 -0
- package/src/tiling/landing_table.js +0 -0
- package/src/tiling/loading_overlay.js +0 -0
- package/src/tiling/nav_panel.js +0 -0
- package/src/tiling/page_factory.js +0 -0
- package/src/tiling/panel_availability.js +0 -0
- package/src/tiling/panel_keys.js +0 -0
- package/src/tiling/shell.js +9 -2
- package/src/tiling/tab_strip.js +0 -0
- package/src/tiling/tile_breadcrumb.js +0 -0
- package/src/tiling/tile_renderer.js +0 -0
- package/src/tiling/tile_tab_menu.js +0 -0
- package/src/tiling/tile_tree.js +63 -5
- package/src/tiling/wm.js +59 -6
- package/src/tiling/zoom.js +0 -0
- package/src/ui/base/component_base.js +0 -0
- package/src/ui/base/controller_base.js +0 -0
- package/src/ui/base/page_base.js +0 -0
- package/src/ui/components/about_dialog.js +0 -0
- package/src/ui/components/alert_log.js +0 -0
- package/src/ui/components/alerts_pane.js +0 -0
- package/src/ui/components/attribute_list_editor.js +0 -0
- package/src/ui/components/autocomplete_field.js +0 -0
- package/src/ui/components/cell_editor_host.js +0 -0
- package/src/ui/components/cell_editors.js +0 -0
- package/src/ui/components/cell_grid.js +0 -0
- package/src/ui/components/cell_paste.js +0 -0
- package/src/ui/components/cell_selection.js +0 -0
- package/src/ui/components/choice_controls.js +0 -0
- package/src/ui/components/color_field.js +0 -0
- package/src/ui/components/color_list_field.js +0 -0
- package/src/ui/components/column_fit.js +0 -0
- package/src/ui/components/column_groups.js +0 -0
- package/src/ui/components/column_order.js +0 -0
- package/src/ui/components/computing_status_window.js +0 -0
- package/src/ui/components/confirm_dialog.js +0 -0
- package/src/ui/components/conversation_view.js +0 -0
- package/src/ui/components/crosstab.js +0 -0
- package/src/ui/components/detail_header.js +0 -0
- package/src/ui/components/document_outline.js +0 -0
- package/src/ui/components/drag_reorder.js +0 -0
- package/src/ui/components/fact_table.js +0 -0
- package/src/ui/components/fill_handle.js +0 -0
- package/src/ui/components/gallery_picker.js +0 -0
- package/src/ui/components/header_actions.js +0 -0
- package/src/ui/components/inline_renamer.js +0 -0
- package/src/ui/components/job_progress.js +0 -0
- package/src/ui/components/managed_window.js +24 -6
- package/src/ui/components/menu_bar.js +0 -0
- package/src/ui/components/modal.js +0 -0
- package/src/ui/components/notification_history.js +0 -0
- package/src/ui/components/progress.js +0 -0
- package/src/ui/components/record_list.js +0 -0
- package/src/ui/components/row_activation.js +0 -0
- package/src/ui/components/section_stack.js +0 -0
- package/src/ui/components/series.js +0 -0
- package/src/ui/components/settings_view.js +0 -0
- package/src/ui/components/slide_out_panel.js +0 -0
- package/src/ui/components/slider_field.js +0 -0
- package/src/ui/components/sortable_list.js +0 -0
- package/src/ui/components/staged_edits.js +0 -0
- package/src/ui/components/staged_history.js +0 -0
- package/src/ui/components/table_filter_chips.js +0 -0
- package/src/ui/components/table_state_store.js +0 -0
- package/src/ui/components/table_structure.js +0 -0
- package/src/ui/components/table_values.js +0 -0
- package/src/ui/components/tabs.js +0 -0
- package/src/ui/components/tag_input.js +0 -0
- package/src/ui/components/toast.js +0 -0
- package/src/ui/components/toggle_field.js +0 -0
- package/src/ui/components/tree_view.js +41 -18
- package/src/ui/components/tsv.js +0 -0
- package/src/ui/components/window_taskbar.js +0 -0
- package/src/ui/components/wizard.js +0 -0
- package/src/ui/controllers/window_chrome_controller.js +0 -0
- package/src/ui/notification_center.js +0 -0
- package/src/ui/utils/auto_scrollbars.js +0 -0
- package/src/ui/utils/markdown.js +0 -0
- package/src/ui/utils/native_context_menu.js +0 -0
- package/src/ui/utils/overlay_scrollbar.js +0 -0
- package/src/ui/utils/raf_resize_observer.js +0 -0
- package/src/ui/utils/scroll_lock.js +0 -0
- package/src/ui/utils/strip_scroll.js +0 -0
- package/src/ui/utils/tooltip_service.js +0 -0
- package/tiles.js +0 -0
- package/widgets.js +0 -0
- package/wm.js +0 -0
- package/dist/chunk-CVMCZZX2.js.map +0 -7
- /package/dist/{chunk-NIJEJAZ7.js.map → chunk-2PM6ZMNS.js.map} +0 -0
- /package/dist/{chunk-F35XSQWA.js.map → chunk-IG74S3ZH.js.map} +0 -0
- /package/dist/{chunk-75FLVAUT.js.map → chunk-TLIV6QSU.js.map} +0 -0
- /package/dist/{chunk-BE2PU3LL.js.map → chunk-ZMH3OC7H.js.map} +0 -0
package/dist/core.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/core/event_bus.js", "../src/core/logging.js", "../src/core/state_guard_config.js", "../src/core/state_guard.js"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Event Bus (js_new)\r\n *\r\n * Purpose\r\n * -------\r\n * Provide a deterministic, dependency-injected publish/subscribe hub for all front-end modules.\r\n *\r\n * Responsibilities\r\n * - Maintain per-event listener registries with namespace awareness.\r\n * - Support synchronous + async dispatch without DOM bridges or global singletons.\r\n * - Surface diagnostics via the shared logging service instead of ad hoc console calls.\r\n *\r\n * Source Material\r\n * - html/js/event_manager.js (core pub/sub semantics, minus DOM bridge + globals).\r\n * - html/js/debug_utils.js (event history/diagnostics requirements).\r\n *\r\n */\r\n\r\nconst PATTERN_TOKEN_RE = /[.*+?^${}()|[\\]\\\\]/g;\r\nconst HAS_WILDCARD_RE = /[\\*\\?]/;\r\n\r\nexport class EventBus {\r\n constructor({ logger, historyLimit = 200 } = {}) {\r\n this.logger = logger;\r\n this.historyLimit = historyLimit;\r\n this.sequence = 0;\r\n this.listeners = new Map(); // event -> Set<entry>\r\n this.wildcardListeners = new Map(); // id -> entry (regex based)\r\n this.listenerIndex = new Map(); // id -> entry\r\n this.eventHistory = [];\r\n }\r\n\r\n on(eventName, handler, options = {}) {\r\n if (typeof eventName !== 'string' || !eventName.trim()) {\r\n throw new TypeError('eventName must be a non-empty string');\r\n }\r\n if (typeof handler !== 'function') {\r\n throw new TypeError('handler must be a function');\r\n }\r\n\r\n const entry = {\r\n id: ++this.sequence,\r\n eventName,\r\n handler,\r\n namespace: options.namespace ?? null,\r\n once: Boolean(options.once),\r\n priority: options.priority ?? 0,\r\n regex: null,\r\n abortCleanup: null,\r\n };\r\n\r\n if (HAS_WILDCARD_RE.test(eventName)) {\r\n entry.regex = this._compilePattern(eventName);\r\n this.wildcardListeners.set(entry.id, entry);\r\n } else {\r\n if (!this.listeners.has(eventName)) {\r\n this.listeners.set(eventName, new Set());\r\n }\r\n this.listeners.get(eventName).add(entry);\r\n }\r\n\r\n const useAbortSignal = typeof AbortSignal !== 'undefined' && options.signal instanceof AbortSignal;\r\n if (useAbortSignal) {\r\n if (options.signal.aborted) {\r\n // Immediately unsubscribe if already aborted.\r\n return { dispose: () => {}, id: entry.id };\r\n }\r\n const abortFn = () => this.off(entry.id);\r\n options.signal.addEventListener('abort', abortFn, { once: true });\r\n entry.abortCleanup = () => options.signal.removeEventListener('abort', abortFn);\r\n }\r\n\r\n this.listenerIndex.set(entry.id, entry);\r\n return {\r\n id: entry.id,\r\n dispose: () => this.off(entry.id),\r\n };\r\n }\r\n\r\n once(eventName, handler, options = {}) {\r\n return this.on(eventName, handler, { ...options, once: true });\r\n }\r\n\r\n off(target) {\r\n const id = typeof target === 'number' ? target : target?.id;\r\n if (!this.listenerIndex.has(id)) {\r\n return false;\r\n }\r\n const entry = this.listenerIndex.get(id);\r\n this.listenerIndex.delete(id);\r\n\r\n if (entry.abortCleanup) {\r\n try {\r\n entry.abortCleanup();\r\n } catch (err) {\r\n this.logger?.warn?.('event-bus', 'Abort cleanup failed', err);\r\n }\r\n }\r\n\r\n if (entry.regex) {\r\n this.wildcardListeners.delete(entry.id);\r\n } else {\r\n const bucket = this.listeners.get(entry.eventName);\r\n if (bucket) {\r\n bucket.delete(entry);\r\n if (bucket.size === 0) {\r\n this.listeners.delete(entry.eventName);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n emit(eventName, payload = undefined, options = {}) {\r\n const context = this._createContext(eventName, options);\r\n const listeners = this._collectListeners(eventName, context.namespace);\r\n this._recordHistory(eventName, context.namespace, listeners.length);\r\n return this._invokeListeners(listeners, payload, context);\r\n }\r\n\r\n emitAsync(eventName, payload = undefined, options = {}) {\r\n const context = this._createContext(eventName, options);\r\n const listeners = this._collectListeners(eventName, context.namespace);\r\n this._recordHistory(eventName, context.namespace, listeners.length);\r\n return Promise.resolve().then(() => this._invokeListeners(listeners, payload, context));\r\n }\r\n\r\n listenerCount(eventName) {\r\n const direct = this.listeners.get(eventName)?.size ?? 0;\r\n const wildcard = [...this.wildcardListeners.values()].filter((entry) => entry.regex.test(eventName)).length;\r\n return direct + wildcard;\r\n }\r\n\r\n getHistory() {\r\n return [...this.eventHistory];\r\n }\r\n\r\n clearHistory() {\r\n this.eventHistory.length = 0;\r\n }\r\n\r\n reset() {\r\n this.listeners.clear();\r\n this.wildcardListeners.clear();\r\n this.listenerIndex.clear();\r\n this.eventHistory.length = 0;\r\n }\r\n\r\n _collectListeners(eventName, namespace) {\r\n const matches = [];\r\n const bucket = this.listeners.get(eventName);\r\n if (bucket) {\r\n matches.push(...bucket);\r\n }\r\n\r\n for (const entry of this.wildcardListeners.values()) {\r\n if (entry.regex.test(eventName)) {\r\n matches.push(entry);\r\n }\r\n }\r\n\r\n return matches\r\n .filter((entry) => !entry.namespace || entry.namespace === namespace)\r\n .sort((a, b) => {\r\n if (a.priority === b.priority) {\r\n return a.id - b.id;\r\n }\r\n return b.priority - a.priority;\r\n });\r\n }\r\n\r\n _invokeListeners(listeners, payload, context) {\r\n const results = [];\r\n context.stopPropagation = () => {\r\n context.__stopped = true;\r\n };\r\n\r\n for (const entry of listeners) {\r\n if (context.__stopped) {\r\n break;\r\n }\r\n try {\r\n const result = entry.handler(payload, context);\r\n results.push(result);\r\n if (entry.once) {\r\n this.off(entry.id);\r\n }\r\n } catch (err) {\r\n this._handleListenerError(entry, context, err);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n _createContext(eventName, options) {\r\n return {\r\n event: eventName,\r\n namespace: options.namespace ?? null,\r\n timestamp: Date.now(),\r\n stopPropagation: () => {},\r\n };\r\n }\r\n\r\n _recordHistory(eventName, namespace, listenerCount) {\r\n this.eventHistory.push({\r\n event: eventName,\r\n namespace,\r\n timestamp: Date.now(),\r\n listeners: listenerCount,\r\n });\r\n if (this.eventHistory.length > this.historyLimit) {\r\n this.eventHistory.shift();\r\n }\r\n }\r\n\r\n _handleListenerError(entry, context, error) {\r\n this.logger?.error?.('event-bus', 'Listener error', {\r\n event: context.event,\r\n namespace: context.namespace,\r\n listenerId: entry.id,\r\n error,\r\n });\r\n }\r\n\r\n _compilePattern(pattern) {\r\n const escaped = pattern.replace(PATTERN_TOKEN_RE, '\\\\$&');\r\n const regexSource = `^${escaped.replace(/\\\\\\*/g, '.*').replace(/\\\\\\?/g, '.')}$`;\r\n return new RegExp(regexSource);\r\n }\r\n}\r\n", "/**\r\n * Logging + Telemetry Hub (js_new)\r\n *\r\n * Purpose\r\n * -------\r\n * Single sink for structured logs, metrics, and telemetry forwarding from all modules.\r\n *\r\n * Responsibilities\r\n * - Normalize log payloads (level, namespace, metadata) before dispatching to host.\r\n * - Publish `log:*` events for in-app diagnostics dashboards.\r\n * - Replace scattered console/notify usage with a deterministic API.\r\n *\r\n * Source Material\r\n * - html/js/logger.js (log formatting + transports).\r\n * - html/js/debug_utils.js (runtime diagnostics + indicators).\r\n *\r\n */\r\n\r\nconst LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\r\nconst LEVEL_INDEX = new Map(LEVELS.map((level, idx) => [level, idx]));\r\n\r\nconst DEFAULT_NAMESPACE = 'app';\r\n\r\n// Quiet mode level - only warn and above during simulation\r\nconst QUIET_MODE_LEVEL = 'warn';\r\n\r\nexport class LoggingService {\r\n constructor({\r\n name = 'flexdesk',\r\n eventBus = null,\r\n minLevel = 'info',\r\n historyLimit = 500,\r\n transports = [],\r\n enableConsole = false,\r\n namespaceLevels = null,\r\n } = {}) {\r\n this.name = name;\r\n this.eventBus = eventBus;\r\n this.historyLimit = historyLimit;\r\n this.entries = [];\r\n this.sequence = 0;\r\n this.transports = new Set();\r\n this.namespaceLevels = { ...(namespaceLevels || {}) };\r\n this._quietMode = false;\r\n this._savedLevel = null;\r\n this.setLevel(minLevel);\r\n\r\n transports.forEach((transport) => this.addTransport(transport));\r\n if (enableConsole) {\r\n this.addTransport(this._consoleTransport.bind(this));\r\n }\r\n }\r\n\r\n setLevel(level) {\r\n const normalized = this._normalizeLevel(level);\r\n this.minLevel = normalized;\r\n }\r\n\r\n getLevel() {\r\n return this.minLevel;\r\n }\r\n\r\n /**\r\n * Enter quiet mode - suppresses DEBUG/INFO logs during simulation.\r\n * Only WARNING and above are logged.\r\n */\r\n enterQuietMode() {\r\n if (this._quietMode) return;\r\n this._quietMode = true;\r\n this._savedLevel = this.minLevel;\r\n if (LEVEL_INDEX.get(this.minLevel) < LEVEL_INDEX.get(QUIET_MODE_LEVEL)) {\r\n this.minLevel = QUIET_MODE_LEVEL;\r\n }\r\n }\r\n\r\n /**\r\n * Exit quiet mode - restores previous log level.\r\n */\r\n exitQuietMode() {\r\n if (!this._quietMode) return;\r\n this._quietMode = false;\r\n if (this._savedLevel !== null) {\r\n this.minLevel = this._savedLevel;\r\n this._savedLevel = null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if quiet mode is active.\r\n */\r\n isQuietMode() {\r\n return this._quietMode;\r\n }\r\n\r\n setNamespaceLevel(namespace, level) {\r\n if (!namespace) return;\r\n this.namespaceLevels[namespace] = this._normalizeLevel(level);\r\n }\r\n\r\n setNamespaceLevels(map) {\r\n if (!map || typeof map !== 'object') return;\r\n Object.entries(map).forEach(([ns, lvl]) => {\r\n if (ns) {\r\n this.namespaceLevels[ns] = this._normalizeLevel(lvl);\r\n }\r\n });\r\n }\r\n\r\n getNamespaceLevel(namespace) {\r\n if (!namespace) return undefined;\r\n return this.namespaceLevels[namespace];\r\n }\r\n\r\n addTransport(transport) {\r\n if (typeof transport !== 'function') {\r\n throw new TypeError('Logging transport must be a function');\r\n }\r\n this.transports.add(transport);\r\n }\r\n\r\n removeTransport(transport) {\r\n this.transports.delete(transport);\r\n }\r\n\r\n log(level, message, metadata = null, options = {}) {\r\n const normalizedLevel = this._normalizeLevel(level);\r\n const namespace = options.namespace || DEFAULT_NAMESPACE;\r\n if (!this._shouldLog(normalizedLevel, namespace)) {\r\n return null;\r\n }\r\n\r\n const entry = this._buildEntry(normalizedLevel, message, metadata, options);\r\n this._recordHistory(entry);\r\n this._emit(entry);\r\n this._dispatch(entry);\r\n return entry;\r\n }\r\n\r\n trace(message, metadata, options) {\r\n return this.log('trace', message, metadata, options);\r\n }\r\n\r\n debug(message, metadata, options) {\r\n return this.log('debug', message, metadata, options);\r\n }\r\n\r\n info(message, metadata, options) {\r\n return this.log('info', message, metadata, options);\r\n }\r\n\r\n warn(message, metadata, options) {\r\n return this.log('warn', message, metadata, options);\r\n }\r\n\r\n error(message, metadata, options) {\r\n return this.log('error', message, metadata, options);\r\n }\r\n\r\n fatal(message, metadata, options) {\r\n return this.log('fatal', message, metadata, options);\r\n }\r\n\r\n scoped(namespace) {\r\n const ns = namespace || DEFAULT_NAMESPACE;\r\n // Codebase convention: callers pass (subcategory, message, meta?) where\r\n // subcategory is a short kebab-case tag and message is the human-readable\r\n // string. Detect this pattern (two leading string args) and use the second\r\n // string as the log message, discarding the subcategory (the scoped\r\n // namespace already provides sufficient context).\r\n // Also supports the standard (message, meta?) single-string form.\r\n const make = (level) => (first, second, third) => {\r\n if (typeof second === 'string') {\r\n return this.log(level, second, third ?? null, { namespace: ns });\r\n }\r\n return this.log(level, first, second ?? null, { namespace: ns });\r\n };\r\n return {\r\n trace: make('trace'),\r\n debug: make('debug'),\r\n info: make('info'),\r\n warn: make('warn'),\r\n error: make('error'),\r\n fatal: make('fatal'),\r\n };\r\n }\r\n\r\n getHistory() {\r\n return [...this.entries];\r\n }\r\n\r\n clearHistory() {\r\n this.entries.length = 0;\r\n }\r\n\r\n _normalizeLevel(level) {\r\n const normalized = typeof level === 'string' ? level.toLowerCase() : '';\r\n if (!LEVEL_INDEX.has(normalized)) {\r\n throw new Error(`Unknown log level \"${level}\"`);\r\n }\r\n return normalized;\r\n }\r\n\r\n _shouldLog(level, namespace) {\r\n const effectiveLevel = this._resolveEffectiveLevel(namespace);\r\n return LEVEL_INDEX.get(level) >= LEVEL_INDEX.get(effectiveLevel);\r\n }\r\n\r\n _resolveEffectiveLevel(namespace) {\r\n if (namespace && this.namespaceLevels?.[namespace]) {\r\n return this.namespaceLevels[namespace];\r\n }\r\n return this.minLevel;\r\n }\r\n\r\n _buildEntry(level, message, metadata, options) {\r\n const namespace = options.namespace || DEFAULT_NAMESPACE;\r\n const tags = options.tags || [];\r\n const context = options.context || null;\r\n const data = this._sanitizeMetadata(metadata);\r\n\r\n return {\r\n id: ++this.sequence,\r\n timestamp: Date.now(),\r\n service: this.name,\r\n level,\r\n namespace,\r\n message,\r\n data,\r\n tags,\r\n context,\r\n };\r\n }\r\n\r\n _sanitizeMetadata(metadata) {\r\n if (!metadata) {\r\n return null;\r\n }\r\n if (metadata instanceof Error) {\r\n return this._errorToObject(metadata);\r\n }\r\n if (typeof metadata === 'object') {\r\n const clone = { ...metadata };\r\n if (metadata.error instanceof Error) {\r\n clone.error = this._errorToObject(metadata.error);\r\n }\r\n return clone;\r\n }\r\n return { value: metadata };\r\n }\r\n\r\n _errorToObject(error) {\r\n return {\r\n name: error.name,\r\n message: error.message,\r\n stack: error.stack,\r\n };\r\n }\r\n\r\n _recordHistory(entry) {\r\n this.entries.push(entry);\r\n if (this.entries.length > this.historyLimit) {\r\n this.entries.shift();\r\n }\r\n }\r\n\r\n _emit(entry) {\r\n if (!this.eventBus) {\r\n return;\r\n }\r\n try {\r\n this.eventBus.emit('log:entry', entry);\r\n } catch (err) {\r\n this._consoleTransport({ ...entry, level: 'warn', message: `Failed to emit log entry: ${err.message}` });\r\n }\r\n }\r\n\r\n _dispatch(entry) {\r\n for (const transport of this.transports) {\r\n try {\r\n transport(entry);\r\n } catch (err) {\r\n this._consoleTransport({\r\n ...entry,\r\n level: 'warn',\r\n namespace: 'logging',\r\n message: `Logging transport failed: ${err.message}`,\r\n data: { transportError: this._errorToObject(err) },\r\n });\r\n }\r\n }\r\n }\r\n\r\n _consoleTransport(entry) {\r\n const prefix = `[${entry.service}][${entry.namespace}]`;\r\n const method = (entry.level === 'trace' || entry.level === 'debug')\r\n ? console.log // eslint-disable-line no-console\r\n : (console[entry.level] || console.log); // eslint-disable-line no-console\r\n method(`${prefix} ${entry.message}`, entry.data ?? ''); // eslint-disable-line no-console\r\n }\r\n}\r\n", "const DEFAULT_ALLOWED_ATTRIBUTES = Object.freeze([\n 'data-testid',\n 'data-field',\n 'data-descriptor-key',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-hidden',\n 'aria-expanded',\n 'aria-selected',\n 'aria-disabled',\n 'aria-checked',\n 'aria-controls',\n 'aria-haspopup',\n 'aria-live',\n 'aria-busy',\n 'role',\n 'title',\n 'data-tooltip',\n 'data-help-topic',\n]);\n\nconst DEFAULT_ALLOWED_ATTRIBUTE_PREFIXES = Object.freeze([\n]);\n\nconst DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([\n 'testid',\n 'phase',\n 'page-key',\n 'deleting',\n // Notification center\n 'notification-id',\n // Plotly.js internal attributes (third-party charting library)\n 'unformatted',\n 'toggle',\n 'notex',\n 'math',\n 'originalindex',\n 'original-index',\n 'gravity',\n 'attr',\n 'val',\n 'subplot',\n 'group',\n 'trace',\n 'point',\n 'curve-number',\n 'point-number',\n // UI state keys used by original HTML structure\n 'active-content',\n 'panel-content',\n 'collapsible-id',\n 'collapsible-default',\n 'collapsible-header',\n 'collapsible-content',\n 'collapsible-group',\n 'collapsible-exclusive',\n 'collapsible-float',\n 'collapsible-fill',\n 'tool',\n 'tab',\n 'role',\n 'op',\n 'func-name',\n 'func-expr',\n 'arity',\n 'tooltip',\n 'latex-tooltip',\n 'node-type',\n 'node-name',\n 'lang',\n 'playback-control',\n // Simulation/scenario state keys\n 'status',\n 'scenario-id',\n 'run-id',\n 'run-state',\n 'selected',\n 'active',\n 'disabled',\n 'expanded',\n 'collapsed',\n 'visible',\n 'hidden',\n // Node/canvas state keys\n 'node-id',\n 'connector-id',\n 'connector-type',\n 'connection-id',\n 'input-index',\n 'output-index',\n 'port-index',\n // Scenario editor keys\n 'source',\n 'series-id',\n 'dataset-id',\n 'mirror-input-bound',\n 'mirror-change-bound',\n 'mirror-input',\n 'bound',\n 'field',\n 'key',\n 'namespace',\n 'namespace-id',\n 'tab-id',\n 'param-id',\n 'target-id',\n 'override-type',\n // Tree view component keys\n 'item-id',\n 'category-id',\n // Calibration page keys\n 'info-for',\n 'column',\n // Data page keys\n 'readonly',\n 'id',\n 'action',\n 'type',\n 'name',\n 'path',\n 'index',\n 'count',\n 'total',\n 'page',\n 'sort',\n 'order',\n 'filter',\n 'search',\n 'value',\n 'label',\n 'title',\n 'description',\n // DSL generator keys\n 'dsl-state',\n 'dsl-section-registered',\n 'dsl-scrollbars-installed',\n 'dsl-tabs-bound',\n 'dsl-controls-bound',\n // Inline highlighter keys\n 'inline-hl',\n // Overlay scrollbar keys (UI-only, not state storage)\n 'scrollable',\n 'scrollable-x',\n 'scrollable-y',\n // ManagedWindow component keys\n 'window-id',\n // Help system keys\n 'help-topic',\n // FlexDesk widgets: every literal data key written under src/ is listed\n // here (tests/state_guard_defaults.test.mjs scans for them), so the\n // shell, dialogs, forms, tooltips and editors pass a strict guard.\n 'accent',\n 'act',\n 'action-idx',\n 'action-value',\n 'add',\n 'category',\n 'code',\n 'data',\n 'direction',\n 'dismiss',\n 'entry',\n 'error',\n 'extra',\n 'flow',\n 'from',\n 'gap',\n 'group-id',\n 'item',\n 'kind',\n 'lane',\n 'leaf-id',\n 'level',\n 'list-action',\n 'match',\n 'mode',\n 'node',\n 'note-id',\n 'notification-summary',\n 'open',\n 'pager',\n 'pane',\n 'pane-id',\n 'parameter',\n 'placeholder',\n 'placement',\n 'port',\n 'record-key',\n 'ref',\n 'refusal',\n 'refusal-for',\n 'renameable',\n 'row-key',\n 'rule',\n 'scope',\n 'shape',\n 'slot',\n 'slot-idx',\n 'split-id',\n 'state',\n 'step',\n 'syntax',\n 'tile-id',\n 'tile-type',\n 'tip',\n 'to',\n 'tone',\n 'tooltip-max-width',\n 'tooltip-placement',\n 'twm-flow-item',\n 'twm-flow-title',\n 'twm-icon',\n 'twm-required',\n 'twm-tabs',\n 'twm-tail',\n 'verb',\n]);\n\nexport const DEFAULT_STATE_GUARD_CONFIG = Object.freeze({\n mode: 'warn',\n allowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n allowedAttributePrefixes: DEFAULT_ALLOWED_ATTRIBUTE_PREFIXES,\n allowedDatasetKeys: DEFAULT_ALLOWED_DATASET_KEYS,\n // FlexDesk ships no module overrides: which of YOUR modules may write which\n // keys is yours to say, through `moduleOverrides` or `allow()`.\n moduleOverrides: Object.freeze([]),\n // null: a write is attributed to the frame that made it. A RegExp (or a\n // literal string) picks the first frame from there up whose location\n // matches instead; its first capture group, if any, names the module.\n moduleFramePattern: null,\n});\n\nexport function normalizeStateGuardConfig(config = {}) {\n if (!config || typeof config !== 'object') {\n return { ...DEFAULT_STATE_GUARD_CONFIG };\n }\n return {\n mode: normalizeMode(config.mode ?? DEFAULT_STATE_GUARD_CONFIG.mode),\n allowedAttributes: normalizeStringList(\n config.allowedAttributes ?? DEFAULT_STATE_GUARD_CONFIG.allowedAttributes,\n ),\n allowedAttributePrefixes: normalizeStringList(\n config.allowedAttributePrefixes ?? DEFAULT_STATE_GUARD_CONFIG.allowedAttributePrefixes,\n ),\n allowedDatasetKeys: normalizeStringList(\n config.allowedDatasetKeys ?? DEFAULT_STATE_GUARD_CONFIG.allowedDatasetKeys,\n ),\n moduleOverrides: normalizeOverrides(\n config.moduleOverrides ?? DEFAULT_STATE_GUARD_CONFIG.moduleOverrides,\n ),\n moduleFramePattern: config.moduleFramePattern == null || config.moduleFramePattern === ''\n ? DEFAULT_STATE_GUARD_CONFIG.moduleFramePattern\n : patternToRegExp(config.moduleFramePattern),\n };\n}\n\nfunction normalizeMode(mode) {\n const normalized = typeof mode === 'string' ? mode.toLowerCase() : '';\n return normalized === 'off' || normalized === 'warn' || normalized === 'strict'\n ? normalized\n : DEFAULT_STATE_GUARD_CONFIG.mode;\n}\n\nfunction normalizeStringList(value) {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value\n .map((entry) => (typeof entry === 'string' ? entry.trim() : ''))\n .filter(Boolean);\n }\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction normalizeOverrides(overrides) {\n if (!Array.isArray(overrides)) {\n return [];\n }\n return overrides\n .map((entry) => normalizeOverride(entry))\n .filter(Boolean);\n}\n\nfunction normalizeOverride(entry) {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n if (!entry.pattern) {\n return null;\n }\n const attributes = normalizeStringList(entry.attributes);\n const datasetKeys = normalizeStringList(entry.datasetKeys);\n const prefixes = normalizeStringList(entry.attributePrefixes);\n if (!attributes.length && !datasetKeys.length && !prefixes.length) {\n return null;\n }\n return {\n pattern: patternToRegExp(entry.pattern),\n attributes,\n datasetKeys,\n attributePrefixes: prefixes,\n };\n}\n\nfunction patternToRegExp(pattern) {\n if (pattern instanceof RegExp) {\n return pattern;\n }\n const source = String(pattern ?? '')\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(source);\n}\n", "/**\r\n * StateGuardService\r\n * ------------------\r\n * Runtime enforcement layer that blocks storing application state inside DOM attributes.\r\n * Hooks Element attribute/dataset APIs and emits violations through the event bus.\r\n */\r\n\r\nimport { DEFAULT_STATE_GUARD_CONFIG, normalizeStateGuardConfig } from './state_guard_config.js';\r\n\r\nconst HOOK_REGISTRY = {\r\n installed: false,\r\n service: null,\r\n originals: {\r\n setAttribute: null,\r\n removeAttribute: null,\r\n getAttribute: null,\r\n },\r\n datasetDescriptor: null,\r\n datasetProxyCache: new WeakMap(),\r\n};\r\n\r\nconst STACK_CACHE_LIMIT = 500;\r\n/** `url:line:col` at the end of a frame, in V8 (`at fn (url:1:2)`) and in Firefox/WebKit (`fn@url:1:2`). */\r\nconst FRAME_LOCATION = /(?:\\(|@|\\bat\\s+)([^()\\s@][^()\\s]*?):\\d+(?::\\d+)?\\)?\\s*$/;\r\nconst DATA_ATTRIBUTE_PREFIX = 'data-';\r\n/** Set by the DOM hooks below: one hook frame sits between the writer and handle*Mutation. */\r\nconst VIA_DOM_HOOK = Symbol('state-guard:via-dom-hook');\r\nconst EVENT_CHANNELS = Object.freeze({\r\n READY: 'state-guard:ready',\r\n VIOLATION: 'state-guard:violation',\r\n MODE_CHANGED: 'state-guard:mode-changed',\r\n});\r\n\r\nexport class StateGuardService {\r\n constructor({\r\n eventBus = null,\r\n logger = null,\r\n config = DEFAULT_STATE_GUARD_CONFIG,\r\n } = {}) {\r\n this.eventBus = eventBus;\r\n this.logger = logger;\r\n this.enabled = true;\r\n this.bypassDepth = 0;\r\n this.config = normalizeStateGuardConfig(config);\r\n this.mode = this.config.mode;\r\n this.allowedAttributes = new Set(this.config.allowedAttributes.map((attr) => attr.toLowerCase()));\r\n this.allowedAttributePrefixes = this.config.allowedAttributePrefixes.map((attr) => attr.toLowerCase());\r\n this.allowedDatasetKeys = new Set(this.config.allowedDatasetKeys.map(normalizeDatasetKey));\r\n this.moduleOverrides = (this.config.moduleOverrides ?? []).map((entry) => ({\r\n pattern: entry.pattern,\r\n attributes: new Set(entry.attributes.map((attr) => attr.toLowerCase())),\r\n datasetKeys: new Set(entry.datasetKeys.map(normalizeDatasetKey)),\r\n attributePrefixes: entry.attributePrefixes.map((prefix) => prefix.toLowerCase()),\r\n }));\r\n this.moduleFramePattern = this.config.moduleFramePattern;\r\n this.stackCache = new Map();\r\n this.#installHooks();\r\n }\r\n\r\n setMode(mode) {\r\n const normalized = typeof mode === 'string' ? mode.toLowerCase() : '';\r\n if (!['off', 'warn', 'strict'].includes(normalized)) {\r\n throw new Error(`Invalid state guard mode \"${mode}\"`);\r\n }\r\n if (this.mode === normalized) {\r\n return this.mode;\r\n }\r\n this.mode = normalized;\r\n this.eventBus?.emit?.(EVENT_CHANNELS.MODE_CHANGED, {\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n });\r\n return this.mode;\r\n }\r\n\r\n getMode() {\r\n return this.mode;\r\n }\r\n\r\n allow(modulePattern, attributes = [], { datasetKeys = [], attributePrefixes = [] } = {}) {\r\n const pattern = modulePattern instanceof RegExp\r\n ? modulePattern\r\n : new RegExp(String(modulePattern ?? '').replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\r\n const entry = {\r\n pattern,\r\n attributes: new Set(attributes.map((attr) => String(attr).toLowerCase())),\r\n datasetKeys: new Set(datasetKeys.map(normalizeDatasetKey)),\r\n attributePrefixes: attributePrefixes.map((prefix) => String(prefix).toLowerCase()),\r\n };\r\n this.moduleOverrides.push(entry);\r\n return () => {\r\n const idx = this.moduleOverrides.indexOf(entry);\r\n if (idx >= 0) {\r\n this.moduleOverrides.splice(idx, 1);\r\n }\r\n };\r\n }\r\n\r\n executeWithBypass(label, fn) {\r\n if (typeof fn !== 'function') {\r\n throw new TypeError('executeWithBypass requires a function');\r\n }\r\n try {\r\n this.bypassDepth += 1;\r\n return fn();\r\n } finally {\r\n this.bypassDepth = Math.max(0, this.bypassDepth - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Execute an async function with state guard bypass.\r\n * The bypass remains active for the entire duration of the async operation.\r\n * @param {string} label - Label for debugging\r\n * @param {Function} fn - Async function to execute\r\n * @returns {Promise<*>} Result of the function\r\n */\r\n async executeWithBypassAsync(label, fn) {\r\n if (typeof fn !== 'function') {\r\n throw new TypeError('executeWithBypassAsync requires a function');\r\n }\r\n try {\r\n this.bypassDepth += 1;\r\n return await fn();\r\n } finally {\r\n this.bypassDepth = Math.max(0, this.bypassDepth - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Check one attribute write. The write is attributed to the caller of this\r\n * method, or to the caller of the patched DOM API when it came through one.\r\n */\r\n handleAttributeMutation(element, action, attribute, value, options = {}) {\r\n const attrName = this.#normalizeAttribute(attribute);\r\n if (!this.#shouldGuard(attrName)) {\r\n return;\r\n }\r\n this.#evaluateMutation({\r\n action,\r\n attribute: attrName,\r\n element,\r\n value,\r\n source: 'attribute',\r\n stack: new Error().stack,\r\n writerFrame: options?.[VIA_DOM_HOOK] ? 2 : 1,\r\n });\r\n }\r\n\r\n handleDatasetMutation(element, key, value, { deleting = false, [VIA_DOM_HOOK]: viaHook = false } = {}) {\r\n const attrName = datasetKeyToAttribute(key);\r\n if (!this.#shouldGuard(attrName)) {\r\n return;\r\n }\r\n this.#evaluateMutation({\r\n stack: new Error().stack,\r\n writerFrame: viaHook ? 2 : 1,\r\n action: deleting ? 'dataset:delete' : 'dataset:set',\r\n attribute: attrName,\r\n element,\r\n value,\r\n source: 'dataset',\r\n });\r\n }\r\n\r\n #installHooks() {\r\n if (typeof Element === 'undefined' || typeof HTMLElement === 'undefined') {\r\n this.enabled = false;\r\n this.logger?.warn?.('state-guard', 'DOM environment unavailable; guard disabled');\r\n return;\r\n }\r\n installDomHooks(this);\r\n this.eventBus?.emit?.(EVENT_CHANNELS.READY, {\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n #shouldGuard(attribute) {\r\n if (!this.enabled) {\r\n return false;\r\n }\r\n if (this.mode === 'off') {\r\n return false;\r\n }\r\n if (this.bypassDepth > 0) {\r\n return false;\r\n }\r\n if (!attribute || !attribute.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n return false;\r\n }\r\n if (this.allowedAttributes.has(attribute)) {\r\n return false;\r\n }\r\n if (attribute.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n const datasetKey = attribute.slice(DATA_ATTRIBUTE_PREFIX.length);\r\n if (this.allowedDatasetKeys.has(datasetKey)) {\r\n return false;\r\n }\r\n }\r\n if (this.allowedAttributePrefixes.some((prefix) => attribute.startsWith(prefix))) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n #evaluateMutation({ action, attribute, element, value, source, stack, writerFrame }) {\r\n const moduleKey = this.#resolveModuleFromStack(stack, writerFrame);\r\n if (this.#isAllowedForModule(moduleKey, attribute)) {\r\n return;\r\n }\r\n const payload = {\r\n attribute,\r\n action,\r\n source,\r\n module: moduleKey,\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n };\r\n this.logger?.warn?.('state-guard', 'Blocked DOM state mutation', {\r\n ...payload,\r\n valuePreview: this.#previewValue(value),\r\n });\r\n this.eventBus?.emit?.(EVENT_CHANNELS.VIOLATION, payload);\r\n if (this.mode === 'strict') {\r\n const label = moduleKey ? `${moduleKey}` : 'unknown module';\r\n throw new Error(`StateGuard blocked ${action} on \"${attribute}\" from ${label}`);\r\n }\r\n }\r\n\r\n #isAllowedForModule(moduleKey, attribute) {\r\n if (!moduleKey || !this.moduleOverrides.length) {\r\n return false;\r\n }\r\n const lowerAttr = attribute.toLowerCase();\r\n for (const entry of this.moduleOverrides) {\r\n if (!entry.pattern.test(moduleKey)) {\r\n continue;\r\n }\r\n if (entry.attributes.has(lowerAttr)) {\r\n return true;\r\n }\r\n if (entry.attributePrefixes.some((prefix) => lowerAttr.startsWith(prefix))) {\r\n return true;\r\n }\r\n if (lowerAttr.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n const datasetKey = lowerAttr.slice(DATA_ATTRIBUTE_PREFIX.length);\r\n if (entry.datasetKeys.has(datasetKey)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n #normalizeAttribute(attribute) {\r\n if (!attribute) {\r\n return '';\r\n }\r\n return String(attribute).toLowerCase();\r\n }\r\n\r\n /**\r\n * The module a write is attributed to. `stack` was captured in a\r\n * handle*Mutation method (frame 0); `writerFrame` is the index of the frame\r\n * that made the write (1 for a direct call, 2 through a DOM hook). Without a\r\n * `moduleFramePattern` that writer's location (its URL or path, line and\r\n * column dropped) is the module. With one, the first frame from the writer\r\n * up whose location matches is used, and the module is the pattern's first\r\n * capture group, or that frame's whole location when it has none.\r\n */\r\n #resolveModuleFromStack(stack, writerFrame) {\r\n if (!stack) {\r\n return null;\r\n }\r\n const cacheKey = `${writerFrame}\\n${stack}`;\r\n if (this.stackCache.has(cacheKey)) {\r\n return this.stackCache.get(cacheKey);\r\n }\r\n const locations = [];\r\n for (const line of String(stack).split('\\n')) {\r\n const match = line.match(FRAME_LOCATION);\r\n if (match) {\r\n locations.push(match[1]);\r\n }\r\n }\r\n const callers = locations.slice(writerFrame);\r\n let modulePath = null;\r\n if (!this.moduleFramePattern) {\r\n modulePath = callers[0] ?? null;\r\n } else {\r\n for (const location of callers) {\r\n const match = location.match(this.moduleFramePattern);\r\n if (match) {\r\n modulePath = match[1] ?? location;\r\n break;\r\n }\r\n }\r\n }\r\n if (this.stackCache.size > STACK_CACHE_LIMIT) {\r\n this.stackCache.clear();\r\n }\r\n this.stackCache.set(cacheKey, modulePath);\r\n return modulePath;\r\n }\r\n\r\n #previewValue(value) {\r\n if (value === null || value === undefined) {\r\n return String(value);\r\n }\r\n if (typeof value === 'object') {\r\n return '[object]';\r\n }\r\n const str = String(value);\r\n return str.length > 50 ? `${str.slice(0, 47)}...` : str;\r\n }\r\n}\r\n\r\n/**\r\n * The attribute a dataset key writes: `fooBar` -> `data-foo-bar`, as the DOM\r\n * maps it. Empty for a key that names nothing.\r\n */\r\nfunction datasetKeyToAttribute(key) {\r\n if (!key && key !== 0) {\r\n return '';\r\n }\r\n const normalized = String(key)\r\n .replace(/([A-Z])/g, '-$1')\r\n .replace(/[^a-zA-Z0-9_-]/g, '-')\r\n .toLowerCase()\r\n .replace(/-{2,}/g, '-')\r\n .replace(/^-+/, '')\r\n .replace(/-+$/, '');\r\n if (!normalized) {\r\n return '';\r\n }\r\n return `${DATA_ATTRIBUTE_PREFIX}${normalized}`;\r\n}\r\n\r\n/**\r\n * An allow-list dataset key in the one spelling the guard compares: the\r\n * attribute's, without `data-`. `fooBar` and `foo-bar` are the same key, so an\r\n * allow-list may use either.\r\n */\r\nfunction normalizeDatasetKey(key) {\r\n return datasetKeyToAttribute(key).slice(DATA_ATTRIBUTE_PREFIX.length);\r\n}\r\n\r\nfunction installDomHooks(service) {\r\n if (HOOK_REGISTRY.installed) {\r\n HOOK_REGISTRY.service = service;\r\n return;\r\n }\r\n HOOK_REGISTRY.installed = true;\r\n HOOK_REGISTRY.service = service;\r\n\r\n const { setAttribute, removeAttribute } = Element.prototype;\r\n const nativeSetAttribute = setAttribute;\r\n const nativeRemoveAttribute = removeAttribute;\r\n\r\n HOOK_REGISTRY.originals.setAttribute = nativeSetAttribute;\r\n HOOK_REGISTRY.originals.removeAttribute = nativeRemoveAttribute;\r\n\r\n Element.prototype.setAttribute = function patchedSetAttribute(name, value) {\r\n const guard = HOOK_REGISTRY.service;\r\n guard?.handleAttributeMutation(this, 'setAttribute', name, value, { [VIA_DOM_HOOK]: true });\r\n return nativeSetAttribute.call(this, name, value);\r\n };\r\n\r\n Element.prototype.removeAttribute = function patchedRemoveAttribute(name) {\r\n const guard = HOOK_REGISTRY.service;\r\n guard?.handleAttributeMutation(this, 'removeAttribute', name, undefined, { [VIA_DOM_HOOK]: true });\r\n return nativeRemoveAttribute.call(this, name);\r\n };\r\n\r\n wrapDataset(service);\r\n}\r\n\r\nfunction wrapDataset(service) {\r\n const descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'dataset');\r\n if (!descriptor || typeof descriptor.get !== 'function') {\r\n return;\r\n }\r\n HOOK_REGISTRY.datasetDescriptor = descriptor;\r\n Object.defineProperty(HTMLElement.prototype, 'dataset', {\r\n configurable: true,\r\n enumerable: descriptor.enumerable,\r\n get: function datasetGetter() {\r\n const nativeDataset = descriptor.get.call(this);\r\n if (!nativeDataset || typeof nativeDataset !== 'object') {\r\n return nativeDataset;\r\n }\r\n const cached = HOOK_REGISTRY.datasetProxyCache.get(nativeDataset);\r\n if (cached && cached.proxy) {\r\n cached.element = this;\r\n return cached.proxy;\r\n }\r\n const proxyState = { element: this };\r\n const proxy = new Proxy(nativeDataset, {\r\n set(target, prop, value) {\r\n const guard = HOOK_REGISTRY.service;\r\n const key = typeof prop === 'string' ? prop : null;\r\n if (guard && key) {\r\n guard.handleDatasetMutation(proxyState.element, key, value, { [VIA_DOM_HOOK]: true });\r\n }\r\n return Reflect.set(target, prop, value);\r\n },\r\n deleteProperty(target, prop) {\r\n const guard = HOOK_REGISTRY.service;\r\n const key = typeof prop === 'string' ? prop : null;\r\n if (guard && key) {\r\n guard.handleDatasetMutation(proxyState.element, key, undefined, {\r\n deleting: true,\r\n [VIA_DOM_HOOK]: true,\r\n });\r\n }\r\n return Reflect.deleteProperty(target, prop);\r\n },\r\n });\r\n HOOK_REGISTRY.datasetProxyCache.set(nativeDataset, { proxy, element: this });\r\n return proxy;\r\n },\r\n });\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\r\n * Event Bus (js_new)\r\n *\r\n * Purpose\r\n * -------\r\n * Provide a deterministic, dependency-injected publish/subscribe hub for all front-end modules.\r\n *\r\n * Responsibilities\r\n * - Maintain per-event listener registries with namespace awareness.\r\n * - Support synchronous + async dispatch without DOM bridges or global singletons.\r\n * - Surface diagnostics via the shared logging service instead of ad hoc console calls.\r\n *\r\n * Source Material\r\n * - html/js/event_manager.js (core pub/sub semantics, minus DOM bridge + globals).\r\n * - html/js/debug_utils.js (event history/diagnostics requirements).\r\n *\r\n */\r\n\r\nconst PATTERN_TOKEN_RE = /[.*+?^${}()|[\\]\\\\]/g;\r\nconst HAS_WILDCARD_RE = /[\\*\\?]/;\r\n\r\nexport class EventBus {\r\n constructor({ logger, historyLimit = 200 } = {}) {\r\n this.logger = logger;\r\n this.historyLimit = historyLimit;\r\n this.sequence = 0;\r\n this.listeners = new Map(); // event -> Set<entry>\r\n this.wildcardListeners = new Map(); // id -> entry (regex based)\r\n this.listenerIndex = new Map(); // id -> entry\r\n this.eventHistory = [];\r\n }\r\n\r\n on(eventName, handler, options = {}) {\r\n if (typeof eventName !== 'string' || !eventName.trim()) {\r\n throw new TypeError('eventName must be a non-empty string');\r\n }\r\n if (typeof handler !== 'function') {\r\n throw new TypeError('handler must be a function');\r\n }\r\n\r\n const entry = {\r\n id: ++this.sequence,\r\n eventName,\r\n handler,\r\n namespace: options.namespace ?? null,\r\n once: Boolean(options.once),\r\n priority: options.priority ?? 0,\r\n regex: null,\r\n abortCleanup: null,\r\n };\r\n\r\n if (HAS_WILDCARD_RE.test(eventName)) {\r\n entry.regex = this._compilePattern(eventName);\r\n this.wildcardListeners.set(entry.id, entry);\r\n } else {\r\n if (!this.listeners.has(eventName)) {\r\n this.listeners.set(eventName, new Set());\r\n }\r\n this.listeners.get(eventName).add(entry);\r\n }\r\n\r\n const useAbortSignal = typeof AbortSignal !== 'undefined' && options.signal instanceof AbortSignal;\r\n if (useAbortSignal) {\r\n if (options.signal.aborted) {\r\n // Immediately unsubscribe if already aborted.\r\n return { dispose: () => {}, id: entry.id };\r\n }\r\n const abortFn = () => this.off(entry.id);\r\n options.signal.addEventListener('abort', abortFn, { once: true });\r\n entry.abortCleanup = () => options.signal.removeEventListener('abort', abortFn);\r\n }\r\n\r\n this.listenerIndex.set(entry.id, entry);\r\n return {\r\n id: entry.id,\r\n dispose: () => this.off(entry.id),\r\n };\r\n }\r\n\r\n once(eventName, handler, options = {}) {\r\n return this.on(eventName, handler, { ...options, once: true });\r\n }\r\n\r\n off(target) {\r\n const id = typeof target === 'number' ? target : target?.id;\r\n if (!this.listenerIndex.has(id)) {\r\n return false;\r\n }\r\n const entry = this.listenerIndex.get(id);\r\n this.listenerIndex.delete(id);\r\n\r\n if (entry.abortCleanup) {\r\n try {\r\n entry.abortCleanup();\r\n } catch (err) {\r\n this.logger?.warn?.('event-bus', 'Abort cleanup failed', err);\r\n }\r\n }\r\n\r\n if (entry.regex) {\r\n this.wildcardListeners.delete(entry.id);\r\n } else {\r\n const bucket = this.listeners.get(entry.eventName);\r\n if (bucket) {\r\n bucket.delete(entry);\r\n if (bucket.size === 0) {\r\n this.listeners.delete(entry.eventName);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n emit(eventName, payload = undefined, options = {}) {\r\n const context = this._createContext(eventName, options);\r\n const listeners = this._collectListeners(eventName, context.namespace);\r\n this._recordHistory(eventName, context.namespace, listeners.length);\r\n return this._invokeListeners(listeners, payload, context);\r\n }\r\n\r\n emitAsync(eventName, payload = undefined, options = {}) {\r\n const context = this._createContext(eventName, options);\r\n const listeners = this._collectListeners(eventName, context.namespace);\r\n this._recordHistory(eventName, context.namespace, listeners.length);\r\n return Promise.resolve().then(() => this._invokeListeners(listeners, payload, context));\r\n }\r\n\r\n listenerCount(eventName) {\r\n const direct = this.listeners.get(eventName)?.size ?? 0;\r\n const wildcard = [...this.wildcardListeners.values()].filter((entry) => entry.regex.test(eventName)).length;\r\n return direct + wildcard;\r\n }\r\n\r\n getHistory() {\r\n return [...this.eventHistory];\r\n }\r\n\r\n clearHistory() {\r\n this.eventHistory.length = 0;\r\n }\r\n\r\n reset() {\r\n this.listeners.clear();\r\n this.wildcardListeners.clear();\r\n this.listenerIndex.clear();\r\n this.eventHistory.length = 0;\r\n }\r\n\r\n _collectListeners(eventName, namespace) {\r\n const matches = [];\r\n const bucket = this.listeners.get(eventName);\r\n if (bucket) {\r\n matches.push(...bucket);\r\n }\r\n\r\n for (const entry of this.wildcardListeners.values()) {\r\n if (entry.regex.test(eventName)) {\r\n matches.push(entry);\r\n }\r\n }\r\n\r\n return matches\r\n .filter((entry) => !entry.namespace || entry.namespace === namespace)\r\n .sort((a, b) => {\r\n if (a.priority === b.priority) {\r\n return a.id - b.id;\r\n }\r\n return b.priority - a.priority;\r\n });\r\n }\r\n\r\n _invokeListeners(listeners, payload, context) {\r\n const results = [];\r\n context.stopPropagation = () => {\r\n context.__stopped = true;\r\n };\r\n\r\n for (const entry of listeners) {\r\n if (context.__stopped) {\r\n break;\r\n }\r\n try {\r\n const result = entry.handler(payload, context);\r\n results.push(result);\r\n if (entry.once) {\r\n this.off(entry.id);\r\n }\r\n } catch (err) {\r\n this._handleListenerError(entry, context, err);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n _createContext(eventName, options) {\r\n return {\r\n event: eventName,\r\n namespace: options.namespace ?? null,\r\n timestamp: Date.now(),\r\n stopPropagation: () => {},\r\n };\r\n }\r\n\r\n _recordHistory(eventName, namespace, listenerCount) {\r\n this.eventHistory.push({\r\n event: eventName,\r\n namespace,\r\n timestamp: Date.now(),\r\n listeners: listenerCount,\r\n });\r\n if (this.eventHistory.length > this.historyLimit) {\r\n this.eventHistory.shift();\r\n }\r\n }\r\n\r\n _handleListenerError(entry, context, error) {\r\n this.logger?.error?.('event-bus', 'Listener error', {\r\n event: context.event,\r\n namespace: context.namespace,\r\n listenerId: entry.id,\r\n error,\r\n });\r\n }\r\n\r\n _compilePattern(pattern) {\r\n const escaped = pattern.replace(PATTERN_TOKEN_RE, '\\\\$&');\r\n const regexSource = `^${escaped.replace(/\\\\\\*/g, '.*').replace(/\\\\\\?/g, '.')}$`;\r\n return new RegExp(regexSource);\r\n }\r\n}\r\n", "/**\r\n * Logging + Telemetry Hub (js_new)\r\n *\r\n * Purpose\r\n * -------\r\n * Single sink for structured logs, metrics, and telemetry forwarding from all modules.\r\n *\r\n * Responsibilities\r\n * - Normalize log payloads (level, namespace, metadata) before dispatching to host.\r\n * - Publish `log:*` events for in-app diagnostics dashboards.\r\n * - Replace scattered console/notify usage with a deterministic API.\r\n *\r\n * Source Material\r\n * - html/js/logger.js (log formatting + transports).\r\n * - html/js/debug_utils.js (runtime diagnostics + indicators).\r\n *\r\n */\r\n\r\nconst LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\r\nconst LEVEL_INDEX = new Map(LEVELS.map((level, idx) => [level, idx]));\r\n\r\nconst DEFAULT_NAMESPACE = 'app';\r\n\r\n// Quiet mode level - only warn and above during simulation\r\nconst QUIET_MODE_LEVEL = 'warn';\r\n\r\nexport class LoggingService {\r\n constructor({\r\n name = 'flexdesk',\r\n eventBus = null,\r\n minLevel = 'info',\r\n historyLimit = 500,\r\n transports = [],\r\n enableConsole = false,\r\n namespaceLevels = null,\r\n } = {}) {\r\n this.name = name;\r\n this.eventBus = eventBus;\r\n this.historyLimit = historyLimit;\r\n this.entries = [];\r\n this.sequence = 0;\r\n this.transports = new Set();\r\n this.namespaceLevels = { ...(namespaceLevels || {}) };\r\n this._quietMode = false;\r\n this._savedLevel = null;\r\n this.setLevel(minLevel);\r\n\r\n transports.forEach((transport) => this.addTransport(transport));\r\n if (enableConsole) {\r\n this.addTransport(this._consoleTransport.bind(this));\r\n }\r\n }\r\n\r\n setLevel(level) {\r\n const normalized = this._normalizeLevel(level);\r\n this.minLevel = normalized;\r\n }\r\n\r\n getLevel() {\r\n return this.minLevel;\r\n }\r\n\r\n /**\r\n * Enter quiet mode - suppresses DEBUG/INFO logs during simulation.\r\n * Only WARNING and above are logged.\r\n */\r\n enterQuietMode() {\r\n if (this._quietMode) return;\r\n this._quietMode = true;\r\n this._savedLevel = this.minLevel;\r\n if (LEVEL_INDEX.get(this.minLevel) < LEVEL_INDEX.get(QUIET_MODE_LEVEL)) {\r\n this.minLevel = QUIET_MODE_LEVEL;\r\n }\r\n }\r\n\r\n /**\r\n * Exit quiet mode - restores previous log level.\r\n */\r\n exitQuietMode() {\r\n if (!this._quietMode) return;\r\n this._quietMode = false;\r\n if (this._savedLevel !== null) {\r\n this.minLevel = this._savedLevel;\r\n this._savedLevel = null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if quiet mode is active.\r\n */\r\n isQuietMode() {\r\n return this._quietMode;\r\n }\r\n\r\n setNamespaceLevel(namespace, level) {\r\n if (!namespace) return;\r\n this.namespaceLevels[namespace] = this._normalizeLevel(level);\r\n }\r\n\r\n setNamespaceLevels(map) {\r\n if (!map || typeof map !== 'object') return;\r\n Object.entries(map).forEach(([ns, lvl]) => {\r\n if (ns) {\r\n this.namespaceLevels[ns] = this._normalizeLevel(lvl);\r\n }\r\n });\r\n }\r\n\r\n getNamespaceLevel(namespace) {\r\n if (!namespace) return undefined;\r\n return this.namespaceLevels[namespace];\r\n }\r\n\r\n addTransport(transport) {\r\n if (typeof transport !== 'function') {\r\n throw new TypeError('Logging transport must be a function');\r\n }\r\n this.transports.add(transport);\r\n }\r\n\r\n removeTransport(transport) {\r\n this.transports.delete(transport);\r\n }\r\n\r\n log(level, message, metadata = null, options = {}) {\r\n const normalizedLevel = this._normalizeLevel(level);\r\n const namespace = options.namespace || DEFAULT_NAMESPACE;\r\n if (!this._shouldLog(normalizedLevel, namespace)) {\r\n return null;\r\n }\r\n\r\n const entry = this._buildEntry(normalizedLevel, message, metadata, options);\r\n this._recordHistory(entry);\r\n this._emit(entry);\r\n this._dispatch(entry);\r\n return entry;\r\n }\r\n\r\n trace(message, metadata, options) {\r\n return this.log('trace', message, metadata, options);\r\n }\r\n\r\n debug(message, metadata, options) {\r\n return this.log('debug', message, metadata, options);\r\n }\r\n\r\n info(message, metadata, options) {\r\n return this.log('info', message, metadata, options);\r\n }\r\n\r\n warn(message, metadata, options) {\r\n return this.log('warn', message, metadata, options);\r\n }\r\n\r\n error(message, metadata, options) {\r\n return this.log('error', message, metadata, options);\r\n }\r\n\r\n fatal(message, metadata, options) {\r\n return this.log('fatal', message, metadata, options);\r\n }\r\n\r\n scoped(namespace) {\r\n const ns = namespace || DEFAULT_NAMESPACE;\r\n // Codebase convention: callers pass (subcategory, message, meta?) where\r\n // subcategory is a short kebab-case tag and message is the human-readable\r\n // string. Detect this pattern (two leading string args) and use the second\r\n // string as the log message, discarding the subcategory (the scoped\r\n // namespace already provides sufficient context).\r\n // Also supports the standard (message, meta?) single-string form.\r\n const make = (level) => (first, second, third) => {\r\n if (typeof second === 'string') {\r\n return this.log(level, second, third ?? null, { namespace: ns });\r\n }\r\n return this.log(level, first, second ?? null, { namespace: ns });\r\n };\r\n return {\r\n trace: make('trace'),\r\n debug: make('debug'),\r\n info: make('info'),\r\n warn: make('warn'),\r\n error: make('error'),\r\n fatal: make('fatal'),\r\n };\r\n }\r\n\r\n getHistory() {\r\n return [...this.entries];\r\n }\r\n\r\n clearHistory() {\r\n this.entries.length = 0;\r\n }\r\n\r\n _normalizeLevel(level) {\r\n const normalized = typeof level === 'string' ? level.toLowerCase() : '';\r\n if (!LEVEL_INDEX.has(normalized)) {\r\n throw new Error(`Unknown log level \"${level}\"`);\r\n }\r\n return normalized;\r\n }\r\n\r\n _shouldLog(level, namespace) {\r\n const effectiveLevel = this._resolveEffectiveLevel(namespace);\r\n return LEVEL_INDEX.get(level) >= LEVEL_INDEX.get(effectiveLevel);\r\n }\r\n\r\n _resolveEffectiveLevel(namespace) {\r\n if (namespace && this.namespaceLevels?.[namespace]) {\r\n return this.namespaceLevels[namespace];\r\n }\r\n return this.minLevel;\r\n }\r\n\r\n _buildEntry(level, message, metadata, options) {\r\n const namespace = options.namespace || DEFAULT_NAMESPACE;\r\n const tags = options.tags || [];\r\n const context = options.context || null;\r\n const data = this._sanitizeMetadata(metadata);\r\n\r\n return {\r\n id: ++this.sequence,\r\n timestamp: Date.now(),\r\n service: this.name,\r\n level,\r\n namespace,\r\n message,\r\n data,\r\n tags,\r\n context,\r\n };\r\n }\r\n\r\n _sanitizeMetadata(metadata) {\r\n if (!metadata) {\r\n return null;\r\n }\r\n if (metadata instanceof Error) {\r\n return this._errorToObject(metadata);\r\n }\r\n if (typeof metadata === 'object') {\r\n const clone = { ...metadata };\r\n if (metadata.error instanceof Error) {\r\n clone.error = this._errorToObject(metadata.error);\r\n }\r\n return clone;\r\n }\r\n return { value: metadata };\r\n }\r\n\r\n _errorToObject(error) {\r\n return {\r\n name: error.name,\r\n message: error.message,\r\n stack: error.stack,\r\n };\r\n }\r\n\r\n _recordHistory(entry) {\r\n this.entries.push(entry);\r\n if (this.entries.length > this.historyLimit) {\r\n this.entries.shift();\r\n }\r\n }\r\n\r\n _emit(entry) {\r\n if (!this.eventBus) {\r\n return;\r\n }\r\n try {\r\n this.eventBus.emit('log:entry', entry);\r\n } catch (err) {\r\n this._consoleTransport({ ...entry, level: 'warn', message: `Failed to emit log entry: ${err.message}` });\r\n }\r\n }\r\n\r\n _dispatch(entry) {\r\n for (const transport of this.transports) {\r\n try {\r\n transport(entry);\r\n } catch (err) {\r\n this._consoleTransport({\r\n ...entry,\r\n level: 'warn',\r\n namespace: 'logging',\r\n message: `Logging transport failed: ${err.message}`,\r\n data: { transportError: this._errorToObject(err) },\r\n });\r\n }\r\n }\r\n }\r\n\r\n _consoleTransport(entry) {\r\n const prefix = `[${entry.service}][${entry.namespace}]`;\r\n const method = (entry.level === 'trace' || entry.level === 'debug')\r\n ? console.log // eslint-disable-line no-console\r\n : (console[entry.level] || console.log); // eslint-disable-line no-console\r\n method(`${prefix} ${entry.message}`, entry.data ?? ''); // eslint-disable-line no-console\r\n }\r\n}\r\n", "const DEFAULT_ALLOWED_ATTRIBUTES = Object.freeze([\n 'data-testid',\n 'data-field',\n 'data-descriptor-key',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-hidden',\n 'aria-expanded',\n 'aria-selected',\n 'aria-disabled',\n 'aria-checked',\n 'aria-controls',\n 'aria-haspopup',\n 'aria-live',\n 'aria-busy',\n 'role',\n 'title',\n 'data-tooltip',\n 'data-help-topic',\n]);\n\nconst DEFAULT_ALLOWED_ATTRIBUTE_PREFIXES = Object.freeze([\n]);\n\n// What belongs here: the keys FlexDesk's own widgets write (the last group,\n// which tests/state_guard_defaults.test.mjs keeps complete by scanning src/),\n// the third-party attributes Plotly sets, and generic UI words. What does not:\n// one application's own keys. Whether `data-order-id` is a legitimate write is\n// that application's call, and it says so by adding the key (see\n// docs/concepts/state-guard.md). A key listed here for one embedder's sake that\n// no widget writes is a key every OTHER embedder's strict guard lets through\n// without a word, which is the one thing a strict guard is there to stop.\n//\n// The list does not yet meet that, and it has not been audited key by key:\n// many keys no widget writes are still here, some of them carried over from one\n// application's markup (series-id, dataset-id, func-name and connector-id are\n// examples). Thirteen that name one application's concepts were taken out. The\n// test pins nine of the rest as still allowed, so dropping one is a deliberate\n// edit, and the docs tell an embedder that a strict guard built from the\n// defaults lets a write of such a key through. Do not add another like them.\nconst DEFAULT_ALLOWED_DATASET_KEYS = Object.freeze([\n 'testid',\n 'phase',\n 'page-key',\n 'deleting',\n // Notification center\n 'notification-id',\n // Plotly.js internal attributes (third-party charting library)\n 'unformatted',\n 'toggle',\n 'notex',\n 'math',\n 'originalindex',\n 'original-index',\n 'gravity',\n 'attr',\n 'val',\n 'subplot',\n 'group',\n 'trace',\n 'point',\n 'curve-number',\n 'point-number',\n // UI state keys used by original HTML structure\n 'active-content',\n 'panel-content',\n 'collapsible-id',\n 'collapsible-default',\n 'collapsible-header',\n 'collapsible-content',\n 'collapsible-group',\n 'collapsible-exclusive',\n 'collapsible-float',\n 'collapsible-fill',\n 'tool',\n 'tab',\n 'role',\n 'op',\n 'func-name',\n 'func-expr',\n 'arity',\n 'tooltip',\n 'latex-tooltip',\n 'node-type',\n 'node-name',\n 'lang',\n 'playback-control',\n // Generic state words\n 'status',\n 'selected',\n 'active',\n 'disabled',\n 'expanded',\n 'collapsed',\n 'visible',\n 'hidden',\n // Node/canvas state keys\n 'node-id',\n 'connector-id',\n 'connector-type',\n 'connection-id',\n 'input-index',\n 'output-index',\n 'port-index',\n // Identifier and binding keys\n 'source',\n 'series-id',\n 'dataset-id',\n 'bound',\n 'field',\n 'key',\n 'namespace',\n 'namespace-id',\n 'tab-id',\n 'param-id',\n 'target-id',\n // Tree view component keys\n 'item-id',\n 'category-id',\n // Data page keys\n 'column',\n 'readonly',\n 'id',\n 'action',\n 'type',\n 'name',\n 'path',\n 'index',\n 'count',\n 'total',\n 'page',\n 'sort',\n 'order',\n 'filter',\n 'search',\n 'value',\n 'label',\n 'title',\n 'description',\n // Inline highlighter keys\n 'inline-hl',\n // Overlay scrollbar keys (UI-only, not state storage)\n 'scrollable',\n 'scrollable-x',\n 'scrollable-y',\n // ManagedWindow component keys\n 'window-id',\n // Help system keys\n 'help-topic',\n // FlexDesk widgets: every literal data key written under src/ is listed\n // here (tests/state_guard_defaults.test.mjs scans for them), so the\n // shell, dialogs, forms, tooltips and editors pass a strict guard.\n 'accent',\n 'act',\n 'action-idx',\n 'action-value',\n 'add',\n 'category',\n 'code',\n 'data',\n 'direction',\n 'dismiss',\n 'entry',\n 'error',\n 'extra',\n 'flow',\n 'from',\n 'gap',\n 'group-id',\n 'item',\n 'kind',\n 'lane',\n 'leaf-id',\n 'level',\n 'list-action',\n 'match',\n 'mode',\n 'node',\n 'note-id',\n 'notification-summary',\n 'open',\n 'pager',\n 'pane',\n 'pane-id',\n 'parameter',\n 'placeholder',\n 'placement',\n 'port',\n 'record-key',\n 'ref',\n 'refusal',\n 'refusal-for',\n 'renameable',\n 'row-key',\n 'rule',\n 'scope',\n 'shape',\n 'slot',\n 'slot-idx',\n 'split-id',\n 'state',\n 'step',\n 'syntax',\n 'tile-id',\n 'tile-type',\n 'tip',\n 'to',\n 'tone',\n 'tooltip-max-width',\n 'tooltip-placement',\n 'twm-flow-item',\n 'twm-flow-title',\n 'twm-icon',\n 'twm-required',\n 'twm-tabs',\n 'twm-tail',\n 'verb',\n]);\n\nexport const DEFAULT_STATE_GUARD_CONFIG = Object.freeze({\n mode: 'warn',\n allowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n allowedAttributePrefixes: DEFAULT_ALLOWED_ATTRIBUTE_PREFIXES,\n allowedDatasetKeys: DEFAULT_ALLOWED_DATASET_KEYS,\n // FlexDesk ships no module overrides: which of YOUR modules may write which\n // keys is yours to say, through `moduleOverrides` or `allow()`.\n moduleOverrides: Object.freeze([]),\n // null: a write is attributed to the frame that made it. A RegExp (or a\n // literal string) picks the first frame from there up whose location\n // matches instead; its first capture group, if any, names the module.\n moduleFramePattern: null,\n});\n\nexport function normalizeStateGuardConfig(config = {}) {\n if (!config || typeof config !== 'object') {\n return { ...DEFAULT_STATE_GUARD_CONFIG };\n }\n return {\n mode: normalizeMode(config.mode ?? DEFAULT_STATE_GUARD_CONFIG.mode),\n allowedAttributes: normalizeStringList(\n config.allowedAttributes ?? DEFAULT_STATE_GUARD_CONFIG.allowedAttributes,\n ),\n allowedAttributePrefixes: normalizeStringList(\n config.allowedAttributePrefixes ?? DEFAULT_STATE_GUARD_CONFIG.allowedAttributePrefixes,\n ),\n allowedDatasetKeys: normalizeStringList(\n config.allowedDatasetKeys ?? DEFAULT_STATE_GUARD_CONFIG.allowedDatasetKeys,\n ),\n moduleOverrides: normalizeOverrides(\n config.moduleOverrides ?? DEFAULT_STATE_GUARD_CONFIG.moduleOverrides,\n ),\n moduleFramePattern: config.moduleFramePattern == null || config.moduleFramePattern === ''\n ? DEFAULT_STATE_GUARD_CONFIG.moduleFramePattern\n : patternToRegExp(config.moduleFramePattern),\n };\n}\n\nfunction normalizeMode(mode) {\n const normalized = typeof mode === 'string' ? mode.toLowerCase() : '';\n return normalized === 'off' || normalized === 'warn' || normalized === 'strict'\n ? normalized\n : DEFAULT_STATE_GUARD_CONFIG.mode;\n}\n\nfunction normalizeStringList(value) {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value\n .map((entry) => (typeof entry === 'string' ? entry.trim() : ''))\n .filter(Boolean);\n }\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction normalizeOverrides(overrides) {\n if (!Array.isArray(overrides)) {\n return [];\n }\n return overrides\n .map((entry) => normalizeOverride(entry))\n .filter(Boolean);\n}\n\nfunction normalizeOverride(entry) {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n if (!entry.pattern) {\n return null;\n }\n const attributes = normalizeStringList(entry.attributes);\n const datasetKeys = normalizeStringList(entry.datasetKeys);\n const prefixes = normalizeStringList(entry.attributePrefixes);\n if (!attributes.length && !datasetKeys.length && !prefixes.length) {\n return null;\n }\n return {\n pattern: patternToRegExp(entry.pattern),\n attributes,\n datasetKeys,\n attributePrefixes: prefixes,\n };\n}\n\nfunction patternToRegExp(pattern) {\n if (pattern instanceof RegExp) {\n return pattern;\n }\n const source = String(pattern ?? '')\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(source);\n}\n", "/**\r\n * StateGuardService\r\n * ------------------\r\n * Runtime enforcement layer that blocks storing application state inside DOM attributes.\r\n * Hooks Element attribute/dataset APIs and emits violations through the event bus.\r\n */\r\n\r\nimport { DEFAULT_STATE_GUARD_CONFIG, normalizeStateGuardConfig } from './state_guard_config.js';\r\n\r\nconst HOOK_REGISTRY = {\r\n installed: false,\r\n service: null,\r\n originals: {\r\n setAttribute: null,\r\n removeAttribute: null,\r\n getAttribute: null,\r\n },\r\n datasetDescriptor: null,\r\n datasetProxyCache: new WeakMap(),\r\n};\r\n\r\nconst STACK_CACHE_LIMIT = 500;\r\n/** `url:line:col` at the end of a frame, in V8 (`at fn (url:1:2)`) and in Firefox/WebKit (`fn@url:1:2`). */\r\nconst FRAME_LOCATION = /(?:\\(|@|\\bat\\s+)([^()\\s@][^()\\s]*?):\\d+(?::\\d+)?\\)?\\s*$/;\r\nconst DATA_ATTRIBUTE_PREFIX = 'data-';\r\n/** Set by the DOM hooks below: one hook frame sits between the writer and handle*Mutation. */\r\nconst VIA_DOM_HOOK = Symbol('state-guard:via-dom-hook');\r\nconst EVENT_CHANNELS = Object.freeze({\r\n READY: 'state-guard:ready',\r\n VIOLATION: 'state-guard:violation',\r\n MODE_CHANGED: 'state-guard:mode-changed',\r\n});\r\n\r\nexport class StateGuardService {\r\n constructor({\r\n eventBus = null,\r\n logger = null,\r\n config = DEFAULT_STATE_GUARD_CONFIG,\r\n } = {}) {\r\n this.eventBus = eventBus;\r\n this.logger = logger;\r\n this.enabled = true;\r\n this.bypassDepth = 0;\r\n this.config = normalizeStateGuardConfig(config);\r\n this.mode = this.config.mode;\r\n this.allowedAttributes = new Set(this.config.allowedAttributes.map((attr) => attr.toLowerCase()));\r\n this.allowedAttributePrefixes = this.config.allowedAttributePrefixes.map((attr) => attr.toLowerCase());\r\n this.allowedDatasetKeys = new Set(this.config.allowedDatasetKeys.map(normalizeDatasetKey));\r\n this.moduleOverrides = (this.config.moduleOverrides ?? []).map((entry) => ({\r\n pattern: entry.pattern,\r\n attributes: new Set(entry.attributes.map((attr) => attr.toLowerCase())),\r\n datasetKeys: new Set(entry.datasetKeys.map(normalizeDatasetKey)),\r\n attributePrefixes: entry.attributePrefixes.map((prefix) => prefix.toLowerCase()),\r\n }));\r\n this.moduleFramePattern = this.config.moduleFramePattern;\r\n this.stackCache = new Map();\r\n this.#installHooks();\r\n }\r\n\r\n setMode(mode) {\r\n const normalized = typeof mode === 'string' ? mode.toLowerCase() : '';\r\n if (!['off', 'warn', 'strict'].includes(normalized)) {\r\n throw new Error(`Invalid state guard mode \"${mode}\"`);\r\n }\r\n if (this.mode === normalized) {\r\n return this.mode;\r\n }\r\n this.mode = normalized;\r\n this.eventBus?.emit?.(EVENT_CHANNELS.MODE_CHANGED, {\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n });\r\n return this.mode;\r\n }\r\n\r\n getMode() {\r\n return this.mode;\r\n }\r\n\r\n allow(modulePattern, attributes = [], { datasetKeys = [], attributePrefixes = [] } = {}) {\r\n const pattern = modulePattern instanceof RegExp\r\n ? modulePattern\r\n : new RegExp(String(modulePattern ?? '').replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\r\n const entry = {\r\n pattern,\r\n attributes: new Set(attributes.map((attr) => String(attr).toLowerCase())),\r\n datasetKeys: new Set(datasetKeys.map(normalizeDatasetKey)),\r\n attributePrefixes: attributePrefixes.map((prefix) => String(prefix).toLowerCase()),\r\n };\r\n this.moduleOverrides.push(entry);\r\n return () => {\r\n const idx = this.moduleOverrides.indexOf(entry);\r\n if (idx >= 0) {\r\n this.moduleOverrides.splice(idx, 1);\r\n }\r\n };\r\n }\r\n\r\n executeWithBypass(label, fn) {\r\n if (typeof fn !== 'function') {\r\n throw new TypeError('executeWithBypass requires a function');\r\n }\r\n try {\r\n this.bypassDepth += 1;\r\n return fn();\r\n } finally {\r\n this.bypassDepth = Math.max(0, this.bypassDepth - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Execute an async function with state guard bypass.\r\n * The bypass remains active for the entire duration of the async operation.\r\n * @param {string} label - Label for debugging\r\n * @param {Function} fn - Async function to execute\r\n * @returns {Promise<*>} Result of the function\r\n */\r\n async executeWithBypassAsync(label, fn) {\r\n if (typeof fn !== 'function') {\r\n throw new TypeError('executeWithBypassAsync requires a function');\r\n }\r\n try {\r\n this.bypassDepth += 1;\r\n return await fn();\r\n } finally {\r\n this.bypassDepth = Math.max(0, this.bypassDepth - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Check one attribute write. The write is attributed to the caller of this\r\n * method, or to the caller of the patched DOM API when it came through one.\r\n */\r\n handleAttributeMutation(element, action, attribute, value, options = {}) {\r\n const attrName = this.#normalizeAttribute(attribute);\r\n if (!this.#shouldGuard(attrName)) {\r\n return;\r\n }\r\n this.#evaluateMutation({\r\n action,\r\n attribute: attrName,\r\n element,\r\n value,\r\n source: 'attribute',\r\n stack: new Error().stack,\r\n writerFrame: options?.[VIA_DOM_HOOK] ? 2 : 1,\r\n });\r\n }\r\n\r\n handleDatasetMutation(element, key, value, { deleting = false, [VIA_DOM_HOOK]: viaHook = false } = {}) {\r\n const attrName = datasetKeyToAttribute(key);\r\n if (!this.#shouldGuard(attrName)) {\r\n return;\r\n }\r\n this.#evaluateMutation({\r\n stack: new Error().stack,\r\n writerFrame: viaHook ? 2 : 1,\r\n action: deleting ? 'dataset:delete' : 'dataset:set',\r\n attribute: attrName,\r\n element,\r\n value,\r\n source: 'dataset',\r\n });\r\n }\r\n\r\n #installHooks() {\r\n if (typeof Element === 'undefined' || typeof HTMLElement === 'undefined') {\r\n this.enabled = false;\r\n this.logger?.warn?.('state-guard', 'DOM environment unavailable; guard disabled');\r\n return;\r\n }\r\n installDomHooks(this);\r\n this.eventBus?.emit?.(EVENT_CHANNELS.READY, {\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n #shouldGuard(attribute) {\r\n if (!this.enabled) {\r\n return false;\r\n }\r\n if (this.mode === 'off') {\r\n return false;\r\n }\r\n if (this.bypassDepth > 0) {\r\n return false;\r\n }\r\n if (!attribute || !attribute.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n return false;\r\n }\r\n if (this.allowedAttributes.has(attribute)) {\r\n return false;\r\n }\r\n if (attribute.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n const datasetKey = attribute.slice(DATA_ATTRIBUTE_PREFIX.length);\r\n if (this.allowedDatasetKeys.has(datasetKey)) {\r\n return false;\r\n }\r\n }\r\n if (this.allowedAttributePrefixes.some((prefix) => attribute.startsWith(prefix))) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n #evaluateMutation({ action, attribute, element, value, source, stack, writerFrame }) {\r\n const moduleKey = this.#resolveModuleFromStack(stack, writerFrame);\r\n if (this.#isAllowedForModule(moduleKey, attribute)) {\r\n return;\r\n }\r\n const payload = {\r\n attribute,\r\n action,\r\n source,\r\n module: moduleKey,\r\n mode: this.mode,\r\n timestamp: Date.now(),\r\n };\r\n this.logger?.warn?.('state-guard', 'Blocked DOM state mutation', {\r\n ...payload,\r\n valuePreview: this.#previewValue(value),\r\n });\r\n this.eventBus?.emit?.(EVENT_CHANNELS.VIOLATION, payload);\r\n if (this.mode === 'strict') {\r\n const label = moduleKey ? `${moduleKey}` : 'unknown module';\r\n throw new Error(`StateGuard blocked ${action} on \"${attribute}\" from ${label}`);\r\n }\r\n }\r\n\r\n #isAllowedForModule(moduleKey, attribute) {\r\n if (!moduleKey || !this.moduleOverrides.length) {\r\n return false;\r\n }\r\n const lowerAttr = attribute.toLowerCase();\r\n for (const entry of this.moduleOverrides) {\r\n if (!entry.pattern.test(moduleKey)) {\r\n continue;\r\n }\r\n if (entry.attributes.has(lowerAttr)) {\r\n return true;\r\n }\r\n if (entry.attributePrefixes.some((prefix) => lowerAttr.startsWith(prefix))) {\r\n return true;\r\n }\r\n if (lowerAttr.startsWith(DATA_ATTRIBUTE_PREFIX)) {\r\n const datasetKey = lowerAttr.slice(DATA_ATTRIBUTE_PREFIX.length);\r\n if (entry.datasetKeys.has(datasetKey)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n #normalizeAttribute(attribute) {\r\n if (!attribute) {\r\n return '';\r\n }\r\n return String(attribute).toLowerCase();\r\n }\r\n\r\n /**\r\n * The module a write is attributed to. `stack` was captured in a\r\n * handle*Mutation method (frame 0); `writerFrame` is the index of the frame\r\n * that made the write (1 for a direct call, 2 through a DOM hook). Without a\r\n * `moduleFramePattern` that writer's location (its URL or path, line and\r\n * column dropped) is the module. With one, the first frame from the writer\r\n * up whose location matches is used, and the module is the pattern's first\r\n * capture group, or that frame's whole location when it has none.\r\n */\r\n #resolveModuleFromStack(stack, writerFrame) {\r\n if (!stack) {\r\n return null;\r\n }\r\n const cacheKey = `${writerFrame}\\n${stack}`;\r\n if (this.stackCache.has(cacheKey)) {\r\n return this.stackCache.get(cacheKey);\r\n }\r\n const locations = [];\r\n for (const line of String(stack).split('\\n')) {\r\n const match = line.match(FRAME_LOCATION);\r\n if (match) {\r\n locations.push(match[1]);\r\n }\r\n }\r\n const callers = locations.slice(writerFrame);\r\n let modulePath = null;\r\n if (!this.moduleFramePattern) {\r\n modulePath = callers[0] ?? null;\r\n } else {\r\n for (const location of callers) {\r\n const match = location.match(this.moduleFramePattern);\r\n if (match) {\r\n modulePath = match[1] ?? location;\r\n break;\r\n }\r\n }\r\n }\r\n if (this.stackCache.size > STACK_CACHE_LIMIT) {\r\n this.stackCache.clear();\r\n }\r\n this.stackCache.set(cacheKey, modulePath);\r\n return modulePath;\r\n }\r\n\r\n #previewValue(value) {\r\n if (value === null || value === undefined) {\r\n return String(value);\r\n }\r\n if (typeof value === 'object') {\r\n return '[object]';\r\n }\r\n const str = String(value);\r\n return str.length > 50 ? `${str.slice(0, 47)}...` : str;\r\n }\r\n}\r\n\r\n/**\r\n * The attribute a dataset key writes: `fooBar` -> `data-foo-bar`, as the DOM\r\n * maps it. Empty for a key that names nothing.\r\n */\r\nfunction datasetKeyToAttribute(key) {\r\n if (!key && key !== 0) {\r\n return '';\r\n }\r\n const normalized = String(key)\r\n .replace(/([A-Z])/g, '-$1')\r\n .replace(/[^a-zA-Z0-9_-]/g, '-')\r\n .toLowerCase()\r\n .replace(/-{2,}/g, '-')\r\n .replace(/^-+/, '')\r\n .replace(/-+$/, '');\r\n if (!normalized) {\r\n return '';\r\n }\r\n return `${DATA_ATTRIBUTE_PREFIX}${normalized}`;\r\n}\r\n\r\n/**\r\n * An allow-list dataset key in the one spelling the guard compares: the\r\n * attribute's, without `data-`. `fooBar` and `foo-bar` are the same key, so an\r\n * allow-list may use either.\r\n */\r\nfunction normalizeDatasetKey(key) {\r\n return datasetKeyToAttribute(key).slice(DATA_ATTRIBUTE_PREFIX.length);\r\n}\r\n\r\nfunction installDomHooks(service) {\r\n if (HOOK_REGISTRY.installed) {\r\n HOOK_REGISTRY.service = service;\r\n return;\r\n }\r\n HOOK_REGISTRY.installed = true;\r\n HOOK_REGISTRY.service = service;\r\n\r\n const { setAttribute, removeAttribute } = Element.prototype;\r\n const nativeSetAttribute = setAttribute;\r\n const nativeRemoveAttribute = removeAttribute;\r\n\r\n HOOK_REGISTRY.originals.setAttribute = nativeSetAttribute;\r\n HOOK_REGISTRY.originals.removeAttribute = nativeRemoveAttribute;\r\n\r\n Element.prototype.setAttribute = function patchedSetAttribute(name, value) {\r\n const guard = HOOK_REGISTRY.service;\r\n guard?.handleAttributeMutation(this, 'setAttribute', name, value, { [VIA_DOM_HOOK]: true });\r\n return nativeSetAttribute.call(this, name, value);\r\n };\r\n\r\n Element.prototype.removeAttribute = function patchedRemoveAttribute(name) {\r\n const guard = HOOK_REGISTRY.service;\r\n guard?.handleAttributeMutation(this, 'removeAttribute', name, undefined, { [VIA_DOM_HOOK]: true });\r\n return nativeRemoveAttribute.call(this, name);\r\n };\r\n\r\n wrapDataset(service);\r\n}\r\n\r\nfunction wrapDataset(service) {\r\n const descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'dataset');\r\n if (!descriptor || typeof descriptor.get !== 'function') {\r\n return;\r\n }\r\n HOOK_REGISTRY.datasetDescriptor = descriptor;\r\n Object.defineProperty(HTMLElement.prototype, 'dataset', {\r\n configurable: true,\r\n enumerable: descriptor.enumerable,\r\n get: function datasetGetter() {\r\n const nativeDataset = descriptor.get.call(this);\r\n if (!nativeDataset || typeof nativeDataset !== 'object') {\r\n return nativeDataset;\r\n }\r\n const cached = HOOK_REGISTRY.datasetProxyCache.get(nativeDataset);\r\n if (cached && cached.proxy) {\r\n cached.element = this;\r\n return cached.proxy;\r\n }\r\n const proxyState = { element: this };\r\n const proxy = new Proxy(nativeDataset, {\r\n set(target, prop, value) {\r\n const guard = HOOK_REGISTRY.service;\r\n const key = typeof prop === 'string' ? prop : null;\r\n if (guard && key) {\r\n guard.handleDatasetMutation(proxyState.element, key, value, { [VIA_DOM_HOOK]: true });\r\n }\r\n return Reflect.set(target, prop, value);\r\n },\r\n deleteProperty(target, prop) {\r\n const guard = HOOK_REGISTRY.service;\r\n const key = typeof prop === 'string' ? prop : null;\r\n if (guard && key) {\r\n guard.handleDatasetMutation(proxyState.element, key, undefined, {\r\n deleting: true,\r\n [VIA_DOM_HOOK]: true,\r\n });\r\n }\r\n return Reflect.deleteProperty(target, prop);\r\n },\r\n });\r\n HOOK_REGISTRY.datasetProxyCache.set(nativeDataset, { proxy, element: this });\r\n return proxy;\r\n },\r\n });\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/editor.js.map
CHANGED
|
File without changes
|
package/dist/flexdesk.css
CHANGED
|
@@ -1695,6 +1695,28 @@ body.twm-dt-col-resizing {
|
|
|
1695
1695
|
.twm-global-top-bar, .twm-global-top-bar .twm-bar-left, .twm-global-top-bar .twm-bar-center, .twm-global-top-bar .twm-bar-right {
|
|
1696
1696
|
min-width: 0; /* allow flex children to shrink */
|
|
1697
1697
|
}
|
|
1698
|
+
/* Global menu row (STORY-0119, 0.17.13): a shell's `chrome.menuBar` in a
|
|
1699
|
+
* full-width strip of its own, directly under .twm-global-top-bar in
|
|
1700
|
+
* body.twm-body's column (host.css), so the host below shrinks by its height.
|
|
1701
|
+
* It is a sibling of the top bar, not inside it: a window-drag region bound
|
|
1702
|
+
* to the top bar does not include it. No z-index, so it is no stacking
|
|
1703
|
+
* context: the top bar's dropdowns draw over it, and the .twm-menubar inside
|
|
1704
|
+
* keeps its own styles, its menus (position: fixed, --z-over-windows) drawing
|
|
1705
|
+
* over the page. It reads as a band of its own (STORY-0122, 0.17.14): darker
|
|
1706
|
+
* than the top bar, with a border above and below. Its height is the bar's
|
|
1707
|
+
* plus the padding and the two borders. */
|
|
1708
|
+
.twm-global-menu-bar {
|
|
1709
|
+
display: flex;
|
|
1710
|
+
align-items: center;
|
|
1711
|
+
width: 100%;
|
|
1712
|
+
box-sizing: border-box;
|
|
1713
|
+
padding: var(--space-xxs) var(--space-xs);
|
|
1714
|
+
background-color: var(--surface-0);
|
|
1715
|
+
color: var(--text-body);
|
|
1716
|
+
border-top: 1px solid var(--border-strong);
|
|
1717
|
+
border-bottom: 1px solid var(--border-strong);
|
|
1718
|
+
overflow: visible; /* the bar's menus extend below */
|
|
1719
|
+
}
|
|
1698
1720
|
.twm-bar-center {
|
|
1699
1721
|
white-space: nowrap;
|
|
1700
1722
|
overflow: hidden;
|
|
@@ -2942,6 +2964,28 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
2942
2964
|
color: var(--text-dim);
|
|
2943
2965
|
margin-left: var(--space-xs);
|
|
2944
2966
|
}
|
|
2967
|
+
/* Row actions (createTreeItem's `actions`, STORY-0121): one line at the row's
|
|
2968
|
+
* end, after label, subtitle and badge, shown on hover, on focus within and on
|
|
2969
|
+
* the selected item. Hidden by opacity, not display, so the buttons stay in
|
|
2970
|
+
* the tab order (Tab reaches them and :focus-within shows them) and the label
|
|
2971
|
+
* keeps its width on hover. The slot is no taller than the label line, so a
|
|
2972
|
+
* row is as high with actions as without. */
|
|
2973
|
+
.twm-tree-item__actions {
|
|
2974
|
+
display: flex;
|
|
2975
|
+
align-items: center;
|
|
2976
|
+
gap: var(--space-xxs);
|
|
2977
|
+
flex-shrink: 0;
|
|
2978
|
+
height: 0;
|
|
2979
|
+
overflow: visible;
|
|
2980
|
+
opacity: 0;
|
|
2981
|
+
pointer-events: none;
|
|
2982
|
+
}
|
|
2983
|
+
.twm-tree-item:hover > .twm-tree-item__actions,
|
|
2984
|
+
.twm-tree-item:focus-within > .twm-tree-item__actions,
|
|
2985
|
+
.twm-tree-item.selected > .twm-tree-item__actions {
|
|
2986
|
+
opacity: 1;
|
|
2987
|
+
pointer-events: auto;
|
|
2988
|
+
}
|
|
2945
2989
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2946
2990
|
Plot Popout Window
|
|
2947
2991
|
═══════════════════════════════════════════════════════════════════════════ */
|
|
@@ -3319,6 +3363,18 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
3319
3363
|
border-radius: 50%;
|
|
3320
3364
|
animation: computing-spin 0.8s linear infinite;
|
|
3321
3365
|
}
|
|
3366
|
+
/* The keyframes the rule above names. A spinner rule shipped with the animation
|
|
3367
|
+
name and without the `@keyframes` block, which CSS does not report: an
|
|
3368
|
+
undefined name is simply no animation, so the ring was drawn and never
|
|
3369
|
+
turned, and nothing threw, logged or failed a build. `@keyframes` names are
|
|
3370
|
+
global, so this one is not scoped (see `spin`): an embedder that defines
|
|
3371
|
+
its own `computing-spin` wins or loses on source order, and either way the
|
|
3372
|
+
ring turns. A full turn at the rule's own duration, linear and infinite, so
|
|
3373
|
+
the loop has no seam: the arc is back where it started. */
|
|
3374
|
+
@keyframes computing-spin {
|
|
3375
|
+
from { transform: rotate(0deg); }
|
|
3376
|
+
to { transform: rotate(360deg); }
|
|
3377
|
+
}
|
|
3322
3378
|
.twm-computing-status__message {
|
|
3323
3379
|
font-size: var(--font-size-md);
|
|
3324
3380
|
color: #b0b0b0;
|
|
@@ -3364,6 +3420,11 @@ body.twm-window-maximized .twm-resize-handle {
|
|
|
3364
3420
|
flex-shrink: 0;
|
|
3365
3421
|
animation: etl-spin 0.8s linear infinite;
|
|
3366
3422
|
}
|
|
3423
|
+
/* The keyframes the rule above names; see `computing-spin`. */
|
|
3424
|
+
@keyframes etl-spin {
|
|
3425
|
+
from { transform: rotate(0deg); }
|
|
3426
|
+
to { transform: rotate(360deg); }
|
|
3427
|
+
}
|
|
3367
3428
|
.twm-run-progress__message {
|
|
3368
3429
|
font-size: var(--font-size-md);
|
|
3369
3430
|
color: var(--text-primary, #ccc);
|
|
@@ -8528,8 +8589,9 @@ body.twm-dragging * { user-select: none; }
|
|
|
8528
8589
|
* the WM host fills the remaining space.
|
|
8529
8590
|
*/
|
|
8530
8591
|
|
|
8531
|
-
/* Body is a flex column: top bar,
|
|
8532
|
-
* override the legacy `position: fixed` on both
|
|
8592
|
+
/* Body is a flex column: top bar, menu row (when there is one), WM host
|
|
8593
|
+
* (fill), bottom bar. We override the legacy `position: fixed` on both
|
|
8594
|
+
* bars so they become
|
|
8533
8595
|
* deterministic flex items and the host's height is exactly the
|
|
8534
8596
|
* leftover space — no math, no overlap, no off-by-N pixels. Their
|
|
8535
8597
|
* `z-index` stays put for dropdown stacking. */
|
|
@@ -8547,6 +8609,12 @@ body.twm-body > .twm-global-bottom-bar {
|
|
|
8547
8609
|
inset: auto !important;
|
|
8548
8610
|
flex: 0 0 auto;
|
|
8549
8611
|
}
|
|
8612
|
+
/* The menu row (STORY-0119) sits between the top bar and the host, in
|
|
8613
|
+
* normal flow: a fixed-size strip, so the host's leftover space is less by
|
|
8614
|
+
* exactly its height. */
|
|
8615
|
+
body.twm-body > .twm-global-menu-bar {
|
|
8616
|
+
flex: 0 0 auto;
|
|
8617
|
+
}
|
|
8550
8618
|
body.twm-body > .twm-host {
|
|
8551
8619
|
flex: 1 1 auto;
|
|
8552
8620
|
min-height: 0;
|
|
@@ -8842,6 +8910,16 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
8842
8910
|
border-radius: 50%;
|
|
8843
8911
|
animation: data-table__spin 0.7s linear infinite;
|
|
8844
8912
|
}
|
|
8913
|
+
/* The keyframes the rule above names. Without them the name is no animation
|
|
8914
|
+
(CSS reports nothing for it), so the ring was drawn and stood still. A full
|
|
8915
|
+
turn at the rule's own 0.7s linear infinite. `@keyframes` names are global
|
|
8916
|
+
and cannot be scoped (see `spin`); a definition of the same name in an
|
|
8917
|
+
embedder's sheet wins or loses on source order, and either way the ring
|
|
8918
|
+
turns. */
|
|
8919
|
+
@keyframes data-table__spin {
|
|
8920
|
+
from { transform: rotate(0deg); }
|
|
8921
|
+
to { transform: rotate(360deg); }
|
|
8922
|
+
}
|
|
8845
8923
|
.twm-data-table-component--compact .twm-pagination-controls > span {
|
|
8846
8924
|
color: var(--ea-text-dim, #aaa) !important;
|
|
8847
8925
|
font-size: 9.5px !important;
|
|
@@ -9019,6 +9097,11 @@ tr:hover .twm-row-action { opacity: 1; }
|
|
|
9019
9097
|
border-radius: 50%;
|
|
9020
9098
|
animation: twm-tile-loading-spin 0.7s linear infinite;
|
|
9021
9099
|
}
|
|
9100
|
+
/* The keyframes the rule above names; see `data-table__spin`. */
|
|
9101
|
+
@keyframes twm-tile-loading-spin {
|
|
9102
|
+
from { transform: rotate(0deg); }
|
|
9103
|
+
to { transform: rotate(360deg); }
|
|
9104
|
+
}
|
|
9022
9105
|
/* Merged home page — detail header row, then the project-setup body
|
|
9023
9106
|
* fills the rest of the tile. */
|
|
9024
9107
|
.twm-home-page {
|
package/dist/flow.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
modalHost
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZMH3OC7H.js";
|
|
4
4
|
import {
|
|
5
5
|
DataTable
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2PM6ZMNS.js";
|
|
7
7
|
import {
|
|
8
8
|
choiceList,
|
|
9
9
|
selectBox,
|
|
10
10
|
shownValue,
|
|
11
11
|
toggleChips
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-MADMGRX2.js";
|
|
13
13
|
import "./chunk-HNU6MM2B.js";
|
|
14
14
|
import "./chunk-WUFLGETN.js";
|
|
15
15
|
import {
|
package/dist/flow.js.map
CHANGED
|
File without changes
|
package/dist/host.js
CHANGED
|
File without changes
|
package/dist/host.js.map
CHANGED
|
File without changes
|
package/dist/reset.css
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/tiles.js
CHANGED
|
@@ -17,11 +17,11 @@ import {
|
|
|
17
17
|
} from "./chunk-MIW7D6WC.js";
|
|
18
18
|
import {
|
|
19
19
|
showContextMenu
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-IG74S3ZH.js";
|
|
21
21
|
import {
|
|
22
22
|
modalHost,
|
|
23
23
|
openModal
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-ZMH3OC7H.js";
|
|
25
25
|
import {
|
|
26
26
|
buildHistogramTrace,
|
|
27
27
|
buildLegendLayout,
|
|
@@ -36,11 +36,11 @@ import {
|
|
|
36
36
|
purge,
|
|
37
37
|
resize,
|
|
38
38
|
strideDownsampleShared
|
|
39
|
-
} from "./chunk-
|
|
40
|
-
import "./chunk-
|
|
39
|
+
} from "./chunk-TLIV6QSU.js";
|
|
40
|
+
import "./chunk-2PM6ZMNS.js";
|
|
41
41
|
import {
|
|
42
42
|
isHexColor
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-MADMGRX2.js";
|
|
44
44
|
import "./chunk-HNU6MM2B.js";
|
|
45
45
|
import "./chunk-WUFLGETN.js";
|
|
46
46
|
import {
|
package/dist/widgets.js
CHANGED
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
import {
|
|
27
27
|
hideContextMenu,
|
|
28
28
|
showContextMenu
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-IG74S3ZH.js";
|
|
30
30
|
import {
|
|
31
31
|
ColorListField,
|
|
32
32
|
SortableList,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
openForm,
|
|
36
36
|
openModal,
|
|
37
37
|
setModalHost
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-ZMH3OC7H.js";
|
|
39
39
|
import {
|
|
40
40
|
ACTIONS,
|
|
41
41
|
AutocompleteField,
|
|
@@ -82,7 +82,7 @@ import {
|
|
|
82
82
|
resolvePaging,
|
|
83
83
|
toTSV,
|
|
84
84
|
tsvCell
|
|
85
|
-
} from "./chunk-
|
|
85
|
+
} from "./chunk-2PM6ZMNS.js";
|
|
86
86
|
import {
|
|
87
87
|
ColorField,
|
|
88
88
|
DEFAULT_WINDOW_STORAGE_KEY,
|
|
@@ -96,7 +96,7 @@ import {
|
|
|
96
96
|
normalizeHex,
|
|
97
97
|
selectBox,
|
|
98
98
|
shownValue
|
|
99
|
-
} from "./chunk-
|
|
99
|
+
} from "./chunk-MADMGRX2.js";
|
|
100
100
|
import {
|
|
101
101
|
getSetting
|
|
102
102
|
} from "./chunk-HNU6MM2B.js";
|
|
@@ -5169,25 +5169,27 @@ function createTreeNode(options) {
|
|
|
5169
5169
|
<div class="twm-tree-node__children" style="display: ${expanded ? "block" : "none"};"></div>
|
|
5170
5170
|
`;
|
|
5171
5171
|
setText2(node, ".twm-tree-node__label", label);
|
|
5172
|
-
if (actions)
|
|
5173
|
-
const actionsEl = node.querySelector(".twm-tree-node__actions");
|
|
5174
|
-
Object.entries(actions).forEach(([actionId, actionConfig]) => {
|
|
5175
|
-
const btn = document.createElement("button");
|
|
5176
|
-
btn.className = "twm-tree-node__action-btn";
|
|
5177
|
-
btn.dataset.action = actionId;
|
|
5178
|
-
btn.title = actionConfig.title || actionId;
|
|
5179
|
-
btn.innerHTML = `<span class="material-symbols-outlined">${actionConfig.icon}</span>`;
|
|
5180
|
-
if (actionConfig.onClick) {
|
|
5181
|
-
btn.addEventListener("click", (e) => {
|
|
5182
|
-
e.stopPropagation();
|
|
5183
|
-
actionConfig.onClick(id, e);
|
|
5184
|
-
});
|
|
5185
|
-
}
|
|
5186
|
-
actionsEl.appendChild(btn);
|
|
5187
|
-
});
|
|
5188
|
-
}
|
|
5172
|
+
if (actions) appendActionButtons(node.querySelector(".twm-tree-node__actions"), id, actions);
|
|
5189
5173
|
return node;
|
|
5190
5174
|
}
|
|
5175
|
+
function appendActionButtons(actionsEl, id, actions) {
|
|
5176
|
+
Object.entries(actions).forEach(([actionId, actionConfig]) => {
|
|
5177
|
+
const btn = document.createElement("button");
|
|
5178
|
+
btn.type = "button";
|
|
5179
|
+
btn.className = "twm-tree-node__action-btn";
|
|
5180
|
+
btn.dataset.action = actionId;
|
|
5181
|
+
btn.title = actionConfig.title || actionId;
|
|
5182
|
+
btn.innerHTML = `<span class="material-symbols-outlined">${actionConfig.icon}</span>`;
|
|
5183
|
+
if (actionConfig.onClick) {
|
|
5184
|
+
btn.addEventListener("click", (e) => {
|
|
5185
|
+
e.stopPropagation();
|
|
5186
|
+
actionConfig.onClick(id, e);
|
|
5187
|
+
});
|
|
5188
|
+
btn.addEventListener("dblclick", (e) => e.stopPropagation());
|
|
5189
|
+
}
|
|
5190
|
+
actionsEl.appendChild(btn);
|
|
5191
|
+
});
|
|
5192
|
+
}
|
|
5191
5193
|
function createTreeItem(options) {
|
|
5192
5194
|
const {
|
|
5193
5195
|
id,
|
|
@@ -5198,7 +5200,8 @@ function createTreeItem(options) {
|
|
|
5198
5200
|
selected = false,
|
|
5199
5201
|
subtitle = null,
|
|
5200
5202
|
data = null,
|
|
5201
|
-
badge = null
|
|
5203
|
+
badge = null,
|
|
5204
|
+
actions = null
|
|
5202
5205
|
} = options;
|
|
5203
5206
|
const item = document.createElement("div");
|
|
5204
5207
|
item.className = `twm-tree-item${readonly ? " readonly" : ""}${selected ? " selected" : ""}`;
|
|
@@ -5228,6 +5231,12 @@ function createTreeItem(options) {
|
|
|
5228
5231
|
setText2(item, ".twm-tree-item__label", label);
|
|
5229
5232
|
if (subtitle) setText2(item, ".twm-tree-item__subtitle", subtitle);
|
|
5230
5233
|
if (badge?.text) setText2(item, ".twm-tree-item__badge", badge.text);
|
|
5234
|
+
if (actions) {
|
|
5235
|
+
const actionsEl = document.createElement("span");
|
|
5236
|
+
actionsEl.className = "twm-tree-item__actions";
|
|
5237
|
+
appendActionButtons(actionsEl, id, actions);
|
|
5238
|
+
item.appendChild(actionsEl);
|
|
5239
|
+
}
|
|
5231
5240
|
return item;
|
|
5232
5241
|
}
|
|
5233
5242
|
function toggleCategory(categoryEl, force) {
|