@hexclave/next 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clickmap/clickmap-core.d.ts +15 -0
- package/dist/clickmap/clickmap-core.d.ts.map +1 -0
- package/dist/clickmap/clickmap-core.js +1527 -0
- package/dist/clickmap/clickmap-core.js.map +1 -0
- package/dist/clickmap/clickmap-styles.d.ts +5 -0
- package/dist/clickmap/clickmap-styles.d.ts.map +1 -0
- package/dist/clickmap/clickmap-styles.js +1095 -0
- package/dist/clickmap/clickmap-styles.js.map +1 -0
- package/dist/clickmap/index.d.ts +16 -0
- package/dist/clickmap/index.d.ts.map +1 -0
- package/dist/clickmap/index.js +74 -0
- package/dist/clickmap/index.js.map +1 -0
- package/dist/components/api-key-dialogs.js +5 -5
- package/dist/components/credential-sign-in.js +3 -3
- package/dist/components/credential-sign-up.js +5 -5
- package/dist/components/elements/sidebar-layout.js +1 -1
- package/dist/components/elements/user-avatar.js +1 -1
- package/dist/components/magic-link-sign-in.js +5 -5
- package/dist/components/message-cards/known-error-message-card.d.ts +1 -1
- package/dist/components/message-cards/predefined-message-card.js +1 -1
- package/dist/components/passkey-button.js +1 -1
- package/dist/components/profile-image-editor.js +1 -1
- package/dist/components/team-icon.js +1 -1
- package/dist/components/team-switcher.js +2 -2
- package/dist/components/user-button.js +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
- package/dist/components-page/account-settings/editable-text.js +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +3 -3
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js +3 -3
- package/dist/components-page/account-settings/teams/team-api-keys-section.js +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js +3 -3
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
- package/dist/components-page/account-settings.js +3 -3
- package/dist/components-page/auth-page.js +2 -2
- package/dist/components-page/cli-auth-confirm.js +2 -2
- package/dist/components-page/cli-auth-confirm.test.js +1 -1
- package/dist/components-page/email-verification.js +1 -1
- package/dist/components-page/forgot-password.d.ts.map +1 -1
- package/dist/components-page/forgot-password.js +6 -7
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/hexclave-handler-client.d.ts +1 -1
- package/dist/components-page/hexclave-handler-client.js +2 -2
- package/dist/components-page/magic-link-callback.js +1 -1
- package/dist/components-page/mfa.js +7 -22
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.js +2 -2
- package/dist/components-page/onboarding.js +4 -4
- package/dist/components-page/password-reset.d.ts.map +1 -1
- package/dist/components-page/password-reset.js +12 -14
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/team-creation.js +5 -5
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +258 -262
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/dev-tool/dev-tool-styles.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-styles.js +13 -143
- package/dist/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/dev-tool/index.d.ts.map +1 -1
- package/dist/dev-tool/index.js +4 -11
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/esm/clickmap/clickmap-core.d.ts +15 -0
- package/dist/esm/clickmap/clickmap-core.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-core.js +1525 -0
- package/dist/esm/clickmap/clickmap-core.js.map +1 -0
- package/dist/esm/clickmap/clickmap-styles.d.ts +5 -0
- package/dist/esm/clickmap/clickmap-styles.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-styles.js +1093 -0
- package/dist/esm/clickmap/clickmap-styles.js.map +1 -0
- package/dist/esm/clickmap/index.d.ts +16 -0
- package/dist/esm/clickmap/index.d.ts.map +1 -0
- package/dist/esm/clickmap/index.js +72 -0
- package/dist/esm/clickmap/index.js.map +1 -0
- package/dist/esm/components/api-key-dialogs.js +5 -5
- package/dist/esm/components/credential-sign-in.js +3 -3
- package/dist/esm/components/credential-sign-up.js +5 -5
- package/dist/esm/components/elements/sidebar-layout.js +1 -1
- package/dist/esm/components/elements/user-avatar.js +1 -1
- package/dist/esm/components/magic-link-sign-in.js +5 -5
- package/dist/esm/components/message-cards/predefined-message-card.js +1 -1
- package/dist/esm/components/passkey-button.js +1 -1
- package/dist/esm/components/profile-image-editor.js +1 -1
- package/dist/esm/components/team-icon.js +1 -1
- package/dist/esm/components/team-switcher.js +2 -2
- package/dist/esm/components/user-button.js +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +3 -3
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +3 -3
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js +3 -3
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
- package/dist/esm/components-page/account-settings.d.ts +1 -1
- package/dist/esm/components-page/account-settings.js +3 -3
- package/dist/esm/components-page/auth-page.js +2 -2
- package/dist/esm/components-page/cli-auth-confirm.js +2 -2
- package/dist/esm/components-page/cli-auth-confirm.test.js +1 -1
- package/dist/esm/components-page/email-verification.js +1 -1
- package/dist/esm/components-page/forgot-password.d.ts.map +1 -1
- package/dist/esm/components-page/forgot-password.js +6 -7
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.d.ts +1 -1
- package/dist/esm/components-page/hexclave-handler-client.js +2 -2
- package/dist/esm/components-page/magic-link-callback.js +1 -1
- package/dist/esm/components-page/mfa.js +7 -22
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js +2 -2
- package/dist/esm/components-page/onboarding.js +4 -4
- package/dist/esm/components-page/password-reset.d.ts.map +1 -1
- package/dist/esm/components-page/password-reset.js +11 -13
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/team-creation.js +5 -5
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +35 -39
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.js +13 -143
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts.map +1 -1
- package/dist/esm/dev-tool/index.js +1 -8
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/generated/global-css.d.ts +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/in-page-ui/base-styles.d.ts +5 -0
- package/dist/esm/in-page-ui/base-styles.d.ts.map +1 -0
- package/dist/esm/in-page-ui/base-styles.js +166 -0
- package/dist/esm/in-page-ui/base-styles.js.map +1 -0
- package/dist/esm/in-page-ui/dom.d.ts +15 -0
- package/dist/esm/in-page-ui/dom.d.ts.map +1 -0
- package/dist/esm/in-page-ui/dom.js +44 -0
- package/dist/esm/in-page-ui/dom.js.map +1 -0
- package/dist/esm/lib/auth.js +2 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +6 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js +21 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +4 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts +13 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js +146 -14
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js +221 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts +5 -0
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/users/index.d.ts +1 -1
- package/dist/esm/providers/theme-provider.js +1 -1
- package/dist/esm/providers/translation-provider.js +1 -1
- package/dist/generated/global-css.d.ts +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.ts +2 -2
- package/dist/in-page-ui/base-styles.d.ts +5 -0
- package/dist/in-page-ui/base-styles.d.ts.map +1 -0
- package/dist/in-page-ui/base-styles.js +168 -0
- package/dist/in-page-ui/base-styles.js.map +1 -0
- package/dist/in-page-ui/dom.d.ts +15 -0
- package/dist/in-page-ui/dom.d.ts.map +1 -0
- package/dist/in-page-ui/dom.js +51 -0
- package/dist/in-page-ui/dom.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/integrations/convex/component/convex.config.d.ts +1 -1
- package/dist/lib/auth.js +2 -2
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +5 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js +21 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +4 -2
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts +13 -0
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js +146 -14
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js +221 -0
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +5 -0
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
- package/dist/lib/hexclave-app/common.d.ts +1 -1
- package/dist/providers/hexclave-provider-client.d.ts +1 -1
- package/dist/providers/theme-provider.js +1 -1
- package/dist/providers/translation-provider.js +1 -1
- package/dist/{storage-CKzvsBxG.d.ts → storage-ksajV_p6.d.ts} +1 -1
- package/dist/{storage-CKzvsBxG.d.ts.map → storage-ksajV_p6.d.ts.map} +1 -1
- package/package.json +4 -4
- package/src/clickmap/clickmap-core.ts +1997 -0
- package/src/clickmap/clickmap-styles.ts +1102 -0
- package/src/clickmap/index.ts +95 -0
- package/src/components-page/forgot-password.tsx +1 -2
- package/src/components-page/mfa.tsx +12 -21
- package/src/components-page/password-reset.tsx +4 -6
- package/src/dev-tool/dev-tool-core.ts +38 -65
- package/src/dev-tool/dev-tool-styles.ts +13 -142
- package/src/dev-tool/index.ts +1 -14
- package/src/in-page-ui/base-styles.ts +171 -0
- package/src/in-page-ui/dom.ts +80 -0
- package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +23 -1
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +7 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +287 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +226 -16
- package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-tool-core.js","names":[],"sources":["../../../src/dev-tool/dev-tool-core.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport type { RequestLogEntry } from \"@hexclave/shared/dist/interface/client-interface\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { isLocalhost } from \"@hexclave/shared/dist/utils/urls\";\nimport type { StackClientApp } from \"../lib/hexclave-app\";\nimport { envVars } from \"../generated/env\";\nimport { getBaseUrl } from \"../lib/hexclave-app/apps/implementations/common\";\nimport type { HandlerUrlOptions, HandlerUrls, HandlerUrlTarget } from \"../lib/hexclave-app/common\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app/common\";\nimport { getPagePrompt } from \"../lib/hexclave-app/url-targets\";\nimport { devToolCSS } from \"./dev-tool-styles\";\nimport type { TriggerCorner, TriggerPlacement } from \"./dev-tool-trigger-position\";\nimport { clampTriggerPosition, getSnappedTriggerPlacement, resolveTriggerPosition } from \"./dev-tool-trigger-position\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TabId = 'overview' | 'customize' | 'ai' | 'dashboard' | 'console' | 'support';\n\ntype TabResult = { element: HTMLElement, cleanup?: () => void };\n\ntype ApiLogEntry = {\n id: string;\n timestamp: number;\n method: string;\n url: string;\n status?: number;\n duration?: number;\n error?: string;\n};\n\ntype EventLogEntry = {\n id: string;\n timestamp: number;\n type: 'error' | 'info';\n message: string;\n};\n\ntype DevToolState = {\n isOpen: boolean;\n activeTab: TabId;\n panelWidth: number;\n panelHeight: number;\n};\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n// Hexclave rebrand: UI-only local prefs — straight rename (one-time reset is harmless)\nconst STORAGE_KEY = '__hexclave-dev-tool-state';\nconst TRIGGER_POS_KEY = 'hexclave-devtool-trigger-position';\nconst ROOT_ID = '__hexclave-dev-tool-root';\nconst GLOBAL_INSTANCE_KEY = '__hexclave-dev-tool-instance';\nconst MAX_LOG_ENTRIES = 500;\nconst CONSOLE_LOG_BATCH_SIZE = 100;\nconst DRAG_THRESHOLD = 5;\nconst DOCS_URL = 'https://docs.hexclave.com';\n\nconst TABS: { id: TabId; label: string; icon: string }[] = [\n { id: 'overview', label: 'Overview', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></svg>' },\n { id: 'customize', label: 'Customize', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/></svg>' },\n { id: 'ai', label: 'AI', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>' },\n { id: 'console', label: 'Console', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 17 10 11 4 5\"/><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"/></svg>' },\n { id: 'dashboard', label: 'Dashboard', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M9 21V9\"/></svg>' },\n { id: 'support', label: 'Support', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>' },\n];\n\nconst DEFAULT_STATE: DevToolState = {\n isOpen: false,\n activeTab: 'overview',\n panelWidth: 800,\n panelHeight: 520,\n};\n\n// Hexclave mark — hexagon outline with three radial bars, monochrome via currentColor\n// so it inherits the trigger logo's color. Sourced from apps/dashboard/public/hexclave-icon.svg\n// (gradient + glow stripped; this is a tiny trigger glyph, not the full brand mark).\nconst HEXCLAVE_LOGO_SVG = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linejoin=\"miter\"><path d=\"M 24 4 L 41.32 14 L 41.32 34 L 24 44 L 6.68 34 L 6.68 14 Z\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(120 24 24)\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(240 24 24)\"/></svg>';\n\n// ---------------------------------------------------------------------------\n// State management\n// ---------------------------------------------------------------------------\n\nfunction loadState(): DevToolState {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n // Migrate old 'components' tab name to 'customize'\n if (parsed.activeTab === 'components') parsed.activeTab = 'customize';\n if (parsed.activeTab === 'docs') parsed.activeTab = 'overview';\n return { ...DEFAULT_STATE, ...parsed, isOpen: false };\n }\n } catch {}\n return { ...DEFAULT_STATE };\n}\n\nfunction saveState(state: DevToolState) {\n try {\n // Keep layout preferences across pages, but do not reopen the panel automatically on remount.\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...state, isOpen: false }));\n } catch {}\n}\n\nfunction createStateStore() {\n let state = loadState();\n const listeners = new Set<() => void>();\n\n return {\n get: () => state,\n update(partial: Partial<DevToolState>) {\n state = { ...state, ...partial };\n saveState(state);\n listeners.forEach((fn) => fn());\n },\n subscribe(fn: () => void) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Global log store (survives remounts, shared across instances)\n// ---------------------------------------------------------------------------\n\ntype LogStore = {\n apiLogs: ApiLogEntry[];\n eventLogs: EventLogEntry[];\n listeners: Set<() => void>;\n addApiLog(entry: ApiLogEntry): void;\n addEventLog(entry: EventLogEntry): void;\n clear(): void;\n subscribe(fn: () => void): () => void;\n};\n\ntype DevToolGlobalInstance = {\n cleanup: () => void;\n};\n\nfunction isDevToolGlobalInstance(value: unknown): value is DevToolGlobalInstance {\n return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'cleanup') === 'function';\n}\n\nfunction getGlobalDevToolInstance(): DevToolGlobalInstance | null {\n if (typeof window === 'undefined') return null;\n const value: unknown = Reflect.get(window, GLOBAL_INSTANCE_KEY);\n return isDevToolGlobalInstance(value) ? value : null;\n}\n\nfunction setGlobalDevToolInstance(instance: DevToolGlobalInstance | null) {\n if (typeof window === 'undefined') return;\n if (instance === null) {\n Reflect.deleteProperty(window, GLOBAL_INSTANCE_KEY);\n } else {\n Reflect.set(window, GLOBAL_INSTANCE_KEY, instance);\n }\n}\n\nfunction getGlobalLogStore(): LogStore {\n const g = globalThis as any;\n if (!g.__STACK_DEV_TOOL_LOG_STORE__) {\n g.__STACK_DEV_TOOL_LOG_STORE__ = {\n apiLogs: [] as ApiLogEntry[],\n eventLogs: [] as EventLogEntry[],\n listeners: new Set<() => void>(),\n addApiLog(entry: ApiLogEntry) {\n this.apiLogs = [entry, ...this.apiLogs].slice(0, MAX_LOG_ENTRIES);\n this.listeners.forEach((fn: () => void) => fn());\n },\n addEventLog(entry: EventLogEntry) {\n this.eventLogs = [entry, ...this.eventLogs].slice(0, MAX_LOG_ENTRIES);\n this.listeners.forEach((fn: () => void) => fn());\n },\n clear() {\n this.apiLogs = [];\n this.eventLogs = [];\n this.listeners.forEach((fn: () => void) => fn());\n },\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n },\n };\n }\n return g.__STACK_DEV_TOOL_LOG_STORE__;\n}\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\nlet _idCounter = 0;\nfunction nextId() {\n return `sdt-${++_idCounter}-${Date.now()}`;\n}\n\nfunction resolveApiBaseUrl(app: StackClientApp<true>): string {\n const opts = app[hexclaveAppInternalsSymbol].getConstructorOptions();\n return getBaseUrl(opts.baseUrl);\n}\n\nfunction shouldShowDashboardTab(app: StackClientApp<true>): boolean {\n return envVars.HEXCLAVE_IS_LOCAL_EMULATOR === \"true\" && isLocalhost(resolveApiBaseUrl(app));\n}\n\nfunction getTabsForApp(app: StackClientApp<true>): { id: TabId; label: string; icon: string }[] {\n if (shouldShowDashboardTab(app)) {\n return TABS;\n }\n return TABS.filter((tab) => tab.id !== 'dashboard');\n}\n\nfunction deriveDashboardBaseUrl(apiBaseUrl: string): string {\n try {\n const url = new URL(apiBaseUrl);\n if (url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]') {\n const port = url.port;\n if (port && port.endsWith('02')) {\n url.port = port.slice(0, -2) + '01';\n }\n return url.origin;\n }\n if (url.hostname.startsWith('api.')) {\n url.hostname = 'app.' + url.hostname.slice(4);\n return url.origin;\n }\n return url.origin;\n } catch {\n return 'https://app.hexclave.com';\n }\n}\n\nfunction resolveDashboardUrl(app: StackClientApp<true>): string {\n const base = deriveDashboardBaseUrl(resolveApiBaseUrl(app));\n return `${base}/projects/${encodeURIComponent(app.projectId)}`;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n } as any);\n}\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction generateRandomEmail(): string {\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\n let id = '';\n for (let i = 0; i < 8; i++) {\n id += chars[Math.floor(Math.random() * chars.length)];\n }\n return `dev-${id}@test.hexclave.com`;\n}\n\n// ---------------------------------------------------------------------------\n// DOM helpers\n// ---------------------------------------------------------------------------\n\nfunction h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs?: Record<string, any> | null,\n ...children: (string | Node | null | undefined)[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n if (v == null) continue;\n if (k === 'className') {\n el.className = v;\n } else if (k === 'style' && typeof v === 'object') {\n Object.assign(el.style, v);\n } else if (k.startsWith('on') && typeof v === 'function') {\n el.addEventListener(k.slice(2).toLowerCase(), v);\n } else {\n el.setAttribute(k, String(v));\n }\n }\n }\n for (const child of children) {\n if (child == null) continue;\n el.appendChild(typeof child === 'string' ? document.createTextNode(child) : child);\n }\n return el;\n}\n\nfunction setHtml(el: HTMLElement, html: string) {\n el.innerHTML = html;\n}\n\nfunction hasAppendChild(value: unknown): value is { appendChild(node: Node): void } {\n return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'appendChild') === 'function';\n}\n\nfunction parseMarkdownImage(line: string): { alt: string, src: string } | null {\n const match = line.trim().match(/^!\\[([^\\]]*)\\]\\((.+)\\)$/);\n if (!match) return null;\n\n const [, alt, src] = match;\n const normalizedSrc = src.trim();\n if (normalizedSrc === '') return null;\n\n return {\n alt: alt.trim(),\n src: normalizedSrc,\n };\n}\n\nfunction appendInlineMarkdown(container: HTMLElement, text: string) {\n const tokenPattern = /(\\[[^\\]]+\\]\\([^)]+\\)|`[^`\\n]+`|\\*\\*[^*\\n]+\\*\\*|__[^_\\n]+__|\\*[^*\\n]+\\*|_[^_\\n]+_)/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = tokenPattern.exec(text)) !== null) {\n if (match.index > lastIndex) {\n container.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\n }\n\n const token = match[0];\n if (token.startsWith(\"`\")) {\n container.appendChild(h(\"code\", { className: \"sdt-ai-inline-code\" }, token.slice(1, -1)));\n } else if (token.startsWith(\"**\") || token.startsWith(\"__\")) {\n const bold = h(\"strong\", { className: \"sdt-ai-bold\" });\n appendInlineMarkdown(bold, token.slice(2, -2));\n container.appendChild(bold);\n } else if (token.startsWith(\"*\") || token.startsWith(\"_\")) {\n const italic = h(\"em\");\n appendInlineMarkdown(italic, token.slice(1, -1));\n container.appendChild(italic);\n } else {\n const linkMatch = token.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n if (linkMatch) {\n const [, linkText, href] = linkMatch;\n const trimmedHref = href.trim();\n if (/^(https?:\\/\\/|mailto:)/i.test(trimmedHref)) {\n const link = h(\"a\", {\n className: \"sdt-ai-link\",\n href: trimmedHref,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n appendInlineMarkdown(link, linkText);\n container.appendChild(link);\n } else {\n container.appendChild(document.createTextNode(token));\n }\n } else {\n container.appendChild(document.createTextNode(token));\n }\n }\n\n lastIndex = tokenPattern.lastIndex;\n }\n\n if (lastIndex < text.length) {\n container.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Trigger button (draggable pill — corner-snapping, icon only)\n// ---------------------------------------------------------------------------\n\nfunction createTrigger(onClick: () => void): { element: HTMLElement; cleanup: () => void } {\n type Position = { left: number; top: number };\n type Placement = TriggerPlacement;\n\n // Measured lazily after the element is appended to the DOM.\n let triggerSize = { width: 36, height: 36 };\n\n function isPosition(value: unknown): value is Position {\n if (typeof value !== 'object' || value === null) return false;\n return typeof Reflect.get(value, 'left') === 'number' && typeof Reflect.get(value, 'top') === 'number';\n }\n\n function isPlacement(value: unknown): value is Placement {\n if (typeof value !== 'object' || value === null) return false;\n const corner = Reflect.get(value, 'corner');\n return ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(String(corner));\n }\n\n function loadPlacement(): Placement | null {\n try {\n const raw = localStorage.getItem(TRIGGER_POS_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n\n if (isPlacement(parsed)) return parsed;\n\n // Migrate old side-based placement { side, offset } to nearest corner.\n if (typeof parsed === 'object' && parsed !== null && 'side' in parsed && 'offset' in parsed) {\n const side = String(Reflect.get(parsed, 'side'));\n const offset = Number(Reflect.get(parsed, 'offset'));\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let corner: TriggerCorner;\n if (side === 'right') corner = offset < vh / 2 ? 'top-right' : 'bottom-right';\n else if (side === 'left') corner = offset < vh / 2 ? 'top-left' : 'bottom-left';\n else if (side === 'top') corner = offset < vw / 2 ? 'top-left' : 'top-right';\n else corner = offset < vw / 2 ? 'bottom-left' : 'bottom-right';\n return { corner };\n }\n\n // Migrate old absolute position.\n if (isPosition(parsed)) {\n return getSnappedTriggerPlacement(parsed, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n }\n } catch {}\n return null;\n }\n\n function savePlacement(placement: Placement) {\n try {\n localStorage.setItem(TRIGGER_POS_KEY, JSON.stringify(placement));\n } catch {}\n }\n\n let animationTimeout: number | null = null;\n\n function setPositionAnimation(isAnimated: boolean) {\n if (animationTimeout !== null) {\n window.clearTimeout(animationTimeout);\n animationTimeout = null;\n }\n btn.classList.toggle('sdt-trigger-position-animated', isAnimated);\n if (isAnimated) {\n animationTimeout = window.setTimeout(() => {\n animationTimeout = null;\n btn.classList.remove('sdt-trigger-position-animated');\n }, 180);\n }\n }\n\n function applyPos(nextPos: Position, options?: { animate?: boolean }) {\n setPositionAnimation(options?.animate === true);\n pos = nextPos;\n btn.style.left = pos.left + 'px';\n btn.style.top = pos.top + 'px';\n }\n\n const btn = h('button', {\n className: 'sdt-trigger',\n 'aria-label': 'Toggle Hexclave Dev Tools',\n 'data-hexclave-devtool-trigger': 'true',\n title: 'Hexclave Dev Tools',\n });\n const logoSpan = h('span', { className: 'sdt-trigger-logo' });\n setHtml(logoSpan, HEXCLAVE_LOGO_SVG);\n btn.appendChild(logoSpan);\n\n let placement = loadPlacement() ?? { corner: 'bottom-right' as TriggerCorner };\n let pos = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n applyPos(pos);\n\n let dragState: { startX: number; startY: number; startLeft: number; startTop: number; didDrag: boolean } | null = null;\n\n // After mount, measure the actual rendered size and re-snap if needed.\n requestAnimationFrame(() => {\n const rect = btn.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n triggerSize = { width: rect.width, height: rect.height };\n const measured = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n if (measured.left !== pos.left || measured.top !== pos.top) {\n applyPos(measured, { animate: true });\n }\n }\n });\n\n btn.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n setPositionAnimation(false);\n btn.setPointerCapture(e.pointerId);\n dragState = { startX: e.clientX, startY: e.clientY, startLeft: pos.left, startTop: pos.top, didDrag: false };\n });\n\n btn.addEventListener('pointermove', (e) => {\n if (!dragState) return;\n const dx = e.clientX - dragState.startX;\n const dy = e.clientY - dragState.startY;\n if (!dragState.didDrag && Math.abs(dx) + Math.abs(dy) < DRAG_THRESHOLD) return;\n dragState.didDrag = true;\n applyPos(clampTriggerPosition(\n { left: dragState.startLeft + dx, top: dragState.startTop + dy },\n triggerSize,\n { width: window.innerWidth, height: window.innerHeight },\n ));\n });\n\n btn.addEventListener('pointerup', (e) => {\n const ds = dragState;\n dragState = null;\n if (!ds) return;\n btn.releasePointerCapture(e.pointerId);\n if (ds.didDrag) {\n placement = getSnappedTriggerPlacement(pos, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n applyPos(resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight }), { animate: true });\n savePlacement(placement);\n } else {\n onClick();\n }\n });\n\n // On viewport resize, reapply the existing corner placement to the new dimensions.\n // Placement (corner) only changes when the user drags.\n function onResize() {\n const resizedPos = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n if (resizedPos.left !== pos.left || resizedPos.top !== pos.top) {\n applyPos(resizedPos, { animate: true });\n }\n }\n\n window.addEventListener('resize', onResize);\n\n return {\n element: btn,\n cleanup: () => {\n if (animationTimeout !== null) {\n window.clearTimeout(animationTimeout);\n }\n window.removeEventListener('resize', onResize);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tab bar with sliding indicator\n// ---------------------------------------------------------------------------\n\nfunction createTabBar(\n tabs: { id: string; label: string; icon?: string }[],\n activeTab: string,\n onTabChange: (id: string) => void,\n opts?: { variant?: 'bar' | 'pills'; trailing?: HTMLElement },\n): { el: HTMLElement; setActive: (id: string) => void } {\n const variant = opts?.variant ?? 'bar';\n const barClass = variant === 'pills' ? 'sdt-console-tabs' : 'sdt-tabbar';\n const tabClass = variant === 'pills' ? 'sdt-console-tab' : 'sdt-tab';\n const indicatorClass = variant === 'pills' ? 'sdt-console-tab-indicator' : 'sdt-tab-indicator';\n\n const bar = h('div', { className: barClass });\n const indicator = h('div', { className: indicatorClass });\n indicator.style.opacity = '0';\n bar.appendChild(indicator);\n\n let current = activeTab;\n let isInitial = true;\n\n const buttons = tabs.map((tab) => {\n const btn = h('button', {\n className: tabClass,\n 'data-tab-id': tab.id,\n 'data-active': String(tab.id === activeTab),\n });\n if (tab.icon) {\n const iconSpan = h('span', { className: 'sdt-tab-icon' });\n setHtml(iconSpan, tab.icon);\n btn.appendChild(iconSpan);\n }\n btn.appendChild(document.createTextNode(tab.label));\n btn.addEventListener('click', () => onTabChange(tab.id));\n bar.appendChild(btn);\n return btn;\n });\n\n if (variant === 'bar') {\n bar.appendChild(h('div', { className: 'sdt-tabbar-spacer' }));\n }\n if (opts?.trailing) {\n bar.appendChild(opts.trailing);\n }\n\n function measure() {\n const btn = bar.querySelector<HTMLElement>(`[data-tab-id=\"${current}\"]`);\n if (!btn) return;\n indicator.style.transform = `translateX(${btn.offsetLeft}px)`;\n indicator.style.width = btn.offsetWidth + 'px';\n indicator.style.height = btn.offsetHeight + 'px';\n indicator.style.opacity = '1';\n indicator.style.transition = isInitial ? 'none' : '';\n isInitial = false;\n }\n\n const ro = new ResizeObserver(measure);\n ro.observe(bar);\n requestAnimationFrame(measure);\n\n function setActive(id: string) {\n current = id;\n buttons.forEach((btn) => {\n const tabId = btn.getAttribute('data-tab-id');\n btn.setAttribute('data-active', String(tabId === id));\n });\n measure();\n }\n\n return { el: bar, setActive };\n}\n\n// ---------------------------------------------------------------------------\n// Iframe helper\n// ---------------------------------------------------------------------------\n\nfunction createIframeTab(src: string, title: string, loadingMsg = 'Loading\\u2026', errorMsg = 'Unable to load content', errorDetail?: string, openExternallyLabel?: string): HTMLElement {\n const container = h('div', { className: 'sdt-iframe-container' });\n if (openExternallyLabel != null) {\n container.appendChild(h('div', { className: 'sdt-iframe-toolbar' },\n h('a', { href: src, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-iframe-open-link' }, openExternallyLabel),\n ));\n }\n const loadingEl = h('div', { className: 'sdt-iframe-loading' }, loadingMsg);\n container.appendChild(loadingEl);\n\n const iframe = document.createElement('iframe');\n iframe.src = src;\n iframe.title = title;\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups allow-forms');\n iframe.style.display = 'none';\n\n iframe.addEventListener('load', () => {\n loadingEl.style.display = 'none';\n iframe.style.display = 'block';\n });\n\n iframe.addEventListener('error', () => {\n loadingEl.style.display = 'none';\n container.innerHTML = '';\n const errDiv = h('div', { className: 'sdt-iframe-error' });\n errDiv.appendChild(h('div', null, errorMsg));\n if (errorDetail) {\n errDiv.appendChild(h('div', { style: { fontSize: '12px', color: 'var(--sdt-text-tertiary)' } }, errorDetail));\n }\n const retryBtn = h('button', { className: 'sdt-iframe-error-btn' }, 'Retry');\n retryBtn.addEventListener('click', () => {\n container.replaceWith(createIframeTab(src, title, loadingMsg, errorMsg, errorDetail, openExternallyLabel));\n });\n errDiv.appendChild(retryBtn);\n const link = h('a', { href: src, target: '_blank', rel: 'noopener noreferrer', style: { color: 'var(--sdt-accent)', fontSize: '12px', textDecoration: 'none' } }, 'Open in new tab');\n errDiv.appendChild(link);\n container.appendChild(errDiv);\n });\n\n container.appendChild(iframe);\n return container;\n}\n\n// ===========================================================================================\n// TABS\n// ===========================================================================================\n\n// ---------------------------------------------------------------------------\n// Overview tab\n// ---------------------------------------------------------------------------\n\nfunction createOverviewTab(app: StackClientApp<true>): TabResult {\n const container = h('div', { className: 'sdt-ov' });\n\n // ── Identity card ──────────────────────────────────────────────────────────\n const heroCard = h('div', { className: 'sdt-ov-card sdt-ov-card-hero' });\n heroCard.appendChild(h('div', { className: 'sdt-ov-label' }, 'Identity'));\n\n const userRow = h('div', { className: 'sdt-ov-user-row' });\n const avatar = h('div', { className: 'sdt-ov-avatar' }, '?');\n const userMeta = h('div', { className: 'sdt-ov-user-meta' });\n const userName = h('div', { className: 'sdt-ov-user-name' }, 'Loading\\u2026');\n const userEmail = h('div', { className: 'sdt-ov-user-email' }, '');\n const authIndicator = h('div', { className: 'sdt-ov-auth-indicator', style: { display: 'none' } }, 'Authenticated');\n userMeta.append(userName, userEmail, authIndicator);\n userRow.append(avatar, userMeta);\n heroCard.appendChild(userRow);\n\n const actions = h('div', { className: 'sdt-ov-actions' });\n const toast = h('div', { className: 'sdt-ov-toast', style: { display: 'none' } });\n const emailRow = h('div', { className: 'sdt-ov-email-input' });\n const emailInput = h('input', { type: 'email', placeholder: 'Sign in as email\\u2026' }) as HTMLInputElement;\n const emailBtn = h('button', null);\n setHtml(emailBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/></svg>');\n emailRow.append(emailInput, emailBtn);\n\n function isBestEffortOverviewError(error: unknown) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return true;\n }\n if (error instanceof TypeError) {\n return true;\n }\n if (error instanceof Error) {\n return error.message.includes('Failed to fetch')\n || error.message.includes('NetworkError')\n || error.message.includes('Load failed')\n || error.message.includes('network connection');\n }\n return false;\n }\n\n function showToast(msg: string, type: 'success' | 'error') {\n toast.textContent = msg;\n toast.className = `sdt-ov-toast sdt-ov-toast-${type}`;\n toast.style.display = '';\n setTimeout(() => {\n toast.style.display = 'none';\n }, 4000);\n }\n\n let currentUser: any = null;\n let loading = false;\n\n function rebuildActions() {\n actions.innerHTML = '';\n if (currentUser) {\n const signOutBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-danger' }, 'Sign Out');\n signOutBtn.disabled = loading;\n signOutBtn.addEventListener('click', () => {\n runAsynchronously(async () => {\n loading = true;\n rebuildActions();\n try {\n await currentUser.signOut();\n showToast('Signed out', 'success');\n } catch (e: any) {\n showToast(e.message || 'Sign out failed', 'error');\n }\n loading = false;\n await refreshUser();\n });\n });\n const randomBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-primary' }, 'Random User');\n randomBtn.disabled = loading;\n randomBtn.addEventListener('click', () => {\n runAsynchronously(doQuickSignIn());\n });\n actions.append(signOutBtn, randomBtn);\n } else {\n const quickBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-primary sdt-ov-btn-wide' }, loading ? 'Working\\u2026' : 'Quick Sign In');\n quickBtn.disabled = loading;\n quickBtn.addEventListener('click', () => {\n runAsynchronously(doQuickSignIn());\n });\n actions.appendChild(quickBtn);\n }\n emailInput.placeholder = currentUser ? 'Switch to email\\u2026' : 'Sign in as email\\u2026';\n actions.appendChild(emailRow);\n }\n\n async function doQuickSignIn() {\n if (!isLocalhost(window.location.href)) {\n showToast('Quick sign-in is only available on localhost', 'error');\n return;\n }\n loading = true;\n rebuildActions();\n const email = generateRandomEmail();\n try {\n const signUpResult = await app.signUpWithCredential({ email, password: email, noRedirect: true } as any);\n if (signUpResult.status === 'error') {\n showToast(`Sign up failed: ${signUpResult.error.message}`, 'error');\n loading = false;\n rebuildActions();\n return;\n }\n const signInResult = await app.signInWithCredential({ email, password: email, noRedirect: true });\n if (signInResult.status === 'error') {\n showToast(`Sign in failed: ${signInResult.error.message}`, 'error');\n } else {\n showToast(`Signed in as ${email}`, 'success');\n }\n } catch (e: any) {\n showToast(e.message || 'Unknown error', 'error');\n }\n loading = false;\n await refreshUser();\n }\n\n async function doSignInAs(targetEmail: string) {\n if (!targetEmail.trim()) return;\n if (!isLocalhost(window.location.href)) {\n showToast('Quick sign-in is only available on localhost', 'error');\n return;\n }\n loading = true;\n rebuildActions();\n const trimmed = targetEmail.trim();\n try {\n const signInResult = await app.signInWithCredential({ email: trimmed, password: trimmed, noRedirect: true });\n if (signInResult.status === 'ok') {\n showToast(`Signed in as ${trimmed}`, 'success');\n emailInput.value = '';\n loading = false;\n await refreshUser();\n return;\n }\n const signUpResult = await app.signUpWithCredential({ email: trimmed, password: trimmed, noRedirect: true } as any);\n if (signUpResult.status === 'error') {\n showToast(`Failed: ${signUpResult.error.message}`, 'error');\n loading = false;\n rebuildActions();\n return;\n }\n const retryResult = await app.signInWithCredential({ email: trimmed, password: trimmed, noRedirect: true });\n if (retryResult.status === 'error') {\n showToast(`Sign in failed: ${retryResult.error.message}`, 'error');\n } else {\n showToast(`Signed in as ${trimmed}`, 'success');\n emailInput.value = '';\n }\n } catch (e: any) {\n showToast(e.message || 'Unknown error', 'error');\n }\n loading = false;\n await refreshUser();\n }\n\n emailBtn.addEventListener('click', () => {\n runAsynchronously(doSignInAs(emailInput.value));\n });\n emailInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n runAsynchronously(doSignInAs(emailInput.value));\n }\n });\n\n heroCard.append(actions, toast);\n\n // ── Auth methods card ──────────────────────────────────────────────────────\n const methodsCard = h('div', { className: 'sdt-ov-card sdt-ov-card-auth' });\n methodsCard.appendChild(h('div', { className: 'sdt-ov-label' }, 'Auth Methods'));\n const authGrid = h('div', { className: 'sdt-ov-auth-grid' });\n for (let i = 0; i < 3; i++) {\n authGrid.appendChild(h('div', { className: 'sdt-ov-method sdt-ov-skeleton-pill' }));\n }\n methodsCard.appendChild(authGrid);\n let hasActiveAuthMethod: boolean | null = null;\n\n async function loadAuthMethods() {\n try {\n const project = await app.getProject();\n authGrid.innerHTML = '';\n const config = project.config;\n hasActiveAuthMethod = config.credentialEnabled\n || config.magicLinkEnabled\n || config.passkeyEnabled\n || config.oauthProviders.length > 0;\n const methods = [\n { label: 'Password', enabled: config.credentialEnabled },\n { label: 'Magic Link', enabled: config.magicLinkEnabled },\n { label: 'Passkey', enabled: config.passkeyEnabled },\n ];\n for (const m of methods) {\n const pill = h('div', { className: `sdt-ov-method ${m.enabled ? 'sdt-ov-method-on' : 'sdt-ov-method-off'}` });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, m.label));\n authGrid.appendChild(pill);\n }\n for (const p of config.oauthProviders) {\n const pill = h('div', { className: 'sdt-ov-method sdt-ov-method-on sdt-ov-method-oauth' });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, p.id));\n authGrid.appendChild(pill);\n }\n if (!config.signUpEnabled) {\n const pill = h('div', { className: 'sdt-ov-method sdt-ov-method-warn' });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, 'Sign-up off'));\n authGrid.appendChild(pill);\n }\n buildChecklist();\n } catch (error) {\n authGrid.innerHTML = '<div style=\"font-size:11px;color:var(--sdt-text-tertiary)\">Could not load auth methods</div>';\n hasActiveAuthMethod = null;\n buildChecklist();\n if (!isBestEffortOverviewError(error)) {\n throw error;\n }\n }\n }\n\n // Overview hydration is best-effort while the local Stack backend is still booting.\n runAsynchronously(loadAuthMethods());\n\n // ── Setup checklist (only shown when something is incomplete) ──────────────\n const checksCard = h('div', { className: 'sdt-ov-card sdt-ov-card-checks' });\n const projectId = app.projectId;\n let checksCardMounted = false;\n\n function buildChecklist() {\n checksCard.innerHTML = '';\n const checks = [\n { ok: !!projectId && projectId !== 'default', label: 'Project configured', hint: null },\n { ok: hasActiveAuthMethod === true, label: 'Auth method active', hint: hasActiveAuthMethod === null ? 'Still checking project config' : null },\n { ok: !!currentUser, label: 'Sign in a test user', hint: 'Use \\u201cQuick Sign In\\u201d above \\u2192' },\n ];\n const passCount = checks.filter((c) => c.ok).length;\n const allGood = passCount === checks.length;\n\n if (allGood) {\n if (checksCardMounted && checksCard.parentElement) {\n container.removeChild(checksCard);\n checksCardMounted = false;\n }\n return;\n }\n\n if (!checksCardMounted) {\n container.appendChild(checksCard);\n checksCardMounted = true;\n }\n\n const titleRow = h('div', { className: 'sdt-ov-checks-header' });\n const titleLabel = h('div', { className: 'sdt-ov-label', style: { marginBottom: '0', color: 'var(--sdt-warning)' } }, 'Setup');\n const badge = h('span', { className: 'sdt-ov-checks-badge sdt-ov-checks-badge-warn' }, `${passCount}\\u200a/\\u200a${checks.length}`);\n titleRow.append(titleLabel, badge);\n checksCard.appendChild(titleRow);\n\n const bar = h('div', { className: 'sdt-ov-checks-bar' });\n const fill = h('div', { className: 'sdt-ov-checks-bar-fill' });\n fill.style.width = `${(passCount / checks.length) * 100}%`;\n bar.appendChild(fill);\n checksCard.appendChild(bar);\n\n for (const c of checks) {\n const row = h('div', { className: 'sdt-ov-setup-row' });\n row.appendChild(h('span', { className: `sdt-ov-setup-dot ${c.ok ? 'sdt-ov-setup-dot-ok' : 'sdt-ov-setup-dot-warn'}` }));\n row.appendChild(h('span', { className: 'sdt-ov-setup-label' }, c.label));\n if (!c.ok && c.hint) {\n row.appendChild(h('span', { className: 'sdt-ov-setup-hint' }, c.hint));\n }\n checksCard.appendChild(row);\n }\n }\n\n async function refreshUser() {\n try {\n currentUser = await app.getUser();\n\n if (currentUser) {\n const initials = (currentUser.displayName || currentUser.primaryEmail || '?')\n .split(' ').map((s: string) => s[0]).join('').slice(0, 2).toUpperCase();\n avatar.className = 'sdt-ov-avatar sdt-ov-avatar-active';\n if (currentUser.profileImageUrl) {\n avatar.innerHTML = `<img src=\"${escapeHtml(currentUser.profileImageUrl)}\" alt=\"\" />`;\n } else {\n avatar.textContent = initials;\n }\n userName.textContent = currentUser.displayName || 'Anonymous';\n userEmail.textContent = currentUser.primaryEmail || 'No email';\n authIndicator.style.display = '';\n } else {\n avatar.className = 'sdt-ov-avatar';\n avatar.textContent = '?';\n userName.textContent = 'No user signed in';\n userEmail.textContent = 'Sign in to test auth flows';\n authIndicator.style.display = 'none';\n }\n } catch (error) {\n avatar.className = 'sdt-ov-avatar';\n avatar.textContent = '?';\n userName.textContent = 'Could not load user';\n userEmail.textContent = 'Check your local Stack backend';\n authIndicator.style.display = 'none';\n currentUser = null;\n if (!isBestEffortOverviewError(error)) {\n throw error;\n }\n }\n rebuildActions();\n buildChecklist();\n }\n\n container.append(heroCard, methodsCard);\n buildChecklist();\n runAsynchronously(refreshUser());\n const userPoll = setInterval(() => {\n runAsynchronously(refreshUser());\n }, 3000);\n\n return { element: container, cleanup: () => clearInterval(userPoll) };\n}\n\n// ---------------------------------------------------------------------------\n// Console tab\n// ---------------------------------------------------------------------------\n\ntype MergedLogEntry =\n | { kind: 'api', entry: ApiLogEntry }\n | { kind: 'event', entry: EventLogEntry };\n\nfunction createConsoleTab(logStore: LogStore): TabResult {\n const container = h('div', { className: 'sdt-console-panel' });\n\n const EVENT_TYPE_STYLES: Record<string, string> = {\n 'error': 'sdt-badge-error',\n 'info': 'sdt-badge-info',\n };\n\n const title = h('div', { className: 'sdt-console-title' }, 'Logs');\n const actions = h('div', { className: 'sdt-console-actions' });\n const copyBtn = h('button', { className: 'sdt-console-action-btn', title: 'Copy logs' });\n setHtml(copyBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>Copy');\n const exportBtn = h('button', { className: 'sdt-console-action-btn', title: 'Export logs' });\n setHtml(exportBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>Export');\n const clearBtn = h('button', { className: 'sdt-console-action-btn', title: 'Clear logs' });\n setHtml(clearBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>Clear');\n actions.append(copyBtn, exportBtn, clearBtn);\n container.appendChild(h('div', { className: 'sdt-console-header' }, title, actions));\n\n const contentArea = h('div', { className: 'sdt-console-log-scroll sdt-tab-content-fade' });\n container.appendChild(contentArea);\n\n let visibleLogCount = CONSOLE_LOG_BATCH_SIZE;\n\n function getMergedLogs(): MergedLogEntry[] {\n return [\n ...logStore.apiLogs.map((entry) => ({ kind: 'api' as const, entry })),\n ...logStore.eventLogs.map((entry) => ({ kind: 'event' as const, entry })),\n ].sort((a, b) => b.entry.timestamp - a.entry.timestamp);\n }\n\n function formatLogLine(item: MergedLogEntry): string {\n if (item.kind === 'api') {\n const log = item.entry;\n const status = log.status !== undefined ? ` [${log.status}]` : '';\n const duration = log.duration !== undefined ? ` ${log.duration}ms` : '';\n const error = log.error !== undefined ? ` ${log.error}` : '';\n return `${new Date(log.timestamp).toISOString()} ${log.method} ${log.url}${status}${duration}${error}`;\n }\n\n const log = item.entry;\n return `${new Date(log.timestamp).toISOString()} ${log.type.toUpperCase()} ${log.message}`;\n }\n\n function formatLogsForExport(): string {\n const lines = [\n '=== Hexclave Dev Tool Logs ===',\n `Generated: ${new Date().toISOString()}`,\n `Total logs: ${getMergedLogs().length}`,\n '',\n ...getMergedLogs().map(formatLogLine),\n ];\n return lines.join('\\n');\n }\n\n function renderLogItem(item: MergedLogEntry): HTMLElement {\n if (item.kind === 'api') {\n const log = item.entry;\n const row = h('div', { className: 'sdt-log-item' });\n row.appendChild(h('span', { className: 'sdt-log-time' }, formatTimestamp(log.timestamp)));\n row.appendChild(h('span', { className: `sdt-log-method sdt-log-method-${log.method.toLowerCase()}` }, log.method));\n row.appendChild(h('span', { className: 'sdt-log-url' }, log.url));\n if (log.status !== undefined) {\n row.appendChild(h('span', { className: `sdt-log-status ${log.status < 400 ? 'sdt-log-status-ok' : 'sdt-log-status-err'}` }, String(log.status)));\n }\n if (log.duration !== undefined) {\n row.appendChild(h('span', { className: 'sdt-log-time' }, log.duration + 'ms'));\n }\n return row;\n }\n\n const log = item.entry;\n const row = h('div', { className: 'sdt-log-item' });\n row.appendChild(h('span', { className: 'sdt-log-time' }, formatTimestamp(log.timestamp)));\n row.appendChild(h('span', { className: `sdt-badge ${EVENT_TYPE_STYLES[log.type] || 'sdt-badge-info'}` }, log.type));\n row.appendChild(h('span', { className: 'sdt-log-message' }, log.message));\n return row;\n }\n\n function renderLogs() {\n const previousScrollTop = contentArea.scrollTop;\n contentArea.innerHTML = '';\n const merged = getMergedLogs();\n visibleLogCount = Math.min(Math.max(visibleLogCount, CONSOLE_LOG_BATCH_SIZE), Math.max(merged.length, CONSOLE_LOG_BATCH_SIZE));\n\n if (merged.length === 0) {\n contentArea.innerHTML = '<div class=\"sdt-empty-state\"><div class=\"sdt-empty-state-icon\">\\uD83D\\uDCCB</div><div>No logs recorded yet</div><div style=\"font-size:12px;color:var(--sdt-text-tertiary)\">API calls and auth events will appear here</div></div>';\n return;\n }\n\n const list = h('div', { className: 'sdt-log-list' });\n for (const item of merged.slice(0, visibleLogCount)) {\n list.appendChild(renderLogItem(item));\n }\n if (visibleLogCount < merged.length) {\n list.appendChild(h('div', { className: 'sdt-log-load-hint' }, `${merged.length - visibleLogCount} older logs available`));\n }\n contentArea.appendChild(list);\n contentArea.scrollTop = Math.min(previousScrollTop, contentArea.scrollHeight);\n }\n\n function maybeLoadOlderLogs() {\n const mergedLength = getMergedLogs().length;\n if (visibleLogCount >= mergedLength) return;\n const distanceFromBottom = contentArea.scrollHeight - contentArea.scrollTop - contentArea.clientHeight;\n if (distanceFromBottom <= 48) {\n visibleLogCount = Math.min(visibleLogCount + CONSOLE_LOG_BATCH_SIZE, mergedLength);\n renderLogs();\n }\n }\n\n contentArea.addEventListener('scroll', maybeLoadOlderLogs);\n renderLogs();\n\n copyBtn.addEventListener('click', () => {\n runAsynchronously(\n navigator.clipboard.writeText(formatLogsForExport()).then(() => {\n copyBtn.textContent = '\\u2713 Copied';\n setTimeout(() => {\n setHtml(copyBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>Copy');\n }, 1500);\n })\n );\n });\n\n exportBtn.addEventListener('click', () => {\n const blob = new Blob([formatLogsForExport()], { type: 'text/plain;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const link = h('a', { href: url, download: `hexclave-dev-tool-logs-${new Date().toISOString()}.txt` });\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n });\n\n clearBtn.addEventListener('click', () => {\n visibleLogCount = CONSOLE_LOG_BATCH_SIZE;\n logStore.clear();\n });\n\n const unsub = logStore.subscribe(() => {\n renderLogs();\n });\n\n return {\n element: container,\n cleanup: () => {\n contentArea.removeEventListener('scroll', maybeLoadOlderLogs);\n unsub();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// AI tab\n// ---------------------------------------------------------------------------\n\nfunction createAITab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-ai-container' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n\n type ToolCallState = 'running' | 'success' | 'error';\n type ToolCall = {\n id: string,\n toolName: string,\n argsText: string | null,\n resultText: string | null,\n state: ToolCallState,\n errorText: string | null,\n isExpanded: boolean,\n };\n type AssistantPart =\n | { type: 'text', content: string }\n | { type: 'tool', toolCallId: string };\n type UserMessage = { role: 'user'; content: string };\n type AssistantMessage = { role: 'assistant'; parts: AssistantPart[]; toolCallsById: Map<string, ToolCall> };\n type Message = UserMessage | AssistantMessage;\n const messages: Message[] = [];\n let aiLoading = false;\n let activeAiAbortController: AbortController | null = null;\n\n const messagesArea = h('div', { className: 'sdt-ai-messages' });\n const inputArea = h('div', { className: 'sdt-ai-input-area' });\n\n const SUGGESTED_QUESTIONS = [\n { icon: '\\uD83D\\uDD12', text: 'How do I protect a Next.js route?' },\n { icon: '\\uD83D\\uDC65', text: 'How do teams and permissions work?' },\n { icon: '\\uD83D\\uDD17', text: 'How do I add OAuth providers?' },\n { icon: '\\u2709\\uFE0F', text: 'How do I customize auth emails?' },\n ];\n\n function getHeaders(): Record<string, string> {\n const opts = app[hexclaveAppInternalsSymbol].getConstructorOptions();\n // Hexclave rebrand: emit x-hexclave-* request headers (backend dual-accepts).\n const headers: Record<string, string> = {\n 'X-Hexclave-Access-Type': 'client',\n 'X-Hexclave-Project-Id': app.projectId,\n };\n if ('publishableClientKey' in opts && opts.publishableClientKey) {\n headers['X-Hexclave-Publishable-Client-Key'] = opts.publishableClientKey as string;\n }\n return headers;\n }\n\n function renderToolCard(toolCall: ToolCall): HTMLElement {\n const toolCard = h('div', { className: 'sdt-ai-tool-card' });\n const header = h('button', { className: 'sdt-ai-tool-header', type: 'button' });\n header.appendChild(h('span', { className: 'sdt-ai-tool-name' }, toolCall.toolName));\n header.appendChild(h('span', { className: `sdt-ai-tool-status sdt-ai-tool-status-${toolCall.state}` }, toolCall.state));\n header.appendChild(h('span', { className: `sdt-ai-tool-chevron${toolCall.isExpanded ? ' sdt-ai-tool-chevron-open' : ''}` }, '\\u25BE'));\n header.addEventListener('click', () => {\n toolCall.isExpanded = !toolCall.isExpanded;\n renderMessages();\n });\n toolCard.appendChild(header);\n\n if (toolCall.isExpanded) {\n const body = h('div', { className: 'sdt-ai-tool-body' });\n if (toolCall.argsText !== null) {\n body.appendChild(h('div', { className: 'sdt-ai-tool-label' }, 'Args'));\n const argsPre = h('pre', { className: 'sdt-ai-tool-pre' });\n argsPre.appendChild(h('code', null, toolCall.argsText));\n body.appendChild(argsPre);\n }\n if (toolCall.resultText !== null) {\n body.appendChild(h('div', { className: 'sdt-ai-tool-label' }, toolCall.state === 'error' ? 'Error' : 'Result'));\n const resultPre = h('pre', { className: 'sdt-ai-tool-pre' });\n resultPre.appendChild(h('code', null, toolCall.resultText));\n body.appendChild(resultPre);\n }\n if (toolCall.state === 'running') {\n body.appendChild(h('div', { className: 'sdt-ai-tool-running' }, 'Running...'));\n }\n toolCard.appendChild(body);\n }\n\n return toolCard;\n }\n\n function renderMessages() {\n messagesArea.innerHTML = '';\n\n if (messages.length === 0) {\n const empty = h('div', { className: 'sdt-ai-empty' });\n const icon = h('div', { className: 'sdt-ai-empty-icon' });\n setHtml(icon, '<svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>');\n empty.appendChild(icon);\n empty.appendChild(h('div', { className: 'sdt-ai-empty-title' }, 'Ask AI'));\n empty.appendChild(h('div', { className: 'sdt-ai-empty-desc' }, 'Get help with Hexclave integration, troubleshooting, and best practices.'));\n\n const suggestions = h('div', { className: 'sdt-ai-suggestions' });\n for (const q of SUGGESTED_QUESTIONS) {\n const btn = h('button', { className: 'sdt-ai-suggestion' });\n btn.appendChild(h('span', { className: 'sdt-ai-suggestion-icon' }, q.icon));\n btn.appendChild(h('span', null, q.text));\n btn.addEventListener('click', () => {\n runAsynchronously(sendMessage(q.text));\n });\n suggestions.appendChild(btn);\n }\n empty.appendChild(suggestions);\n messagesArea.appendChild(empty);\n return;\n }\n\n const list = h('div', { className: 'sdt-ai-message-list' });\n for (const msg of messages) {\n if (msg.role === 'user') {\n const msgDiv = h('div', { className: 'sdt-ai-msg sdt-ai-msg-user' });\n const bubble = h('div', { className: 'sdt-ai-bubble sdt-ai-bubble-user' });\n bubble.appendChild(h('p', null, msg.content));\n msgDiv.appendChild(bubble);\n const avatarDiv = h('div', { className: 'sdt-ai-avatar sdt-ai-avatar-user' });\n setHtml(avatarDiv, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>');\n msgDiv.appendChild(avatarDiv);\n list.appendChild(msgDiv);\n } else {\n const msgDiv = h('div', { className: 'sdt-ai-msg sdt-ai-msg-assistant' });\n const avatarDiv = h('div', { className: 'sdt-ai-avatar sdt-ai-avatar-assistant' });\n setHtml(avatarDiv, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>');\n msgDiv.appendChild(avatarDiv);\n const bubble = h('div', { className: 'sdt-ai-bubble sdt-ai-bubble-assistant' });\n if (msg.parts.length === 0) {\n bubble.innerHTML = '<div class=\"sdt-ai-thinking\"><span class=\"sdt-ai-thinking-dot\"></span><span class=\"sdt-ai-thinking-dot\"></span><span class=\"sdt-ai-thinking-dot\"></span></div>';\n } else {\n for (const part of msg.parts) {\n if (part.type === 'text') {\n const textContainer = h('div', { className: 'sdt-ai-part-text' });\n renderMarkdownInto(textContainer, part.content);\n bubble.appendChild(textContainer);\n continue;\n }\n\n const toolCall = msg.toolCallsById.get(part.toolCallId);\n if (toolCall == null) {\n const missingTool = h('div', { className: 'sdt-ai-tool-card' });\n const missingBody = h('div', { className: 'sdt-ai-tool-body' });\n missingBody.appendChild(h('div', { className: 'sdt-ai-tool-label' }, 'Error'));\n const missingPre = h('pre', { className: 'sdt-ai-tool-pre' });\n missingPre.appendChild(h('code', null, `Missing tool call state for ${part.toolCallId}`));\n missingBody.appendChild(missingPre);\n missingTool.appendChild(missingBody);\n bubble.appendChild(missingTool);\n continue;\n }\n const toolsContainer = h('div', { className: 'sdt-ai-tools' });\n toolsContainer.appendChild(renderToolCard(toolCall));\n bubble.appendChild(toolsContainer);\n }\n }\n msgDiv.appendChild(bubble);\n list.appendChild(msgDiv);\n }\n }\n messagesArea.appendChild(list);\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n\n function renderMarkdownInto(el: HTMLElement, content: string) {\n function appendBlockWithInlineMarkdown(tag: \"p\" | \"li\" | \"h1\" | \"h2\" | \"h3\", className: string, text: string) {\n const block = h(tag, { className });\n appendInlineMarkdown(block, text);\n el.appendChild(block);\n }\n\n const lines = content.split('\\n');\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n const block = h('div', { className: 'sdt-ai-code-block' });\n const header = h('div', { className: 'sdt-ai-code-header' });\n header.appendChild(h('span', { className: 'sdt-ai-code-lang' }, lang || 'CODE'));\n const copyBtn = h('button', { className: 'sdt-ai-copy-btn' }, '\\u2398');\n const code = codeLines.join('\\n');\n copyBtn.addEventListener('click', () => {\n runAsynchronously(navigator.clipboard.writeText(code).then(() => {\n copyBtn.textContent = '\\u2713';\n setTimeout(() => {\n copyBtn.textContent = '\\u2398';\n }, 1500);\n }));\n });\n header.appendChild(copyBtn);\n block.appendChild(header);\n const pre = h('pre', { className: 'sdt-ai-code-pre' });\n pre.appendChild(h('code', null, code));\n block.appendChild(pre);\n el.appendChild(block);\n continue;\n }\n\n const headingMatch = line.match(/^(#{1,3}) (.+)/);\n if (headingMatch) {\n const tag = `h${headingMatch[1].length}` as 'h1' | 'h2' | 'h3';\n appendBlockWithInlineMarkdown(tag, \"sdt-ai-heading\", headingMatch[2]);\n i++;\n continue;\n }\n\n if (/^[-*] /.test(line)) {\n const ul = h('ul', { className: 'sdt-ai-list' });\n while (i < lines.length && /^[-*] /.test(lines[i])) {\n const li = h(\"li\");\n appendInlineMarkdown(li, lines[i].replace(/^[-*] /, \"\"));\n ul.appendChild(li);\n i++;\n }\n el.appendChild(ul);\n continue;\n }\n\n if (/^\\d+\\. /.test(line)) {\n const ol = h('ol', { className: 'sdt-ai-list sdt-ai-list-ordered' });\n while (i < lines.length && /^\\d+\\. /.test(lines[i])) {\n const li = h(\"li\");\n appendInlineMarkdown(li, lines[i].replace(/^\\d+\\. /, \"\"));\n ol.appendChild(li);\n i++;\n }\n el.appendChild(ol);\n continue;\n }\n\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n appendBlockWithInlineMarkdown(\"p\", \"sdt-ai-paragraph\", line);\n i++;\n }\n }\n\n function stringifyForDebug(value: unknown): string {\n if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {\n return String(value);\n }\n return JSON.stringify(value, null, 2);\n }\n\n function getLastItem<T>(items: readonly T[]): T | undefined {\n return items.length > 0 ? items[items.length - 1] : undefined;\n }\n\n function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n function expectObject(value: unknown, payload: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`SSE payload must be an object: ${payload}`);\n }\n return value;\n }\n\n function getRequiredStringField(event: Record<string, unknown>, field: string, payload: string): string {\n const value = event[field];\n if (typeof value !== 'string') {\n throw new Error(`SSE event '${String(event.type)}' missing string '${field}': ${payload}`);\n }\n return value;\n }\n\n function getCurrentAssistantMessage(): AssistantMessage {\n const lastMessage = getLastItem(messages);\n if (lastMessage?.role !== 'assistant') {\n throw new Error('Expected current message to be an assistant message');\n }\n return lastMessage;\n }\n\n function appendTextDelta(delta: string) {\n const assistantMessage = getCurrentAssistantMessage();\n const lastPart = getLastItem(assistantMessage.parts);\n if (lastPart?.type === 'text') {\n lastPart.content += delta;\n return;\n }\n assistantMessage.parts.push({ type: 'text', content: delta });\n }\n\n function ensureToolPart(assistantMessage: AssistantMessage, toolCallId: string) {\n const hasPart = assistantMessage.parts.some(part => part.type === 'tool' && part.toolCallId === toolCallId);\n if (!hasPart) {\n assistantMessage.parts.push({ type: 'tool', toolCallId });\n }\n }\n\n function findOrCreateToolCall(toolCallId: string, fallbackToolName: string): ToolCall {\n const assistantMessage = getCurrentAssistantMessage();\n const existing = assistantMessage.toolCallsById.get(toolCallId);\n if (existing != null) {\n if (existing.toolName === 'tool' && fallbackToolName !== 'tool') {\n existing.toolName = fallbackToolName;\n }\n ensureToolPart(assistantMessage, toolCallId);\n return existing;\n }\n\n const created: ToolCall = {\n id: toolCallId,\n toolName: fallbackToolName,\n argsText: null,\n resultText: null,\n state: 'running',\n errorText: null,\n isExpanded: false,\n };\n assistantMessage.toolCallsById.set(toolCallId, created);\n ensureToolPart(assistantMessage, toolCallId);\n return created;\n }\n\n async function sendMessage(text: string) {\n if (!text.trim() || aiLoading) return;\n messages.push({ role: 'user', content: text.trim() });\n messages.push({ role: 'assistant', parts: [], toolCallsById: new Map<string, ToolCall>() });\n aiLoading = true;\n renderMessages();\n renderInput();\n\n try {\n const abortController = new AbortController();\n activeAiAbortController = abortController;\n const res = await fetch(`${apiBaseUrl}/api/latest/ai/query/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getHeaders(),\n },\n signal: abortController.signal,\n body: JSON.stringify({\n systemPrompt: 'command-center-ask-ai',\n tools: ['docs'],\n quality: 'smart',\n speed: 'slow',\n messages: messages\n .slice(0, -1)\n .map((m) => ({\n role: m.role,\n content: [{ type: 'text', text: m.role === 'user' ? m.content : m.parts.filter(part => part.type === 'text').map(part => part.content).join('') }],\n })),\n }),\n });\n\n if (!res.ok) {\n throw new Error(`AI request failed with status ${res.status}`);\n }\n if (!res.body) {\n throw new Error('AI request returned no response body');\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const streamLines = buffer.split('\\n');\n buffer = streamLines.pop() || '';\n\n for (const streamLine of streamLines) {\n const line = streamLine.trim();\n if (line === '' || line.startsWith(':')) continue;\n if (!line.startsWith('data: ')) {\n throw new Error(`Unexpected SSE line: ${line}`);\n }\n\n const payload = line.slice(6);\n if (payload === '[DONE]') continue;\n const event = expectObject(JSON.parse(payload), payload);\n const eventType = getRequiredStringField(event, 'type', payload);\n\n switch (eventType) {\n case 'start':\n case 'start-step':\n case 'finish-step':\n case 'finish':\n case 'message-metadata':\n case 'text-start':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n case 'source-url':\n case 'source-document':\n case 'file': {\n break;\n }\n case 'text-delta': {\n const delta = getRequiredStringField(event, 'delta', payload);\n appendTextDelta(delta);\n break;\n }\n case 'tool-input-start': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.state = 'running';\n toolCall.resultText = null;\n toolCall.errorText = null;\n toolCall.argsText = '';\n break;\n }\n case 'tool-input-delta': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const inputTextDelta = getRequiredStringField(event, 'inputTextDelta', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.argsText = (toolCall.argsText ?? '') + inputTextDelta;\n break;\n }\n case 'tool-input-available': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.argsText = stringifyForDebug(event.input);\n break;\n }\n case 'tool-input-error': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const errorText = getRequiredStringField(event, 'errorText', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.state = 'error';\n toolCall.errorText = errorText;\n toolCall.resultText = errorText;\n break;\n }\n case 'tool-output-available': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n const preliminary = event.preliminary === true;\n toolCall.resultText = stringifyForDebug(event.output);\n if (!preliminary) {\n toolCall.state = 'success';\n }\n break;\n }\n case 'tool-output-error': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const errorText = getRequiredStringField(event, 'errorText', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'error';\n toolCall.errorText = errorText;\n toolCall.resultText = errorText;\n break;\n }\n case 'tool-output-denied': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'error';\n toolCall.errorText = 'Tool output denied';\n toolCall.resultText = 'Tool output denied';\n break;\n }\n case 'tool-approval-request': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const approvalId = getRequiredStringField(event, 'approvalId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'running';\n toolCall.resultText = `Approval requested (${approvalId})`;\n break;\n }\n case 'abort': {\n const reason = typeof event.reason === 'string' ? event.reason : 'unknown reason';\n throw new Error(`AI stream aborted: ${reason}`);\n }\n case 'error': {\n throw new Error(\n typeof event.errorText === 'string'\n ? `AI stream error: ${event.errorText}`\n : `AI stream error event: ${payload}`\n );\n }\n default: {\n if (eventType.startsWith('data-')) {\n break;\n }\n throw new Error(`Unexpected AI stream event type: ${eventType}`);\n }\n }\n }\n\n renderMessages();\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n const assistantMessage = getCurrentAssistantMessage();\n if (assistantMessage.parts.length === 0) {\n assistantMessage.parts.push({ type: 'text', content: 'Stopped.' });\n }\n renderMessages();\n return;\n }\n\n const message = error instanceof Error ? error.message : 'Unknown AI stream error';\n const lastMessage = getLastItem(messages);\n if (lastMessage?.role === 'assistant') {\n lastMessage.parts = [{ type: 'text', content: message }];\n lastMessage.toolCallsById.clear();\n }\n renderMessages();\n alert(`AI stream failed: ${message}`);\n } finally {\n aiLoading = false;\n activeAiAbortController = null;\n renderMessages();\n renderInput();\n }\n }\n\n const inputWrapper = h('div', { className: 'sdt-ai-input-wrapper' });\n const input = h('input', {\n type: 'text',\n className: 'sdt-ai-input',\n placeholder: 'Ask anything about Hexclave...',\n autocomplete: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n }) as HTMLInputElement;\n const sendBtn = h('button', { className: 'sdt-ai-send-btn', title: 'Send' });\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n\n function renderInput() {\n input.disabled = false;\n input.placeholder = messages.length === 0 ? 'Ask anything about Hexclave...' : 'Ask a follow-up...';\n if (aiLoading) {\n sendBtn.classList.add('sdt-ai-send-btn-active');\n sendBtn.classList.add('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Stop');\n setHtml(sendBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/></svg>');\n } else if (input.value.trim()) {\n sendBtn.classList.add('sdt-ai-send-btn-active');\n sendBtn.classList.remove('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Send');\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n } else {\n sendBtn.classList.remove('sdt-ai-send-btn-active');\n sendBtn.classList.remove('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Send');\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n }\n }\n\n input.addEventListener('input', renderInput);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (aiLoading) {\n activeAiAbortController?.abort();\n } else {\n runAsynchronously(sendMessage(input.value));\n input.value = '';\n }\n renderInput();\n }\n });\n sendBtn.addEventListener('click', () => {\n if (aiLoading) {\n activeAiAbortController?.abort();\n } else {\n runAsynchronously(sendMessage(input.value));\n input.value = '';\n }\n renderInput();\n });\n\n const newChatBtn = h('button', { className: 'sdt-ai-new-chat', title: 'New conversation', style: { display: 'none' } });\n setHtml(newChatBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>');\n newChatBtn.addEventListener('click', () => {\n if (aiLoading) {\n activeAiAbortController?.abort();\n }\n messages.length = 0;\n input.value = '';\n renderMessages();\n renderInput();\n newChatBtn.style.display = 'none';\n });\n\n inputWrapper.append(input, sendBtn);\n inputArea.append(newChatBtn, inputWrapper);\n\n container.append(messagesArea, inputArea);\n renderMessages();\n renderInput();\n\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard tab\n// ---------------------------------------------------------------------------\n\nfunction createDashboardTab(app: StackClientApp<true>): HTMLElement {\n const dashboardUrl = resolveDashboardUrl(app);\n return createIframeTab(dashboardUrl, 'Hexclave Dashboard', 'Loading dashboard\\u2026', 'Unable to load dashboard', 'The dashboard may require authentication or block framing', 'Open in New Tab');\n}\n\n// ---------------------------------------------------------------------------\n// Support tab\n// ---------------------------------------------------------------------------\n\nfunction createSupportTab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-support-tab' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n\n function createFeedbackForm(): HTMLElement {\n const pane = h('div', { className: 'sdt-support-feedback-pane' });\n const form = h('form', { className: 'sdt-support-form' });\n\n let feedbackType: 'feedback' | 'bug' = 'feedback';\n let status: 'idle' | 'submitting' | 'success' | 'error' = 'idle';\n let errorMessage = '';\n\n const nameInput = h('input', { className: 'sdt-support-input', type: 'text', placeholder: 'Your name' }) as HTMLInputElement;\n const emailInput = h('input', { className: 'sdt-support-input', type: 'email', placeholder: 'you@example.com', required: 'true' }) as HTMLInputElement;\n const messageInput = h('textarea', { className: 'sdt-support-textarea', placeholder: \"What's on your mind?\", required: 'true', rows: '5' }) as HTMLTextAreaElement;\n\n function render() {\n form.innerHTML = '';\n\n if (status === 'success') {\n const successDiv = h('div', { className: 'sdt-support-status sdt-support-status-success' });\n const icon = h('div', { className: 'sdt-support-status-icon' });\n setHtml(icon, '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M6 10l3 3 5-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>');\n successDiv.append(\n icon,\n h('div', { className: 'sdt-support-status-title' }, 'Feedback sent'),\n h('div', { className: 'sdt-support-status-msg' }, \"Thank you! We'll get back to you soon.\"),\n );\n const resetBtn = h('button', { className: 'sdt-support-submit', style: { marginTop: '12px', width: 'auto' } }, 'Send another');\n resetBtn.addEventListener('click', () => {\n status = 'idle';\n render();\n });\n successDiv.appendChild(resetBtn);\n form.appendChild(successDiv);\n return;\n }\n\n if (status === 'error') {\n const errDiv = h('div', { className: 'sdt-support-status sdt-support-status-error' });\n const icon = h('div', { className: 'sdt-support-status-icon' });\n setHtml(icon, '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M10 6v5m0 3h.01\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');\n errDiv.append(\n icon,\n h('div', { className: 'sdt-support-status-title' }, 'Failed to send'),\n h('div', { className: 'sdt-support-status-msg' }, errorMessage || 'Please try again.'),\n );\n const retryBtn = h('button', { className: 'sdt-support-submit', style: { marginTop: '12px', width: 'auto' } }, 'Try again');\n retryBtn.addEventListener('click', () => {\n status = 'idle';\n errorMessage = '';\n render();\n });\n errDiv.appendChild(retryBtn);\n form.appendChild(errDiv);\n return;\n }\n\n const nameField = h('div', { className: 'sdt-support-field' });\n const nameLabel = h('label', { className: 'sdt-support-label' }, 'Name ');\n nameLabel.appendChild(h('span', { className: 'sdt-support-optional' }, 'optional'));\n nameField.append(nameLabel, nameInput);\n form.appendChild(nameField);\n\n const emailField = h('div', { className: 'sdt-support-field' });\n emailField.append(h('label', { className: 'sdt-support-label' }, 'Email'), emailInput);\n form.appendChild(emailField);\n\n const msgField = h('div', { className: 'sdt-support-field' });\n msgField.append(h('label', { className: 'sdt-support-label' }, feedbackType === 'bug' ? 'Description' : 'Message'), messageInput);\n messageInput.placeholder = feedbackType === 'bug' ? 'Steps to reproduce, expected vs. actual behavior\\u2026' : \"What's on your mind?\";\n form.appendChild(msgField);\n\n const typeCards = h('div', { className: 'sdt-support-type-cards' });\n const feedbackBtn = h('button', { type: 'button', className: `sdt-support-type-card ${feedbackType === 'feedback' ? 'sdt-support-type-card-active' : ''}` });\n setHtml(feedbackBtn, '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg><span>Feedback</span>');\n feedbackBtn.addEventListener('click', () => {\n feedbackType = 'feedback';\n render();\n });\n const bugBtn = h('button', { type: 'button', className: `sdt-support-type-card ${feedbackType === 'bug' ? 'sdt-support-type-card-active' : ''}` });\n setHtml(bugBtn, '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 2l1.88 1.88M14.12 3.88L16 2M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"/><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"/><path d=\"M12 20v-9M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M6 17H3M21 5c0 2.1-1.6 3.8-3.53 4M18 13h4M21 17h-3\"/></svg><span>Bug Report</span>');\n bugBtn.addEventListener('click', () => {\n feedbackType = 'bug';\n render();\n });\n typeCards.append(feedbackBtn, bugBtn);\n form.appendChild(typeCards);\n\n const submitBtn = h('button', { type: 'submit', className: 'sdt-support-submit' });\n setHtml(submitBtn, 'Submit <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/></svg>');\n submitBtn.disabled = status === 'submitting';\n form.appendChild(submitBtn);\n\n const channels = h('div', { className: 'sdt-support-channels' });\n channels.innerHTML = `\n <a href=\"https://discord.hexclave.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\"/></svg>\n <span>Discord</span>\n </a>\n <a href=\"mailto:team@hexclave.com\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>\n <span>Email</span>\n </a>\n <a href=\"https://github.com/hexclave/hexclave\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z\"/></svg>\n <span>GitHub</span>\n </a>`;\n form.appendChild(channels);\n form.insertBefore(channels, form.firstChild);\n }\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n if (!emailInput.value.trim() || !messageInput.value.trim()) return;\n runAsynchronously(async () => {\n status = 'submitting';\n render();\n try {\n const response = await fetch(`${apiBaseUrl}/api/latest/internal/feedback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({\n name: nameInput.value.trim() || undefined,\n email: emailInput.value.trim(),\n message: messageInput.value.trim(),\n feedback_type: feedbackType,\n }),\n });\n if (!response.ok) {\n throw new Error(`Failed to send: ${response.status} ${response.statusText}`);\n }\n const result = await response.json();\n if (!result.success) {\n throw new Error(result.message || 'Failed to send feedback');\n }\n status = 'success';\n messageInput.value = '';\n } catch (err: any) {\n status = 'error';\n errorMessage = err.message || 'An unexpected error occurred';\n }\n render();\n });\n });\n\n render();\n pane.appendChild(form);\n return pane;\n }\n\n container.appendChild(createFeedbackForm());\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Components tab\n// ---------------------------------------------------------------------------\n\nfunction createComponentsTab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-pg-layout' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n const urls = app.urls;\n const urlOptions: HandlerUrlOptions = app[hexclaveAppInternalsSymbol].getConstructorOptions().urls ?? {};\n\n const PAGE_ENTRIES: { key: keyof HandlerUrls; label: string }[] = [\n { key: 'signIn' as any, label: 'Sign-in' },\n { key: 'signUp' as any, label: 'Sign-up' },\n { key: 'forgotPassword' as any, label: 'Forgot password' },\n { key: 'passwordReset' as any, label: 'Password reset' },\n { key: 'emailVerification' as any, label: 'Email verification' },\n { key: 'accountSettings' as any, label: 'Account settings' },\n { key: 'teamInvitation' as any, label: 'Team invitation' },\n { key: 'cliAuthConfirm' as any, label: 'CLI auth confirmation' },\n { key: 'mfa' as any, label: 'MFA' },\n { key: 'onboarding' as any, label: 'Onboarding' },\n { key: 'error' as any, label: 'Error' },\n ];\n\n type PageClassification = 'handler-component' | 'hosted' | 'custom';\n\n function classifyPage(key: keyof HandlerUrls): { classification: PageClassification; version: number | null } {\n const target: HandlerUrlTarget = (urlOptions as any)[key] ?? (urlOptions as any).default ?? { type: 'handler-component' };\n if (typeof target === 'string') {\n return { classification: 'custom', version: null };\n }\n if ('type' in target) {\n if (target.type === 'custom') {\n return { classification: 'custom', version: (target as any).version ?? null };\n }\n return { classification: target.type as PageClassification, version: null };\n }\n return { classification: 'handler-component', version: null };\n }\n\n type PageInfo = {\n key: keyof HandlerUrls;\n label: string;\n url: string;\n classification: PageClassification;\n version: number | null;\n versionStatus: string;\n versionChangelogs: { version: number; changelog: string }[];\n };\n\n let latestVersions: Map<string, { version: number; changelogs: Record<number, string> }> | null = null;\n let selectedKey: string | null = null;\n\n runAsynchronously(\n fetch(`${apiBaseUrl}/api/latest/internal/component-versions`)\n .then((r) => r.json())\n .then((data) => {\n latestVersions = new Map(Object.entries(data.versions ?? {}));\n renderSidebar();\n })\n .catch(() => {})\n );\n\n function buildPages(): PageInfo[] {\n return PAGE_ENTRIES.map((entry) => {\n const { classification, version } = classifyPage(entry.key);\n let versionStatus = 'current';\n let versionChangelogs: { version: number; changelog: string }[] = [];\n\n if (classification === 'custom' && version != null && latestVersions) {\n const info = latestVersions.get(entry.key as string);\n if (info && version < info.version) {\n versionStatus = 'outdated';\n versionChangelogs = Object.entries(info.changelogs)\n .map(([v, cl]) => ({ version: Number(v), changelog: cl }))\n .filter((e) => e.version > version)\n .sort((a, b) => a.version - b.version);\n }\n }\n\n return {\n key: entry.key,\n label: entry.label,\n url: (urls as any)[entry.key] || '',\n classification,\n version,\n versionStatus,\n versionChangelogs,\n };\n });\n }\n\n function getCompactUrl(url: string): string {\n const resolved = new URL(url, window.location.origin);\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n }\n\n const sidebar = h('div', { className: 'sdt-pg-sidebar' });\n const mainArea = h('div', { className: 'sdt-pg-main' });\n\n function renderSidebar() {\n sidebar.innerHTML = '';\n const pages = buildPages();\n const outdatedCount = pages.filter((p) => p.versionStatus === 'outdated').length;\n\n const head = h('div', { className: 'sdt-pg-sidebar-head' });\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-title' }, 'Pages'));\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-count' }, String(pages.length)));\n if (outdatedCount > 0) {\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-warn' }, `${outdatedCount} outdated`));\n }\n sidebar.appendChild(head);\n\n const list = h('div', { className: 'sdt-pg-list' });\n for (const page of pages) {\n const isOutdated = page.versionStatus === 'outdated';\n const item = h('div', {\n className: `sdt-pg-item ${isOutdated ? 'sdt-pg-item-warn' : ''}`,\n 'data-selected': String(selectedKey === page.key),\n });\n const dotClass = isOutdated\n ? 'sdt-pg-item-dot-warn'\n : page.classification === 'custom'\n ? 'sdt-pg-item-dot-custom'\n : 'sdt-pg-item-dot-handler';\n item.appendChild(h('span', { className: `sdt-pg-item-dot ${dotClass}` }));\n item.appendChild(h('span', { className: 'sdt-pg-item-label' }, page.label));\n if (isOutdated) {\n item.appendChild(h('span', { className: 'sdt-pg-badge sdt-pg-badge-outdated' }, 'Outdated'));\n }\n item.addEventListener('click', () => {\n selectedKey = page.key as string;\n renderSidebar();\n renderDetail(page);\n });\n list.appendChild(item);\n }\n sidebar.appendChild(list);\n }\n\n function renderDetail(page: PageInfo) {\n mainArea.innerHTML = '';\n const detail = h('div', { className: 'sdt-pg-detail' });\n\n const header = h('div', { className: 'sdt-pg-header' });\n const headerTop = h('div', { className: 'sdt-pg-header-top' });\n headerTop.appendChild(h('h3', { className: 'sdt-pg-title' }, `${page.label} Page`));\n headerTop.appendChild(h('a', { href: page.url, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-pg-title-url' }, getCompactUrl(page.url)));\n if (page.versionStatus === 'outdated') {\n headerTop.appendChild(h('span', { className: 'sdt-pg-badge sdt-pg-badge-outdated' }, 'Outdated'));\n }\n header.appendChild(headerTop);\n\n const redirectMethod = `hexclaveApp.redirectTo${(page.key as string).charAt(0).toUpperCase()}${(page.key as string).slice(1)}()`;\n const codeRow = h('div', { className: 'sdt-pg-code-inline' });\n codeRow.appendChild(h('code', { className: 'sdt-pg-code' }, redirectMethod));\n const openBtn = h('button', { className: 'sdt-pg-copy-btn sdt-pg-open-btn' });\n setHtml(openBtn, 'Open <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 17L17 7\"/><path d=\"M7 7h10v10\"/></svg>');\n openBtn.addEventListener('click', () => {\n const resolved = new URL(page.url, window.location.origin);\n window.open(resolved.toString(), '_blank', 'noopener,noreferrer');\n });\n codeRow.appendChild(openBtn);\n header.appendChild(codeRow);\n detail.appendChild(header);\n\n const prompt = getPagePrompt(page.key as string, page.version ?? undefined);\n if (prompt) {\n const isOutdated = page.versionStatus === 'outdated';\n const showPrompt = page.classification === 'handler-component' || page.classification === 'hosted' || isOutdated;\n if (showPrompt) {\n let promptText: string;\n if (isOutdated && prompt.upgradePrompt) {\n promptText = prompt.upgradePrompt;\n } else if (prompt.fullPrompt) {\n promptText = prompt.fullPrompt;\n } else {\n promptText = '';\n }\n\n if (promptText) {\n const section = h('div', { className: 'sdt-pg-section' });\n section.appendChild(h('div', { className: 'sdt-pg-section-label' }, isOutdated ? 'Use this prompt to upgrade your component:' : 'Want to customize this page? Paste this prompt into your coding agent.'));\n section.appendChild(h('pre', { className: 'sdt-pg-pre' }, promptText));\n const footer = h('div', { className: 'sdt-pg-section-footer' });\n const copyBtn = h('button', { className: 'sdt-pg-copy-btn' }, 'Copy prompt');\n copyBtn.addEventListener('click', () => {\n runAsynchronously(navigator.clipboard.writeText(promptText).then(() => {\n copyBtn.textContent = '\\u2713 Copied';\n setTimeout(() => {\n copyBtn.textContent = 'Copy prompt';\n }, 1500);\n }));\n });\n footer.appendChild(copyBtn);\n section.appendChild(footer);\n detail.appendChild(section);\n }\n }\n }\n\n mainArea.appendChild(detail);\n }\n\n function renderEmptyMain() {\n mainArea.innerHTML = '';\n const empty = h('div', { className: 'sdt-pg-empty' });\n const icon = h('div', { className: 'sdt-pg-empty-icon' });\n setHtml(icon, '<svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/></svg>');\n empty.appendChild(icon);\n empty.appendChild(h('div', { className: 'sdt-pg-empty-text' }, 'Select a page to inspect'));\n empty.appendChild(h('div', { className: 'sdt-pg-empty-sub' }, 'View configuration, preview, and upgrade prompts'));\n mainArea.appendChild(empty);\n }\n\n renderSidebar();\n renderEmptyMain();\n\n container.append(sidebar, mainArea);\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Panel (main shell with tab bar and content area)\n// ---------------------------------------------------------------------------\n\nfunction createPanel(\n app: StackClientApp<true>,\n state: ReturnType<typeof createStateStore>,\n logStore: LogStore,\n onClose: () => void,\n): { element: HTMLElement, cleanup: () => void } {\n const panel = h('div', { className: 'sdt-panel' });\n let panelAnimationTimeout: ReturnType<typeof setTimeout> | null = null;\n\n function animateNextPanelGeometryChange() {\n panel.classList.add('sdt-panel-geometry-animated');\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n }\n panelAnimationTimeout = setTimeout(() => {\n panel.classList.remove('sdt-panel-geometry-animated');\n panelAnimationTimeout = null;\n }, 220);\n }\n\n function applyPanelMode(tabId: TabId, opts?: { animate?: boolean }) {\n if (opts?.animate === true) {\n animateNextPanelGeometryChange();\n }\n\n if (tabId === 'dashboard') {\n panel.classList.add('sdt-panel-fullscreen');\n panel.style.width = '';\n panel.style.height = '';\n return;\n }\n\n panel.classList.remove('sdt-panel-fullscreen');\n panel.style.width = state.get().panelWidth + 'px';\n panel.style.height = state.get().panelHeight + 'px';\n }\n\n const tabs = getTabsForApp(app);\n const storedActiveTab = state.get().activeTab;\n const activeTab = tabs.some((tab) => tab.id === storedActiveTab) ? storedActiveTab : DEFAULT_STATE.activeTab;\n\n applyPanelMode(activeTab);\n\n const inner = h('div', { className: 'sdt-panel-inner' });\n\n const closeBtn = h('button', { className: 'sdt-close-btn', 'aria-label': 'Close' });\n setHtml(closeBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"3\" y1=\"3\" x2=\"11\" y2=\"11\"/><line x1=\"11\" y1=\"3\" x2=\"3\" y2=\"11\"/></svg>');\n closeBtn.addEventListener('click', onClose);\n\n const docsLink = h('a', { href: DOCS_URL, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-docs-link' });\n docsLink.appendChild(document.createTextNode('Docs'));\n const docsIcon = h('span', { className: 'sdt-docs-link-icon', 'aria-hidden': 'true' });\n setHtml(docsIcon, '<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 17L17 7\"/><path d=\"M7 7h10v10\"/></svg>');\n docsLink.appendChild(docsIcon);\n\n const trailingControls = h('div', { className: 'sdt-tabbar-actions' }, docsLink, closeBtn);\n\n const tabBar = createTabBar(tabs, activeTab, (id) => {\n state.update({ activeTab: id as TabId });\n applyPanelMode(id as TabId, { animate: true });\n showTab(id as TabId);\n }, { trailing: trailingControls });\n inner.appendChild(tabBar.el);\n\n const content = h('div', { className: 'sdt-content' });\n const layers = h('div', { className: 'sdt-tab-layers' });\n content.appendChild(layers);\n inner.appendChild(content);\n\n const mountedPanes = new Map<TabId, HTMLElement>();\n const cleanups: Array<() => void> = [];\n\n function mountTab(pane: HTMLElement, result: TabResult | HTMLElement) {\n if ('element' in result) {\n pane.appendChild(result.element);\n if (result.cleanup) {\n cleanups.push(result.cleanup);\n }\n } else {\n pane.appendChild(result);\n }\n }\n\n function getOrCreatePane(tabId: TabId): HTMLElement {\n if (mountedPanes.has(tabId)) {\n return mountedPanes.get(tabId)!;\n }\n const pane = h('div', { className: 'sdt-tab-pane' });\n if (tabId === 'dashboard') {\n pane.classList.add('sdt-tab-pane-iframe');\n }\n switch (tabId) {\n case 'overview': {\n mountTab(pane, createOverviewTab(app));\n break;\n }\n case 'customize': {\n mountTab(pane, createComponentsTab(app));\n break;\n }\n case 'ai': {\n mountTab(pane, createAITab(app));\n break;\n }\n case 'console': {\n mountTab(pane, createConsoleTab(logStore));\n break;\n }\n case 'dashboard': {\n mountTab(pane, createDashboardTab(app));\n break;\n }\n case 'support': {\n mountTab(pane, createSupportTab(app));\n break;\n }\n }\n mountedPanes.set(tabId, pane);\n layers.appendChild(pane);\n return pane;\n }\n\n function showTab(tabId: TabId) {\n const pane = getOrCreatePane(tabId);\n tabBar.setActive(tabId);\n for (const [, p] of mountedPanes) {\n p.classList.remove('sdt-tab-pane-active');\n }\n pane.classList.add('sdt-tab-pane-active');\n }\n\n showTab(activeTab);\n\n function addResizeHandle(edge: 'top' | 'left' | 'top-left') {\n const handle = h('div', { className: `sdt-resize-handle sdt-resize-${edge}` });\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n handle.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n panelAnimationTimeout = null;\n }\n panel.classList.remove('sdt-panel-geometry-animated');\n handle.setPointerCapture(e.pointerId);\n startX = e.clientX;\n startY = e.clientY;\n startW = panel.offsetWidth;\n startH = panel.offsetHeight;\n });\n\n handle.addEventListener('pointermove', (e) => {\n if (!handle.hasPointerCapture(e.pointerId)) return;\n const dx = startX - e.clientX;\n const dy = startY - e.clientY;\n if (edge === 'left' || edge === 'top-left') {\n const newW = Math.max(400, Math.min(startW + dx, window.innerWidth - 32));\n panel.style.width = newW + 'px';\n }\n if (edge === 'top' || edge === 'top-left') {\n const newH = Math.max(300, Math.min(startH + dy, window.innerHeight - 80));\n panel.style.height = newH + 'px';\n }\n });\n\n handle.addEventListener('pointerup', (e) => {\n handle.releasePointerCapture(e.pointerId);\n state.update({ panelWidth: panel.offsetWidth, panelHeight: panel.offsetHeight });\n });\n\n panel.appendChild(handle);\n }\n\n addResizeHandle('top');\n addResizeHandle('left');\n addResizeHandle('top-left');\n\n panel.appendChild(inner);\n return {\n element: panel,\n cleanup: () => {\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n }\n for (const fn of cleanups) fn();\n },\n };\n}\n\n// ===========================================================================================\n// Main entry point\n// ===========================================================================================\n\nexport function createDevTool(app: StackClientApp<true>): () => void {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return () => {};\n }\n const body = Reflect.get(document, 'body');\n if (!hasAppendChild(body)) return () => {};\n\n getGlobalDevToolInstance()?.cleanup();\n let existingRoot = document.getElementById(ROOT_ID);\n while (existingRoot !== null) {\n existingRoot.remove();\n existingRoot = document.getElementById(ROOT_ID);\n }\n\n const root = document.createElement('div');\n root.id = ROOT_ID;\n body.appendChild(root);\n\n const wrapper = h('div', { className: 'hexclave-devtool' });\n root.appendChild(wrapper);\n\n const style = document.createElement('style');\n style.textContent = devToolCSS;\n wrapper.appendChild(style);\n\n const state = createStateStore();\n const logStore = getGlobalLogStore();\n\n let panel: { element: HTMLElement, cleanup: () => void } | null = null;\n\n function closePanelAndPersistClosed() {\n closePanel();\n }\n\n function openPanel() {\n if (panel) return;\n panel = createPanel(app, state, logStore, closePanelAndPersistClosed);\n wrapper.appendChild(panel.element);\n }\n\n function closePanel() {\n if (!panel) return;\n state.update({ isOpen: false });\n const closing = panel;\n panel = null;\n closing.cleanup();\n closing.element.classList.add('sdt-panel-exiting');\n setTimeout(() => {\n if (wrapper.contains(closing.element)) {\n wrapper.removeChild(closing.element);\n }\n }, 150);\n }\n\n function togglePanel() {\n if (state.get().isOpen) {\n closePanel();\n } else {\n state.update({ isOpen: true });\n openPanel();\n }\n }\n\n const trigger = createTrigger(togglePanel);\n wrapper.appendChild(trigger.element);\n\n if (state.get().isOpen) {\n openPanel();\n }\n\n const removeRequestListener = app[hexclaveAppInternalsSymbol].addRequestListener((entry: RequestLogEntry) => {\n const timestamp = Date.now();\n logStore.addApiLog({\n id: nextId(),\n timestamp,\n method: entry.method,\n url: entry.path,\n status: entry.status,\n duration: entry.duration,\n error: entry.error,\n });\n if (entry.error) {\n logStore.addEventLog({ id: nextId(), timestamp, type: 'error', message: `Network error on ${entry.method} ${entry.path}: ${entry.error}` });\n } else if (entry.status && entry.status >= 400) {\n logStore.addEventLog({ id: nextId(), timestamp, type: 'error', message: `API error ${entry.status} on ${entry.method} ${entry.path}` });\n }\n });\n\n let didCleanup = false;\n const instance: DevToolGlobalInstance = {\n cleanup: () => {\n if (didCleanup) return;\n didCleanup = true;\n if (getGlobalDevToolInstance() === instance) {\n setGlobalDevToolInstance(null);\n }\n trigger.cleanup();\n removeRequestListener();\n panel?.cleanup();\n if (root.parentNode) {\n root.parentNode.removeChild(root);\n }\n },\n };\n setGlobalDevToolInstance(instance);\n\n return () => {\n instance.cleanup();\n };\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-tool-core.js","names":[],"sources":["../../../src/dev-tool/dev-tool-core.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport type { RequestLogEntry } from \"@hexclave/shared/dist/interface/client-interface\";\nimport { DEV_TOOL_ROOT_ID } from \"@hexclave/shared/dist/utils/dev-tool\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { isLocalhost } from \"@hexclave/shared/dist/utils/urls\";\nimport type { StackClientApp } from \"../lib/hexclave-app\";\nimport { envVars } from \"../generated/env\";\nimport { getGlobalUiInstance, h, hasAppendChild, setGlobalUiInstance, setHtml, type UiGlobalInstance } from \"../in-page-ui/dom\";\nimport { getBaseUrl } from \"../lib/hexclave-app/apps/implementations/common\";\nimport type { HandlerUrlOptions, HandlerUrls, HandlerUrlTarget } from \"../lib/hexclave-app/common\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app/common\";\nimport { getPagePrompt } from \"../lib/hexclave-app/url-targets\";\nimport { devToolCSS } from \"./dev-tool-styles\";\nimport type { TriggerCorner, TriggerPlacement } from \"./dev-tool-trigger-position\";\nimport { clampTriggerPosition, getSnappedTriggerPlacement, resolveTriggerPosition } from \"./dev-tool-trigger-position\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TabId = 'overview' | 'customize' | 'ai' | 'dashboard' | 'console' | 'support';\n\ntype TabResult = { element: HTMLElement, cleanup?: () => void };\n\ntype ApiLogEntry = {\n id: string;\n timestamp: number;\n method: string;\n url: string;\n status?: number;\n duration?: number;\n error?: string;\n};\n\ntype EventLogEntry = {\n id: string;\n timestamp: number;\n type: 'error' | 'info';\n message: string;\n};\n\ntype DevToolState = {\n isOpen: boolean;\n activeTab: TabId;\n panelWidth: number;\n panelHeight: number;\n};\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n// Hexclave rebrand: UI-only local prefs — straight rename (one-time reset is harmless)\nconst STORAGE_KEY = '__hexclave-dev-tool-state';\nconst TRIGGER_POS_KEY = 'hexclave-devtool-trigger-position';\nconst ROOT_ID = DEV_TOOL_ROOT_ID;\nconst GLOBAL_INSTANCE_KEY = '__hexclave-dev-tool-instance';\nconst MAX_LOG_ENTRIES = 500;\nconst CONSOLE_LOG_BATCH_SIZE = 100;\nconst DRAG_THRESHOLD = 5;\nconst DOCS_URL = 'https://docs.hexclave.com';\n\nconst TABS: { id: TabId; label: string; icon: string }[] = [\n { id: 'overview', label: 'Overview', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></svg>' },\n { id: 'customize', label: 'Customize', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/></svg>' },\n { id: 'ai', label: 'AI', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>' },\n { id: 'console', label: 'Console', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 17 10 11 4 5\"/><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"/></svg>' },\n { id: 'dashboard', label: 'Dashboard', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M9 21V9\"/></svg>' },\n { id: 'support', label: 'Support', icon: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>' },\n];\n\n// Clickmaps is intentionally NOT a dev tool tab or feature. It's a fully\n// independent module (see src/clickmap) with its own mount, root element, and\n// styles, so the dev tool can be changed or removed without affecting it.\n\nconst DEFAULT_STATE: DevToolState = {\n isOpen: false,\n activeTab: 'overview',\n panelWidth: 800,\n panelHeight: 520,\n};\n\n// Hexclave mark — hexagon outline with three radial bars, monochrome via currentColor\n// so it inherits the trigger logo's color. Sourced from apps/dashboard/public/hexclave-icon.svg\n// (gradient + glow stripped; this is a tiny trigger glyph, not the full brand mark).\nconst HEXCLAVE_LOGO_SVG = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linejoin=\"miter\"><path d=\"M 24 4 L 41.32 14 L 41.32 34 L 24 44 L 6.68 34 L 6.68 14 Z\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(120 24 24)\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(240 24 24)\"/></svg>';\n\n// ---------------------------------------------------------------------------\n// State management\n// ---------------------------------------------------------------------------\n\nfunction loadState(): DevToolState {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n // Migrate old 'components' tab name to 'customize'\n if (parsed.activeTab === 'components') parsed.activeTab = 'customize';\n if (parsed.activeTab === 'docs') parsed.activeTab = 'overview';\n return { ...DEFAULT_STATE, ...parsed, isOpen: false };\n }\n } catch {}\n return { ...DEFAULT_STATE };\n}\n\nfunction saveState(state: DevToolState) {\n try {\n // Keep layout preferences across pages, but do not reopen the panel automatically on remount.\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...state, isOpen: false }));\n } catch {}\n}\n\nfunction createStateStore() {\n let state = loadState();\n const listeners = new Set<() => void>();\n\n return {\n get: () => state,\n update(partial: Partial<DevToolState>) {\n state = { ...state, ...partial };\n saveState(state);\n listeners.forEach((fn) => fn());\n },\n subscribe(fn: () => void) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Global log store (survives remounts, shared across instances)\n// ---------------------------------------------------------------------------\n\ntype LogStore = {\n apiLogs: ApiLogEntry[];\n eventLogs: EventLogEntry[];\n listeners: Set<() => void>;\n addApiLog(entry: ApiLogEntry): void;\n addEventLog(entry: EventLogEntry): void;\n clear(): void;\n subscribe(fn: () => void): () => void;\n};\n\nfunction getGlobalLogStore(): LogStore {\n const g = globalThis as any;\n if (!g.__STACK_DEV_TOOL_LOG_STORE__) {\n g.__STACK_DEV_TOOL_LOG_STORE__ = {\n apiLogs: [] as ApiLogEntry[],\n eventLogs: [] as EventLogEntry[],\n listeners: new Set<() => void>(),\n addApiLog(entry: ApiLogEntry) {\n this.apiLogs = [entry, ...this.apiLogs].slice(0, MAX_LOG_ENTRIES);\n this.listeners.forEach((fn: () => void) => fn());\n },\n addEventLog(entry: EventLogEntry) {\n this.eventLogs = [entry, ...this.eventLogs].slice(0, MAX_LOG_ENTRIES);\n this.listeners.forEach((fn: () => void) => fn());\n },\n clear() {\n this.apiLogs = [];\n this.eventLogs = [];\n this.listeners.forEach((fn: () => void) => fn());\n },\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n },\n };\n }\n return g.__STACK_DEV_TOOL_LOG_STORE__;\n}\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\nlet _idCounter = 0;\nfunction nextId() {\n return `sdt-${++_idCounter}-${Date.now()}`;\n}\n\nfunction resolveApiBaseUrl(app: StackClientApp<true>): string {\n const opts = app[hexclaveAppInternalsSymbol].getConstructorOptions();\n return getBaseUrl(opts.baseUrl);\n}\n\nfunction shouldShowDashboardTab(app: StackClientApp<true>): boolean {\n return envVars.HEXCLAVE_IS_LOCAL_EMULATOR === \"true\" && isLocalhost(resolveApiBaseUrl(app));\n}\n\nfunction getTabsForApp(app: StackClientApp<true>): { id: TabId; label: string; icon: string }[] {\n if (shouldShowDashboardTab(app)) {\n return TABS;\n }\n return TABS.filter((tab) => tab.id !== 'dashboard');\n}\n\nfunction deriveDashboardBaseUrl(apiBaseUrl: string): string {\n try {\n const url = new URL(apiBaseUrl);\n if (url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]') {\n const port = url.port;\n if (port && port.endsWith('02')) {\n url.port = port.slice(0, -2) + '01';\n }\n return url.origin;\n }\n if (url.hostname.startsWith('api.')) {\n url.hostname = 'app.' + url.hostname.slice(4);\n return url.origin;\n }\n return url.origin;\n } catch {\n return 'https://app.hexclave.com';\n }\n}\n\nfunction resolveDashboardUrl(app: StackClientApp<true>): string {\n const base = deriveDashboardBaseUrl(resolveApiBaseUrl(app));\n return `${base}/projects/${encodeURIComponent(app.projectId)}`;\n}\n\nfunction formatTimestamp(ts: number): string {\n return new Date(ts).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: 3,\n } as any);\n}\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction generateRandomEmail(): string {\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\n let id = '';\n for (let i = 0; i < 8; i++) {\n id += chars[Math.floor(Math.random() * chars.length)];\n }\n return `dev-${id}@test.hexclave.com`;\n}\n\n// ---------------------------------------------------------------------------\n// DOM helpers\n// ---------------------------------------------------------------------------\n\nfunction parseMarkdownImage(line: string): { alt: string, src: string } | null {\n const match = line.trim().match(/^!\\[([^\\]]*)\\]\\((.+)\\)$/);\n if (!match) return null;\n\n const [, alt, src] = match;\n const normalizedSrc = src.trim();\n if (normalizedSrc === '') return null;\n\n return {\n alt: alt.trim(),\n src: normalizedSrc,\n };\n}\n\nfunction appendInlineMarkdown(container: HTMLElement, text: string) {\n const tokenPattern = /(\\[[^\\]]+\\]\\([^)]+\\)|`[^`\\n]+`|\\*\\*[^*\\n]+\\*\\*|__[^_\\n]+__|\\*[^*\\n]+\\*|_[^_\\n]+_)/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = tokenPattern.exec(text)) !== null) {\n if (match.index > lastIndex) {\n container.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\n }\n\n const token = match[0];\n if (token.startsWith(\"`\")) {\n container.appendChild(h(\"code\", { className: \"sdt-ai-inline-code\" }, token.slice(1, -1)));\n } else if (token.startsWith(\"**\") || token.startsWith(\"__\")) {\n const bold = h(\"strong\", { className: \"sdt-ai-bold\" });\n appendInlineMarkdown(bold, token.slice(2, -2));\n container.appendChild(bold);\n } else if (token.startsWith(\"*\") || token.startsWith(\"_\")) {\n const italic = h(\"em\");\n appendInlineMarkdown(italic, token.slice(1, -1));\n container.appendChild(italic);\n } else {\n const linkMatch = token.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n if (linkMatch) {\n const [, linkText, href] = linkMatch;\n const trimmedHref = href.trim();\n if (/^(https?:\\/\\/|mailto:)/i.test(trimmedHref)) {\n const link = h(\"a\", {\n className: \"sdt-ai-link\",\n href: trimmedHref,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n });\n appendInlineMarkdown(link, linkText);\n container.appendChild(link);\n } else {\n container.appendChild(document.createTextNode(token));\n }\n } else {\n container.appendChild(document.createTextNode(token));\n }\n }\n\n lastIndex = tokenPattern.lastIndex;\n }\n\n if (lastIndex < text.length) {\n container.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Trigger button (draggable pill — corner-snapping, icon only)\n// ---------------------------------------------------------------------------\n\nfunction createTrigger(onClick: () => void): { element: HTMLElement; cleanup: () => void } {\n type Position = { left: number; top: number };\n type Placement = TriggerPlacement;\n\n // Measured lazily after the element is appended to the DOM.\n let triggerSize = { width: 36, height: 36 };\n\n function isPosition(value: unknown): value is Position {\n if (typeof value !== 'object' || value === null) return false;\n return typeof Reflect.get(value, 'left') === 'number' && typeof Reflect.get(value, 'top') === 'number';\n }\n\n function isPlacement(value: unknown): value is Placement {\n if (typeof value !== 'object' || value === null) return false;\n const corner = Reflect.get(value, 'corner');\n return ['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(String(corner));\n }\n\n function loadPlacement(): Placement | null {\n try {\n const raw = localStorage.getItem(TRIGGER_POS_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n\n if (isPlacement(parsed)) return parsed;\n\n // Migrate old side-based placement { side, offset } to nearest corner.\n if (typeof parsed === 'object' && parsed !== null && 'side' in parsed && 'offset' in parsed) {\n const side = String(Reflect.get(parsed, 'side'));\n const offset = Number(Reflect.get(parsed, 'offset'));\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let corner: TriggerCorner;\n if (side === 'right') corner = offset < vh / 2 ? 'top-right' : 'bottom-right';\n else if (side === 'left') corner = offset < vh / 2 ? 'top-left' : 'bottom-left';\n else if (side === 'top') corner = offset < vw / 2 ? 'top-left' : 'top-right';\n else corner = offset < vw / 2 ? 'bottom-left' : 'bottom-right';\n return { corner };\n }\n\n // Migrate old absolute position.\n if (isPosition(parsed)) {\n return getSnappedTriggerPlacement(parsed, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n }\n } catch {}\n return null;\n }\n\n function savePlacement(placement: Placement) {\n try {\n localStorage.setItem(TRIGGER_POS_KEY, JSON.stringify(placement));\n } catch {}\n }\n\n let animationTimeout: number | null = null;\n\n function setPositionAnimation(isAnimated: boolean) {\n if (animationTimeout !== null) {\n window.clearTimeout(animationTimeout);\n animationTimeout = null;\n }\n btn.classList.toggle('sdt-trigger-position-animated', isAnimated);\n if (isAnimated) {\n animationTimeout = window.setTimeout(() => {\n animationTimeout = null;\n btn.classList.remove('sdt-trigger-position-animated');\n }, 180);\n }\n }\n\n function applyPos(nextPos: Position, options?: { animate?: boolean }) {\n setPositionAnimation(options?.animate === true);\n pos = nextPos;\n btn.style.left = pos.left + 'px';\n btn.style.top = pos.top + 'px';\n }\n\n const btn = h('button', {\n className: 'sdt-trigger',\n 'aria-label': 'Toggle Hexclave Dev Tools',\n 'data-hexclave-devtool-trigger': 'true',\n title: 'Hexclave Dev Tools',\n });\n const logoSpan = h('span', { className: 'sdt-trigger-logo' });\n setHtml(logoSpan, HEXCLAVE_LOGO_SVG);\n btn.appendChild(logoSpan);\n\n let placement = loadPlacement() ?? { corner: 'bottom-right' as TriggerCorner };\n let pos = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n applyPos(pos);\n\n let dragState: { startX: number; startY: number; startLeft: number; startTop: number; didDrag: boolean } | null = null;\n\n // After mount, measure the actual rendered size and re-snap if needed.\n requestAnimationFrame(() => {\n const rect = btn.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n triggerSize = { width: rect.width, height: rect.height };\n const measured = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n if (measured.left !== pos.left || measured.top !== pos.top) {\n applyPos(measured, { animate: true });\n }\n }\n });\n\n btn.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n setPositionAnimation(false);\n btn.setPointerCapture(e.pointerId);\n dragState = { startX: e.clientX, startY: e.clientY, startLeft: pos.left, startTop: pos.top, didDrag: false };\n });\n\n btn.addEventListener('pointermove', (e) => {\n if (!dragState) return;\n const dx = e.clientX - dragState.startX;\n const dy = e.clientY - dragState.startY;\n if (!dragState.didDrag && Math.abs(dx) + Math.abs(dy) < DRAG_THRESHOLD) return;\n dragState.didDrag = true;\n applyPos(clampTriggerPosition(\n { left: dragState.startLeft + dx, top: dragState.startTop + dy },\n triggerSize,\n { width: window.innerWidth, height: window.innerHeight },\n ));\n });\n\n btn.addEventListener('pointerup', (e) => {\n const ds = dragState;\n dragState = null;\n if (!ds) return;\n btn.releasePointerCapture(e.pointerId);\n if (ds.didDrag) {\n placement = getSnappedTriggerPlacement(pos, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n applyPos(resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight }), { animate: true });\n savePlacement(placement);\n } else {\n onClick();\n }\n });\n\n // On viewport resize, reapply the existing corner placement to the new dimensions.\n // Placement (corner) only changes when the user drags.\n function onResize() {\n const resizedPos = resolveTriggerPosition(placement, triggerSize, { width: window.innerWidth, height: window.innerHeight });\n if (resizedPos.left !== pos.left || resizedPos.top !== pos.top) {\n applyPos(resizedPos, { animate: true });\n }\n }\n\n window.addEventListener('resize', onResize);\n\n return {\n element: btn,\n cleanup: () => {\n if (animationTimeout !== null) {\n window.clearTimeout(animationTimeout);\n }\n window.removeEventListener('resize', onResize);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tab bar with sliding indicator\n// ---------------------------------------------------------------------------\n\nfunction createTabBar(\n tabs: { id: string; label: string; icon?: string }[],\n activeTab: string,\n onTabChange: (id: string) => void,\n opts?: { variant?: 'bar' | 'pills'; trailing?: HTMLElement },\n): { el: HTMLElement; setActive: (id: string) => void } {\n const variant = opts?.variant ?? 'bar';\n const barClass = variant === 'pills' ? 'sdt-console-tabs' : 'sdt-tabbar';\n const tabClass = variant === 'pills' ? 'sdt-console-tab' : 'sdt-tab';\n const indicatorClass = variant === 'pills' ? 'sdt-console-tab-indicator' : 'sdt-tab-indicator';\n\n const bar = h('div', { className: barClass });\n const indicator = h('div', { className: indicatorClass });\n indicator.style.opacity = '0';\n bar.appendChild(indicator);\n\n let current = activeTab;\n let isInitial = true;\n\n const buttons = tabs.map((tab) => {\n const btn = h('button', {\n className: tabClass,\n 'data-tab-id': tab.id,\n 'data-active': String(tab.id === activeTab),\n });\n if (tab.icon) {\n const iconSpan = h('span', { className: 'sdt-tab-icon' });\n setHtml(iconSpan, tab.icon);\n btn.appendChild(iconSpan);\n }\n btn.appendChild(document.createTextNode(tab.label));\n btn.addEventListener('click', () => onTabChange(tab.id));\n bar.appendChild(btn);\n return btn;\n });\n\n if (variant === 'bar') {\n bar.appendChild(h('div', { className: 'sdt-tabbar-spacer' }));\n }\n if (opts?.trailing) {\n bar.appendChild(opts.trailing);\n }\n\n function measure() {\n const btn = bar.querySelector<HTMLElement>(`[data-tab-id=\"${current}\"]`);\n if (!btn) return;\n indicator.style.transform = `translateX(${btn.offsetLeft}px)`;\n indicator.style.width = btn.offsetWidth + 'px';\n indicator.style.height = btn.offsetHeight + 'px';\n indicator.style.opacity = '1';\n indicator.style.transition = isInitial ? 'none' : '';\n isInitial = false;\n }\n\n const ro = new ResizeObserver(measure);\n ro.observe(bar);\n requestAnimationFrame(measure);\n\n function setActive(id: string) {\n current = id;\n buttons.forEach((btn) => {\n const tabId = btn.getAttribute('data-tab-id');\n btn.setAttribute('data-active', String(tabId === id));\n });\n measure();\n }\n\n return { el: bar, setActive };\n}\n\n// ---------------------------------------------------------------------------\n// Iframe helper\n// ---------------------------------------------------------------------------\n\nfunction createIframeTab(src: string, title: string, loadingMsg = 'Loading\\u2026', errorMsg = 'Unable to load content', errorDetail?: string, openExternallyLabel?: string): HTMLElement {\n const container = h('div', { className: 'sdt-iframe-container' });\n if (openExternallyLabel != null) {\n container.appendChild(h('div', { className: 'sdt-iframe-toolbar' },\n h('a', { href: src, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-iframe-open-link' }, openExternallyLabel),\n ));\n }\n const loadingEl = h('div', { className: 'sdt-iframe-loading' }, loadingMsg);\n container.appendChild(loadingEl);\n\n const iframe = document.createElement('iframe');\n iframe.src = src;\n iframe.title = title;\n iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups allow-forms');\n iframe.style.display = 'none';\n\n iframe.addEventListener('load', () => {\n loadingEl.style.display = 'none';\n iframe.style.display = 'block';\n });\n\n iframe.addEventListener('error', () => {\n loadingEl.style.display = 'none';\n container.innerHTML = '';\n const errDiv = h('div', { className: 'sdt-iframe-error' });\n errDiv.appendChild(h('div', null, errorMsg));\n if (errorDetail) {\n errDiv.appendChild(h('div', { style: { fontSize: '12px', color: 'var(--sdt-text-tertiary)' } }, errorDetail));\n }\n const retryBtn = h('button', { className: 'sdt-iframe-error-btn' }, 'Retry');\n retryBtn.addEventListener('click', () => {\n container.replaceWith(createIframeTab(src, title, loadingMsg, errorMsg, errorDetail, openExternallyLabel));\n });\n errDiv.appendChild(retryBtn);\n const link = h('a', { href: src, target: '_blank', rel: 'noopener noreferrer', style: { color: 'var(--sdt-accent)', fontSize: '12px', textDecoration: 'none' } }, 'Open in new tab');\n errDiv.appendChild(link);\n container.appendChild(errDiv);\n });\n\n container.appendChild(iframe);\n return container;\n}\n\n// ===========================================================================================\n// TABS\n// ===========================================================================================\n\n// ---------------------------------------------------------------------------\n// Overview tab\n// ---------------------------------------------------------------------------\n\nfunction hasPersistentTokenStoreForDevTool(app: StackClientApp<boolean>): boolean {\n return app[hexclaveAppInternalsSymbol].getConstructorOptions().tokenStore !== null;\n}\n\nfunction createOverviewTab(app: StackClientApp<true>): TabResult {\n const container = h('div', { className: 'sdt-ov' });\n const hasPersistentTokenStore = hasPersistentTokenStoreForDevTool(app);\n\n // ── Identity card ──────────────────────────────────────────────────────────\n const heroCard = h('div', { className: 'sdt-ov-card sdt-ov-card-hero' });\n heroCard.appendChild(h('div', { className: 'sdt-ov-label' }, 'Identity'));\n\n const userRow = h('div', { className: 'sdt-ov-user-row' });\n const avatar = h('div', { className: 'sdt-ov-avatar' }, '?');\n const userMeta = h('div', { className: 'sdt-ov-user-meta' });\n const userName = h('div', { className: 'sdt-ov-user-name' }, 'Loading\\u2026');\n const userEmail = h('div', { className: 'sdt-ov-user-email' }, '');\n const authIndicator = h('div', { className: 'sdt-ov-auth-indicator', style: { display: 'none' } }, 'Authenticated');\n userMeta.append(userName, userEmail, authIndicator);\n userRow.append(avatar, userMeta);\n heroCard.appendChild(userRow);\n\n const actions = h('div', { className: 'sdt-ov-actions' });\n const toast = h('div', { className: 'sdt-ov-toast', style: { display: 'none' } });\n const emailRow = h('div', { className: 'sdt-ov-email-input' });\n const emailInput = h('input', { type: 'email', placeholder: 'Sign in as email\\u2026' }) as HTMLInputElement;\n const emailBtn = h('button', null);\n setHtml(emailBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/></svg>');\n emailRow.append(emailInput, emailBtn);\n\n function isBestEffortOverviewError(error: unknown) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return true;\n }\n if (error instanceof TypeError) {\n return true;\n }\n if (error instanceof Error) {\n return error.message.includes('Failed to fetch')\n || error.message.includes('NetworkError')\n || error.message.includes('Load failed')\n || error.message.includes('network connection');\n }\n return false;\n }\n\n function showToast(msg: string, type: 'success' | 'error') {\n toast.textContent = msg;\n toast.className = `sdt-ov-toast sdt-ov-toast-${type}`;\n toast.style.display = '';\n setTimeout(() => {\n toast.style.display = 'none';\n }, 4000);\n }\n\n let currentUser: any = null;\n let loading = false;\n\n function rebuildActions() {\n actions.innerHTML = '';\n if (!hasPersistentTokenStore) {\n userName.textContent = 'Current user unavailable';\n userEmail.textContent = 'This app was initialized without a token store';\n actions.appendChild(h('button', { className: 'sdt-ov-btn sdt-ov-btn-wide', disabled: 'true' }, 'Session actions unavailable'));\n return;\n }\n if (currentUser) {\n const signOutBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-danger' }, 'Sign Out');\n signOutBtn.disabled = loading;\n signOutBtn.addEventListener('click', () => {\n runAsynchronously(async () => {\n loading = true;\n rebuildActions();\n try {\n await currentUser.signOut();\n showToast('Signed out', 'success');\n } catch (e: any) {\n showToast(e.message || 'Sign out failed', 'error');\n }\n loading = false;\n await refreshUser();\n });\n });\n const randomBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-primary' }, 'Random User');\n randomBtn.disabled = loading;\n randomBtn.addEventListener('click', () => {\n runAsynchronously(doQuickSignIn());\n });\n actions.append(signOutBtn, randomBtn);\n } else {\n const quickBtn = h('button', { className: 'sdt-ov-btn sdt-ov-btn-primary sdt-ov-btn-wide' }, loading ? 'Working\\u2026' : 'Quick Sign In');\n quickBtn.disabled = loading;\n quickBtn.addEventListener('click', () => {\n runAsynchronously(doQuickSignIn());\n });\n actions.appendChild(quickBtn);\n }\n emailInput.placeholder = currentUser ? 'Switch to email\\u2026' : 'Sign in as email\\u2026';\n actions.appendChild(emailRow);\n }\n\n async function doQuickSignIn() {\n if (!isLocalhost(window.location.href)) {\n showToast('Quick sign-in is only available on localhost', 'error');\n return;\n }\n loading = true;\n rebuildActions();\n const email = generateRandomEmail();\n try {\n const signUpResult = await app.signUpWithCredential({ email, password: email, noRedirect: true } as any);\n if (signUpResult.status === 'error') {\n showToast(`Sign up failed: ${signUpResult.error.message}`, 'error');\n loading = false;\n rebuildActions();\n return;\n }\n const signInResult = await app.signInWithCredential({ email, password: email, noRedirect: true });\n if (signInResult.status === 'error') {\n showToast(`Sign in failed: ${signInResult.error.message}`, 'error');\n } else {\n showToast(`Signed in as ${email}`, 'success');\n }\n } catch (e: any) {\n showToast(e.message || 'Unknown error', 'error');\n }\n loading = false;\n await refreshUser();\n }\n\n async function doSignInAs(targetEmail: string) {\n if (!targetEmail.trim()) return;\n if (!isLocalhost(window.location.href)) {\n showToast('Quick sign-in is only available on localhost', 'error');\n return;\n }\n loading = true;\n rebuildActions();\n const trimmed = targetEmail.trim();\n try {\n const signInResult = await app.signInWithCredential({ email: trimmed, password: trimmed, noRedirect: true });\n if (signInResult.status === 'ok') {\n showToast(`Signed in as ${trimmed}`, 'success');\n emailInput.value = '';\n loading = false;\n await refreshUser();\n return;\n }\n const signUpResult = await app.signUpWithCredential({ email: trimmed, password: trimmed, noRedirect: true } as any);\n if (signUpResult.status === 'error') {\n showToast(`Failed: ${signUpResult.error.message}`, 'error');\n loading = false;\n rebuildActions();\n return;\n }\n const retryResult = await app.signInWithCredential({ email: trimmed, password: trimmed, noRedirect: true });\n if (retryResult.status === 'error') {\n showToast(`Sign in failed: ${retryResult.error.message}`, 'error');\n } else {\n showToast(`Signed in as ${trimmed}`, 'success');\n emailInput.value = '';\n }\n } catch (e: any) {\n showToast(e.message || 'Unknown error', 'error');\n }\n loading = false;\n await refreshUser();\n }\n\n emailBtn.addEventListener('click', () => {\n runAsynchronously(doSignInAs(emailInput.value));\n });\n emailInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n runAsynchronously(doSignInAs(emailInput.value));\n }\n });\n\n heroCard.append(actions, toast);\n\n // ── Auth methods card ──────────────────────────────────────────────────────\n const methodsCard = h('div', { className: 'sdt-ov-card sdt-ov-card-auth' });\n methodsCard.appendChild(h('div', { className: 'sdt-ov-label' }, 'Auth Methods'));\n const authGrid = h('div', { className: 'sdt-ov-auth-grid' });\n for (let i = 0; i < 3; i++) {\n authGrid.appendChild(h('div', { className: 'sdt-ov-method sdt-ov-skeleton-pill' }));\n }\n methodsCard.appendChild(authGrid);\n let hasActiveAuthMethod: boolean | null = null;\n\n async function loadAuthMethods() {\n try {\n const project = await app.getProject();\n authGrid.innerHTML = '';\n const config = project.config;\n hasActiveAuthMethod = config.credentialEnabled\n || config.magicLinkEnabled\n || config.passkeyEnabled\n || config.oauthProviders.length > 0;\n const methods = [\n { label: 'Password', enabled: config.credentialEnabled },\n { label: 'Magic Link', enabled: config.magicLinkEnabled },\n { label: 'Passkey', enabled: config.passkeyEnabled },\n ];\n for (const m of methods) {\n const pill = h('div', { className: `sdt-ov-method ${m.enabled ? 'sdt-ov-method-on' : 'sdt-ov-method-off'}` });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, m.label));\n authGrid.appendChild(pill);\n }\n for (const p of config.oauthProviders) {\n const pill = h('div', { className: 'sdt-ov-method sdt-ov-method-on sdt-ov-method-oauth' });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, p.id));\n authGrid.appendChild(pill);\n }\n if (!config.signUpEnabled) {\n const pill = h('div', { className: 'sdt-ov-method sdt-ov-method-warn' });\n pill.appendChild(h('span', { className: 'sdt-ov-method-name' }, 'Sign-up off'));\n authGrid.appendChild(pill);\n }\n buildChecklist();\n } catch (error) {\n authGrid.innerHTML = '<div style=\"font-size:11px;color:var(--sdt-text-tertiary)\">Could not load auth methods</div>';\n hasActiveAuthMethod = null;\n buildChecklist();\n if (!isBestEffortOverviewError(error)) {\n throw error;\n }\n }\n }\n\n // Overview hydration is best-effort while the local Stack backend is still booting.\n runAsynchronously(loadAuthMethods());\n\n // ── Setup checklist (only shown when something is incomplete) ──────────────\n const checksCard = h('div', { className: 'sdt-ov-card sdt-ov-card-checks' });\n const projectId = app.projectId;\n let checksCardMounted = false;\n\n function buildChecklist() {\n checksCard.innerHTML = '';\n const currentUserCheck = hasPersistentTokenStore\n ? { ok: !!currentUser, label: 'Sign in a test user', hint: 'Use \\u201cQuick Sign In\\u201d above \\u2192' }\n : { ok: true, label: 'Current-user tools unavailable', hint: null };\n const checks = [\n { ok: !!projectId && projectId !== 'default', label: 'Project configured', hint: null },\n { ok: hasActiveAuthMethod === true, label: 'Auth method active', hint: hasActiveAuthMethod === null ? 'Still checking project config' : null },\n currentUserCheck,\n ];\n const passCount = checks.filter((c) => c.ok).length;\n const allGood = passCount === checks.length;\n\n if (allGood) {\n if (checksCardMounted && checksCard.parentElement) {\n container.removeChild(checksCard);\n checksCardMounted = false;\n }\n return;\n }\n\n if (!checksCardMounted) {\n container.appendChild(checksCard);\n checksCardMounted = true;\n }\n\n const titleRow = h('div', { className: 'sdt-ov-checks-header' });\n const titleLabel = h('div', { className: 'sdt-ov-label', style: { marginBottom: '0', color: 'var(--sdt-warning)' } }, 'Setup');\n const badge = h('span', { className: 'sdt-ov-checks-badge sdt-ov-checks-badge-warn' }, `${passCount}\\u200a/\\u200a${checks.length}`);\n titleRow.append(titleLabel, badge);\n checksCard.appendChild(titleRow);\n\n const bar = h('div', { className: 'sdt-ov-checks-bar' });\n const fill = h('div', { className: 'sdt-ov-checks-bar-fill' });\n fill.style.width = `${(passCount / checks.length) * 100}%`;\n bar.appendChild(fill);\n checksCard.appendChild(bar);\n\n for (const c of checks) {\n const row = h('div', { className: 'sdt-ov-setup-row' });\n row.appendChild(h('span', { className: `sdt-ov-setup-dot ${c.ok ? 'sdt-ov-setup-dot-ok' : 'sdt-ov-setup-dot-warn'}` }));\n row.appendChild(h('span', { className: 'sdt-ov-setup-label' }, c.label));\n if (!c.ok && c.hint) {\n row.appendChild(h('span', { className: 'sdt-ov-setup-hint' }, c.hint));\n }\n checksCard.appendChild(row);\n }\n }\n\n async function refreshUser() {\n if (!hasPersistentTokenStore) {\n avatar.className = 'sdt-ov-avatar';\n avatar.textContent = '?';\n userName.textContent = 'Current user unavailable';\n userEmail.textContent = 'This app was initialized without a token store';\n authIndicator.style.display = 'none';\n currentUser = null;\n rebuildActions();\n buildChecklist();\n return;\n }\n try {\n currentUser = await app.getUser();\n\n if (currentUser) {\n const initials = (currentUser.displayName || currentUser.primaryEmail || '?')\n .split(' ').map((s: string) => s[0]).join('').slice(0, 2).toUpperCase();\n avatar.className = 'sdt-ov-avatar sdt-ov-avatar-active';\n if (currentUser.profileImageUrl) {\n avatar.innerHTML = `<img src=\"${escapeHtml(currentUser.profileImageUrl)}\" alt=\"\" />`;\n } else {\n avatar.textContent = initials;\n }\n userName.textContent = currentUser.displayName || 'Anonymous';\n userEmail.textContent = currentUser.primaryEmail || 'No email';\n authIndicator.style.display = '';\n } else {\n avatar.className = 'sdt-ov-avatar';\n avatar.textContent = '?';\n userName.textContent = 'No user signed in';\n userEmail.textContent = 'Sign in to test auth flows';\n authIndicator.style.display = 'none';\n }\n } catch (error) {\n avatar.className = 'sdt-ov-avatar';\n avatar.textContent = '?';\n userName.textContent = 'Could not load user';\n userEmail.textContent = 'Check your local Stack backend';\n authIndicator.style.display = 'none';\n currentUser = null;\n if (!isBestEffortOverviewError(error)) {\n throw error;\n }\n }\n rebuildActions();\n buildChecklist();\n }\n\n container.append(heroCard, methodsCard);\n buildChecklist();\n runAsynchronously(refreshUser());\n const userPoll = setInterval(() => {\n runAsynchronously(refreshUser());\n }, 3000);\n\n return { element: container, cleanup: () => clearInterval(userPoll) };\n}\n\n// ---------------------------------------------------------------------------\n// Console tab\n// ---------------------------------------------------------------------------\n\ntype MergedLogEntry =\n | { kind: 'api', entry: ApiLogEntry }\n | { kind: 'event', entry: EventLogEntry };\n\nfunction createConsoleTab(logStore: LogStore): TabResult {\n const container = h('div', { className: 'sdt-console-panel' });\n\n const EVENT_TYPE_STYLES: Record<string, string> = {\n 'error': 'sdt-badge-error',\n 'info': 'sdt-badge-info',\n };\n\n const title = h('div', { className: 'sdt-console-title' }, 'Logs');\n const actions = h('div', { className: 'sdt-console-actions' });\n const copyBtn = h('button', { className: 'sdt-console-action-btn', title: 'Copy logs' });\n setHtml(copyBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>Copy');\n const exportBtn = h('button', { className: 'sdt-console-action-btn', title: 'Export logs' });\n setHtml(exportBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>Export');\n const clearBtn = h('button', { className: 'sdt-console-action-btn', title: 'Clear logs' });\n setHtml(clearBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/></svg>Clear');\n actions.append(copyBtn, exportBtn, clearBtn);\n container.appendChild(h('div', { className: 'sdt-console-header' }, title, actions));\n\n const contentArea = h('div', { className: 'sdt-console-log-scroll sdt-tab-content-fade' });\n container.appendChild(contentArea);\n\n let visibleLogCount = CONSOLE_LOG_BATCH_SIZE;\n\n function getMergedLogs(): MergedLogEntry[] {\n return [\n ...logStore.apiLogs.map((entry) => ({ kind: 'api' as const, entry })),\n ...logStore.eventLogs.map((entry) => ({ kind: 'event' as const, entry })),\n ].sort((a, b) => b.entry.timestamp - a.entry.timestamp);\n }\n\n function formatLogLine(item: MergedLogEntry): string {\n if (item.kind === 'api') {\n const log = item.entry;\n const status = log.status !== undefined ? ` [${log.status}]` : '';\n const duration = log.duration !== undefined ? ` ${log.duration}ms` : '';\n const error = log.error !== undefined ? ` ${log.error}` : '';\n return `${new Date(log.timestamp).toISOString()} ${log.method} ${log.url}${status}${duration}${error}`;\n }\n\n const log = item.entry;\n return `${new Date(log.timestamp).toISOString()} ${log.type.toUpperCase()} ${log.message}`;\n }\n\n function formatLogsForExport(): string {\n const lines = [\n '=== Hexclave Dev Tool Logs ===',\n `Generated: ${new Date().toISOString()}`,\n `Total logs: ${getMergedLogs().length}`,\n '',\n ...getMergedLogs().map(formatLogLine),\n ];\n return lines.join('\\n');\n }\n\n function renderLogItem(item: MergedLogEntry): HTMLElement {\n if (item.kind === 'api') {\n const log = item.entry;\n const row = h('div', { className: 'sdt-log-item' });\n row.appendChild(h('span', { className: 'sdt-log-time' }, formatTimestamp(log.timestamp)));\n row.appendChild(h('span', { className: `sdt-log-method sdt-log-method-${log.method.toLowerCase()}` }, log.method));\n row.appendChild(h('span', { className: 'sdt-log-url' }, log.url));\n if (log.status !== undefined) {\n row.appendChild(h('span', { className: `sdt-log-status ${log.status < 400 ? 'sdt-log-status-ok' : 'sdt-log-status-err'}` }, String(log.status)));\n }\n if (log.duration !== undefined) {\n row.appendChild(h('span', { className: 'sdt-log-time' }, log.duration + 'ms'));\n }\n return row;\n }\n\n const log = item.entry;\n const row = h('div', { className: 'sdt-log-item' });\n row.appendChild(h('span', { className: 'sdt-log-time' }, formatTimestamp(log.timestamp)));\n row.appendChild(h('span', { className: `sdt-badge ${EVENT_TYPE_STYLES[log.type] || 'sdt-badge-info'}` }, log.type));\n row.appendChild(h('span', { className: 'sdt-log-message' }, log.message));\n return row;\n }\n\n function renderLogs() {\n const previousScrollTop = contentArea.scrollTop;\n contentArea.innerHTML = '';\n const merged = getMergedLogs();\n visibleLogCount = Math.min(Math.max(visibleLogCount, CONSOLE_LOG_BATCH_SIZE), Math.max(merged.length, CONSOLE_LOG_BATCH_SIZE));\n\n if (merged.length === 0) {\n contentArea.innerHTML = '<div class=\"sdt-empty-state\"><div class=\"sdt-empty-state-icon\">\\uD83D\\uDCCB</div><div>No logs recorded yet</div><div style=\"font-size:12px;color:var(--sdt-text-tertiary)\">API calls and auth events will appear here</div></div>';\n return;\n }\n\n const list = h('div', { className: 'sdt-log-list' });\n for (const item of merged.slice(0, visibleLogCount)) {\n list.appendChild(renderLogItem(item));\n }\n if (visibleLogCount < merged.length) {\n list.appendChild(h('div', { className: 'sdt-log-load-hint' }, `${merged.length - visibleLogCount} older logs available`));\n }\n contentArea.appendChild(list);\n contentArea.scrollTop = Math.min(previousScrollTop, contentArea.scrollHeight);\n }\n\n function maybeLoadOlderLogs() {\n const mergedLength = getMergedLogs().length;\n if (visibleLogCount >= mergedLength) return;\n const distanceFromBottom = contentArea.scrollHeight - contentArea.scrollTop - contentArea.clientHeight;\n if (distanceFromBottom <= 48) {\n visibleLogCount = Math.min(visibleLogCount + CONSOLE_LOG_BATCH_SIZE, mergedLength);\n renderLogs();\n }\n }\n\n contentArea.addEventListener('scroll', maybeLoadOlderLogs);\n renderLogs();\n\n copyBtn.addEventListener('click', () => {\n runAsynchronously(\n navigator.clipboard.writeText(formatLogsForExport()).then(() => {\n copyBtn.textContent = '\\u2713 Copied';\n setTimeout(() => {\n setHtml(copyBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>Copy');\n }, 1500);\n })\n );\n });\n\n exportBtn.addEventListener('click', () => {\n const blob = new Blob([formatLogsForExport()], { type: 'text/plain;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const link = h('a', { href: url, download: `hexclave-dev-tool-logs-${new Date().toISOString()}.txt` });\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n });\n\n clearBtn.addEventListener('click', () => {\n visibleLogCount = CONSOLE_LOG_BATCH_SIZE;\n logStore.clear();\n });\n\n const unsub = logStore.subscribe(() => {\n renderLogs();\n });\n\n return {\n element: container,\n cleanup: () => {\n contentArea.removeEventListener('scroll', maybeLoadOlderLogs);\n unsub();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// AI tab\n// ---------------------------------------------------------------------------\n\nfunction createAITab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-ai-container' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n\n type ToolCallState = 'running' | 'success' | 'error';\n type ToolCall = {\n id: string,\n toolName: string,\n argsText: string | null,\n resultText: string | null,\n state: ToolCallState,\n errorText: string | null,\n isExpanded: boolean,\n };\n type AssistantPart =\n | { type: 'text', content: string }\n | { type: 'tool', toolCallId: string };\n type UserMessage = { role: 'user'; content: string };\n type AssistantMessage = { role: 'assistant'; parts: AssistantPart[]; toolCallsById: Map<string, ToolCall> };\n type Message = UserMessage | AssistantMessage;\n const messages: Message[] = [];\n let aiLoading = false;\n let activeAiAbortController: AbortController | null = null;\n\n const messagesArea = h('div', { className: 'sdt-ai-messages' });\n const inputArea = h('div', { className: 'sdt-ai-input-area' });\n\n const SUGGESTED_QUESTIONS = [\n { icon: '\\uD83D\\uDD12', text: 'How do I protect a Next.js route?' },\n { icon: '\\uD83D\\uDC65', text: 'How do teams and permissions work?' },\n { icon: '\\uD83D\\uDD17', text: 'How do I add OAuth providers?' },\n { icon: '\\u2709\\uFE0F', text: 'How do I customize auth emails?' },\n ];\n\n function getHeaders(): Record<string, string> {\n const opts = app[hexclaveAppInternalsSymbol].getConstructorOptions();\n // Hexclave rebrand: emit x-hexclave-* request headers (backend dual-accepts).\n const headers: Record<string, string> = {\n 'X-Hexclave-Access-Type': 'client',\n 'X-Hexclave-Project-Id': app.projectId,\n };\n if ('publishableClientKey' in opts && opts.publishableClientKey) {\n headers['X-Hexclave-Publishable-Client-Key'] = opts.publishableClientKey as string;\n }\n return headers;\n }\n\n function renderToolCard(toolCall: ToolCall): HTMLElement {\n const toolCard = h('div', { className: 'sdt-ai-tool-card' });\n const header = h('button', { className: 'sdt-ai-tool-header', type: 'button' });\n header.appendChild(h('span', { className: 'sdt-ai-tool-name' }, toolCall.toolName));\n header.appendChild(h('span', { className: `sdt-ai-tool-status sdt-ai-tool-status-${toolCall.state}` }, toolCall.state));\n header.appendChild(h('span', { className: `sdt-ai-tool-chevron${toolCall.isExpanded ? ' sdt-ai-tool-chevron-open' : ''}` }, '\\u25BE'));\n header.addEventListener('click', () => {\n toolCall.isExpanded = !toolCall.isExpanded;\n renderMessages();\n });\n toolCard.appendChild(header);\n\n if (toolCall.isExpanded) {\n const body = h('div', { className: 'sdt-ai-tool-body' });\n if (toolCall.argsText !== null) {\n body.appendChild(h('div', { className: 'sdt-ai-tool-label' }, 'Args'));\n const argsPre = h('pre', { className: 'sdt-ai-tool-pre' });\n argsPre.appendChild(h('code', null, toolCall.argsText));\n body.appendChild(argsPre);\n }\n if (toolCall.resultText !== null) {\n body.appendChild(h('div', { className: 'sdt-ai-tool-label' }, toolCall.state === 'error' ? 'Error' : 'Result'));\n const resultPre = h('pre', { className: 'sdt-ai-tool-pre' });\n resultPre.appendChild(h('code', null, toolCall.resultText));\n body.appendChild(resultPre);\n }\n if (toolCall.state === 'running') {\n body.appendChild(h('div', { className: 'sdt-ai-tool-running' }, 'Running...'));\n }\n toolCard.appendChild(body);\n }\n\n return toolCard;\n }\n\n function renderMessages() {\n messagesArea.innerHTML = '';\n\n if (messages.length === 0) {\n const empty = h('div', { className: 'sdt-ai-empty' });\n const icon = h('div', { className: 'sdt-ai-empty-icon' });\n setHtml(icon, '<svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>');\n empty.appendChild(icon);\n empty.appendChild(h('div', { className: 'sdt-ai-empty-title' }, 'Ask AI'));\n empty.appendChild(h('div', { className: 'sdt-ai-empty-desc' }, 'Get help with Hexclave integration, troubleshooting, and best practices.'));\n\n const suggestions = h('div', { className: 'sdt-ai-suggestions' });\n for (const q of SUGGESTED_QUESTIONS) {\n const btn = h('button', { className: 'sdt-ai-suggestion' });\n btn.appendChild(h('span', { className: 'sdt-ai-suggestion-icon' }, q.icon));\n btn.appendChild(h('span', null, q.text));\n btn.addEventListener('click', () => {\n runAsynchronously(sendMessage(q.text));\n });\n suggestions.appendChild(btn);\n }\n empty.appendChild(suggestions);\n messagesArea.appendChild(empty);\n return;\n }\n\n const list = h('div', { className: 'sdt-ai-message-list' });\n for (const msg of messages) {\n if (msg.role === 'user') {\n const msgDiv = h('div', { className: 'sdt-ai-msg sdt-ai-msg-user' });\n const bubble = h('div', { className: 'sdt-ai-bubble sdt-ai-bubble-user' });\n bubble.appendChild(h('p', null, msg.content));\n msgDiv.appendChild(bubble);\n const avatarDiv = h('div', { className: 'sdt-ai-avatar sdt-ai-avatar-user' });\n setHtml(avatarDiv, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>');\n msgDiv.appendChild(avatarDiv);\n list.appendChild(msgDiv);\n } else {\n const msgDiv = h('div', { className: 'sdt-ai-msg sdt-ai-msg-assistant' });\n const avatarDiv = h('div', { className: 'sdt-ai-avatar sdt-ai-avatar-assistant' });\n setHtml(avatarDiv, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>');\n msgDiv.appendChild(avatarDiv);\n const bubble = h('div', { className: 'sdt-ai-bubble sdt-ai-bubble-assistant' });\n if (msg.parts.length === 0) {\n bubble.innerHTML = '<div class=\"sdt-ai-thinking\"><span class=\"sdt-ai-thinking-dot\"></span><span class=\"sdt-ai-thinking-dot\"></span><span class=\"sdt-ai-thinking-dot\"></span></div>';\n } else {\n for (const part of msg.parts) {\n if (part.type === 'text') {\n const textContainer = h('div', { className: 'sdt-ai-part-text' });\n renderMarkdownInto(textContainer, part.content);\n bubble.appendChild(textContainer);\n continue;\n }\n\n const toolCall = msg.toolCallsById.get(part.toolCallId);\n if (toolCall == null) {\n const missingTool = h('div', { className: 'sdt-ai-tool-card' });\n const missingBody = h('div', { className: 'sdt-ai-tool-body' });\n missingBody.appendChild(h('div', { className: 'sdt-ai-tool-label' }, 'Error'));\n const missingPre = h('pre', { className: 'sdt-ai-tool-pre' });\n missingPre.appendChild(h('code', null, `Missing tool call state for ${part.toolCallId}`));\n missingBody.appendChild(missingPre);\n missingTool.appendChild(missingBody);\n bubble.appendChild(missingTool);\n continue;\n }\n const toolsContainer = h('div', { className: 'sdt-ai-tools' });\n toolsContainer.appendChild(renderToolCard(toolCall));\n bubble.appendChild(toolsContainer);\n }\n }\n msgDiv.appendChild(bubble);\n list.appendChild(msgDiv);\n }\n }\n messagesArea.appendChild(list);\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n\n function renderMarkdownInto(el: HTMLElement, content: string) {\n function appendBlockWithInlineMarkdown(tag: \"p\" | \"li\" | \"h1\" | \"h2\" | \"h3\", className: string, text: string) {\n const block = h(tag, { className });\n appendInlineMarkdown(block, text);\n el.appendChild(block);\n }\n\n const lines = content.split('\\n');\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n const block = h('div', { className: 'sdt-ai-code-block' });\n const header = h('div', { className: 'sdt-ai-code-header' });\n header.appendChild(h('span', { className: 'sdt-ai-code-lang' }, lang || 'CODE'));\n const copyBtn = h('button', { className: 'sdt-ai-copy-btn' }, '\\u2398');\n const code = codeLines.join('\\n');\n copyBtn.addEventListener('click', () => {\n runAsynchronously(navigator.clipboard.writeText(code).then(() => {\n copyBtn.textContent = '\\u2713';\n setTimeout(() => {\n copyBtn.textContent = '\\u2398';\n }, 1500);\n }));\n });\n header.appendChild(copyBtn);\n block.appendChild(header);\n const pre = h('pre', { className: 'sdt-ai-code-pre' });\n pre.appendChild(h('code', null, code));\n block.appendChild(pre);\n el.appendChild(block);\n continue;\n }\n\n const headingMatch = line.match(/^(#{1,3}) (.+)/);\n if (headingMatch) {\n const tag = `h${headingMatch[1].length}` as 'h1' | 'h2' | 'h3';\n appendBlockWithInlineMarkdown(tag, \"sdt-ai-heading\", headingMatch[2]);\n i++;\n continue;\n }\n\n if (/^[-*] /.test(line)) {\n const ul = h('ul', { className: 'sdt-ai-list' });\n while (i < lines.length && /^[-*] /.test(lines[i])) {\n const li = h(\"li\");\n appendInlineMarkdown(li, lines[i].replace(/^[-*] /, \"\"));\n ul.appendChild(li);\n i++;\n }\n el.appendChild(ul);\n continue;\n }\n\n if (/^\\d+\\. /.test(line)) {\n const ol = h('ol', { className: 'sdt-ai-list sdt-ai-list-ordered' });\n while (i < lines.length && /^\\d+\\. /.test(lines[i])) {\n const li = h(\"li\");\n appendInlineMarkdown(li, lines[i].replace(/^\\d+\\. /, \"\"));\n ol.appendChild(li);\n i++;\n }\n el.appendChild(ol);\n continue;\n }\n\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n appendBlockWithInlineMarkdown(\"p\", \"sdt-ai-paragraph\", line);\n i++;\n }\n }\n\n function stringifyForDebug(value: unknown): string {\n if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {\n return String(value);\n }\n return JSON.stringify(value, null, 2);\n }\n\n function getLastItem<T>(items: readonly T[]): T | undefined {\n return items.length > 0 ? items[items.length - 1] : undefined;\n }\n\n function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n function expectObject(value: unknown, payload: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`SSE payload must be an object: ${payload}`);\n }\n return value;\n }\n\n function getRequiredStringField(event: Record<string, unknown>, field: string, payload: string): string {\n const value = event[field];\n if (typeof value !== 'string') {\n throw new Error(`SSE event '${String(event.type)}' missing string '${field}': ${payload}`);\n }\n return value;\n }\n\n function getCurrentAssistantMessage(): AssistantMessage {\n const lastMessage = getLastItem(messages);\n if (lastMessage?.role !== 'assistant') {\n throw new Error('Expected current message to be an assistant message');\n }\n return lastMessage;\n }\n\n function appendTextDelta(delta: string) {\n const assistantMessage = getCurrentAssistantMessage();\n const lastPart = getLastItem(assistantMessage.parts);\n if (lastPart?.type === 'text') {\n lastPart.content += delta;\n return;\n }\n assistantMessage.parts.push({ type: 'text', content: delta });\n }\n\n function ensureToolPart(assistantMessage: AssistantMessage, toolCallId: string) {\n const hasPart = assistantMessage.parts.some(part => part.type === 'tool' && part.toolCallId === toolCallId);\n if (!hasPart) {\n assistantMessage.parts.push({ type: 'tool', toolCallId });\n }\n }\n\n function findOrCreateToolCall(toolCallId: string, fallbackToolName: string): ToolCall {\n const assistantMessage = getCurrentAssistantMessage();\n const existing = assistantMessage.toolCallsById.get(toolCallId);\n if (existing != null) {\n if (existing.toolName === 'tool' && fallbackToolName !== 'tool') {\n existing.toolName = fallbackToolName;\n }\n ensureToolPart(assistantMessage, toolCallId);\n return existing;\n }\n\n const created: ToolCall = {\n id: toolCallId,\n toolName: fallbackToolName,\n argsText: null,\n resultText: null,\n state: 'running',\n errorText: null,\n isExpanded: false,\n };\n assistantMessage.toolCallsById.set(toolCallId, created);\n ensureToolPart(assistantMessage, toolCallId);\n return created;\n }\n\n async function sendMessage(text: string) {\n if (!text.trim() || aiLoading) return;\n messages.push({ role: 'user', content: text.trim() });\n messages.push({ role: 'assistant', parts: [], toolCallsById: new Map<string, ToolCall>() });\n aiLoading = true;\n renderMessages();\n renderInput();\n\n try {\n const abortController = new AbortController();\n activeAiAbortController = abortController;\n const res = await fetch(`${apiBaseUrl}/api/latest/ai/query/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...getHeaders(),\n },\n signal: abortController.signal,\n body: JSON.stringify({\n systemPrompt: 'command-center-ask-ai',\n tools: ['docs'],\n quality: 'smart',\n speed: 'slow',\n messages: messages\n .slice(0, -1)\n .map((m) => ({\n role: m.role,\n content: [{ type: 'text', text: m.role === 'user' ? m.content : m.parts.filter(part => part.type === 'text').map(part => part.content).join('') }],\n })),\n }),\n });\n\n if (!res.ok) {\n throw new Error(`AI request failed with status ${res.status}`);\n }\n if (!res.body) {\n throw new Error('AI request returned no response body');\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const streamLines = buffer.split('\\n');\n buffer = streamLines.pop() || '';\n\n for (const streamLine of streamLines) {\n const line = streamLine.trim();\n if (line === '' || line.startsWith(':')) continue;\n if (!line.startsWith('data: ')) {\n throw new Error(`Unexpected SSE line: ${line}`);\n }\n\n const payload = line.slice(6);\n if (payload === '[DONE]') continue;\n const event = expectObject(JSON.parse(payload), payload);\n const eventType = getRequiredStringField(event, 'type', payload);\n\n switch (eventType) {\n case 'start':\n case 'start-step':\n case 'finish-step':\n case 'finish':\n case 'message-metadata':\n case 'text-start':\n case 'text-end':\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n case 'source-url':\n case 'source-document':\n case 'file': {\n break;\n }\n case 'text-delta': {\n const delta = getRequiredStringField(event, 'delta', payload);\n appendTextDelta(delta);\n break;\n }\n case 'tool-input-start': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.state = 'running';\n toolCall.resultText = null;\n toolCall.errorText = null;\n toolCall.argsText = '';\n break;\n }\n case 'tool-input-delta': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const inputTextDelta = getRequiredStringField(event, 'inputTextDelta', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.argsText = (toolCall.argsText ?? '') + inputTextDelta;\n break;\n }\n case 'tool-input-available': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.argsText = stringifyForDebug(event.input);\n break;\n }\n case 'tool-input-error': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolName = getRequiredStringField(event, 'toolName', payload);\n const errorText = getRequiredStringField(event, 'errorText', payload);\n const toolCall = findOrCreateToolCall(toolCallId, toolName);\n toolCall.state = 'error';\n toolCall.errorText = errorText;\n toolCall.resultText = errorText;\n break;\n }\n case 'tool-output-available': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n const preliminary = event.preliminary === true;\n toolCall.resultText = stringifyForDebug(event.output);\n if (!preliminary) {\n toolCall.state = 'success';\n }\n break;\n }\n case 'tool-output-error': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const errorText = getRequiredStringField(event, 'errorText', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'error';\n toolCall.errorText = errorText;\n toolCall.resultText = errorText;\n break;\n }\n case 'tool-output-denied': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'error';\n toolCall.errorText = 'Tool output denied';\n toolCall.resultText = 'Tool output denied';\n break;\n }\n case 'tool-approval-request': {\n const toolCallId = getRequiredStringField(event, 'toolCallId', payload);\n const approvalId = getRequiredStringField(event, 'approvalId', payload);\n const toolCall = findOrCreateToolCall(toolCallId, 'tool');\n toolCall.state = 'running';\n toolCall.resultText = `Approval requested (${approvalId})`;\n break;\n }\n case 'abort': {\n const reason = typeof event.reason === 'string' ? event.reason : 'unknown reason';\n throw new Error(`AI stream aborted: ${reason}`);\n }\n case 'error': {\n throw new Error(\n typeof event.errorText === 'string'\n ? `AI stream error: ${event.errorText}`\n : `AI stream error event: ${payload}`\n );\n }\n default: {\n if (eventType.startsWith('data-')) {\n break;\n }\n throw new Error(`Unexpected AI stream event type: ${eventType}`);\n }\n }\n }\n\n renderMessages();\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n const assistantMessage = getCurrentAssistantMessage();\n if (assistantMessage.parts.length === 0) {\n assistantMessage.parts.push({ type: 'text', content: 'Stopped.' });\n }\n renderMessages();\n return;\n }\n\n const message = error instanceof Error ? error.message : 'Unknown AI stream error';\n const lastMessage = getLastItem(messages);\n if (lastMessage?.role === 'assistant') {\n lastMessage.parts = [{ type: 'text', content: message }];\n lastMessage.toolCallsById.clear();\n }\n renderMessages();\n alert(`AI stream failed: ${message}`);\n } finally {\n aiLoading = false;\n activeAiAbortController = null;\n renderMessages();\n renderInput();\n }\n }\n\n const inputWrapper = h('div', { className: 'sdt-ai-input-wrapper' });\n const input = h('input', {\n type: 'text',\n className: 'sdt-ai-input',\n placeholder: 'Ask anything about Hexclave...',\n autocomplete: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n }) as HTMLInputElement;\n const sendBtn = h('button', { className: 'sdt-ai-send-btn', title: 'Send' });\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n\n function renderInput() {\n input.disabled = false;\n input.placeholder = messages.length === 0 ? 'Ask anything about Hexclave...' : 'Ask a follow-up...';\n if (aiLoading) {\n sendBtn.classList.add('sdt-ai-send-btn-active');\n sendBtn.classList.add('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Stop');\n setHtml(sendBtn, '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/></svg>');\n } else if (input.value.trim()) {\n sendBtn.classList.add('sdt-ai-send-btn-active');\n sendBtn.classList.remove('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Send');\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n } else {\n sendBtn.classList.remove('sdt-ai-send-btn-active');\n sendBtn.classList.remove('sdt-ai-stop-btn');\n sendBtn.setAttribute('title', 'Send');\n setHtml(sendBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>');\n }\n }\n\n input.addEventListener('input', renderInput);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (aiLoading) {\n activeAiAbortController?.abort();\n } else {\n runAsynchronously(sendMessage(input.value));\n input.value = '';\n }\n renderInput();\n }\n });\n sendBtn.addEventListener('click', () => {\n if (aiLoading) {\n activeAiAbortController?.abort();\n } else {\n runAsynchronously(sendMessage(input.value));\n input.value = '';\n }\n renderInput();\n });\n\n const newChatBtn = h('button', { className: 'sdt-ai-new-chat', title: 'New conversation', style: { display: 'none' } });\n setHtml(newChatBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>');\n newChatBtn.addEventListener('click', () => {\n if (aiLoading) {\n activeAiAbortController?.abort();\n }\n messages.length = 0;\n input.value = '';\n renderMessages();\n renderInput();\n newChatBtn.style.display = 'none';\n });\n\n inputWrapper.append(input, sendBtn);\n inputArea.append(newChatBtn, inputWrapper);\n\n container.append(messagesArea, inputArea);\n renderMessages();\n renderInput();\n\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard tab\n// ---------------------------------------------------------------------------\n\nfunction createDashboardTab(app: StackClientApp<true>): HTMLElement {\n const dashboardUrl = resolveDashboardUrl(app);\n return createIframeTab(dashboardUrl, 'Hexclave Dashboard', 'Loading dashboard\\u2026', 'Unable to load dashboard', 'The dashboard may require authentication or block framing', 'Open in New Tab');\n}\n\n// ---------------------------------------------------------------------------\n// Support tab\n// ---------------------------------------------------------------------------\n\nfunction createSupportTab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-support-tab' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n\n function createFeedbackForm(): HTMLElement {\n const pane = h('div', { className: 'sdt-support-feedback-pane' });\n const form = h('form', { className: 'sdt-support-form' });\n\n let feedbackType: 'feedback' | 'bug' = 'feedback';\n let status: 'idle' | 'submitting' | 'success' | 'error' = 'idle';\n let errorMessage = '';\n\n const nameInput = h('input', { className: 'sdt-support-input', type: 'text', placeholder: 'Your name' }) as HTMLInputElement;\n const emailInput = h('input', { className: 'sdt-support-input', type: 'email', placeholder: 'you@example.com', required: 'true' }) as HTMLInputElement;\n const messageInput = h('textarea', { className: 'sdt-support-textarea', placeholder: \"What's on your mind?\", required: 'true', rows: '5' }) as HTMLTextAreaElement;\n\n function render() {\n form.innerHTML = '';\n\n if (status === 'success') {\n const successDiv = h('div', { className: 'sdt-support-status sdt-support-status-success' });\n const icon = h('div', { className: 'sdt-support-status-icon' });\n setHtml(icon, '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M6 10l3 3 5-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>');\n successDiv.append(\n icon,\n h('div', { className: 'sdt-support-status-title' }, 'Feedback sent'),\n h('div', { className: 'sdt-support-status-msg' }, \"Thank you! We'll get back to you soon.\"),\n );\n const resetBtn = h('button', { className: 'sdt-support-submit', style: { marginTop: '12px', width: 'auto' } }, 'Send another');\n resetBtn.addEventListener('click', () => {\n status = 'idle';\n render();\n });\n successDiv.appendChild(resetBtn);\n form.appendChild(successDiv);\n return;\n }\n\n if (status === 'error') {\n const errDiv = h('div', { className: 'sdt-support-status sdt-support-status-error' });\n const icon = h('div', { className: 'sdt-support-status-icon' });\n setHtml(icon, '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M10 6v5m0 3h.01\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');\n errDiv.append(\n icon,\n h('div', { className: 'sdt-support-status-title' }, 'Failed to send'),\n h('div', { className: 'sdt-support-status-msg' }, errorMessage || 'Please try again.'),\n );\n const retryBtn = h('button', { className: 'sdt-support-submit', style: { marginTop: '12px', width: 'auto' } }, 'Try again');\n retryBtn.addEventListener('click', () => {\n status = 'idle';\n errorMessage = '';\n render();\n });\n errDiv.appendChild(retryBtn);\n form.appendChild(errDiv);\n return;\n }\n\n const nameField = h('div', { className: 'sdt-support-field' });\n const nameLabel = h('label', { className: 'sdt-support-label' }, 'Name ');\n nameLabel.appendChild(h('span', { className: 'sdt-support-optional' }, 'optional'));\n nameField.append(nameLabel, nameInput);\n form.appendChild(nameField);\n\n const emailField = h('div', { className: 'sdt-support-field' });\n emailField.append(h('label', { className: 'sdt-support-label' }, 'Email'), emailInput);\n form.appendChild(emailField);\n\n const msgField = h('div', { className: 'sdt-support-field' });\n msgField.append(h('label', { className: 'sdt-support-label' }, feedbackType === 'bug' ? 'Description' : 'Message'), messageInput);\n messageInput.placeholder = feedbackType === 'bug' ? 'Steps to reproduce, expected vs. actual behavior\\u2026' : \"What's on your mind?\";\n form.appendChild(msgField);\n\n const typeCards = h('div', { className: 'sdt-support-type-cards' });\n const feedbackBtn = h('button', { type: 'button', className: `sdt-support-type-card ${feedbackType === 'feedback' ? 'sdt-support-type-card-active' : ''}` });\n setHtml(feedbackBtn, '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg><span>Feedback</span>');\n feedbackBtn.addEventListener('click', () => {\n feedbackType = 'feedback';\n render();\n });\n const bugBtn = h('button', { type: 'button', className: `sdt-support-type-card ${feedbackType === 'bug' ? 'sdt-support-type-card-active' : ''}` });\n setHtml(bugBtn, '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 2l1.88 1.88M14.12 3.88L16 2M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"/><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"/><path d=\"M12 20v-9M6.53 9C4.6 8.8 3 7.1 3 5M6 13H2M6 17H3M21 5c0 2.1-1.6 3.8-3.53 4M18 13h4M21 17h-3\"/></svg><span>Bug Report</span>');\n bugBtn.addEventListener('click', () => {\n feedbackType = 'bug';\n render();\n });\n typeCards.append(feedbackBtn, bugBtn);\n form.appendChild(typeCards);\n\n const submitBtn = h('button', { type: 'submit', className: 'sdt-support-submit' });\n setHtml(submitBtn, 'Submit <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/></svg>');\n submitBtn.disabled = status === 'submitting';\n form.appendChild(submitBtn);\n\n const channels = h('div', { className: 'sdt-support-channels' });\n channels.innerHTML = `\n <a href=\"https://discord.hexclave.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\"/></svg>\n <span>Discord</span>\n </a>\n <a href=\"mailto:team@hexclave.com\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>\n <span>Email</span>\n </a>\n <a href=\"https://github.com/hexclave/hexclave\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"sdt-support-channel\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0 1 12 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z\"/></svg>\n <span>GitHub</span>\n </a>`;\n form.appendChild(channels);\n form.insertBefore(channels, form.firstChild);\n }\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n if (!emailInput.value.trim() || !messageInput.value.trim()) return;\n runAsynchronously(async () => {\n status = 'submitting';\n render();\n try {\n const response = await fetch(`${apiBaseUrl}/api/latest/internal/feedback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify({\n name: nameInput.value.trim() || undefined,\n email: emailInput.value.trim(),\n message: messageInput.value.trim(),\n feedback_type: feedbackType,\n }),\n });\n if (!response.ok) {\n throw new Error(`Failed to send: ${response.status} ${response.statusText}`);\n }\n const result = await response.json();\n if (!result.success) {\n throw new Error(result.message || 'Failed to send feedback');\n }\n status = 'success';\n messageInput.value = '';\n } catch (err: any) {\n status = 'error';\n errorMessage = err.message || 'An unexpected error occurred';\n }\n render();\n });\n });\n\n render();\n pane.appendChild(form);\n return pane;\n }\n\n container.appendChild(createFeedbackForm());\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Components tab\n// ---------------------------------------------------------------------------\n\nfunction createComponentsTab(app: StackClientApp<true>): HTMLElement {\n const container = h('div', { className: 'sdt-pg-layout' });\n const apiBaseUrl = resolveApiBaseUrl(app);\n const urls = app.urls;\n const urlOptions: HandlerUrlOptions = app[hexclaveAppInternalsSymbol].getConstructorOptions().urls ?? {};\n\n const PAGE_ENTRIES: { key: keyof HandlerUrls; label: string }[] = [\n { key: 'signIn' as any, label: 'Sign-in' },\n { key: 'signUp' as any, label: 'Sign-up' },\n { key: 'forgotPassword' as any, label: 'Forgot password' },\n { key: 'passwordReset' as any, label: 'Password reset' },\n { key: 'emailVerification' as any, label: 'Email verification' },\n { key: 'accountSettings' as any, label: 'Account settings' },\n { key: 'teamInvitation' as any, label: 'Team invitation' },\n { key: 'cliAuthConfirm' as any, label: 'CLI auth confirmation' },\n { key: 'mfa' as any, label: 'MFA' },\n { key: 'onboarding' as any, label: 'Onboarding' },\n { key: 'error' as any, label: 'Error' },\n ];\n\n type PageClassification = 'handler-component' | 'hosted' | 'custom';\n\n function classifyPage(key: keyof HandlerUrls): { classification: PageClassification; version: number | null } {\n const target: HandlerUrlTarget = (urlOptions as any)[key] ?? (urlOptions as any).default ?? { type: 'handler-component' };\n if (typeof target === 'string') {\n return { classification: 'custom', version: null };\n }\n if ('type' in target) {\n if (target.type === 'custom') {\n return { classification: 'custom', version: (target as any).version ?? null };\n }\n return { classification: target.type as PageClassification, version: null };\n }\n return { classification: 'handler-component', version: null };\n }\n\n type PageInfo = {\n key: keyof HandlerUrls;\n label: string;\n url: string;\n classification: PageClassification;\n version: number | null;\n versionStatus: string;\n versionChangelogs: { version: number; changelog: string }[];\n };\n\n let latestVersions: Map<string, { version: number; changelogs: Record<number, string> }> | null = null;\n let selectedKey: string | null = null;\n\n runAsynchronously(\n fetch(`${apiBaseUrl}/api/latest/internal/component-versions`)\n .then((r) => r.json())\n .then((data) => {\n latestVersions = new Map(Object.entries(data.versions ?? {}));\n renderSidebar();\n })\n .catch(() => {})\n );\n\n function buildPages(): PageInfo[] {\n return PAGE_ENTRIES.map((entry) => {\n const { classification, version } = classifyPage(entry.key);\n let versionStatus = 'current';\n let versionChangelogs: { version: number; changelog: string }[] = [];\n\n if (classification === 'custom' && version != null && latestVersions) {\n const info = latestVersions.get(entry.key as string);\n if (info && version < info.version) {\n versionStatus = 'outdated';\n versionChangelogs = Object.entries(info.changelogs)\n .map(([v, cl]) => ({ version: Number(v), changelog: cl }))\n .filter((e) => e.version > version)\n .sort((a, b) => a.version - b.version);\n }\n }\n\n return {\n key: entry.key,\n label: entry.label,\n url: (urls as any)[entry.key] || '',\n classification,\n version,\n versionStatus,\n versionChangelogs,\n };\n });\n }\n\n function getCompactUrl(url: string): string {\n const resolved = new URL(url, window.location.origin);\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n }\n\n const sidebar = h('div', { className: 'sdt-pg-sidebar' });\n const mainArea = h('div', { className: 'sdt-pg-main' });\n\n function renderSidebar() {\n sidebar.innerHTML = '';\n const pages = buildPages();\n const outdatedCount = pages.filter((p) => p.versionStatus === 'outdated').length;\n\n const head = h('div', { className: 'sdt-pg-sidebar-head' });\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-title' }, 'Pages'));\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-count' }, String(pages.length)));\n if (outdatedCount > 0) {\n head.appendChild(h('span', { className: 'sdt-pg-sidebar-warn' }, `${outdatedCount} outdated`));\n }\n sidebar.appendChild(head);\n\n const list = h('div', { className: 'sdt-pg-list' });\n for (const page of pages) {\n const isOutdated = page.versionStatus === 'outdated';\n const item = h('div', {\n className: `sdt-pg-item ${isOutdated ? 'sdt-pg-item-warn' : ''}`,\n 'data-selected': String(selectedKey === page.key),\n });\n const dotClass = isOutdated\n ? 'sdt-pg-item-dot-warn'\n : page.classification === 'custom'\n ? 'sdt-pg-item-dot-custom'\n : 'sdt-pg-item-dot-handler';\n item.appendChild(h('span', { className: `sdt-pg-item-dot ${dotClass}` }));\n item.appendChild(h('span', { className: 'sdt-pg-item-label' }, page.label));\n if (isOutdated) {\n item.appendChild(h('span', { className: 'sdt-pg-badge sdt-pg-badge-outdated' }, 'Outdated'));\n }\n item.addEventListener('click', () => {\n selectedKey = page.key as string;\n renderSidebar();\n renderDetail(page);\n });\n list.appendChild(item);\n }\n sidebar.appendChild(list);\n }\n\n function renderDetail(page: PageInfo) {\n mainArea.innerHTML = '';\n const detail = h('div', { className: 'sdt-pg-detail' });\n\n const header = h('div', { className: 'sdt-pg-header' });\n const headerTop = h('div', { className: 'sdt-pg-header-top' });\n headerTop.appendChild(h('h3', { className: 'sdt-pg-title' }, `${page.label} Page`));\n headerTop.appendChild(h('a', { href: page.url, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-pg-title-url' }, getCompactUrl(page.url)));\n if (page.versionStatus === 'outdated') {\n headerTop.appendChild(h('span', { className: 'sdt-pg-badge sdt-pg-badge-outdated' }, 'Outdated'));\n }\n header.appendChild(headerTop);\n\n const redirectMethod = `hexclaveApp.redirectTo${(page.key as string).charAt(0).toUpperCase()}${(page.key as string).slice(1)}()`;\n const codeRow = h('div', { className: 'sdt-pg-code-inline' });\n codeRow.appendChild(h('code', { className: 'sdt-pg-code' }, redirectMethod));\n const openBtn = h('button', { className: 'sdt-pg-copy-btn sdt-pg-open-btn' });\n setHtml(openBtn, 'Open <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M7 17L17 7\"/><path d=\"M7 7h10v10\"/></svg>');\n openBtn.addEventListener('click', () => {\n const resolved = new URL(page.url, window.location.origin);\n window.open(resolved.toString(), '_blank', 'noopener,noreferrer');\n });\n codeRow.appendChild(openBtn);\n header.appendChild(codeRow);\n detail.appendChild(header);\n\n const prompt = getPagePrompt(page.key as string, page.version ?? undefined);\n if (prompt) {\n const isOutdated = page.versionStatus === 'outdated';\n const showPrompt = page.classification === 'handler-component' || page.classification === 'hosted' || isOutdated;\n if (showPrompt) {\n let promptText: string;\n if (isOutdated && prompt.upgradePrompt) {\n promptText = prompt.upgradePrompt;\n } else if (prompt.fullPrompt) {\n promptText = prompt.fullPrompt;\n } else {\n promptText = '';\n }\n\n if (promptText) {\n const section = h('div', { className: 'sdt-pg-section' });\n section.appendChild(h('div', { className: 'sdt-pg-section-label' }, isOutdated ? 'Use this prompt to upgrade your component:' : 'Want to customize this page? Paste this prompt into your coding agent.'));\n section.appendChild(h('pre', { className: 'sdt-pg-pre' }, promptText));\n const footer = h('div', { className: 'sdt-pg-section-footer' });\n const copyBtn = h('button', { className: 'sdt-pg-copy-btn' }, 'Copy prompt');\n copyBtn.addEventListener('click', () => {\n runAsynchronously(navigator.clipboard.writeText(promptText).then(() => {\n copyBtn.textContent = '\\u2713 Copied';\n setTimeout(() => {\n copyBtn.textContent = 'Copy prompt';\n }, 1500);\n }));\n });\n footer.appendChild(copyBtn);\n section.appendChild(footer);\n detail.appendChild(section);\n }\n }\n }\n\n mainArea.appendChild(detail);\n }\n\n function renderEmptyMain() {\n mainArea.innerHTML = '';\n const empty = h('div', { className: 'sdt-pg-empty' });\n const icon = h('div', { className: 'sdt-pg-empty-icon' });\n setHtml(icon, '<svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/></svg>');\n empty.appendChild(icon);\n empty.appendChild(h('div', { className: 'sdt-pg-empty-text' }, 'Select a page to inspect'));\n empty.appendChild(h('div', { className: 'sdt-pg-empty-sub' }, 'View configuration, preview, and upgrade prompts'));\n mainArea.appendChild(empty);\n }\n\n renderSidebar();\n renderEmptyMain();\n\n container.append(sidebar, mainArea);\n return container;\n}\n\n// ---------------------------------------------------------------------------\n// Panel (main shell with tab bar and content area)\n// ---------------------------------------------------------------------------\n\nfunction createPanel(\n app: StackClientApp<true>,\n state: ReturnType<typeof createStateStore>,\n logStore: LogStore,\n onClose: () => void,\n): { element: HTMLElement, cleanup: () => void } {\n const panel = h('div', { className: 'sdt-panel' });\n let panelAnimationTimeout: ReturnType<typeof setTimeout> | null = null;\n\n function animateNextPanelGeometryChange() {\n panel.classList.add('sdt-panel-geometry-animated');\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n }\n panelAnimationTimeout = setTimeout(() => {\n panel.classList.remove('sdt-panel-geometry-animated');\n panelAnimationTimeout = null;\n }, 220);\n }\n\n function applyPanelMode(tabId: TabId, opts?: { animate?: boolean }) {\n if (opts?.animate === true) {\n animateNextPanelGeometryChange();\n }\n\n if (tabId === 'dashboard') {\n panel.classList.add('sdt-panel-fullscreen');\n panel.style.width = '';\n panel.style.height = '';\n return;\n }\n\n panel.classList.remove('sdt-panel-fullscreen');\n panel.style.width = state.get().panelWidth + 'px';\n panel.style.height = state.get().panelHeight + 'px';\n }\n\n const tabs = getTabsForApp(app);\n const storedActiveTab = state.get().activeTab;\n const activeTab = tabs.some((tab) => tab.id === storedActiveTab) ? storedActiveTab : DEFAULT_STATE.activeTab;\n\n applyPanelMode(activeTab);\n\n const inner = h('div', { className: 'sdt-panel-inner' });\n\n const closeBtn = h('button', { className: 'sdt-close-btn', 'aria-label': 'Close' });\n setHtml(closeBtn, '<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"3\" y1=\"3\" x2=\"11\" y2=\"11\"/><line x1=\"11\" y1=\"3\" x2=\"3\" y2=\"11\"/></svg>');\n closeBtn.addEventListener('click', onClose);\n\n const docsLink = h('a', { href: DOCS_URL, target: '_blank', rel: 'noopener noreferrer', className: 'sdt-docs-link' });\n docsLink.appendChild(document.createTextNode('Docs'));\n const docsIcon = h('span', { className: 'sdt-docs-link-icon', 'aria-hidden': 'true' });\n setHtml(docsIcon, '<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 17L17 7\"/><path d=\"M7 7h10v10\"/></svg>');\n docsLink.appendChild(docsIcon);\n\n const trailingControls = h('div', { className: 'sdt-tabbar-actions' }, docsLink, closeBtn);\n\n const tabBar = createTabBar(tabs, activeTab, (id) => {\n state.update({ activeTab: id as TabId });\n applyPanelMode(id as TabId, { animate: true });\n showTab(id as TabId);\n }, { trailing: trailingControls });\n inner.appendChild(tabBar.el);\n\n const content = h('div', { className: 'sdt-content' });\n const layers = h('div', { className: 'sdt-tab-layers' });\n content.appendChild(layers);\n inner.appendChild(content);\n\n const mountedPanes = new Map<TabId, HTMLElement>();\n const cleanups: Array<() => void> = [];\n\n function mountTab(pane: HTMLElement, result: TabResult | HTMLElement) {\n if ('element' in result) {\n pane.appendChild(result.element);\n if (result.cleanup) {\n cleanups.push(result.cleanup);\n }\n } else {\n pane.appendChild(result);\n }\n }\n\n function getOrCreatePane(tabId: TabId): HTMLElement {\n if (mountedPanes.has(tabId)) {\n return mountedPanes.get(tabId)!;\n }\n const pane = h('div', { className: 'sdt-tab-pane' });\n if (tabId === 'dashboard') {\n pane.classList.add('sdt-tab-pane-iframe');\n }\n switch (tabId) {\n case 'overview': {\n mountTab(pane, createOverviewTab(app));\n break;\n }\n case 'customize': {\n mountTab(pane, createComponentsTab(app));\n break;\n }\n case 'ai': {\n mountTab(pane, createAITab(app));\n break;\n }\n case 'console': {\n mountTab(pane, createConsoleTab(logStore));\n break;\n }\n case 'dashboard': {\n mountTab(pane, createDashboardTab(app));\n break;\n }\n case 'support': {\n mountTab(pane, createSupportTab(app));\n break;\n }\n }\n mountedPanes.set(tabId, pane);\n layers.appendChild(pane);\n return pane;\n }\n\n function showTab(tabId: TabId) {\n const pane = getOrCreatePane(tabId);\n tabBar.setActive(tabId);\n for (const [, p] of mountedPanes) {\n p.classList.remove('sdt-tab-pane-active');\n }\n pane.classList.add('sdt-tab-pane-active');\n }\n\n showTab(activeTab);\n\n function addResizeHandle(edge: 'top' | 'left' | 'top-left') {\n const handle = h('div', { className: `sdt-resize-handle sdt-resize-${edge}` });\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n handle.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n panelAnimationTimeout = null;\n }\n panel.classList.remove('sdt-panel-geometry-animated');\n handle.setPointerCapture(e.pointerId);\n startX = e.clientX;\n startY = e.clientY;\n startW = panel.offsetWidth;\n startH = panel.offsetHeight;\n });\n\n handle.addEventListener('pointermove', (e) => {\n if (!handle.hasPointerCapture(e.pointerId)) return;\n const dx = startX - e.clientX;\n const dy = startY - e.clientY;\n if (edge === 'left' || edge === 'top-left') {\n const newW = Math.max(400, Math.min(startW + dx, window.innerWidth - 32));\n panel.style.width = newW + 'px';\n }\n if (edge === 'top' || edge === 'top-left') {\n const newH = Math.max(300, Math.min(startH + dy, window.innerHeight - 80));\n panel.style.height = newH + 'px';\n }\n });\n\n handle.addEventListener('pointerup', (e) => {\n handle.releasePointerCapture(e.pointerId);\n state.update({ panelWidth: panel.offsetWidth, panelHeight: panel.offsetHeight });\n });\n\n panel.appendChild(handle);\n }\n\n addResizeHandle('top');\n addResizeHandle('left');\n addResizeHandle('top-left');\n\n panel.appendChild(inner);\n return {\n element: panel,\n cleanup: () => {\n if (panelAnimationTimeout !== null) {\n clearTimeout(panelAnimationTimeout);\n }\n for (const fn of cleanups) fn();\n },\n };\n}\n\n// ===========================================================================================\n// Main entry point\n// ===========================================================================================\n\nexport function createDevTool(app: StackClientApp<true>): () => void {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return () => {};\n }\n const body = Reflect.get(document, 'body');\n if (!hasAppendChild(body)) return () => {};\n\n getGlobalUiInstance(GLOBAL_INSTANCE_KEY)?.cleanup();\n let existingRoot = document.getElementById(ROOT_ID);\n while (existingRoot !== null) {\n existingRoot.remove();\n existingRoot = document.getElementById(ROOT_ID);\n }\n\n const root = document.createElement('div');\n root.id = ROOT_ID;\n body.appendChild(root);\n\n const wrapper = h('div', { className: 'hexclave-devtool' });\n root.appendChild(wrapper);\n\n const style = document.createElement('style');\n style.textContent = devToolCSS;\n wrapper.appendChild(style);\n\n const state = createStateStore();\n const logStore = getGlobalLogStore();\n\n let panel: { element: HTMLElement, cleanup: () => void } | null = null;\n\n function closePanelAndPersistClosed() {\n closePanel();\n }\n\n function openPanel() {\n if (panel) return;\n panel = createPanel(app, state, logStore, closePanelAndPersistClosed);\n wrapper.appendChild(panel.element);\n }\n\n function closePanel() {\n if (!panel) return;\n state.update({ isOpen: false });\n const closing = panel;\n panel = null;\n closing.cleanup();\n closing.element.classList.add('sdt-panel-exiting');\n setTimeout(() => {\n if (wrapper.contains(closing.element)) {\n wrapper.removeChild(closing.element);\n }\n }, 150);\n }\n\n function togglePanel() {\n if (state.get().isOpen) {\n closePanel();\n } else {\n state.update({ isOpen: true });\n openPanel();\n }\n }\n\n const trigger = createTrigger(togglePanel);\n wrapper.appendChild(trigger.element);\n\n if (state.get().isOpen) {\n openPanel();\n }\n\n const removeRequestListener = app[hexclaveAppInternalsSymbol].addRequestListener((entry: RequestLogEntry) => {\n const timestamp = Date.now();\n logStore.addApiLog({\n id: nextId(),\n timestamp,\n method: entry.method,\n url: entry.path,\n status: entry.status,\n duration: entry.duration,\n error: entry.error,\n });\n if (entry.error) {\n logStore.addEventLog({ id: nextId(), timestamp, type: 'error', message: `Network error on ${entry.method} ${entry.path}: ${entry.error}` });\n } else if (entry.status && entry.status >= 400) {\n logStore.addEventLog({ id: nextId(), timestamp, type: 'error', message: `API error ${entry.status} on ${entry.method} ${entry.path}` });\n }\n });\n\n let didCleanup = false;\n const instance: UiGlobalInstance = {\n cleanup: () => {\n if (didCleanup) return;\n didCleanup = true;\n if (getGlobalUiInstance(GLOBAL_INSTANCE_KEY) === instance) {\n setGlobalUiInstance(GLOBAL_INSTANCE_KEY, null);\n }\n trigger.cleanup();\n removeRequestListener();\n panel?.cleanup();\n if (root.parentNode) {\n root.parentNode.removeChild(root);\n }\n },\n };\n setGlobalUiInstance(GLOBAL_INSTANCE_KEY, instance);\n\n return () => {\n instance.cleanup();\n };\n}\n\n"],"mappings":"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"}
|