vibe64 0.1.38 → 0.1.40
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/bin/run.js +1942 -1846
- package/bin/server.js +136 -112
- package/bin/upgrade-state.js +5023 -4860
- package/dist/assets/GithubBrowserTabs-BoDkGFtY.js +1 -0
- package/dist/assets/LocalDatabaseServer-BWAvRlUl.css +1 -0
- package/dist/assets/LocalDatabaseServer-CVsGChHh.js +2 -0
- package/dist/assets/StudioErrorNotice-C_jbvp9V.js +1 -0
- package/dist/assets/VAlert-gwuhYlYb.js +1 -0
- package/dist/assets/VAutocomplete-D7Vk5wq_.js +1 -0
- package/dist/assets/VAvatar-DvRBcmqv.js +1 -0
- package/dist/assets/VBtn-BhVEwXLX.js +1 -0
- package/dist/assets/VCard-C3Hx769y.js +1 -0
- package/dist/assets/VCheckbox-DyCGSN0H.js +1 -0
- package/dist/assets/VCheckboxBtn-DCyuVH7W.css +1 -0
- package/dist/assets/VCheckboxBtn-DYcQU2Pn.js +1 -0
- package/dist/assets/VChip-VVdtjfq-.js +1 -0
- package/dist/assets/VDialog-CQDhjRiV.js +1 -0
- package/dist/assets/VDivider-Dq25WsKu.js +1 -0
- package/dist/assets/VExpansionPanels-C1y-myl5.js +1 -0
- package/dist/assets/VMenu-CDcBLYWR.js +1 -0
- package/dist/assets/VOverlay-Cp4rFk6g.js +1 -0
- package/dist/assets/VRadioGroup-CAjNZwF7.js +1 -0
- package/dist/assets/VRow-BskP28jR.js +1 -0
- package/dist/assets/VSelect-D3oLvCcB.js +2 -0
- package/dist/assets/VSheet-DxYEFfnM.js +1 -0
- package/dist/assets/VSkeletonLoader-Cync3lZZ.js +1 -0
- package/dist/assets/VSpacer-CgWOWvBh.js +1 -0
- package/dist/assets/VSwitch-BxGuGypi.js +1 -0
- package/dist/assets/VTextField-C0b_0cSa.js +1 -0
- package/dist/assets/VTextField-F6unyhrS.css +1 -0
- package/dist/assets/VTextarea-B7sZd1JY.js +1 -0
- package/dist/assets/{Vibe64AsyncModuleState-Do9EqX3S.js → Vibe64AsyncModuleState-syuPcpGx.js} +1 -1
- package/dist/assets/Vibe64AuthSettingsButton-CmiidAs5.js +5 -0
- package/dist/assets/{Vibe64AuthSettingsButton-M44SSmZ9.css → Vibe64AuthSettingsButton-D2lltUhi.css} +1 -1
- package/dist/assets/Vibe64CopyCommand-CYiZcy0d.js +1 -0
- package/dist/assets/Vibe64CopyCommand-ClbQLYZi.css +1 -0
- package/dist/assets/{Vibe64DashboardBackButton-BH_8j_VR.js → Vibe64DashboardBackButton-Go_MJuIK.js} +1 -1
- package/dist/assets/{Vibe64DashboardPageHeader-BXQR00HK.js → Vibe64DashboardPageHeader-BMrdRph6.js} +1 -1
- package/dist/assets/Vibe64DashboardPageHeader-CdlzsyKQ.css +1 -0
- package/dist/assets/Vibe64DashboardShell-MCzEQCWu.js +1 -0
- package/dist/assets/{Vibe64DatabaseWorkspace-Ca8IHSRq.js → Vibe64DatabaseWorkspace-DM9V017v.js} +3 -3
- package/dist/assets/{Vibe64DatabaseWorkspace-DPDMxhAW.css → Vibe64DatabaseWorkspace-DePBDUMy.css} +1 -1
- package/dist/assets/Vibe64OutputControls-CU9H0Dur.js +8 -0
- package/dist/assets/{Vibe64OutputControls-Co5YzwcK.css → Vibe64OutputControls-CeBzZPUT.css} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-Agyt4O-V.css → Vibe64RepositoryWorkspace-Bw9W691N.css} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-BfsZozSJ.js → Vibe64RepositoryWorkspace-DaAChLA8.js} +2 -2
- package/dist/assets/{Vibe64SessionFiles-n87RqqY6.js → Vibe64SessionFiles-CM2EzXBf.js} +4 -4
- package/dist/assets/Vibe64SessionFiles-DsPb8hOe.css +1 -0
- package/dist/assets/{Vibe64TemporaryAiFixAction-BiuIE9mC.js → Vibe64TemporaryAiFixAction-CIePbdW8.js} +1 -1
- package/dist/assets/{Vibe64UiStoryboardView-BhKRpL0N.js → Vibe64UiStoryboardView-Bp9STItF.js} +1 -1
- package/dist/assets/{Vibe64UnavailableSessions-Ca5nC7KH.js → Vibe64UnavailableSessions-JBgHzM-j.js} +1 -1
- package/dist/assets/{_sessionId_-B_TTRB4c.js → _sessionId_-DVHd6D5V.js} +1 -1
- package/dist/assets/{_sessionTool_-1V-z6Pbp.js → _sessionTool_-BV1AwpUx.js} +1 -1
- package/dist/assets/_slug_-DsfaE8Vh.js +25 -0
- package/dist/assets/_slug_-_qfQqdHb.css +1 -0
- package/dist/assets/{access-tl4ht_d8.js → access-BbzSuMt5.js} +1 -1
- package/dist/assets/app-BNh2oZg-.js +1 -0
- package/dist/assets/assistantRouting-DeE8jvtE.js +3 -0
- package/dist/assets/{changes-DZWHZguL.js → changes-D8Koqrqg.js} +1 -1
- package/dist/assets/client-CybfBKCn.js +2 -0
- package/dist/assets/client-D6UGamrv.css +1 -0
- package/dist/assets/{conversation-B90ERX9h.js → conversation-DZW4-Wck.js} +2 -2
- package/dist/assets/{conversation-vxJGwmtW.css → conversation-TK6EmDk4.css} +1 -1
- package/dist/assets/{createSimpleFunctional-CZTGuNuR.js → createSimpleFunctional-zlXZooQW.js} +1 -1
- package/dist/assets/{dashboard-iREwhGqv.js → dashboard-DLrmf5ed.js} +1 -1
- package/dist/assets/definitions-DgyQJgn-.js +1 -0
- package/dist/assets/dialog-transition-D2vqGksQ.js +1 -0
- package/dist/assets/env-B5V1EC4M.css +1 -0
- package/dist/assets/env-rVQwLtYr.js +1 -0
- package/dist/assets/health-92hh8xXh.css +1 -0
- package/dist/assets/health-B6r9LLrd.js +1 -0
- package/dist/assets/{history-DVURy45X.js → history-C6xLWUxL.js} +1 -1
- package/dist/assets/incoming-Bdqo8z25.css +1 -0
- package/dist/assets/incoming-CNwZa_yD.js +2 -0
- package/dist/assets/index-B9P6KjvH.js +138 -0
- package/dist/assets/{index-irlMYzLh.css → index-BC29JK2e.css} +1 -1
- package/dist/assets/{integrations-Dy5jIiJ5.js → integrations-CcrqPXxj.js} +10 -10
- package/dist/assets/integrations-Co8WvCiD.css +1 -0
- package/dist/assets/issues-DEjIlMdl.js +1 -0
- package/dist/assets/layout-B2Ap07aa.js +1 -0
- package/dist/assets/{lazy-NHSwD9FS.js → lazy-BjyT2XvW.js} +1 -1
- package/dist/assets/{learning-_O1PEaam.js → learning-BP1xvd8w.js} +1 -1
- package/dist/assets/mdi-Bt90Ns76.js +1 -0
- package/dist/assets/placement-CQy46H3H.js +1 -0
- package/dist/assets/publish-CPWnztCc.css +1 -0
- package/dist/assets/publish-CVXolnAG.js +3 -0
- package/dist/assets/pull-requests-BjwokcU0.css +1 -0
- package/dist/assets/pull-requests-DdgzLzY_.js +1 -0
- package/dist/assets/{repository-BUfUAyS9.js → repository-5S0LzRq3.js} +1 -1
- package/dist/assets/ripple-EFNA8EBu.js +11 -0
- package/dist/assets/rolldown-runtime-DBalRfVu.js +1 -0
- package/dist/assets/{session-BdhKrcX4.js → session-BGpiZThC.js} +1 -1
- package/dist/assets/{settings-CzhIcn9K.js → settings-BKP_eQ3F.js} +1 -1
- package/dist/assets/settings-D8x4KUqV.css +1 -0
- package/dist/assets/shared-DZETtWRH.js +2 -0
- package/dist/assets/studioGateApi-BXHVBVEc.js +1 -0
- package/dist/assets/studioUrls-DpSS-0z1.js +1 -0
- package/dist/assets/useArchivedVibe64Sessions-D8DWpcSy.js +1 -0
- package/dist/assets/useCommand-nWFczmJy.js +1 -0
- package/dist/assets/useEndpointResource-Ds8EDBZ2.js +1 -0
- package/dist/assets/useRealtimeEvent-DrOiU8lJ.js +1 -0
- package/dist/assets/{useUiFeedback-BPBF_0bp.js → useUiFeedback-CMwE4MLs.js} +1 -1
- package/dist/assets/useVibe64ConversationLog-D-Vkq0sK.js +1 -0
- package/dist/assets/{useVibe64DatabaseTools-4o6S8eXq.js → useVibe64DatabaseTools-Dpm53ruL.js} +1 -1
- package/dist/assets/useVibe64ProjectScope-B5ogg6jd.js +1 -0
- package/dist/assets/useVibe64SessionData-CGJXj3r7.js +1 -0
- package/dist/assets/{useVibe64SessionSelection-CuZCzAcY.js → useVibe64SessionSelection-BEqKR412.js} +1 -1
- package/dist/assets/{useVibe64SystemGraph-B4RmsC9Y.js → useVibe64SystemGraph-DbSfrYF8.js} +1 -1
- package/dist/assets/{useVibe64Terminal-Cg3idMcy.js → useVibe64Terminal-I7Sf6xMW.js} +1 -1
- package/dist/assets/vibe64ProjectScope.local-B06ABkhI.js +1 -0
- package/dist/assets/vibe64SavedEnvValues-B_QE9aAj.js +1 -0
- package/dist/assets/vibe64SessionFocus-CA-sk8Ri.css +1 -0
- package/dist/assets/vibe64SessionFocus-tv2wz7_H.js +1 -0
- package/dist/assets/{vibe64SessionInfo-BuBUdL-e.js → vibe64SessionInfo-B0uItVOK.js} +1 -1
- package/dist/assets/{vibe64SessionToolDefinitions-BJaJH5LR.js → vibe64SessionToolDefinitions-Dsn8WYmO.js} +1 -1
- package/dist/index.html +56 -46
- package/docs/colleague-usage/account-profile-and-appearance.md +1 -1
- package/docs/colleague-usage/{ai-accounts-and-routing.md → ai-accounts.md} +41 -114
- package/docs/colleague-usage/ai-model-setups.md +159 -0
- package/docs/colleague-usage/ai-onboarding.md +94 -21
- package/docs/colleague-usage/ai-personal-use.md +41 -0
- package/docs/colleague-usage/auto-workflow.md +8 -3
- package/docs/colleague-usage/codex-context-recovery.md +2 -1
- package/docs/colleague-usage/coding-agent-goals.md +7 -4
- package/docs/colleague-usage/coding-agents.md +8 -5
- package/docs/colleague-usage/colleague-watches.md +15 -4
- package/docs/colleague-usage/colleague.md +21 -5
- package/docs/colleague-usage/connected-contributions.md +13 -13
- package/docs/colleague-usage/connected-projects.md +2 -2
- package/docs/colleague-usage/conversation-context.md +1 -1
- package/docs/colleague-usage/dashboard-navigation.md +5 -3
- package/docs/colleague-usage/development-env.md +21 -4
- package/docs/colleague-usage/file-interfaces.md +1 -1
- package/docs/colleague-usage/github-work.md +8 -8
- package/docs/colleague-usage/health-checks.md +52 -18
- package/docs/colleague-usage/incoming-changes.md +3 -3
- package/docs/colleague-usage/integrations.md +5 -3
- package/docs/colleague-usage/learning-course-catalogue.md +3 -3
- package/docs/colleague-usage/learning-environment.md +57 -50
- package/docs/colleague-usage/learning-mode-ui.md +13 -10
- package/docs/colleague-usage/learning-practice-projects.md +13 -2
- package/docs/colleague-usage/learning-teacher-guide.md +9 -4
- package/docs/colleague-usage/learning-with-colleague.md +9 -5
- package/docs/colleague-usage/lesson-authoring.md +12 -12
- package/docs/colleague-usage/lesson-step-bar.md +32 -33
- package/docs/colleague-usage/main-chat-approvals.md +150 -0
- package/docs/colleague-usage/preview-browser-checks.md +5 -1
- package/docs/colleague-usage/project-language-tools.md +16 -2
- package/docs/colleague-usage/project-settings.md +1 -1
- package/docs/colleague-usage/project-setup.md +17 -7
- package/docs/colleague-usage/publishing.md +185 -0
- package/docs/colleague-usage/running-vibe64-on-your-computer.md +54 -6
- package/docs/colleague-usage/sessions.md +18 -10
- package/docs/colleague-usage/set-up-linux.md +254 -0
- package/docs/colleague-usage/set-up-macos.md +199 -0
- package/docs/colleague-usage/set-up-windows.md +76 -0
- package/docs/colleague-usage/starter-apps.md +21 -4
- package/docs/colleague-usage/teaching-content.md +2 -2
- package/docs/colleague-usage/team-ai-access.md +108 -0
- package/docs/colleague-usage/temporary-chats.md +9 -7
- package/docs/colleague-usage/workspace-preparation.md +50 -1
- package/docs/templates/learn-topic/README.md +3 -3
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/lesson.json +2 -1
- package/docs/training-content.md +39 -16
- package/node_modules/@jskit-ai/assistant-core/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/patterns/oauth-connection/PATTERN.md +25 -0
- package/node_modules/@jskit-ai/connectors-core/package.json +1 -1
- package/node_modules/@jskit-ai/http-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/kernel/package.json +1 -1
- package/node_modules/@jskit-ai/realtime/package.json +1 -1
- package/node_modules/@jskit-ai/resource-core/package.json +1 -1
- package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
- package/node_modules/@jskit-ai/uploads-runtime/package.json +1 -1
- package/node_modules/@local/vibe64-accounts/package.json +2 -1
- package/node_modules/@local/vibe64-core/package.json +4 -1
- package/node_modules/@local/vibe64-execution/src/host/execHelper.js +82 -81
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +73 -69
- package/node_modules/@local/vibe64-genesis/package.json +1 -0
- package/node_modules/@local/vibe64-genesis/src/server/agentSpecs.js +118 -68
- package/node_modules/@local/vibe64-genesis/src/server/index.js +501 -415
- package/node_modules/@local/vibe64-genesis/src/server/packaging.js +105 -0
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +143 -139
- package/node_modules/@local/vibe64-packaging/package.json +26 -0
- package/node_modules/@local/vibe64-packaging/src/server/packers/capacitor/ShellIcons.java +112 -0
- package/node_modules/@local/vibe64-project/package.json +3 -1
- package/node_modules/@local/vibe64-publishing/package.json +12 -0
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +7 -7
- package/node_modules/@local/vibe64-runtime/src/shared/assistantRoutingScores.json +25 -22
- package/node_modules/@local/vibe64-terminals/package.json +2 -1
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1340 -1300
- package/node_modules/@local/vibe64-training/package.json +2 -1
- package/package.json +19 -15
- package/server.bundle.mjs +42890 -40887
- package/dist/assets/GithubBrowserTabs-BykoCFfz.js +0 -1
- package/dist/assets/StudioErrorNotice-CSrUw1QV.js +0 -1
- package/dist/assets/VAlert-P256xaE0.js +0 -1
- package/dist/assets/VAutocomplete-BDb95qJX.js +0 -1
- package/dist/assets/VAvatar-DPzqDH4r.js +0 -1
- package/dist/assets/VBtn-B2MBK2DL.js +0 -1
- package/dist/assets/VCard-mXy0k4aS.js +0 -1
- package/dist/assets/VCheckbox-C7A1ZW4D.js +0 -1
- package/dist/assets/VChip-CcI-Oo2J.js +0 -1
- package/dist/assets/VDialog-Bu3EfKb1.js +0 -1
- package/dist/assets/VDivider-BMEqUoAB.js +0 -1
- package/dist/assets/VExpansionPanels-Dgjrop0V.js +0 -1
- package/dist/assets/VMenu-C_x18lwb.js +0 -1
- package/dist/assets/VOverlay-CeMZurIN.js +0 -1
- package/dist/assets/VRadioGroup-CUu2-KIP.js +0 -1
- package/dist/assets/VRow-Cpw7OHQV.js +0 -1
- package/dist/assets/VSelect-DL3HaA5m.js +0 -2
- package/dist/assets/VSheet-DZWsu0kL.js +0 -1
- package/dist/assets/VSkeletonLoader-CttxM1tw.js +0 -1
- package/dist/assets/VSpacer-Dhmsvk4t.js +0 -1
- package/dist/assets/VSwitch-BRHeDJkH.js +0 -1
- package/dist/assets/VTextField-BR2eZeFT.js +0 -1
- package/dist/assets/VTextField-BiatYyd3.css +0 -1
- package/dist/assets/VTextarea-DbqamXJd.js +0 -1
- package/dist/assets/Vibe64AuthSettingsButton-CIwtchKm.js +0 -5
- package/dist/assets/Vibe64DashboardPageHeader-Gm1IvlHx.css +0 -1
- package/dist/assets/Vibe64DashboardShell-DXVDJUAY.js +0 -1
- package/dist/assets/Vibe64OutputControls-DngQNTTt.js +0 -8
- package/dist/assets/Vibe64SessionFiles-Bl8wJ5Sk.css +0 -1
- package/dist/assets/_slug_-Buxpw0T4.css +0 -1
- package/dist/assets/_slug_-DsqilUs_.js +0 -24
- package/dist/assets/app-DT4_MliP.js +0 -1
- package/dist/assets/assistantRouting-D4XpXcEf.js +0 -3
- package/dist/assets/client-BWV84wi2.js +0 -2
- package/dist/assets/client-DGrP-2AJ.css +0 -1
- package/dist/assets/definitions-CNu5E87y.js +0 -1
- package/dist/assets/env-BzRtyO0w.css +0 -1
- package/dist/assets/env-D5KpTEw7.js +0 -1
- package/dist/assets/health-BJvooRnJ.css +0 -1
- package/dist/assets/health-BhoO1d4h.js +0 -1
- package/dist/assets/incoming-DWDrmxyH.css +0 -1
- package/dist/assets/incoming-DzADFGqp.js +0 -2
- package/dist/assets/index-GBRpNZLy.js +0 -138
- package/dist/assets/integrations-Cq1x-Di9.css +0 -1
- package/dist/assets/issues-lh7R775d.js +0 -1
- package/dist/assets/mdi-CG9pWOSj.js +0 -1
- package/dist/assets/placement-BF-zIEhA.js +0 -1
- package/dist/assets/pull-requests-ByE-Dvk7.js +0 -1
- package/dist/assets/pull-requests-CdbhyFOv.css +0 -1
- package/dist/assets/ripple-BVltMmyV.js +0 -11
- package/dist/assets/settings-BopLnpB0.css +0 -1
- package/dist/assets/shared-DpMvYJO3.js +0 -2
- package/dist/assets/studioGateApi-DcCqiD9V.js +0 -1
- package/dist/assets/studioUrls-DmMMIScP.js +0 -1
- package/dist/assets/useArchivedVibe64Sessions-CLHJOyeW.js +0 -1
- package/dist/assets/useCommand-Bqxb-naz.js +0 -1
- package/dist/assets/useEndpointResource-DWoQ2keu.js +0 -1
- package/dist/assets/useRealtimeEvent-Bwapstla.js +0 -1
- package/dist/assets/useVibe64ConversationLog-B4JgmxUf.js +0 -1
- package/dist/assets/useVibe64Learning-DyqXkpLw.js +0 -1
- package/dist/assets/useVibe64ProjectScope-Bp1ImZlz.js +0 -1
- package/dist/assets/useVibe64SessionData-YhhE_5pC.js +0 -1
- package/dist/assets/vibe64SessionFocus-Cz5Vq1re.js +0 -1
- package/dist/assets/vibe64SessionFocus-OJ2toBd9.css +0 -1
package/dist/assets/{Vibe64DatabaseWorkspace-Ca8IHSRq.js → Vibe64DatabaseWorkspace-DM9V017v.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$n as normalizeProps,Cn as toRaw,D as createVNode,E as createTextVNode,Ht as watch,J as inject,Lt as useSlots,Nt as useAttrs,On as unref,Ut as watchEffect,Yt as withDirectives,Zn as normalizeClass,_ as createBaseVNode,b as createElementBlock,bt as renderList,ct as onMounted,er as normalizeStyle,et as mergeProps,fn as markRaw,g as computed,gn as reactive,gt as provide,it as onBeforeUnmount,k as defineComponent,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,tt as nextTick,u as Teleport,v as createBlock,vn as ref,wn as toRef,wt as resolveDynamicComponent,xn as shallowRef,xt as renderSlot,y as createCommentVNode,z as guardReactiveProps}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{ar as vShow,h as VIcon,or as withKeys,sr as withModifiers}from"./ripple-EFNA8EBu.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{t as VSelect}from"./VSelect-D3oLvCcB.js";import{n as VList,s as VListItem,t as VMenu}from"./VMenu-CDcBLYWR.js";import{t as VChip}from"./VChip-VVdtjfq-.js";import{t as VTextField}from"./VTextField-C0b_0cSa.js";import{i as VIBE64_COLLEAGUE_DATABASE_KEY}from"./vibe64AssistantHost-CP6oxv5b.js";import{A as mdiBookmarkOutline,Ar as mdiTable,Bt as mdiFilterPlusOutline,Cn as mdiLinkVariant,Dr as mdiStop,Gn as mdiPin,Gt as mdiFullscreenExit,H as mdiChevronLeft,Kn as mdiPinOutline,Mr as mdiTableSearch,Rr as mdiTuneVariant,S as mdiArrowLeft,U as mdiChevronRight,V as mdiChevronDown,W as mdiChevronUp,Wn as mdiPencilOutline,Wt as mdiFullscreen,X as mdiClose,Yn as mdiPlus,Zt as mdiHistory,an as mdiKeyVariant,ar as mdiRestore,bt as mdiDeleteOutline,en as mdiImageFilterCenterFocus,er as mdiRedo,f as mdiAlertCircleOutline,j as mdiBookmarkPlusOutline,jr as mdiTableEye,kn as mdiMagnify,mt as mdiCreationOutline,nr as mdiRefresh,nt as mdiCodeTags,qn as mdiPlay,qt as mdiGraphOutline,rn as mdiInformationOutline,vt as mdiDatabaseAlertOutline,yt as mdiDatabaseOutline,z as mdiCheckCircleOutline,zr as mdiUndo}from"./mdi-Bt90Ns76.js";import{i as VBtnToggle,t as VBtn}from"./VBtn-BhVEwXLX.js";import{t as VAlert}from"./VAlert-gwuhYlYb.js";import{t as VAutocomplete}from"./VAutocomplete-D7Vk5wq_.js";import{t as VCheckbox}from"./VCheckbox-DyCGSN0H.js";import{t as VDivider}from"./VDivider-Dq25WsKu.js";import{t as VSheet}from"./VSheet-DxYEFfnM.js";import{t as VDialog}from"./VDialog-CQDhjRiV.js";import{i as VCardTitle,n as VCardText,o as VCardActions,t as VCard}from"./VCard-C3Hx769y.js";import{t as VSpacer}from"./VSpacer-CgWOWvBh.js";import{n as VRadio,t as VRadioGroup}from"./VRadioGroup-CAjNZwF7.js";import{t as VSkeletonLoader}from"./VSkeletonLoader-Cync3lZZ.js";import{t as VSwitch}from"./VSwitch-BxGuGypi.js";import{t as VTextarea}from"./VTextarea-B7sZd1JY.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{n as AssistantConversationElement_default}from"./conversation-DZW4-Wck.js";import{c as vibe64AssistantSelectionLabel}from"./shared-DZETtWRH.js";import{t as useUiFeedback}from"./useUiFeedback-CMwE4MLs.js";import{t as useVibe64DatabaseTools}from"./useVibe64DatabaseTools-Dpm53ruL.js";import{St as useAssistantConversation}from"./index-B9P6KjvH.js";import{B as tags,C as continuedIndent,G as drawSelection,H as EditorView,I as syntaxHighlighting,L as syntaxTree,Q as lineNumbers,Y as highlightActiveLine,Z as keymap,c as completeFromList,f as ExternalTokenizer,h as LRLanguage,j as indentNodeProp,k as foldNodeProp,l as ifNotIn,n as history,p as LRParser,r as historyKeymap,st as EditorState,t as defaultKeymap,v as LanguageSupport,w as defaultHighlightStyle,x as bracketMatching,z as styleTags}from"./dist-CDa9Iec1.js";import{a as _sfc_main$d,c as getBoundsofRects,d as getSmoothStepPath,f as isMacOs,i as _sfc_main$1$2,l as getConnectedEdges,m as wheelDelta,n as Position,o as _sfc_main$e,p as useVueFlow,r as _sfc_main$9,s as _sfc_main$f,t as MarkerType,u as getRectOfNodes}from"./vue-flow-core-BlVEnES8.js";var whitespace=36;var LineComment=1;var BlockComment=2;var String$1=3;var Number$1=4;var Bool=5;var Null=6;var ParenL=7;var ParenR=8;var BraceL=9;var BraceR=10;var BracketL=11;var BracketR=12;var Semi=13;var Dot=14;var Operator=15;var Punctuation=16;var SpecialVar=17;var Identifier=18;var QuotedIdentifier=19;var Keyword=20;var Type=21;var Bits=22;var Bytes=23;var Builtin=24;function isAlpha(ch){return ch>=65&&ch<=90||ch>=97&&ch<=122||ch>=48&&ch<=57}function isHexDigit(ch){return ch>=48&&ch<=57||ch>=97&&ch<=102||ch>=65&&ch<=70}function readLiteral(input,endQuote,backslashEscapes){for(let escaped=false;;){if(input.next<0)return;if(input.next==endQuote&&!escaped){input.advance();return}escaped=backslashEscapes&&!escaped&&input.next==92;input.advance()}}function readDoubleDollarLiteral(input,tag){scan:for(;;){if(input.next<0)return;if(input.next==36){input.advance();for(let i=0;i<tag.length;i++){if(input.next!=tag.charCodeAt(i))continue scan;input.advance()}if(input.next==36){input.advance();return}}else input.advance()}}function readPLSQLQuotedLiteral(input,openDelim){let matchingDelim=`[{<(`.indexOf(String.fromCharCode(openDelim));let closeDelim=matchingDelim<0?openDelim:`]}>)`.charCodeAt(matchingDelim);for(;;){if(input.next<0)return;if(input.next==closeDelim&&input.peek(1)==39){input.advance(2);return}input.advance()}}function readWord(input,result){for(;;){if(input.next!=95&&!isAlpha(input.next))break;if(result!=null)result+=String.fromCharCode(input.next);input.advance()}return result}function readWordOrQuoted(input){if(input.next==39||input.next==34||input.next==96){let quote=input.next;input.advance();readLiteral(input,quote,false)}else readWord(input)}function readBits(input,endQuote){while(input.next==48||input.next==49)input.advance();if(endQuote&&input.next==endQuote)input.advance()}function readNumber(input,sawDot){for(;;){if(input.next==46){if(sawDot)break;sawDot=true}else if(input.next<48||input.next>57)break;input.advance()}if(input.next==69||input.next==101){input.advance();if(input.next==43||input.next==45)input.advance();while(input.next>=48&&input.next<=57)input.advance()}}function eol(input){while(!(input.next<0||input.next==10))input.advance()}function inString(ch,str){for(let i=0;i<str.length;i++)if(str.charCodeAt(i)==ch)return true;return false}var Space=` \r
|
|
2
2
|
`;function keywords(keywords,types,builtin){let result=Object.create(null);result[`true`]=result[`false`]=Bool;result[`null`]=result[`unknown`]=Null;for(let kw of keywords.split(` `))if(kw)result[kw]=Keyword;for(let tp of types.split(` `))if(tp)result[tp]=Type;for(let kw of(builtin||``).split(` `))if(kw)result[kw]=Builtin;return result}var SQLTypes=`array binary bit boolean char character clob date decimal double float int integer interval large national nchar nclob numeric object precision real smallint time timestamp varchar varying `;var SQLKeywords=`absolute action add after all allocate alter and any are as asc assertion at authorization before begin between both breadth by call cascade cascaded case cast catalog check close collate collation column commit condition connect connection constraint constraints constructor continue corresponding count create cross cube current current_date current_default_transform_group current_transform_group_for_type current_path current_role current_time current_timestamp current_user cursor cycle data day deallocate declare default deferrable deferred delete depth deref desc describe descriptor deterministic diagnostics disconnect distinct do domain drop dynamic each else elseif end end-exec equals escape except exception exec execute exists exit external fetch first for foreign found from free full function general get global go goto grant group grouping handle having hold hour identity if immediate in indicator initially inner inout input insert intersect into is isolation join key language last lateral leading leave left level like limit local localtime localtimestamp locator loop map match method minute modifies module month names natural nesting new next no none not of old on only open option or order ordinality out outer output overlaps pad parameter partial path prepare preserve primary prior privileges procedure public read reads recursive redo ref references referencing relative release repeat resignal restrict result return returns revoke right role rollback rollup routine row rows savepoint schema scroll search second section select session session_user set sets signal similar size some space specific specifictype sql sqlexception sqlstate sqlwarning start state static system_user table temporary then timezone_hour timezone_minute to trailing transaction translation treat trigger under undo union unique unnest until update usage user using value values view when whenever where while with without work write year zone `;var defaults={backslashEscapes:false,hashComments:false,spaceAfterDashes:false,slashComments:false,doubleQuotedStrings:false,doubleDollarQuotedStrings:false,unquotedBitLiterals:false,treatBitsAsBytes:false,charSetCasts:false,plsqlQuotingMechanism:false,operatorChars:`*+-%<>!=&|~^/`,specialVar:`?`,identifierQuotes:`"`,caseInsensitiveIdentifiers:false,words:keywords(SQLKeywords,SQLTypes)};function dialect(spec,kws,types,builtin){let dialect={};for(let prop in defaults)dialect[prop]=(spec.hasOwnProperty(prop)?spec:defaults)[prop];if(kws)dialect.words=keywords(kws,types||``,builtin);return dialect}function tokensFor(d){return new ExternalTokenizer(input=>{var _a;let{next}=input;input.advance();if(inString(next,Space)){while(inString(input.next,Space))input.advance();input.acceptToken(whitespace)}else if(next==36&&d.doubleDollarQuotedStrings){let tag=readWord(input,``);if(input.next==36){input.advance();readDoubleDollarLiteral(input,tag);input.acceptToken(String$1)}}else if(next==39||next==34&&d.doubleQuotedStrings){readLiteral(input,next,d.backslashEscapes);input.acceptToken(String$1)}else if(next==35&&d.hashComments||next==47&&input.next==47&&d.slashComments){eol(input);input.acceptToken(LineComment)}else if(next==45&&input.next==45&&(!d.spaceAfterDashes||input.peek(1)==32)){eol(input);input.acceptToken(LineComment)}else if(next==47&&input.next==42){input.advance();for(let depth=1;;){let cur=input.next;if(input.next<0)break;input.advance();if(cur==42&&input.next==47){depth--;input.advance();if(!depth)break}else if(cur==47&&input.next==42){depth++;input.advance()}}input.acceptToken(BlockComment)}else if((next==101||next==69)&&input.next==39){input.advance();readLiteral(input,39,true);input.acceptToken(String$1)}else if((next==110||next==78)&&input.next==39&&d.charSetCasts){input.advance();readLiteral(input,39,d.backslashEscapes);input.acceptToken(String$1)}else if(next==95&&d.charSetCasts)for(let i=0;;i++){if(input.next==39&&i>1){input.advance();readLiteral(input,39,d.backslashEscapes);input.acceptToken(String$1);break}if(!isAlpha(input.next))break;input.advance()}else if(d.plsqlQuotingMechanism&&(next==113||next==81)&&input.next==39&&input.peek(1)>0&&!inString(input.peek(1),Space)){let openDelim=input.peek(1);input.advance(2);readPLSQLQuotedLiteral(input,openDelim);input.acceptToken(String$1)}else if(inString(next,d.identifierQuotes)){readLiteral(input,next==91?93:next,false);input.acceptToken(QuotedIdentifier)}else if(next==40)input.acceptToken(ParenL);else if(next==41)input.acceptToken(ParenR);else if(next==123)input.acceptToken(BraceL);else if(next==125)input.acceptToken(BraceR);else if(next==91)input.acceptToken(BracketL);else if(next==93)input.acceptToken(BracketR);else if(next==59)input.acceptToken(Semi);else if(d.unquotedBitLiterals&&next==48&&input.next==98){input.advance();readBits(input);input.acceptToken(Bits)}else if((next==98||next==66)&&(input.next==39||input.next==34)){const quoteStyle=input.next;input.advance();if(d.treatBitsAsBytes){readLiteral(input,quoteStyle,d.backslashEscapes);input.acceptToken(Bytes)}else{readBits(input,quoteStyle);input.acceptToken(Bits)}}else if(next==48&&(input.next==120||input.next==88)||(next==120||next==88)&&input.next==39){let quoted=input.next==39;input.advance();while(isHexDigit(input.next))input.advance();if(quoted&&input.next==39)input.advance();input.acceptToken(Number$1)}else if(next==46&&input.next>=48&&input.next<=57){readNumber(input,true);input.acceptToken(Number$1)}else if(next==46)input.acceptToken(Dot);else if(next>=48&&next<=57){readNumber(input,false);input.acceptToken(Number$1)}else if(inString(next,d.operatorChars)){while(inString(input.next,d.operatorChars))input.advance();input.acceptToken(Operator)}else if(inString(next,d.specialVar)){if(input.next==next)input.advance();readWordOrQuoted(input);input.acceptToken(SpecialVar)}else if(next==58||next==44)input.acceptToken(Punctuation);else if(isAlpha(next)){let word=readWord(input,String.fromCharCode(next));input.acceptToken(input.next==46||input.peek(-word.length-1)==46?Identifier:(_a=d.words[word.toLowerCase()])!==null&&_a!==void 0?_a:Identifier)}})}var tokens=tokensFor(defaults);var parser$1=LRParser.deserialize({version:14,states:"%vQ]QQOOO#wQRO'#DSO$OQQO'#CwO%eQQO'#CxO%lQQO'#CyO%sQQO'#CzOOQQ'#DS'#DSOOQQ'#C}'#C}O'UQRO'#C{OOQQ'#Cv'#CvOOQQ'#C|'#C|Q]QQOOQOQQOOO'`QQO'#DOO(xQRO,59cO)PQQO,59cO)UQQO'#DSOOQQ,59d,59dO)cQQO,59dOOQQ,59e,59eO)jQQO,59eOOQQ,59f,59fO)qQQO,59fOOQQ-E6{-E6{OOQQ,59b,59bOOQQ-E6z-E6zOOQQ,59j,59jOOQQ-E6|-E6|O+VQRO1G.}O+^QQO,59cOOQQ1G/O1G/OOOQQ1G/P1G/POOQQ1G/Q1G/QP+kQQO'#C}O+rQQO1G.}O)PQQO,59cO,PQQO'#Cw",stateData:",[~OtOSPOSQOS~ORUOSUOTUOUUOVROXSOZTO]XO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O^]ORvXSvXTvXUvXVvXXvXZvX]vX_vX`vXavXbvXcvXdvXevXfvXgvXhvX~OsvX~P!jOa_Ob_Oc_O~ORUOSUOTUOUUOVROXSOZTO^tO_UO`UOa`Ob`Oc`OdUOeUOfUOgUOhUO~OWaO~P$ZOYcO~P$ZO[eO~P$ZORUOSUOTUOUUOVROXSOZTO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O]hOsoX~P%zOajObjOcjO~O^]ORkaSkaTkaUkaVkaXkaZka]ka_ka`kaakabkackadkaekafkagkahka~Oska~P'kO^]O~OWvXYvX[vX~P!jOWnO~P$ZOYoO~P$ZO[pO~P$ZO^]ORkiSkiTkiUkiVkiXkiZki]ki_ki`kiakibkickidkiekifkigkihki~Oski~P)xOWkaYka[ka~P'kO]hO~P$ZOWkiYki[ki~P)xOasObsOcsO~O",goto:"#hwPPPPPPPPPPPPPPPPPPPPPPPPPPx||||!Y!^!d!xPPP#[TYOZeUORSTWZbdfqT[OZQZORiZSWOZQbRQdSQfTZgWbdfqQ^PWk^lmrQl_Qm`RrseVORSTWZbdfq",nodeNames:`⚠ LineComment BlockComment String Number Bool Null ( ) { } [ ] ; . Operator Punctuation SpecialVar Identifier QuotedIdentifier Keyword Type Bits Bytes Builtin Script Statement CompositeIdentifier Parens Braces Brackets Statement`,maxTerm:38,nodeProps:[[`isolate`,-4,1,2,3,19,``]],skippedNodes:[0,1,2],repeatNodeCount:3,tokenData:`RORO`,tokenizers:[0,tokens],topRules:{"Script":[0,25]},tokenPrec:0});function tokenBefore(tree){let cursor=tree.cursor().moveTo(tree.from,-1);while(/Comment/.test(cursor.name))cursor.moveTo(cursor.from,-1);return cursor.node}function idName(doc,node){let text=doc.sliceString(node.from,node.to);let quoted=/^([`'"\[])(.*)([`'"\]])$/.exec(text);return quoted?quoted[2]:text}function plainID(node){return node&&(node.name==`Identifier`||node.name==`QuotedIdentifier`)}function pathFor(doc,id){if(id.name==`CompositeIdentifier`){let path=[];for(let ch=id.firstChild;ch;ch=ch.nextSibling)if(plainID(ch))path.push(idName(doc,ch));return path}return[idName(doc,id)]}function parentsFor(doc,node){for(let path=[];;){if(!node||node.name!=`.`)return path;let name=tokenBefore(node);if(!plainID(name))return path;path.unshift(idName(doc,name));node=tokenBefore(name)}}function sourceContext(state,startPos){let pos=syntaxTree(state).resolveInner(startPos,-1);let aliases=getAliases(state.doc,pos);if(pos.name==`Identifier`||pos.name==`QuotedIdentifier`||pos.name==`Keyword`)return{from:pos.from,quoted:pos.name==`QuotedIdentifier`?state.doc.sliceString(pos.from,pos.from+1):null,parents:parentsFor(state.doc,tokenBefore(pos)),aliases};if(pos.name==`.`)return{from:startPos,quoted:null,parents:parentsFor(state.doc,pos),aliases};else return{from:startPos,quoted:null,parents:[],empty:true,aliases}}var EndFrom=new Set(`where group having order union intersect except all distinct limit offset fetch for`.split(` `));function getAliases(doc,at){let statement;for(let parent=at;!statement;parent=parent.parent){if(!parent)return null;if(parent.name==`Statement`)statement=parent}let aliases=null;for(let scan=statement.firstChild,sawFrom=false,prevID=null;scan;scan=scan.nextSibling){let kw=scan.name==`Keyword`?doc.sliceString(scan.from,scan.to).toLowerCase():null;let alias=null;if(!sawFrom)sawFrom=kw==`from`;else if(kw==`as`&&prevID&&plainID(scan.nextSibling))alias=idName(doc,scan.nextSibling);else if(kw&&EndFrom.has(kw))break;else if(prevID&&plainID(scan))alias=idName(doc,scan);if(alias){if(!aliases)aliases=Object.create(null);aliases[alias]=pathFor(doc,prevID)}prevID=/Identifier$/.test(scan.name)?scan:null}return aliases}function maybeQuoteCompletions(openingQuote,closingQuote,completions){return completions.map(c=>({...c,label:c.label[0]==openingQuote?c.label:openingQuote+c.label+closingQuote,apply:void 0}))}var Span=/^\w*$/;var QuotedSpan=/^[`'"\[]?\w*[`'"\]]?$/;function isSelfTag(namespace){return namespace.self&&typeof namespace.self.label==`string`}var CompletionLevel=class CompletionLevel{constructor(idQuote,idCaseInsensitive){this.idQuote=idQuote;this.idCaseInsensitive=idCaseInsensitive;this.list=[];this.children=void 0}child(name){let children=this.children||(this.children=Object.create(null));let found=children[name];if(found)return found;if(name&&!this.list.some(c=>c.label==name))this.list.push(nameCompletion(name,`type`,this.idQuote,this.idCaseInsensitive));return children[name]=new CompletionLevel(this.idQuote,this.idCaseInsensitive)}maybeChild(name){return this.children?this.children[name]:null}addCompletion(option){let found=this.list.findIndex(o=>o.label==option.label);if(found>-1)this.list[found]=option;else this.list.push(option)}addCompletions(completions){for(let option of completions)this.addCompletion(typeof option==`string`?nameCompletion(option,`property`,this.idQuote,this.idCaseInsensitive):option)}addNamespace(namespace){if(Array.isArray(namespace))this.addCompletions(namespace);else if(isSelfTag(namespace))this.addNamespace(namespace.children);else this.addNamespaceObject(namespace)}addNamespaceObject(namespace){for(let name of Object.keys(namespace)){let children=namespace[name],self=null;let parts=name.replace(/\\?\./g,p=>p==`.`?`\0`:p).split(`\0`);let scope=this;if(isSelfTag(children)){self=children.self;children=children.children}for(let i=0;i<parts.length;i++){if(self&&i==parts.length-1)scope.addCompletion(self);scope=scope.child(parts[i].replace(/\\\./g,`.`))}scope.addNamespace(children)}}};function nameCompletion(label,type,idQuote,idCaseInsensitive){if(new RegExp(`^[a-z_][a-z_\\d]*$`,idCaseInsensitive?`i`:``).test(label))return{label,type};return{label,type,apply:idQuote+label+getClosingQuote(idQuote)}}function getClosingQuote(openingQuote){return openingQuote===`[`?`]`:openingQuote}function completeFromSchema(schema,tables,schemas,defaultTableName,defaultSchemaName,dialect){var _a;let idQuote=((_a=dialect===null||dialect===void 0?void 0:dialect.spec.identifierQuotes)===null||_a===void 0?void 0:_a[0])||`"`;let top=new CompletionLevel(idQuote,!!(dialect===null||dialect===void 0?void 0:dialect.spec.caseInsensitiveIdentifiers));let defaultSchema=defaultSchemaName?top.child(defaultSchemaName):null;top.addNamespace(schema);if(tables)(defaultSchema||top).addCompletions(tables);if(schemas)top.addCompletions(schemas);if(defaultSchema)top.addCompletions(defaultSchema.list);if(defaultTableName)top.addCompletions((defaultSchema||top).child(defaultTableName).list);return context=>{let{parents,from,quoted,empty,aliases}=sourceContext(context.state,context.pos);if(empty&&!context.explicit)return null;if(aliases&&parents.length==1)parents=aliases[parents[0]]||parents;let level=top;for(let name of parents){while(!level.children||!level.children[name])if(level==top&&defaultSchema)level=defaultSchema;else if(level==defaultSchema&&defaultTableName)level=level.child(defaultTableName);else return null;let next=level.maybeChild(name);if(!next)return null;level=next}let options=level.list;if(level==top&&aliases)options=options.concat(Object.keys(aliases).map(name=>({label:name,type:`constant`})));if(quoted){let openingQuote=quoted[0];let closingQuote=getClosingQuote(openingQuote);return{from,to:context.state.sliceDoc(context.pos,context.pos+1)==closingQuote?context.pos+1:void 0,options:maybeQuoteCompletions(openingQuote,closingQuote,options),validFor:QuotedSpan}}else return{from,options,validFor:Span}}}function completionType(tokenType){return tokenType==Type?`type`:tokenType==Keyword?`keyword`:`variable`}function completeKeywords(keywords,upperCase,build){let completions=Object.keys(keywords).map(keyword=>build(upperCase?keyword.toUpperCase():keyword,completionType(keywords[keyword])));return ifNotIn([`QuotedIdentifier`,`String`,`LineComment`,`BlockComment`,`.`],completeFromList(completions))}var parser=parser$1.configure({props:[indentNodeProp.add({Statement:continuedIndent()}),foldNodeProp.add({Statement(tree,state){return{from:Math.min(tree.from+100,state.doc.lineAt(tree.from).to),to:tree.to}},BlockComment(tree){return{from:tree.from+2,to:tree.to-2}}}),styleTags({Keyword:tags.keyword,Type:tags.typeName,Builtin:tags.standard(tags.name),Bits:tags.number,Bytes:tags.string,Bool:tags.bool,Null:tags.null,Number:tags.number,String:tags.string,Identifier:tags.name,QuotedIdentifier:tags.special(tags.string),SpecialVar:tags.special(tags.name),LineComment:tags.lineComment,BlockComment:tags.blockComment,Operator:tags.operator,"Semi Punctuation":tags.punctuation,"( )":tags.paren,"{ }":tags.brace,"[ ]":tags.squareBracket})]});var SQLDialect=class SQLDialect{constructor(dialect,language,spec){this.dialect=dialect;this.language=language;this.spec=spec}get extension(){return this.language.extension}configureLanguage(options,name){return new SQLDialect(this.dialect,this.language.configure(options,name),this.spec)}static define(spec){let d=dialect(spec,spec.keywords,spec.types,spec.builtin);let language=LRLanguage.define({name:`sql`,parser:parser.configure({tokenizers:[{from:tokens,to:tokensFor(d)}]}),languageData:{commentTokens:{line:`--`,block:{open:`/*`,close:`*/`}},closeBrackets:{brackets:[`(`,`[`,`{`,`'`,`"`,"`"]}}});return new SQLDialect(d,language,spec)}};function defaultKeyword(label,type){return{label,type,boost:-1}}function keywordCompletionSource(dialect,upperCase=false,build){return completeKeywords(dialect.dialect.words,upperCase,build||defaultKeyword)}function schemaCompletionSource(config){return config.schema?completeFromSchema(config.schema,config.tables,config.schemas,config.defaultTable,config.defaultSchema,config.dialect||StandardSQL):()=>null}function schemaCompletion(config){return config.schema?(config.dialect||StandardSQL).language.data.of({autocomplete:schemaCompletionSource(config)}):[]}function sql(config={}){let lang=config.dialect||StandardSQL;return new LanguageSupport(lang.language,[schemaCompletion(config),lang.language.data.of({autocomplete:keywordCompletionSource(lang,config.upperCaseKeywords,config.keywordCompletion)})])}var StandardSQL=SQLDialect.define({});var PostgreSQL=SQLDialect.define({charSetCasts:true,doubleDollarQuotedStrings:true,operatorChars:"+-*/<>=~!@#%^&|`?",specialVar:``,keywords:SQLKeywords+`abort abs absent access according ada admin aggregate alias also always analyse analyze array_agg array_max_cardinality asensitive assert assignment asymmetric atomic attach attribute attributes avg backward base64 begin_frame begin_partition bernoulli bit_length blocked bom cache called cardinality catalog_name ceil ceiling chain char_length character_length character_set_catalog character_set_name character_set_schema characteristics characters checkpoint class class_origin cluster coalesce cobol collation_catalog collation_name collation_schema collect column_name columns command_function command_function_code comment comments committed concurrently condition_number configuration conflict connection_name constant constraint_catalog constraint_name constraint_schema contains content control conversion convert copy corr cost covar_pop covar_samp csv cume_dist current_catalog current_row current_schema cursor_name database datalink datatype datetime_interval_code datetime_interval_precision db debug defaults defined definer degree delimiter delimiters dense_rank depends derived detach detail dictionary disable discard dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue document dump dynamic_function dynamic_function_code element elsif empty enable encoding encrypted end_frame end_partition endexec enforced enum errcode error event every exclude excluding exclusive exp explain expression extension extract family file filter final first_value flag floor following force foreach fortran forward frame_row freeze fs functions fusion generated granted greatest groups handler header hex hierarchy hint id ignore ilike immediately immutable implementation implicit import include including increment indent index indexes info inherit inherits inline insensitive instance instantiable instead integrity intersection invoker isnull key_member key_type label lag last_value lead leakproof least length library like_regex link listen ln load location lock locked log logged lower mapping matched materialized max max_cardinality maxvalue member merge message message_length message_octet_length message_text min minvalue mod mode more move multiset mumps name namespace nfc nfd nfkc nfkd nil normalize normalized nothing notice notify notnull nowait nth_value ntile nullable nullif nulls number occurrences_regex octet_length octets off offset oids operator options ordering others over overlay overriding owned owner parallel parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partition pascal passing passthrough password percent percent_rank percentile_cont percentile_disc perform period permission pg_context pg_datatype_name pg_exception_context pg_exception_detail pg_exception_hint placing plans pli policy portion position position_regex power precedes preceding prepared print_strict_params procedural procedures program publication query quote raise range rank reassign recheck recovery refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex rename repeatable replace replica requiring reset respect restart restore result_oid returned_cardinality returned_length returned_octet_length returned_sqlstate returning reverse routine_catalog routine_name routine_schema routines row_count row_number rowtype rule scale schema_name schemas scope scope_catalog scope_name scope_schema security selective self sensitive sequence sequences serializable server server_name setof share show simple skip slice snapshot source specific_name sqlcode sqlerror sqrt stable stacked standalone statement statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset subscription substring substring_regex succeeds sum symmetric sysid system system_time table_name tables tablesample tablespace temp template ties token top_level_count transaction_active transactions_committed transactions_rolled_back transform transforms translate translate_regex trigger_catalog trigger_name trigger_schema trim trim_array truncate trusted type types uescape unbounded uncommitted unencrypted unlink unlisten unlogged unnamed untyped upper uri use_column use_variable user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema vacuum valid validate validator value_of var_pop var_samp varbinary variable_conflict variadic verbose version versioning views volatile warning whitespace width_bucket window within wrapper xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate yes`,types:SQLTypes+`bigint int8 bigserial serial8 varbit bool box bytea cidr circle precision float8 inet int4 json jsonb line lseg macaddr macaddr8 money numeric pg_lsn point polygon float4 int2 smallserial serial2 serial serial4 text timetz timestamptz tsquery tsvector txid_snapshot uuid xml`});var MySQLKeywords=`accessible algorithm analyze asensitive authors auto_increment autocommit avg avg_row_length binlog btree cache catalog_name chain change changed checkpoint checksum class_origin client_statistics coalesce code collations columns comment committed completion concurrent consistent contains contributors convert database databases day_hour day_microsecond day_minute day_second delay_key_write delayed delimiter des_key_file dev_pop dev_samp deviance directory disable discard distinctrow div dual dumpfile enable enclosed ends engine engines enum errors escaped even event events every explain extended fast field fields flush force found_rows fulltext grants handler hash high_priority hosts hour_microsecond hour_minute hour_second ignore ignore_server_ids import index index_statistics infile innodb insensitive insert_method install invoker iterate keys kill linear lines list load lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modify mutex mysql_errno no_write_to_binlog offline offset one online optimize optionally outfile pack_keys parser partition partitions password phase plugin plugins prev processlist profile profiles purge query quick range read_write rebuild recover regexp relaylog remove rename reorganize repair repeatable replace require resume rlike row_format rtree schedule schema_name schemas second_microsecond security sensitive separator serializable server share show slave slow snapshot soname spatial sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result ssl starting starts std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace terminated triggers truncate uncommitted uninstall unlock upgrade use use_frm user_resources user_statistics utc_date utc_time utc_timestamp variables views warnings xa xor year_month zerofill`;var MySQLTypes=SQLTypes+`bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int1 int2 int3 int4 int8 float4 float8 varbinary varcharacter precision datetime unsigned signed`;var MySQLBuiltin=`charset clear edit ego help nopager notee nowarning pager print prompt quit rehash source status system tee`;var MySQL=SQLDialect.define({operatorChars:`*+-%<>!=&|^`,charSetCasts:true,doubleQuotedStrings:true,unquotedBitLiterals:true,hashComments:true,spaceAfterDashes:true,specialVar:`@?`,identifierQuotes:"`",keywords:SQLKeywords+`group_concat `+MySQLKeywords,types:MySQLTypes,builtin:MySQLBuiltin});var MariaSQL=SQLDialect.define({operatorChars:`*+-%<>!=&|^`,charSetCasts:true,doubleQuotedStrings:true,unquotedBitLiterals:true,hashComments:true,spaceAfterDashes:true,specialVar:`@?`,identifierQuotes:"`",keywords:SQLKeywords+`always generated groupby_concat hard persistent shutdown soft virtual `+MySQLKeywords,types:MySQLTypes,builtin:MySQLBuiltin});var MSSQL=SQLDialect.define({keywords:SQLKeywords+`add external procedure all fetch public alter file raiserror and fillfactor read any for readtext as foreign reconfigure asc freetext references authorization freetexttable replication backup from restore begin full restrict between function return break goto revert browse grant revoke bulk group right by having rollback cascade holdlock rowcount case identity rowguidcol check identity_insert rule checkpoint identitycol save close if schema clustered in securityaudit coalesce index select collate inner semantickeyphrasetable column insert semanticsimilaritydetailstable commit intersect semanticsimilaritytable compute into session_user constraint is set contains join setuser containstable key shutdown continue kill some convert left statistics create like system_user cross lineno table current load tablesample current_date merge textsize current_time national then current_timestamp nocheck to current_user nonclustered top cursor not tran database null transaction dbcc nullif trigger deallocate of truncate declare off try_convert default offsets tsequal delete on union deny open unique desc opendatasource unpivot disk openquery update distinct openrowset updatetext distributed openxml use double option user drop or values dump order varying else outer view end over waitfor errlvl percent when escape pivot where except plan while exec precision with execute primary within group exists print writetext exit proc `+`noexpand index forceseek forcescan holdlock nolock nowait paglock readcommitted readcommittedlock readpast readuncommitted repeatableread rowlock serializable snapshot spatial_window_max_cells tablock tablockx updlock xlock keepidentity keepdefaults ignore_constraints ignore_triggers`,types:SQLTypes+`smalldatetime datetimeoffset datetime2 datetime bigint smallint smallmoney tinyint money real text nvarchar ntext varbinary image hierarchyid uniqueidentifier sql_variant xml`,builtin:`approx_count_distinct approx_percentile_cont approx_percentile_disc avg checksum_agg count count_big grouping grouping_id max min product stdev stdevp sum var varp ai_generate_embeddings ai_generate_chunks cume_dist first_value lag last_value lead percentile_cont percentile_disc percent_rank left_shift right_shift bit_count get_bit set_bit collationproperty tertiary_weights @@datefirst @@dbts @@langid @@language @@lock_timeout @@max_connections @@max_precision @@nestlevel @@options @@remserver @@servername @@servicename @@spid @@textsize @@version cast convert parse try_cast try_convert try_parse asymkey_id asymkeyproperty certproperty cert_id crypt_gen_random decryptbyasymkey decryptbycert decryptbykey decryptbykeyautoasymkey decryptbykeyautocert decryptbypassphrase encryptbyasymkey encryptbycert encryptbykey encryptbypassphrase hashbytes is_objectsigned key_guid key_id key_name signbyasymkey signbycert symkeyproperty verifysignedbycert verifysignedbyasymkey @@cursor_rows @@fetch_status cursor_status datalength ident_current ident_incr ident_seed identity sql_variant_property @@datefirst current_timestamp current_timezone current_timezone_id date_bucket dateadd datediff datediff_big datefromparts datename datepart datetime2fromparts datetimefromparts datetimeoffsetfromparts datetrunc day eomonth getdate getutcdate isdate month smalldatetimefromparts switchoffset sysdatetime sysdatetimeoffset sysutcdatetime timefromparts todatetimeoffset year edit_distance edit_distance_similarity jaro_winkler_distance jaro_winkler_similarity edge_id_from_parts graph_id_from_edge_id graph_id_from_node_id node_id_from_parts object_id_from_edge_id object_id_from_node_id json isjson json_array json_contains json_modify json_object json_path_exists json_query json_value regexp_like regexp_replace regexp_substr regexp_instr regexp_count regexp_matches regexp_split_to_table abs acos asin atan atn2 ceiling cos cot degrees exp floor log log10 pi power radians rand round sign sin sqrt square tan choose greatest iif least @@procid app_name applock_mode applock_test assemblyproperty col_length col_name columnproperty databasepropertyex db_id db_name file_id file_idex file_name filegroup_id filegroup_name filegroupproperty fileproperty filepropertyex fulltextcatalogproperty fulltextserviceproperty index_col indexkey_property indexproperty next value for object_definition object_id object_name object_schema_name objectproperty objectpropertyex original_db_name parsename schema_id schema_name scope_identity serverproperty stats_date type_id type_name typeproperty dense_rank ntile rank row_number publishingservername certenclosed certprivatekey current_user database_principal_id has_dbaccess has_perms_by_name is_member is_rolemember is_srvrolemember loginproperty original_login permissions pwdencrypt pwdcompare session_user sessionproperty suser_id suser_name suser_sid suser_sname system_user user user_id user_name ascii char charindex concat concat_ws difference format left len lower ltrim nchar patindex quotename replace replicate reverse right rtrim soundex space str string_agg string_escape stuff substring translate trim unicode upper $partition @@error @@identity @@pack_received @@rowcount @@trancount binary_checksum checksum compress connectionproperty context_info current_request_id current_transaction_id decompress error_line error_message error_number error_procedure error_severity error_state formatmessage get_filestream_transaction_context getansinull host_id host_name isnull isnumeric min_active_rowversion newid newsequentialid rowcount_big session_context xact_state @@connections @@cpu_busy @@idle @@io_busy @@pack_sent @@packet_errors @@timeticks @@total_errors @@total_read @@total_write textptr textvalid columns_updated eventdata trigger_nestlevel vector_distance vectorproperty vector_search generate_series opendatasource openjson openquery openrowset openxml predict string_split coalesce nullif apply catch filter force include keep keepfixed modify optimize parameterization parameters partition recompile sequence set`,operatorChars:`*+-%<>!=^&|/`,specialVar:`@`,identifierQuotes:`"[`});var SQLite=SQLDialect.define({keywords:SQLKeywords+`abort analyze attach autoincrement conflict database detach exclusive fail glob ignore index indexed instead isnull notnull offset plan pragma query raise regexp reindex rename replace temp vacuum virtual`,types:SQLTypes+`bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int2 int8 unsigned signed real`,builtin:`auth backup bail changes clone databases dbinfo dump echo eqp explain fullschema headers help import imposter indexes iotrace lint load log mode nullvalue once print prompt quit restore save scanstats separator shell show stats system tables testcase timeout timer trace vfsinfo vfslist vfsname width`,operatorChars:`*+-%<>!=&|/~`,identifierQuotes:'`"',specialVar:`@:?$`});var Cassandra=SQLDialect.define({keywords:`add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime infinity NaN`,types:SQLTypes+`ascii bigint blob counter frozen inet list map static text timeuuid tuple uuid varint`,slashComments:true});var PLSQL=SQLDialect.define({keywords:SQLKeywords+`abort accept access add all alter and any arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body by case cast char_base check close cluster clusters colauth column comment commit compress connected constant constraint crash create current currval cursor data_base database dba deallocate debugoff debugon declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry exception exception_init exchange exclusive exists external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base of off offline on online only option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw rebuild record ref references refresh rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work`,builtin:`appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define echo editfile embedded feedback flagger flush heading headsep instance linesize lno loboffset logsource longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar repfooter repheader serveroutput shiftinout show showmode spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout timing trimout trimspool ttitle underline verify version wrap`,types:SQLTypes+`ascii bfile bfilename bigserial bit blob dec long number nvarchar nvarchar2 serial smallint string text uid varchar2 xml`,operatorChars:`*/+-%<>!=~`,doubleQuotedStrings:true,charSetCasts:true,plsqlQuotingMechanism:true});function quotedIdentifier(value=``,delimiter=`"`){const name=String(value||``);if(!name)throw new TypeError(`A database identifier is missing.`);return`${delimiter}${name.replaceAll(delimiter,delimiter.repeat(2))}${delimiter}`}function defineDatabaseClientDialect(definition={}){if(!definition.codeMirrorDialect||typeof definition.quoteIdentifier!==`function`||typeof definition.stringLiteral!==`function`)throw new TypeError(`A database client dialect must implement the complete UI adapter contract.`);return Object.freeze(definition)}var DATABASE_CLIENT_DIALECTS=Object.freeze({sqlite:defineDatabaseClientDialect({codeMirrorDialect:SQLite,quoteIdentifier:value=>quotedIdentifier(value),stringLiteral:value=>`'${String(value).replaceAll(`'`,`''`)}'`}),mysql:defineDatabaseClientDialect({codeMirrorDialect:MariaSQL,quoteIdentifier:value=>quotedIdentifier(value,"`"),stringLiteral:value=>`'${String(value).replaceAll(`\\`,`\\\\`).replaceAll(`'`,`''`)}'`}),postgresql:defineDatabaseClientDialect({codeMirrorDialect:PostgreSQL,quoteIdentifier:value=>quotedIdentifier(value,`"`),stringLiteral:value=>`'${String(value).replaceAll(`'`,`''`)}'`})});function databaseClientDialect(engine=``){const candidate=String(engine||``).trim().toLowerCase();const dialect=DATABASE_CLIENT_DIALECTS[candidate];if(!dialect)throw new TypeError(`Unsupported database client dialect: ${candidate||`missing`}.`);return dialect}var _hoisted_1$5={class:`database-table-list`};var _hoisted_2$5={class:`database-workspace__schema-label`};var _hoisted_3$5=[`disabled`,`title`,`onClick`];var _hoisted_4$4={key:0,class:`database-workspace__empty-copy`};var _hoisted_5$4={key:0,class:`database-workspace__table-detail`};var _hoisted_6$3={key:0};var _sfc_main$8={__name:`DatabaseTableList`,props:{active:{type:Boolean,default:true},schema:{type:Object,required:true},selectedTableName:{type:String,default:``},search:{type:String,default:``},database:{type:String,default:``},running:{type:Boolean,default:false},interactiveColumns:{type:Boolean,default:false}},emits:[`select-table`,`select-column`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const tableList=ref(null);const selectedTable=computed(()=>props.schema.tables.find(table=>table.qualifiedName===props.selectedTableName));const filteredSchemas=computed(()=>{const search=(props.search||``).trim().toLowerCase();return(props.schema.schemas||[]).map(group=>({...group,tables:(props.schema.tables||[]).filter(table=>table.schema===group.name&&(!search||`${table.qualifiedName} ${table.comment}`.toLowerCase().includes(search)))})).filter(group=>group.tables.length>0)});watch([()=>props.selectedTableName,()=>props.active,filteredSchemas,tableList],()=>{if(!props.active||!tableList.value)return;const button=tableList.value.querySelector(`.database-workspace__table-button--active`);if(!button)return;const bounds=tableList.value.getBoundingClientRect();const selected=button.getBoundingClientRect();if(selected.top<bounds.top)tableList.value.scrollTop+=selected.top-bounds.top;else if(selected.bottom>bounds.bottom)tableList.value.scrollTop+=selected.bottom-bounds.bottom},{flush:`post`});function columnKeyIcon(column={}){if(selectedTable.value?.keys?.some(key=>key.primary&&key.columns.includes(column.name)))return mdiKeyVariant;return props.schema.relationships?.some(relationship=>relationship.sourceTable===selectedTable.value?.qualifiedName&&relationship.columns.includes(column.name))?mdiLinkVariant:mdiTable}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$5,[createBaseVNode(`div`,{ref_key:`tableList`,ref:tableList,class:`database-workspace__nav-scroll`},[(openBlock(true),createElementBlock(Fragment,null,renderList(filteredSchemas.value,group=>{return openBlock(),createElementBlock(Fragment,{key:group.name},[createBaseVNode(`div`,_hoisted_2$5,[createBaseVNode(`span`,null,toDisplayString(group.name||__props.database),1),createBaseVNode(`small`,null,toDisplayString(group.tables.length),1)]),(openBlock(true),createElementBlock(Fragment,null,renderList(group.tables,table=>{return openBlock(),createElementBlock(`button`,{key:table.qualifiedName,class:normalizeClass([{"database-workspace__table-button--active":__props.selectedTableName===table.qualifiedName},`database-workspace__table-button`]),disabled:__props.running,title:table.comment||table.qualifiedName,type:`button`,onClick:$event=>emit(`select-table`,table)},[createVNode(VIcon,{icon:table.kind.includes(`view`)?unref(mdiTableEye):unref(mdiTable),size:`15`},null,8,[`icon`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(table.name),1),createBaseVNode(`small`,null,toDisplayString(table.kind)+` · `+toDisplayString(table.columns.length)+` fields`,1)])],10,_hoisted_3$5)}),128))],64)}),128)),filteredSchemas.value.length===0?(openBlock(),createElementBlock(`p`,_hoisted_4$4,`No matching tables or views.`)):createCommentVNode(``,true)],512),selectedTable.value?(openBlock(),createElementBlock(`section`,_hoisted_5$4,[createBaseVNode(`header`,null,[createBaseVNode(`strong`,null,toDisplayString(selectedTable.value.name),1),renderSlot(_ctx.$slots,`table-actions`,{table:selectedTable.value},void 0,true)]),selectedTable.value.comment?(openBlock(),createElementBlock(`p`,_hoisted_6$3,toDisplayString(selectedTable.value.comment),1)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(selectedTable.value.columns,column=>{return openBlock(),createBlock(resolveDynamicComponent(__props.interactiveColumns?`button`:`div`),{key:column.name,type:__props.interactiveColumns?`button`:void 0,title:column.comment||column.nativeType,class:`database-table-list__column`,onClick:$event=>emit(`select-column`,column)},{default:withCtx(()=>[createVNode(VIcon,{icon:columnKeyIcon(column),size:`13`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(column.name),1),createBaseVNode(`small`,null,toDisplayString(column.nativeType),1)]),_:2},1032,[`type`,`title`,`onClick`])}),128))])):createCommentVNode(``,true)])}}};var DatabaseTableList_default=_plugin_vue_export_helper_default(_sfc_main$8,[[`__scopeId`,`data-v-3957b87d`]]);var noop={value:()=>{}};function dispatch(){for(var i=0,n=arguments.length,_={},t;i<n;++i){if(!(t=arguments[i]+``)||t in _||/[\s.]/.test(t))throw new Error(`illegal type: `+t);_[t]=[]}return new Dispatch(_)}function Dispatch(_){this._=_}function parseTypenames$1(typenames,types){return typenames.trim().split(/^|\s+/).map(function(t){var name=``,i=t.indexOf(`.`);if(i>=0)name=t.slice(i+1),t=t.slice(0,i);if(t&&!types.hasOwnProperty(t))throw new Error(`unknown type: `+t);return{type:t,name}})}Dispatch.prototype=dispatch.prototype={constructor:Dispatch,on:function(typename,callback){var _=this._,T=parseTypenames$1(typename+``,_),t,i=-1,n=T.length;if(arguments.length<2){while(++i<n)if((t=(typename=T[i]).type)&&(t=get$1(_[t],typename.name)))return t;return}if(callback!=null&&typeof callback!==`function`)throw new Error(`invalid callback: `+callback);while(++i<n)if(t=(typename=T[i]).type)_[t]=set$1(_[t],typename.name,callback);else if(callback==null)for(t in _)_[t]=set$1(_[t],typename.name,null);return this},copy:function(){var copy={},_=this._;for(var t in _)copy[t]=_[t].slice();return new Dispatch(copy)},call:function(type,that){if((n=arguments.length-2)>0)for(var args=new Array(n),i=0,n,t;i<n;++i)args[i]=arguments[i+2];if(!this._.hasOwnProperty(type))throw new Error(`unknown type: `+type);for(t=this._[type],i=0,n=t.length;i<n;++i)t[i].value.apply(that,args)},apply:function(type,that,args){if(!this._.hasOwnProperty(type))throw new Error(`unknown type: `+type);for(var t=this._[type],i=0,n=t.length;i<n;++i)t[i].value.apply(that,args)}};function get$1(type,name){for(var i=0,n=type.length,c;i<n;++i)if((c=type[i]).name===name)return c.value}function set$1(type,name,callback){for(var i=0,n=type.length;i<n;++i)if(type[i].name===name){type[i]=noop,type=type.slice(0,i).concat(type.slice(i+1));break}if(callback!=null)type.push({name,value:callback});return type}var xhtml=`http://www.w3.org/1999/xhtml`;var namespaces={svg:`http://www.w3.org/2000/svg`,xhtml,xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`,xmlns:`http://www.w3.org/2000/xmlns/`};function namespace(name){var prefix=name+=``,i=prefix.indexOf(`:`);if(i>=0&&(prefix=name.slice(0,i))!==`xmlns`)name=name.slice(i+1);return namespaces.hasOwnProperty(prefix)?{space:namespaces[prefix],local:name}:name}function creatorInherit(name){return function(){var document2=this.ownerDocument,uri=this.namespaceURI;return uri===xhtml&&document2.documentElement.namespaceURI===xhtml?document2.createElement(name):document2.createElementNS(uri,name)}}function creatorFixed(fullname){return function(){return this.ownerDocument.createElementNS(fullname.space,fullname.local)}}function creator(name){var fullname=namespace(name);return(fullname.local?creatorFixed:creatorInherit)(fullname)}function none(){}function selector(selector2){return selector2==null?none:function(){return this.querySelector(selector2)}}function selection_select(select2){if(typeof select2!==`function`)select2=selector(select2);for(var groups=this._groups,m=groups.length,subgroups=new Array(m),j=0;j<m;++j)for(var group=groups[j],n=group.length,subgroup=subgroups[j]=new Array(n),node,subnode,i=0;i<n;++i)if((node=group[i])&&(subnode=select2.call(node,node.__data__,i,group))){if(`__data__`in node)subnode.__data__=node.__data__;subgroup[i]=subnode}return new Selection$1(subgroups,this._parents)}function array(x){return x==null?[]:Array.isArray(x)?x:Array.from(x)}function empty(){return[]}function selectorAll(selector2){return selector2==null?empty:function(){return this.querySelectorAll(selector2)}}function arrayAll(select2){return function(){return array(select2.apply(this,arguments))}}function selection_selectAll(select2){if(typeof select2===`function`)select2=arrayAll(select2);else select2=selectorAll(select2);for(var groups=this._groups,m=groups.length,subgroups=[],parents=[],j=0;j<m;++j)for(var group=groups[j],n=group.length,node,i=0;i<n;++i)if(node=group[i]){subgroups.push(select2.call(node,node.__data__,i,group));parents.push(node)}return new Selection$1(subgroups,parents)}function matcher(selector2){return function(){return this.matches(selector2)}}function childMatcher(selector2){return function(node){return node.matches(selector2)}}var find=Array.prototype.find;function childFind(match){return function(){return find.call(this.children,match)}}function childFirst(){return this.firstElementChild}function selection_selectChild(match){return this.select(match==null?childFirst:childFind(typeof match===`function`?match:childMatcher(match)))}var filter=Array.prototype.filter;function children(){return Array.from(this.children)}function childrenFilter(match){return function(){return filter.call(this.children,match)}}function selection_selectChildren(match){return this.selectAll(match==null?children:childrenFilter(typeof match===`function`?match:childMatcher(match)))}function selection_filter(match){if(typeof match!==`function`)match=matcher(match);for(var groups=this._groups,m=groups.length,subgroups=new Array(m),j=0;j<m;++j)for(var group=groups[j],n=group.length,subgroup=subgroups[j]=[],node,i=0;i<n;++i)if((node=group[i])&&match.call(node,node.__data__,i,group))subgroup.push(node);return new Selection$1(subgroups,this._parents)}function sparse(update){return new Array(update.length)}function selection_enter(){return new Selection$1(this._enter||this._groups.map(sparse),this._parents)}function EnterNode(parent,datum2){this.ownerDocument=parent.ownerDocument;this.namespaceURI=parent.namespaceURI;this._next=null;this._parent=parent;this.__data__=datum2}EnterNode.prototype={constructor:EnterNode,appendChild:function(child){return this._parent.insertBefore(child,this._next)},insertBefore:function(child,next){return this._parent.insertBefore(child,next)},querySelector:function(selector2){return this._parent.querySelector(selector2)},querySelectorAll:function(selector2){return this._parent.querySelectorAll(selector2)}};function constant$2(x){return function(){return x}}function bindIndex(parent,group,enter,update,exit,data){var i=0,node,groupLength=group.length,dataLength=data.length;for(;i<dataLength;++i)if(node=group[i]){node.__data__=data[i];update[i]=node}else enter[i]=new EnterNode(parent,data[i]);for(;i<groupLength;++i)if(node=group[i])exit[i]=node}function bindKey(parent,group,enter,update,exit,data,key){var i,node,nodeByKeyValue=new Map,groupLength=group.length,dataLength=data.length,keyValues=new Array(groupLength),keyValue;for(i=0;i<groupLength;++i)if(node=group[i]){keyValues[i]=keyValue=key.call(node,node.__data__,i,group)+``;if(nodeByKeyValue.has(keyValue))exit[i]=node;else nodeByKeyValue.set(keyValue,node)}for(i=0;i<dataLength;++i){keyValue=key.call(parent,data[i],i,data)+``;if(node=nodeByKeyValue.get(keyValue)){update[i]=node;node.__data__=data[i];nodeByKeyValue.delete(keyValue)}else enter[i]=new EnterNode(parent,data[i])}for(i=0;i<groupLength;++i)if((node=group[i])&&nodeByKeyValue.get(keyValues[i])===node)exit[i]=node}function datum(node){return node.__data__}function selection_data(value,key){if(!arguments.length)return Array.from(this,datum);var bind=key?bindKey:bindIndex,parents=this._parents,groups=this._groups;if(typeof value!==`function`)value=constant$2(value);for(var m=groups.length,update=new Array(m),enter=new Array(m),exit=new Array(m),j=0;j<m;++j){var parent=parents[j],group=groups[j],groupLength=group.length,data=arraylike(value.call(parent,parent&&parent.__data__,j,parents)),dataLength=data.length,enterGroup=enter[j]=new Array(dataLength),updateGroup=update[j]=new Array(dataLength);bind(parent,group,enterGroup,updateGroup,exit[j]=new Array(groupLength),data,key);for(var i0=0,i1=0,previous,next;i0<dataLength;++i0)if(previous=enterGroup[i0]){if(i0>=i1)i1=i0+1;while(!(next=updateGroup[i1])&&++i1<dataLength);previous._next=next||null}}update=new Selection$1(update,parents);update._enter=enter;update._exit=exit;return update}function arraylike(data){return typeof data===`object`&&`length`in data?data:Array.from(data)}function selection_exit(){return new Selection$1(this._exit||this._groups.map(sparse),this._parents)}function selection_join(onenter,onupdate,onexit){var enter=this.enter(),update=this,exit=this.exit();if(typeof onenter===`function`){enter=onenter(enter);if(enter)enter=enter.selection()}else enter=enter.append(onenter+``);if(onupdate!=null){update=onupdate(update);if(update)update=update.selection()}if(onexit==null)exit.remove();else onexit(exit);return enter&&update?enter.merge(update).order():update}function selection_merge(context){var selection2=context.selection?context.selection():context;for(var groups0=this._groups,groups1=selection2._groups,m0=groups0.length,m1=groups1.length,m=Math.min(m0,m1),merges=new Array(m0),j=0;j<m;++j)for(var group0=groups0[j],group1=groups1[j],n=group0.length,merge=merges[j]=new Array(n),node,i=0;i<n;++i)if(node=group0[i]||group1[i])merge[i]=node;for(;j<m0;++j)merges[j]=groups0[j];return new Selection$1(merges,this._parents)}function selection_order(){for(var groups=this._groups,j=-1,m=groups.length;++j<m;)for(var group=groups[j],i=group.length-1,next=group[i],node;--i>=0;)if(node=group[i]){if(next&&node.compareDocumentPosition(next)^4)next.parentNode.insertBefore(node,next);next=node}return this}function selection_sort(compare){if(!compare)compare=ascending;function compareNode(a,b){return a&&b?compare(a.__data__,b.__data__):!a-!b}for(var groups=this._groups,m=groups.length,sortgroups=new Array(m),j=0;j<m;++j){for(var group=groups[j],n=group.length,sortgroup=sortgroups[j]=new Array(n),node,i=0;i<n;++i)if(node=group[i])sortgroup[i]=node;sortgroup.sort(compareNode)}return new Selection$1(sortgroups,this._parents).order()}function ascending(a,b){return a<b?-1:a>b?1:a>=b?0:NaN}function selection_call(){var callback=arguments[0];arguments[0]=this;callback.apply(null,arguments);return this}function selection_nodes(){return Array.from(this)}function selection_node(){for(var groups=this._groups,j=0,m=groups.length;j<m;++j)for(var group=groups[j],i=0,n=group.length;i<n;++i){var node=group[i];if(node)return node}return null}function selection_size(){let size=0;for(const node of this)++size;return size}function selection_empty(){return!this.node()}function selection_each(callback){for(var groups=this._groups,j=0,m=groups.length;j<m;++j)for(var group=groups[j],i=0,n=group.length,node;i<n;++i)if(node=group[i])callback.call(node,node.__data__,i,group);return this}function attrRemove$1(name){return function(){this.removeAttribute(name)}}function attrRemoveNS$1(fullname){return function(){this.removeAttributeNS(fullname.space,fullname.local)}}function attrConstant$1(name,value){return function(){this.setAttribute(name,value)}}function attrConstantNS$1(fullname,value){return function(){this.setAttributeNS(fullname.space,fullname.local,value)}}function attrFunction$1(name,value){return function(){var v=value.apply(this,arguments);if(v==null)this.removeAttribute(name);else this.setAttribute(name,v)}}function attrFunctionNS$1(fullname,value){return function(){var v=value.apply(this,arguments);if(v==null)this.removeAttributeNS(fullname.space,fullname.local);else this.setAttributeNS(fullname.space,fullname.local,v)}}function selection_attr(name,value){var fullname=namespace(name);if(arguments.length<2){var node=this.node();return fullname.local?node.getAttributeNS(fullname.space,fullname.local):node.getAttribute(fullname)}return this.each((value==null?fullname.local?attrRemoveNS$1:attrRemove$1:typeof value===`function`?fullname.local?attrFunctionNS$1:attrFunction$1:fullname.local?attrConstantNS$1:attrConstant$1)(fullname,value))}function defaultView(node){return node.ownerDocument&&node.ownerDocument.defaultView||node.document&&node||node.defaultView}function styleRemove$1(name){return function(){this.style.removeProperty(name)}}function styleConstant$1(name,value,priority){return function(){this.style.setProperty(name,value,priority)}}function styleFunction$1(name,value,priority){return function(){var v=value.apply(this,arguments);if(v==null)this.style.removeProperty(name);else this.style.setProperty(name,v,priority)}}function selection_style(name,value,priority){return arguments.length>1?this.each((value==null?styleRemove$1:typeof value===`function`?styleFunction$1:styleConstant$1)(name,value,priority==null?``:priority)):styleValue(this.node(),name)}function styleValue(node,name){return node.style.getPropertyValue(name)||defaultView(node).getComputedStyle(node,null).getPropertyValue(name)}function propertyRemove(name){return function(){delete this[name]}}function propertyConstant(name,value){return function(){this[name]=value}}function propertyFunction(name,value){return function(){var v=value.apply(this,arguments);if(v==null)delete this[name];else this[name]=v}}function selection_property(name,value){return arguments.length>1?this.each((value==null?propertyRemove:typeof value===`function`?propertyFunction:propertyConstant)(name,value)):this.node()[name]}function classArray(string){return string.trim().split(/^|\s+/)}function classList(node){return node.classList||new ClassList(node)}function ClassList(node){this._node=node;this._names=classArray(node.getAttribute(`class`)||``)}ClassList.prototype={add:function(name){if(this._names.indexOf(name)<0){this._names.push(name);this._node.setAttribute(`class`,this._names.join(` `))}},remove:function(name){var i=this._names.indexOf(name);if(i>=0){this._names.splice(i,1);this._node.setAttribute(`class`,this._names.join(` `))}},contains:function(name){return this._names.indexOf(name)>=0}};function classedAdd(node,names){var list=classList(node),i=-1,n=names.length;while(++i<n)list.add(names[i])}function classedRemove(node,names){var list=classList(node),i=-1,n=names.length;while(++i<n)list.remove(names[i])}function classedTrue(names){return function(){classedAdd(this,names)}}function classedFalse(names){return function(){classedRemove(this,names)}}function classedFunction(names,value){return function(){(value.apply(this,arguments)?classedAdd:classedRemove)(this,names)}}function selection_classed(name,value){var names=classArray(name+``);if(arguments.length<2){var list=classList(this.node()),i=-1,n=names.length;while(++i<n)if(!list.contains(names[i]))return false;return true}return this.each((typeof value===`function`?classedFunction:value?classedTrue:classedFalse)(names,value))}function textRemove(){this.textContent=``}function textConstant$1(value){return function(){this.textContent=value}}function textFunction$1(value){return function(){var v=value.apply(this,arguments);this.textContent=v==null?``:v}}function selection_text(value){return arguments.length?this.each(value==null?textRemove:(typeof value===`function`?textFunction$1:textConstant$1)(value)):this.node().textContent}function htmlRemove(){this.innerHTML=``}function htmlConstant(value){return function(){this.innerHTML=value}}function htmlFunction(value){return function(){var v=value.apply(this,arguments);this.innerHTML=v==null?``:v}}function selection_html(value){return arguments.length?this.each(value==null?htmlRemove:(typeof value===`function`?htmlFunction:htmlConstant)(value)):this.node().innerHTML}function raise(){if(this.nextSibling)this.parentNode.appendChild(this)}function selection_raise(){return this.each(raise)}function lower(){if(this.previousSibling)this.parentNode.insertBefore(this,this.parentNode.firstChild)}function selection_lower(){return this.each(lower)}function selection_append(name){var create2=typeof name===`function`?name:creator(name);return this.select(function(){return this.appendChild(create2.apply(this,arguments))})}function constantNull(){return null}function selection_insert(name,before){var create2=typeof name===`function`?name:creator(name),select2=before==null?constantNull:typeof before===`function`?before:selector(before);return this.select(function(){return this.insertBefore(create2.apply(this,arguments),select2.apply(this,arguments)||null)})}function remove(){var parent=this.parentNode;if(parent)parent.removeChild(this)}function selection_remove(){return this.each(remove)}function selection_cloneShallow(){var clone=this.cloneNode(false),parent=this.parentNode;return parent?parent.insertBefore(clone,this.nextSibling):clone}function selection_cloneDeep(){var clone=this.cloneNode(true),parent=this.parentNode;return parent?parent.insertBefore(clone,this.nextSibling):clone}function selection_clone(deep){return this.select(deep?selection_cloneDeep:selection_cloneShallow)}function selection_datum(value){return arguments.length?this.property(`__data__`,value):this.node().__data__}function contextListener(listener){return function(event){listener.call(this,event,this.__data__)}}function parseTypenames(typenames){return typenames.trim().split(/^|\s+/).map(function(t){var name=``,i=t.indexOf(`.`);if(i>=0)name=t.slice(i+1),t=t.slice(0,i);return{type:t,name}})}function onRemove(typename){return function(){var on=this.__on;if(!on)return;for(var j=0,i=-1,m=on.length,o;j<m;++j)if(o=on[j],(!typename.type||o.type===typename.type)&&o.name===typename.name)this.removeEventListener(o.type,o.listener,o.options);else on[++i]=o;if(++i)on.length=i;else delete this.__on}}function onAdd(typename,value,options){return function(){var on=this.__on,o,listener=contextListener(value);if(on){for(var j=0,m=on.length;j<m;++j)if((o=on[j]).type===typename.type&&o.name===typename.name){this.removeEventListener(o.type,o.listener,o.options);this.addEventListener(o.type,o.listener=listener,o.options=options);o.value=value;return}}this.addEventListener(typename.type,listener,options);o={type:typename.type,name:typename.name,value,listener,options};if(!on)this.__on=[o];else on.push(o)}}function selection_on(typename,value,options){var typenames=parseTypenames(typename+``),i,n=typenames.length,t;if(arguments.length<2){var on=this.node().__on;if(on){for(var j=0,m=on.length,o;j<m;++j)for(i=0,o=on[j];i<n;++i)if((t=typenames[i]).type===o.type&&t.name===o.name)return o.value}return}on=value?onAdd:onRemove;for(i=0;i<n;++i)this.each(on(typenames[i],value,options));return this}function dispatchEvent(node,type,params){var window2=defaultView(node),event=window2.CustomEvent;if(typeof event===`function`)event=new event(type,params);else{event=window2.document.createEvent(`Event`);if(params)event.initEvent(type,params.bubbles,params.cancelable),event.detail=params.detail;else event.initEvent(type,false,false)}node.dispatchEvent(event)}function dispatchConstant(type,params){return function(){return dispatchEvent(this,type,params)}}function dispatchFunction(type,params){return function(){return dispatchEvent(this,type,params.apply(this,arguments))}}function selection_dispatch(type,params){return this.each((typeof params===`function`?dispatchFunction:dispatchConstant)(type,params))}function*selection_iterator(){for(var groups=this._groups,j=0,m=groups.length;j<m;++j)for(var group=groups[j],i=0,n=group.length,node;i<n;++i)if(node=group[i])yield node}var root=[null];function Selection$1(groups,parents){this._groups=groups;this._parents=parents}function selection(){return new Selection$1([[document.documentElement]],root)}function selection_selection(){return this}Selection$1.prototype=selection.prototype={constructor:Selection$1,select:selection_select,selectAll:selection_selectAll,selectChild:selection_selectChild,selectChildren:selection_selectChildren,filter:selection_filter,data:selection_data,enter:selection_enter,exit:selection_exit,join:selection_join,merge:selection_merge,selection:selection_selection,order:selection_order,sort:selection_sort,call:selection_call,nodes:selection_nodes,node:selection_node,size:selection_size,empty:selection_empty,each:selection_each,attr:selection_attr,style:selection_style,property:selection_property,classed:selection_classed,text:selection_text,html:selection_html,raise:selection_raise,lower:selection_lower,append:selection_append,insert:selection_insert,remove:selection_remove,clone:selection_clone,datum:selection_datum,on:selection_on,dispatch:selection_dispatch,[Symbol.iterator]:selection_iterator};function select(selector2){return typeof selector2===`string`?new Selection$1([[document.querySelector(selector2)]],[document.documentElement]):new Selection$1([[selector2]],root)}function sourceEvent(event){let sourceEvent2;while(sourceEvent2=event.sourceEvent)event=sourceEvent2;return event}function pointer(event,node){event=sourceEvent(event);if(node===void 0)node=event.currentTarget;if(node){var svg=node.ownerSVGElement||node;if(svg.createSVGPoint){var point=svg.createSVGPoint();point.x=event.clientX,point.y=event.clientY;point=point.matrixTransform(node.getScreenCTM().inverse());return[point.x,point.y]}if(node.getBoundingClientRect){var rect=node.getBoundingClientRect();return[event.clientX-rect.left-node.clientLeft,event.clientY-rect.top-node.clientTop]}}return[event.pageX,event.pageY]}var nonpassivecapture={capture:true,passive:false};function noevent$1(event){event.preventDefault();event.stopImmediatePropagation()}function dragDisable(view){var root2=view.document.documentElement,selection2=select(view).on(`dragstart.drag`,noevent$1,nonpassivecapture);if(`onselectstart`in root2)selection2.on(`selectstart.drag`,noevent$1,nonpassivecapture);else{root2.__noselect=root2.style.MozUserSelect;root2.style.MozUserSelect=`none`}}function yesdrag(view,noclick){var root2=view.document.documentElement,selection2=select(view).on(`dragstart.drag`,null);if(noclick){selection2.on(`click.drag`,noevent$1,nonpassivecapture);setTimeout(function(){selection2.on(`click.drag`,null)},0)}if(`onselectstart`in root2)selection2.on(`selectstart.drag`,null);else{root2.style.MozUserSelect=root2.__noselect;delete root2.__noselect}}function define(constructor,factory,prototype){constructor.prototype=factory.prototype=prototype;prototype.constructor=constructor}function extend(parent,definition){var prototype=Object.create(parent.prototype);for(var key in definition)prototype[key]=definition[key];return prototype}function Color(){}var darker=.7;var brighter=1/darker;var reI=`\\s*([+-]?\\d+)\\s*`;var reN=`\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*`;var reP=`\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*`;var reHex=/^#([0-9a-f]{3,8})$/;var reRgbInteger=new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);var reRgbPercent=new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);var reRgbaInteger=new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);var reRgbaPercent=new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);var reHslPercent=new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);var reHslaPercent=new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);var named={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};define(Color,color,{copy(channels){return Object.assign(new this.constructor,this,channels)},displayable(){return this.rgb().displayable()},hex:color_formatHex,formatHex:color_formatHex,formatHex8:color_formatHex8,formatHsl:color_formatHsl,formatRgb:color_formatRgb,toString:color_formatRgb});function color_formatHex(){return this.rgb().formatHex()}function color_formatHex8(){return this.rgb().formatHex8()}function color_formatHsl(){return hslConvert(this).formatHsl()}function color_formatRgb(){return this.rgb().formatRgb()}function color(format){var m,l;format=(format+``).trim().toLowerCase();return(m=reHex.exec(format))?(l=m[1].length,m=parseInt(m[1],16),l===6?rgbn(m):l===3?new Rgb(m>>8&15|m>>4&240,m>>4&15|m&240,(m&15)<<4|m&15,1):l===8?rgba(m>>24&255,m>>16&255,m>>8&255,(m&255)/255):l===4?rgba(m>>12&15|m>>8&240,m>>8&15|m>>4&240,m>>4&15|m&240,((m&15)<<4|m&15)/255):null):(m=reRgbInteger.exec(format))?new Rgb(m[1],m[2],m[3],1):(m=reRgbPercent.exec(format))?new Rgb(m[1]*255/100,m[2]*255/100,m[3]*255/100,1):(m=reRgbaInteger.exec(format))?rgba(m[1],m[2],m[3],m[4]):(m=reRgbaPercent.exec(format))?rgba(m[1]*255/100,m[2]*255/100,m[3]*255/100,m[4]):(m=reHslPercent.exec(format))?hsla(m[1],m[2]/100,m[3]/100,1):(m=reHslaPercent.exec(format))?hsla(m[1],m[2]/100,m[3]/100,m[4]):named.hasOwnProperty(format)?rgbn(named[format]):format===`transparent`?new Rgb(NaN,NaN,NaN,0):null}function rgbn(n){return new Rgb(n>>16&255,n>>8&255,n&255,1)}function rgba(r,g,b,a){if(a<=0)r=g=b=NaN;return new Rgb(r,g,b,a)}function rgbConvert(o){if(!(o instanceof Color))o=color(o);if(!o)return new Rgb;o=o.rgb();return new Rgb(o.r,o.g,o.b,o.opacity)}function rgb(r,g,b,opacity){return arguments.length===1?rgbConvert(r):new Rgb(r,g,b,opacity==null?1:opacity)}function Rgb(r,g,b,opacity){this.r=+r;this.g=+g;this.b=+b;this.opacity=+opacity}define(Rgb,rgb,extend(Color,{brighter(k){k=k==null?brighter:Math.pow(brighter,k);return new Rgb(this.r*k,this.g*k,this.b*k,this.opacity)},darker(k){k=k==null?darker:Math.pow(darker,k);return new Rgb(this.r*k,this.g*k,this.b*k,this.opacity)},rgb(){return this},clamp(){return new Rgb(clampi(this.r),clampi(this.g),clampi(this.b),clampa(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:rgb_formatHex,formatHex:rgb_formatHex,formatHex8:rgb_formatHex8,formatRgb:rgb_formatRgb,toString:rgb_formatRgb}));function rgb_formatHex(){return`#${hex(this.r)}${hex(this.g)}${hex(this.b)}`}function rgb_formatHex8(){return`#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity)?1:this.opacity)*255)}`}function rgb_formatRgb(){const a=clampa(this.opacity);return`${a===1?`rgb(`:`rgba(`}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a===1?`)`:`, ${a})`}`}function clampa(opacity){return isNaN(opacity)?1:Math.max(0,Math.min(1,opacity))}function clampi(value){return Math.max(0,Math.min(255,Math.round(value)||0))}function hex(value){value=clampi(value);return(value<16?`0`:``)+value.toString(16)}function hsla(h,s,l,a){if(a<=0)h=s=l=NaN;else if(l<=0||l>=1)h=s=NaN;else if(s<=0)h=NaN;return new Hsl(h,s,l,a)}function hslConvert(o){if(o instanceof Hsl)return new Hsl(o.h,o.s,o.l,o.opacity);if(!(o instanceof Color))o=color(o);if(!o)return new Hsl;if(o instanceof Hsl)return o;o=o.rgb();var r=o.r/255,g=o.g/255,b=o.b/255,min=Math.min(r,g,b),max=Math.max(r,g,b),h=NaN,s=max-min,l=(max+min)/2;if(s){if(r===max)h=(g-b)/s+(g<b)*6;else if(g===max)h=(b-r)/s+2;else h=(r-g)/s+4;s/=l<.5?max+min:2-max-min;h*=60}else s=l>0&&l<1?0:h;return new Hsl(h,s,l,o.opacity)}function hsl(h,s,l,opacity){return arguments.length===1?hslConvert(h):new Hsl(h,s,l,opacity==null?1:opacity)}function Hsl(h,s,l,opacity){this.h=+h;this.s=+s;this.l=+l;this.opacity=+opacity}define(Hsl,hsl,extend(Color,{brighter(k){k=k==null?brighter:Math.pow(brighter,k);return new Hsl(this.h,this.s,this.l*k,this.opacity)},darker(k){k=k==null?darker:Math.pow(darker,k);return new Hsl(this.h,this.s,this.l*k,this.opacity)},rgb(){var h=this.h%360+(this.h<0)*360,s=isNaN(h)||isNaN(this.s)?0:this.s,l=this.l,m2=l+(l<.5?l:1-l)*s,m1=2*l-m2;return new Rgb(hsl2rgb(h>=240?h-240:h+120,m1,m2),hsl2rgb(h,m1,m2),hsl2rgb(h<120?h+240:h-120,m1,m2),this.opacity)},clamp(){return new Hsl(clamph(this.h),clampt(this.s),clampt(this.l),clampa(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const a=clampa(this.opacity);return`${a===1?`hsl(`:`hsla(`}${clamph(this.h)}, ${clampt(this.s)*100}%, ${clampt(this.l)*100}%${a===1?`)`:`, ${a})`}`}}));function clamph(value){value=(value||0)%360;return value<0?value+360:value}function clampt(value){return Math.max(0,Math.min(1,value||0))}function hsl2rgb(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255}var constant$1=x=>()=>x;function linear(a,d){return function(t){return a+t*d}}function exponential(a,b,y){return a=Math.pow(a,y),b=Math.pow(b,y)-a,y=1/y,function(t){return Math.pow(a+t*b,y)}}function gamma(y){return(y=+y)===1?nogamma:function(a,b){return b-a?exponential(a,b,y):constant$1(isNaN(a)?b:a)}}function nogamma(a,b){var d=b-a;return d?linear(a,d):constant$1(isNaN(a)?b:a)}var interpolateRgb=function rgbGamma(y){var color2=gamma(y);function rgb$1(start2,end){var r=color2((start2=rgb(start2)).r,(end=rgb(end)).r),g=color2(start2.g,end.g),b=color2(start2.b,end.b),opacity=nogamma(start2.opacity,end.opacity);return function(t){start2.r=r(t);start2.g=g(t);start2.b=b(t);start2.opacity=opacity(t);return start2+``}}rgb$1.gamma=rgbGamma;return rgb$1}(1);function interpolateNumber(a,b){return a=+a,b=+b,function(t){return a*(1-t)+b*t}}var reA=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;var reB=new RegExp(reA.source,`g`);function zero(b){return function(){return b}}function one(b){return function(t){return b(t)+``}}function interpolateString(a,b){var bi=reA.lastIndex=reB.lastIndex=0,am,bm,bs,i=-1,s=[],q=[];a=a+``,b=b+``;while((am=reA.exec(a))&&(bm=reB.exec(b))){if((bs=bm.index)>bi){bs=b.slice(bi,bs);if(s[i])s[i]+=bs;else s[++i]=bs}if((am=am[0])===(bm=bm[0])){if(s[i])s[i]+=bm;else s[++i]=bm}else{s[++i]=null;q.push({i,x:interpolateNumber(am,bm)})}bi=reB.lastIndex}if(bi<b.length){bs=b.slice(bi);if(s[i])s[i]+=bs;else s[++i]=bs}return s.length<2?q[0]?one(q[0].x):zero(b):(b=q.length,function(t){for(var i2=0,o;i2<b;++i2)s[(o=q[i2]).i]=o.x(t);return s.join(``)})}var degrees=180/Math.PI;var identity$1={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function decompose(a,b,c,d,e,f){var scaleX,scaleY,skewX;if(scaleX=Math.sqrt(a*a+b*b))a/=scaleX,b/=scaleX;if(skewX=a*c+b*d)c-=a*skewX,d-=b*skewX;if(scaleY=Math.sqrt(c*c+d*d))c/=scaleY,d/=scaleY,skewX/=scaleY;if(a*d<b*c)a=-a,b=-b,skewX=-skewX,scaleX=-scaleX;return{translateX:e,translateY:f,rotate:Math.atan2(b,a)*degrees,skewX:Math.atan(skewX)*degrees,scaleX,scaleY}}var svgNode;function parseCss(value){const m=new(typeof DOMMatrix===`function`?DOMMatrix:WebKitCSSMatrix)(value+``);return m.isIdentity?identity$1:decompose(m.a,m.b,m.c,m.d,m.e,m.f)}function parseSvg(value){if(value==null)return identity$1;if(!svgNode)svgNode=document.createElementNS(`http://www.w3.org/2000/svg`,`g`);svgNode.setAttribute(`transform`,value);if(!(value=svgNode.transform.baseVal.consolidate()))return identity$1;value=value.matrix;return decompose(value.a,value.b,value.c,value.d,value.e,value.f)}function interpolateTransform(parse,pxComma,pxParen,degParen){function pop(s){return s.length?s.pop()+` `:``}function translate(xa,ya,xb,yb,s,q){if(xa!==xb||ya!==yb){var i=s.push(`translate(`,null,pxComma,null,pxParen);q.push({i:i-4,x:interpolateNumber(xa,xb)},{i:i-2,x:interpolateNumber(ya,yb)})}else if(xb||yb)s.push(`translate(`+xb+pxComma+yb+pxParen)}function rotate(a,b,s,q){if(a!==b){if(a-b>180)b+=360;else if(b-a>180)a+=360;q.push({i:s.push(pop(s)+`rotate(`,null,degParen)-2,x:interpolateNumber(a,b)})}else if(b)s.push(pop(s)+`rotate(`+b+degParen)}function skewX(a,b,s,q){if(a!==b)q.push({i:s.push(pop(s)+`skewX(`,null,degParen)-2,x:interpolateNumber(a,b)});else if(b)s.push(pop(s)+`skewX(`+b+degParen)}function scale(xa,ya,xb,yb,s,q){if(xa!==xb||ya!==yb){var i=s.push(pop(s)+`scale(`,null,`,`,null,`)`);q.push({i:i-4,x:interpolateNumber(xa,xb)},{i:i-2,x:interpolateNumber(ya,yb)})}else if(xb!==1||yb!==1)s.push(pop(s)+`scale(`+xb+`,`+yb+`)`)}return function(a,b){var s=[],q=[];a=parse(a),b=parse(b);translate(a.translateX,a.translateY,b.translateX,b.translateY,s,q);rotate(a.rotate,b.rotate,s,q);skewX(a.skewX,b.skewX,s,q);scale(a.scaleX,a.scaleY,b.scaleX,b.scaleY,s,q);a=b=null;return function(t){var i=-1,n=q.length,o;while(++i<n)s[(o=q[i]).i]=o.x(t);return s.join(``)}}}var interpolateTransformCss=interpolateTransform(parseCss,`px, `,`px)`,`deg)`);var interpolateTransformSvg=interpolateTransform(parseSvg,`, `,`)`,`)`);var epsilon2=1e-12;function cosh(x){return((x=Math.exp(x))+1/x)/2}function sinh(x){return((x=Math.exp(x))-1/x)/2}function tanh(x){return((x=Math.exp(2*x))-1)/(x+1)}var interpolateZoom=function zoomRho(rho,rho2,rho4){function zoom2(p0,p1){var ux0=p0[0],uy0=p0[1],w0=p0[2],ux1=p1[0],uy1=p1[1],w1=p1[2],dx=ux1-ux0,dy=uy1-uy0,d2=dx*dx+dy*dy,i,S;if(d2<epsilon2){S=Math.log(w1/w0)/rho;i=function(t){return[ux0+t*dx,uy0+t*dy,w0*Math.exp(rho*t*S)]}}else{var d1=Math.sqrt(d2),b0=(w1*w1-w0*w0+rho4*d2)/(2*w0*rho2*d1),b1=(w1*w1-w0*w0-rho4*d2)/(2*w1*rho2*d1),r0=Math.log(Math.sqrt(b0*b0+1)-b0);S=(Math.log(Math.sqrt(b1*b1+1)-b1)-r0)/rho;i=function(t){var s=t*S,coshr0=cosh(r0),u=w0/(rho2*d1)*(coshr0*tanh(rho*s+r0)-sinh(r0));return[ux0+u*dx,uy0+u*dy,w0*coshr0/cosh(rho*s+r0)]}}i.duration=S*1e3*rho/Math.SQRT2;return i}zoom2.rho=function(_){var _1=Math.max(.001,+_),_2=_1*_1;return zoomRho(_1,_2,_2*_2)};return zoom2}(Math.SQRT2,2,4);var frame=0;var timeout$1=0;var interval=0;var pokeDelay=1e3;var taskHead;var taskTail;var clockLast=0;var clockNow=0;var clockSkew=0;var clock=typeof performance===`object`&&performance.now?performance:Date;var setFrame=typeof window===`object`&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(f){setTimeout(f,17)};function now(){return clockNow||(setFrame(clearNow),clockNow=clock.now()+clockSkew)}function clearNow(){clockNow=0}function Timer(){this._call=this._time=this._next=null}Timer.prototype=timer.prototype={constructor:Timer,restart:function(callback,delay,time){if(typeof callback!==`function`)throw new TypeError(`callback is not a function`);time=(time==null?now():+time)+(delay==null?0:+delay);if(!this._next&&taskTail!==this){if(taskTail)taskTail._next=this;else taskHead=this;taskTail=this}this._call=callback;this._time=time;sleep()},stop:function(){if(this._call){this._call=null;this._time=Infinity;sleep()}}};function timer(callback,delay,time){var t=new Timer;t.restart(callback,delay,time);return t}function timerFlush(){now();++frame;var t=taskHead,e;while(t){if((e=clockNow-t._time)>=0)t._call.call(void 0,e);t=t._next}--frame}function wake(){clockNow=(clockLast=clock.now())+clockSkew;frame=timeout$1=0;try{timerFlush()}finally{frame=0;nap();clockNow=0}}function poke(){var now2=clock.now(),delay=now2-clockLast;if(delay>pokeDelay)clockSkew-=delay,clockLast=now2}function nap(){var t0,t1=taskHead,t2,time=Infinity;while(t1)if(t1._call){if(time>t1._time)time=t1._time;t0=t1,t1=t1._next}else{t2=t1._next,t1._next=null;t1=t0?t0._next=t2:taskHead=t2}taskTail=t0;sleep(time)}function sleep(time){if(frame)return;if(timeout$1)timeout$1=clearTimeout(timeout$1);if(time-clockNow>24){if(time<Infinity)timeout$1=setTimeout(wake,time-clock.now()-clockSkew);if(interval)interval=clearInterval(interval)}else{if(!interval)clockLast=clock.now(),interval=setInterval(poke,pokeDelay);frame=1,setFrame(wake)}}function timeout(callback,delay,time){var t=new Timer;delay=delay==null?0:+delay;t.restart(elapsed=>{t.stop();callback(elapsed+delay)},delay,time);return t}var emptyOn=dispatch(`start`,`end`,`cancel`,`interrupt`);var emptyTween=[];var CREATED=0;var SCHEDULED=1;var STARTING=2;var STARTED=3;var RUNNING=4;var ENDING=5;var ENDED=6;function schedule(node,name,id2,index,group,timing){var schedules=node.__transition;if(!schedules)node.__transition={};else if(id2 in schedules)return;create(node,id2,{name,index,group,on:emptyOn,tween:emptyTween,time:timing.time,delay:timing.delay,duration:timing.duration,ease:timing.ease,timer:null,state:CREATED})}function init(node,id2){var schedule2=get(node,id2);if(schedule2.state>CREATED)throw new Error(`too late; already scheduled`);return schedule2}function set(node,id2){var schedule2=get(node,id2);if(schedule2.state>STARTED)throw new Error(`too late; already running`);return schedule2}function get(node,id2){var schedule2=node.__transition;if(!schedule2||!(schedule2=schedule2[id2]))throw new Error(`transition not found`);return schedule2}function create(node,id2,self){var schedules=node.__transition,tween;schedules[id2]=self;self.timer=timer(schedule2,0,self.time);function schedule2(elapsed){self.state=SCHEDULED;self.timer.restart(start2,self.delay,self.time);if(self.delay<=elapsed)start2(elapsed-self.delay)}function start2(elapsed){var i,j,n,o;if(self.state!==SCHEDULED)return stop();for(i in schedules){o=schedules[i];if(o.name!==self.name)continue;if(o.state===STARTED)return timeout(start2);if(o.state===RUNNING){o.state=ENDED;o.timer.stop();o.on.call(`interrupt`,node,node.__data__,o.index,o.group);delete schedules[i]}else if(+i<id2){o.state=ENDED;o.timer.stop();o.on.call(`cancel`,node,node.__data__,o.index,o.group);delete schedules[i]}}timeout(function(){if(self.state===STARTED){self.state=RUNNING;self.timer.restart(tick,self.delay,self.time);tick(elapsed)}});self.state=STARTING;self.on.call(`start`,node,node.__data__,self.index,self.group);if(self.state!==STARTING)return;self.state=STARTED;tween=new Array(n=self.tween.length);for(i=0,j=-1;i<n;++i)if(o=self.tween[i].value.call(node,node.__data__,self.index,self.group))tween[++j]=o;tween.length=j+1}function tick(elapsed){var t=elapsed<self.duration?self.ease.call(null,elapsed/self.duration):(self.timer.restart(stop),self.state=ENDING,1),i=-1,n=tween.length;while(++i<n)tween[i].call(node,t);if(self.state===ENDING){self.on.call(`end`,node,node.__data__,self.index,self.group);stop()}}function stop(){self.state=ENDED;self.timer.stop();delete schedules[id2];for(var i in schedules)return;delete node.__transition}}function interrupt(node,name){var schedules=node.__transition,schedule2,active,empty2=true,i;if(!schedules)return;name=name==null?null:name+``;for(i in schedules){if((schedule2=schedules[i]).name!==name){empty2=false;continue}active=schedule2.state>STARTING&&schedule2.state<ENDING;schedule2.state=ENDED;schedule2.timer.stop();schedule2.on.call(active?`interrupt`:`cancel`,node,node.__data__,schedule2.index,schedule2.group);delete schedules[i]}if(empty2)delete node.__transition}function selection_interrupt(name){return this.each(function(){interrupt(this,name)})}function tweenRemove(id2,name){var tween0,tween1;return function(){var schedule2=set(this,id2),tween=schedule2.tween;if(tween!==tween0){tween1=tween0=tween;for(var i=0,n=tween1.length;i<n;++i)if(tween1[i].name===name){tween1=tween1.slice();tween1.splice(i,1);break}}schedule2.tween=tween1}}function tweenFunction(id2,name,value){var tween0,tween1;if(typeof value!==`function`)throw new Error;return function(){var schedule2=set(this,id2),tween=schedule2.tween;if(tween!==tween0){tween1=(tween0=tween).slice();for(var t={name,value},i=0,n=tween1.length;i<n;++i)if(tween1[i].name===name){tween1[i]=t;break}if(i===n)tween1.push(t)}schedule2.tween=tween1}}function transition_tween(name,value){var id2=this._id;name+=``;if(arguments.length<2){var tween=get(this.node(),id2).tween;for(var i=0,n=tween.length,t;i<n;++i)if((t=tween[i]).name===name)return t.value;return null}return this.each((value==null?tweenRemove:tweenFunction)(id2,name,value))}function tweenValue(transition,name,value){var id2=transition._id;transition.each(function(){var schedule2=set(this,id2);(schedule2.value||(schedule2.value={}))[name]=value.apply(this,arguments)});return function(node){return get(node,id2).value[name]}}function interpolate(a,b){var c;return(typeof b===`number`?interpolateNumber:b instanceof color?interpolateRgb:(c=color(b))?(b=c,interpolateRgb):interpolateString)(a,b)}function attrRemove(name){return function(){this.removeAttribute(name)}}function attrRemoveNS(fullname){return function(){this.removeAttributeNS(fullname.space,fullname.local)}}function attrConstant(name,interpolate2,value1){var string00,string1=value1+``,interpolate0;return function(){var string0=this.getAttribute(name);return string0===string1?null:string0===string00?interpolate0:interpolate0=interpolate2(string00=string0,value1)}}function attrConstantNS(fullname,interpolate2,value1){var string00,string1=value1+``,interpolate0;return function(){var string0=this.getAttributeNS(fullname.space,fullname.local);return string0===string1?null:string0===string00?interpolate0:interpolate0=interpolate2(string00=string0,value1)}}function attrFunction(name,interpolate2,value){var string00,string10,interpolate0;return function(){var string0,value1=value(this),string1;if(value1==null)return void this.removeAttribute(name);string0=this.getAttribute(name);string1=value1+``;return string0===string1?null:string0===string00&&string1===string10?interpolate0:(string10=string1,interpolate0=interpolate2(string00=string0,value1))}}function attrFunctionNS(fullname,interpolate2,value){var string00,string10,interpolate0;return function(){var string0,value1=value(this),string1;if(value1==null)return void this.removeAttributeNS(fullname.space,fullname.local);string0=this.getAttributeNS(fullname.space,fullname.local);string1=value1+``;return string0===string1?null:string0===string00&&string1===string10?interpolate0:(string10=string1,interpolate0=interpolate2(string00=string0,value1))}}function transition_attr(name,value){var fullname=namespace(name),i=fullname===`transform`?interpolateTransformSvg:interpolate;return this.attrTween(name,typeof value===`function`?(fullname.local?attrFunctionNS:attrFunction)(fullname,i,tweenValue(this,`attr.`+name,value)):value==null?(fullname.local?attrRemoveNS:attrRemove)(fullname):(fullname.local?attrConstantNS:attrConstant)(fullname,i,value))}function attrInterpolate(name,i){return function(t){this.setAttribute(name,i.call(this,t))}}function attrInterpolateNS(fullname,i){return function(t){this.setAttributeNS(fullname.space,fullname.local,i.call(this,t))}}function attrTweenNS(fullname,value){var t0,i0;function tween(){var i=value.apply(this,arguments);if(i!==i0)t0=(i0=i)&&attrInterpolateNS(fullname,i);return t0}tween._value=value;return tween}function attrTween(name,value){var t0,i0;function tween(){var i=value.apply(this,arguments);if(i!==i0)t0=(i0=i)&&attrInterpolate(name,i);return t0}tween._value=value;return tween}function transition_attrTween(name,value){var key=`attr.`+name;if(arguments.length<2)return(key=this.tween(key))&&key._value;if(value==null)return this.tween(key,null);if(typeof value!==`function`)throw new Error;var fullname=namespace(name);return this.tween(key,(fullname.local?attrTweenNS:attrTween)(fullname,value))}function delayFunction(id2,value){return function(){init(this,id2).delay=+value.apply(this,arguments)}}function delayConstant(id2,value){return value=+value,function(){init(this,id2).delay=value}}function transition_delay(value){var id2=this._id;return arguments.length?this.each((typeof value===`function`?delayFunction:delayConstant)(id2,value)):get(this.node(),id2).delay}function durationFunction(id2,value){return function(){set(this,id2).duration=+value.apply(this,arguments)}}function durationConstant(id2,value){return value=+value,function(){set(this,id2).duration=value}}function transition_duration(value){var id2=this._id;return arguments.length?this.each((typeof value===`function`?durationFunction:durationConstant)(id2,value)):get(this.node(),id2).duration}function easeConstant(id2,value){if(typeof value!==`function`)throw new Error;return function(){set(this,id2).ease=value}}function transition_ease(value){var id2=this._id;return arguments.length?this.each(easeConstant(id2,value)):get(this.node(),id2).ease}function easeVarying(id2,value){return function(){var v=value.apply(this,arguments);if(typeof v!==`function`)throw new Error;set(this,id2).ease=v}}function transition_easeVarying(value){if(typeof value!==`function`)throw new Error;return this.each(easeVarying(this._id,value))}function transition_filter(match){if(typeof match!==`function`)match=matcher(match);for(var groups=this._groups,m=groups.length,subgroups=new Array(m),j=0;j<m;++j)for(var group=groups[j],n=group.length,subgroup=subgroups[j]=[],node,i=0;i<n;++i)if((node=group[i])&&match.call(node,node.__data__,i,group))subgroup.push(node);return new Transition(subgroups,this._parents,this._name,this._id)}function transition_merge(transition){if(transition._id!==this._id)throw new Error;for(var groups0=this._groups,groups1=transition._groups,m0=groups0.length,m1=groups1.length,m=Math.min(m0,m1),merges=new Array(m0),j=0;j<m;++j)for(var group0=groups0[j],group1=groups1[j],n=group0.length,merge=merges[j]=new Array(n),node,i=0;i<n;++i)if(node=group0[i]||group1[i])merge[i]=node;for(;j<m0;++j)merges[j]=groups0[j];return new Transition(merges,this._parents,this._name,this._id)}function start(name){return(name+``).trim().split(/^|\s+/).every(function(t){var i=t.indexOf(`.`);if(i>=0)t=t.slice(0,i);return!t||t===`start`})}function onFunction(id2,name,listener){var on0,on1,sit=start(name)?init:set;return function(){var schedule2=sit(this,id2),on=schedule2.on;if(on!==on0)(on1=(on0=on).copy()).on(name,listener);schedule2.on=on1}}function transition_on(name,listener){var id2=this._id;return arguments.length<2?get(this.node(),id2).on.on(name):this.each(onFunction(id2,name,listener))}function removeFunction(id2){return function(){var parent=this.parentNode;for(var i in this.__transition)if(+i!==id2)return;if(parent)parent.removeChild(this)}}function transition_remove(){return this.on(`end.remove`,removeFunction(this._id))}function transition_select(select2){var name=this._name,id2=this._id;if(typeof select2!==`function`)select2=selector(select2);for(var groups=this._groups,m=groups.length,subgroups=new Array(m),j=0;j<m;++j)for(var group=groups[j],n=group.length,subgroup=subgroups[j]=new Array(n),node,subnode,i=0;i<n;++i)if((node=group[i])&&(subnode=select2.call(node,node.__data__,i,group))){if(`__data__`in node)subnode.__data__=node.__data__;subgroup[i]=subnode;schedule(subgroup[i],name,id2,i,subgroup,get(node,id2))}return new Transition(subgroups,this._parents,name,id2)}function transition_selectAll(select2){var name=this._name,id2=this._id;if(typeof select2!==`function`)select2=selectorAll(select2);for(var groups=this._groups,m=groups.length,subgroups=[],parents=[],j=0;j<m;++j)for(var group=groups[j],n=group.length,node,i=0;i<n;++i)if(node=group[i]){for(var children2=select2.call(node,node.__data__,i,group),child,inherit2=get(node,id2),k=0,l=children2.length;k<l;++k)if(child=children2[k])schedule(child,name,id2,k,children2,inherit2);subgroups.push(children2);parents.push(node)}return new Transition(subgroups,parents,name,id2)}var Selection=selection.prototype.constructor;function transition_selection(){return new Selection(this._groups,this._parents)}function styleNull(name,interpolate2){var string00,string10,interpolate0;return function(){var string0=styleValue(this,name),string1=(this.style.removeProperty(name),styleValue(this,name));return string0===string1?null:string0===string00&&string1===string10?interpolate0:interpolate0=interpolate2(string00=string0,string10=string1)}}function styleRemove(name){return function(){this.style.removeProperty(name)}}function styleConstant(name,interpolate2,value1){var string00,string1=value1+``,interpolate0;return function(){var string0=styleValue(this,name);return string0===string1?null:string0===string00?interpolate0:interpolate0=interpolate2(string00=string0,value1)}}function styleFunction(name,interpolate2,value){var string00,string10,interpolate0;return function(){var string0=styleValue(this,name),value1=value(this),string1=value1+``;if(value1==null)string1=value1=(this.style.removeProperty(name),styleValue(this,name));return string0===string1?null:string0===string00&&string1===string10?interpolate0:(string10=string1,interpolate0=interpolate2(string00=string0,value1))}}function styleMaybeRemove(id2,name){var on0,on1,listener0,key=`style.`+name,event=`end.`+key,remove2;return function(){var schedule2=set(this,id2),on=schedule2.on,listener=schedule2.value[key]==null?remove2||(remove2=styleRemove(name)):void 0;if(on!==on0||listener0!==listener)(on1=(on0=on).copy()).on(event,listener0=listener);schedule2.on=on1}}function transition_style(name,value,priority){var i=(name+=``)===`transform`?interpolateTransformCss:interpolate;return value==null?this.styleTween(name,styleNull(name,i)).on(`end.style.`+name,styleRemove(name)):typeof value===`function`?this.styleTween(name,styleFunction(name,i,tweenValue(this,`style.`+name,value))).each(styleMaybeRemove(this._id,name)):this.styleTween(name,styleConstant(name,i,value),priority).on(`end.style.`+name,null)}function styleInterpolate(name,i,priority){return function(t){this.style.setProperty(name,i.call(this,t),priority)}}function styleTween(name,value,priority){var t,i0;function tween(){var i=value.apply(this,arguments);if(i!==i0)t=(i0=i)&&styleInterpolate(name,i,priority);return t}tween._value=value;return tween}function transition_styleTween(name,value,priority){var key=`style.`+(name+=``);if(arguments.length<2)return(key=this.tween(key))&&key._value;if(value==null)return this.tween(key,null);if(typeof value!==`function`)throw new Error;return this.tween(key,styleTween(name,value,priority==null?``:priority))}function textConstant(value){return function(){this.textContent=value}}function textFunction(value){return function(){var value1=value(this);this.textContent=value1==null?``:value1}}function transition_text(value){return this.tween(`text`,typeof value===`function`?textFunction(tweenValue(this,`text`,value)):textConstant(value==null?``:value+``))}function textInterpolate(i){return function(t){this.textContent=i.call(this,t)}}function textTween(value){var t0,i0;function tween(){var i=value.apply(this,arguments);if(i!==i0)t0=(i0=i)&&textInterpolate(i);return t0}tween._value=value;return tween}function transition_textTween(value){var key=`text`;if(arguments.length<1)return(key=this.tween(key))&&key._value;if(value==null)return this.tween(key,null);if(typeof value!==`function`)throw new Error;return this.tween(key,textTween(value))}function transition_transition(){var name=this._name,id0=this._id,id1=newId();for(var groups=this._groups,m=groups.length,j=0;j<m;++j)for(var group=groups[j],n=group.length,node,i=0;i<n;++i)if(node=group[i]){var inherit2=get(node,id0);schedule(node,name,id1,i,group,{time:inherit2.time+inherit2.delay+inherit2.duration,delay:0,duration:inherit2.duration,ease:inherit2.ease})}return new Transition(groups,this._parents,name,id1)}function transition_end(){var on0,on1,that=this,id2=that._id,size=that.size();return new Promise(function(resolve,reject){var cancel={value:reject},end={value:function(){if(--size===0)resolve()}};that.each(function(){var schedule2=set(this,id2),on=schedule2.on;if(on!==on0){on1=(on0=on).copy();on1._.cancel.push(cancel);on1._.interrupt.push(cancel);on1._.end.push(end)}schedule2.on=on1});if(size===0)resolve()})}var id=0;function Transition(groups,parents,name,id2){this._groups=groups;this._parents=parents;this._name=name;this._id=id2}function newId(){return++id}var selection_prototype=selection.prototype;Transition.prototype={constructor:Transition,select:transition_select,selectAll:transition_selectAll,selectChild:selection_prototype.selectChild,selectChildren:selection_prototype.selectChildren,filter:transition_filter,merge:transition_merge,selection:transition_selection,transition:transition_transition,call:selection_prototype.call,nodes:selection_prototype.nodes,node:selection_prototype.node,size:selection_prototype.size,empty:selection_prototype.empty,each:selection_prototype.each,on:transition_on,attr:transition_attr,attrTween:transition_attrTween,style:transition_style,styleTween:transition_styleTween,text:transition_text,textTween:transition_textTween,remove:transition_remove,tween:transition_tween,delay:transition_delay,duration:transition_duration,ease:transition_ease,easeVarying:transition_easeVarying,end:transition_end,[Symbol.iterator]:selection_prototype[Symbol.iterator]};function cubicInOut(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var defaultTiming={time:null,delay:0,duration:250,ease:cubicInOut};function inherit(node,id2){var timing;while(!(timing=node.__transition)||!(timing=timing[id2]))if(!(node=node.parentNode))throw new Error(`transition ${id2} not found`);return timing}function selection_transition(name){var id2,timing;if(name instanceof Transition)id2=name._id,name=name._name;else id2=newId(),(timing=defaultTiming).time=now(),name=name==null?null:name+``;for(var groups=this._groups,m=groups.length,j=0;j<m;++j)for(var group=groups[j],n=group.length,node,i=0;i<n;++i)if(node=group[i])schedule(node,name,id2,i,group,timing||inherit(node,id2));return new Transition(groups,this._parents,name,id2)}selection.prototype.interrupt=selection_interrupt;selection.prototype.transition=selection_transition;var constant=x=>()=>x;function ZoomEvent(type,{sourceEvent:sourceEvent2,target,transform,dispatch:dispatch2}){Object.defineProperties(this,{type:{value:type,enumerable:true,configurable:true},sourceEvent:{value:sourceEvent2,enumerable:true,configurable:true},target:{value:target,enumerable:true,configurable:true},transform:{value:transform,enumerable:true,configurable:true},_:{value:dispatch2}})}function Transform(k,x,y){this.k=k;this.x=x;this.y=y}Transform.prototype={constructor:Transform,scale:function(k){return k===1?this:new Transform(this.k*k,this.x,this.y)},translate:function(x,y){return x===0&y===0?this:new Transform(this.k,this.x+this.k*x,this.y+this.k*y)},apply:function(point){return[point[0]*this.k+this.x,point[1]*this.k+this.y]},applyX:function(x){return x*this.k+this.x},applyY:function(y){return y*this.k+this.y},invert:function(location){return[(location[0]-this.x)/this.k,(location[1]-this.y)/this.k]},invertX:function(x){return(x-this.x)/this.k},invertY:function(y){return(y-this.y)/this.k},rescaleX:function(x){return x.copy().domain(x.range().map(this.invertX,this).map(x.invert,x))},rescaleY:function(y){return y.copy().domain(y.range().map(this.invertY,this).map(y.invert,y))},toString:function(){return`translate(`+this.x+`,`+this.y+`) scale(`+this.k+`)`}};var identity=new Transform(1,0,0);Transform.prototype;function nopropagation(event){event.stopImmediatePropagation()}function noevent(event){event.preventDefault();event.stopImmediatePropagation()}function defaultFilter(event){return(!event.ctrlKey||event.type===`wheel`)&&!event.button}function defaultExtent(){var e=this;if(e instanceof SVGElement){e=e.ownerSVGElement||e;if(e.hasAttribute(`viewBox`)){e=e.viewBox.baseVal;return[[e.x,e.y],[e.x+e.width,e.y+e.height]]}return[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]}return[[0,0],[e.clientWidth,e.clientHeight]]}function defaultTransform(){return this.__zoom||identity}function defaultWheelDelta(event){return-event.deltaY*(event.deltaMode===1?.05:event.deltaMode?1:.002)*(event.ctrlKey?10:1)}function defaultTouchable(){return navigator.maxTouchPoints||`ontouchstart`in this}function defaultConstrain(transform,extent,translateExtent){var dx0=transform.invertX(extent[0][0])-translateExtent[0][0],dx1=transform.invertX(extent[1][0])-translateExtent[1][0],dy0=transform.invertY(extent[0][1])-translateExtent[0][1],dy1=transform.invertY(extent[1][1])-translateExtent[1][1];return transform.translate(dx1>dx0?(dx0+dx1)/2:Math.min(0,dx0)||Math.max(0,dx1),dy1>dy0?(dy0+dy1)/2:Math.min(0,dy0)||Math.max(0,dy1))}function zoom(){var filter2=defaultFilter,extent=defaultExtent,constrain=defaultConstrain,wheelDelta2=defaultWheelDelta,touchable=defaultTouchable,scaleExtent=[0,Infinity],translateExtent=[[-Infinity,-Infinity],[Infinity,Infinity]],duration=250,interpolate2=interpolateZoom,listeners=dispatch(`start`,`zoom`,`end`),touchstarting,touchfirst,touchending,touchDelay=500,wheelDelay=150,clickDistance2=0,tapDistance=10;function zoom2(selection2){selection2.property(`__zoom`,defaultTransform).on(`wheel.zoom`,wheeled,{passive:false}).on(`mousedown.zoom`,mousedowned).on(`dblclick.zoom`,dblclicked).filter(touchable).on(`touchstart.zoom`,touchstarted).on(`touchmove.zoom`,touchmoved).on(`touchend.zoom touchcancel.zoom`,touchended).style(`-webkit-tap-highlight-color`,`rgba(0,0,0,0)`)}zoom2.transform=function(collection,transform,point,event){var selection2=collection.selection?collection.selection():collection;selection2.property(`__zoom`,defaultTransform);if(collection!==selection2)schedule2(collection,transform,point,event);else selection2.interrupt().each(function(){gesture(this,arguments).event(event).start().zoom(null,typeof transform===`function`?transform.apply(this,arguments):transform).end()})};zoom2.scaleBy=function(selection2,k,p,event){zoom2.scaleTo(selection2,function(){return this.__zoom.k*(typeof k===`function`?k.apply(this,arguments):k)},p,event)};zoom2.scaleTo=function(selection2,k,p,event){zoom2.transform(selection2,function(){var e=extent.apply(this,arguments),t0=this.__zoom,p0=p==null?centroid(e):typeof p===`function`?p.apply(this,arguments):p,p1=t0.invert(p0),k1=typeof k===`function`?k.apply(this,arguments):k;return constrain(translate(scale(t0,k1),p0,p1),e,translateExtent)},p,event)};zoom2.translateBy=function(selection2,x,y,event){zoom2.transform(selection2,function(){return constrain(this.__zoom.translate(typeof x===`function`?x.apply(this,arguments):x,typeof y===`function`?y.apply(this,arguments):y),extent.apply(this,arguments),translateExtent)},null,event)};zoom2.translateTo=function(selection2,x,y,p,event){zoom2.transform(selection2,function(){var e=extent.apply(this,arguments),t=this.__zoom,p0=p==null?centroid(e):typeof p===`function`?p.apply(this,arguments):p;return constrain(identity.translate(p0[0],p0[1]).scale(t.k).translate(typeof x===`function`?-x.apply(this,arguments):-x,typeof y===`function`?-y.apply(this,arguments):-y),e,translateExtent)},p,event)};function scale(transform,k){k=Math.max(scaleExtent[0],Math.min(scaleExtent[1],k));return k===transform.k?transform:new Transform(k,transform.x,transform.y)}function translate(transform,p0,p1){var x=p0[0]-p1[0]*transform.k,y=p0[1]-p1[1]*transform.k;return x===transform.x&&y===transform.y?transform:new Transform(transform.k,x,y)}function centroid(extent2){return[(+extent2[0][0]+ +extent2[1][0])/2,(+extent2[0][1]+ +extent2[1][1])/2]}function schedule2(transition,transform,point,event){transition.on(`start.zoom`,function(){gesture(this,arguments).event(event).start()}).on(`interrupt.zoom end.zoom`,function(){gesture(this,arguments).event(event).end()}).tween(`zoom`,function(){var that=this,args=arguments,g=gesture(that,args).event(event),e=extent.apply(that,args),p=point==null?centroid(e):typeof point===`function`?point.apply(that,args):point,w=Math.max(e[1][0]-e[0][0],e[1][1]-e[0][1]),a=that.__zoom,b=typeof transform===`function`?transform.apply(that,args):transform,i=interpolate2(a.invert(p).concat(w/a.k),b.invert(p).concat(w/b.k));return function(t){if(t===1)t=b;else{var l=i(t),k=w/l[2];t=new Transform(k,p[0]-l[0]*k,p[1]-l[1]*k)}g.zoom(null,t)}})}function gesture(that,args,clean){return!clean&&that.__zooming||new Gesture(that,args)}function Gesture(that,args){this.that=that;this.args=args;this.active=0;this.sourceEvent=null;this.extent=extent.apply(that,args);this.taps=0}Gesture.prototype={event:function(event){if(event)this.sourceEvent=event;return this},start:function(){if(++this.active===1){this.that.__zooming=this;this.emit(`start`)}return this},zoom:function(key,transform){if(this.mouse&&key!==`mouse`)this.mouse[1]=transform.invert(this.mouse[0]);if(this.touch0&&key!==`touch`)this.touch0[1]=transform.invert(this.touch0[0]);if(this.touch1&&key!==`touch`)this.touch1[1]=transform.invert(this.touch1[0]);this.that.__zoom=transform;this.emit(`zoom`);return this},end:function(){if(--this.active===0){delete this.that.__zooming;this.emit(`end`)}return this},emit:function(type){var d=select(this.that).datum();listeners.call(type,this.that,new ZoomEvent(type,{sourceEvent:this.sourceEvent,target:zoom2,type,transform:this.that.__zoom,dispatch:listeners}),d)}};function wheeled(event,...args){if(!filter2.apply(this,arguments))return;var g=gesture(this,args).event(event),t=this.__zoom,k=Math.max(scaleExtent[0],Math.min(scaleExtent[1],t.k*Math.pow(2,wheelDelta2.apply(this,arguments)))),p=pointer(event);if(g.wheel){if(g.mouse[0][0]!==p[0]||g.mouse[0][1]!==p[1])g.mouse[1]=t.invert(g.mouse[0]=p);clearTimeout(g.wheel)}else if(t.k===k)return;else{g.mouse=[p,t.invert(p)];interrupt(this);g.start()}noevent(event);g.wheel=setTimeout(wheelidled,wheelDelay);g.zoom(`mouse`,constrain(translate(scale(t,k),g.mouse[0],g.mouse[1]),g.extent,translateExtent));function wheelidled(){g.wheel=null;g.end()}}function mousedowned(event,...args){if(touchending||!filter2.apply(this,arguments))return;var currentTarget=event.currentTarget,g=gesture(this,args,true).event(event),v=select(event.view).on(`mousemove.zoom`,mousemoved,true).on(`mouseup.zoom`,mouseupped,true),p=pointer(event,currentTarget),x0=event.clientX,y0=event.clientY;dragDisable(event.view);nopropagation(event);g.mouse=[p,this.__zoom.invert(p)];interrupt(this);g.start();function mousemoved(event2){noevent(event2);if(!g.moved){var dx=event2.clientX-x0,dy=event2.clientY-y0;g.moved=dx*dx+dy*dy>clickDistance2}g.event(event2).zoom(`mouse`,constrain(translate(g.that.__zoom,g.mouse[0]=pointer(event2,currentTarget),g.mouse[1]),g.extent,translateExtent))}function mouseupped(event2){v.on(`mousemove.zoom mouseup.zoom`,null);yesdrag(event2.view,g.moved);noevent(event2);g.event(event2).end()}}function dblclicked(event,...args){if(!filter2.apply(this,arguments))return;var t0=this.__zoom,p0=pointer(event.changedTouches?event.changedTouches[0]:event,this),p1=t0.invert(p0),k1=t0.k*(event.shiftKey?.5:2),t1=constrain(translate(scale(t0,k1),p0,p1),extent.apply(this,args),translateExtent);noevent(event);if(duration>0)select(this).transition().duration(duration).call(schedule2,t1,p0,event);else select(this).call(zoom2.transform,t1,p0,event)}function touchstarted(event,...args){if(!filter2.apply(this,arguments))return;var touches=event.touches,n=touches.length,g=gesture(this,args,event.changedTouches.length===n).event(event),started,i,t,p;nopropagation(event);for(i=0;i<n;++i){t=touches[i],p=pointer(t,this);p=[p,this.__zoom.invert(p),t.identifier];if(!g.touch0)g.touch0=p,started=true,g.taps=1+!!touchstarting;else if(!g.touch1&&g.touch0[2]!==p[2])g.touch1=p,g.taps=0}if(touchstarting)touchstarting=clearTimeout(touchstarting);if(started){if(g.taps<2)touchfirst=p[0],touchstarting=setTimeout(function(){touchstarting=null},touchDelay);interrupt(this);g.start()}}function touchmoved(event,...args){if(!this.__zooming)return;var g=gesture(this,args).event(event),touches=event.changedTouches,n=touches.length,i,t,p,l;noevent(event);for(i=0;i<n;++i){t=touches[i],p=pointer(t,this);if(g.touch0&&g.touch0[2]===t.identifier)g.touch0[0]=p;else if(g.touch1&&g.touch1[2]===t.identifier)g.touch1[0]=p}t=g.that.__zoom;if(g.touch1){var p0=g.touch0[0],l0=g.touch0[1],p1=g.touch1[0],l1=g.touch1[1],dp=(dp=p1[0]-p0[0])*dp+(dp=p1[1]-p0[1])*dp,dl=(dl=l1[0]-l0[0])*dl+(dl=l1[1]-l0[1])*dl;t=scale(t,Math.sqrt(dp/dl));p=[(p0[0]+p1[0])/2,(p0[1]+p1[1])/2];l=[(l0[0]+l1[0])/2,(l0[1]+l1[1])/2]}else if(g.touch0)p=g.touch0[0],l=g.touch0[1];else return;g.zoom(`touch`,constrain(translate(t,p,l),g.extent,translateExtent))}function touchended(event,...args){if(!this.__zooming)return;var g=gesture(this,args).event(event),touches=event.changedTouches,n=touches.length,i,t;nopropagation(event);if(touchending)clearTimeout(touchending);touchending=setTimeout(function(){touchending=null},touchDelay);for(i=0;i<n;++i){t=touches[i];if(g.touch0&&g.touch0[2]===t.identifier)delete g.touch0;else if(g.touch1&&g.touch1[2]===t.identifier)delete g.touch1}if(g.touch1&&!g.touch0)g.touch0=g.touch1,delete g.touch1;if(g.touch0)g.touch0[1]=this.__zoom.invert(g.touch0[0]);else{g.end();if(g.taps===2){t=pointer(t,this);if(Math.hypot(touchfirst[0]-t[0],touchfirst[1]-t[1])<tapDistance){var p=select(this).on(`dblclick.zoom`);if(p)p.apply(this,arguments)}}}}zoom2.wheelDelta=function(_){return arguments.length?(wheelDelta2=typeof _===`function`?_:constant(+_),zoom2):wheelDelta2};zoom2.filter=function(_){return arguments.length?(filter2=typeof _===`function`?_:constant(!!_),zoom2):filter2};zoom2.touchable=function(_){return arguments.length?(touchable=typeof _===`function`?_:constant(!!_),zoom2):touchable};zoom2.extent=function(_){return arguments.length?(extent=typeof _===`function`?_:constant([[+_[0][0],+_[0][1]],[+_[1][0],+_[1][1]]]),zoom2):extent};zoom2.scaleExtent=function(_){return arguments.length?(scaleExtent[0]=+_[0],scaleExtent[1]=+_[1],zoom2):[scaleExtent[0],scaleExtent[1]]};zoom2.translateExtent=function(_){return arguments.length?(translateExtent[0][0]=+_[0][0],translateExtent[1][0]=+_[1][0],translateExtent[0][1]=+_[0][1],translateExtent[1][1]=+_[1][1],zoom2):[[translateExtent[0][0],translateExtent[0][1]],[translateExtent[1][0],translateExtent[1][1]]]};zoom2.constrain=function(_){return arguments.length?(constrain=_,zoom2):constrain};zoom2.duration=function(_){return arguments.length?(duration=+_,zoom2):duration};zoom2.interpolate=function(_){return arguments.length?(interpolate2=_,zoom2):interpolate2};zoom2.on=function(){var value=listeners.on.apply(listeners,arguments);return value===listeners?zoom2:value};zoom2.clickDistance=function(_){return arguments.length?(clickDistance2=(_=+_)*_,zoom2):Math.sqrt(clickDistance2)};zoom2.tapDistance=function(_){return arguments.length?(tapDistance=+_,zoom2):tapDistance};return zoom2}var Slots=Symbol(`MiniMapSlots`);var _hoisted_1$1$1=[`id`,`x`,`y`,`rx`,`ry`,`width`,`height`,`fill`,`stroke`,`stroke-width`,`shape-rendering`];var _sfc_main$1$1=defineComponent({name:`MiniMapNode`,compatConfig:{MODE:3},inheritAttrs:false,props:{id:{},type:{},selected:{type:Boolean},dragging:{type:Boolean},position:{},dimensions:{},borderRadius:{},color:{},shapeRendering:{},strokeColor:{},strokeWidth:{},hidden:{type:Boolean}},emits:[`click`,`dblclick`,`mouseenter`,`mousemove`,`mouseleave`],setup(__props,{emit:emits}){const props=__props;const miniMapSlots=inject(Slots);const attrs=useAttrs();const style=toRef(()=>attrs.style??{});function onClick(event){emits(`click`,event)}function onDblclick(event){emits(`dblclick`,event)}function onMouseEnter(event){emits(`mouseenter`,event)}function onMouseMove(event){emits(`mousemove`,event)}function onMouseLeave(event){emits(`mouseleave`,event)}return(_ctx,_cache)=>{return!_ctx.hidden&&_ctx.dimensions.width!==0&&_ctx.dimensions.height!==0?(openBlock(),createElementBlock(Fragment,{key:0},[unref(miniMapSlots)[`node-${props.type}`]?(openBlock(),createBlock(resolveDynamicComponent(unref(miniMapSlots)[`node-${props.type}`]),normalizeProps(mergeProps({key:0},{...props,..._ctx.$attrs})),null,16)):(openBlock(),createElementBlock(`rect`,mergeProps({key:1,id:_ctx.id},_ctx.$attrs,{class:[`vue-flow__minimap-node`,{selected:_ctx.selected,dragging:_ctx.dragging}],x:_ctx.position.x,y:_ctx.position.y,rx:_ctx.borderRadius,ry:_ctx.borderRadius,width:_ctx.dimensions.width,height:_ctx.dimensions.height,fill:_ctx.color||style.value.background||style.value.backgroundColor,stroke:_ctx.strokeColor,"stroke-width":_ctx.strokeWidth,"shape-rendering":_ctx.shapeRendering,onClick,onDblclick,onMouseenter:onMouseEnter,onMousemove:onMouseMove,onMouseleave:onMouseLeave}),null,16,_hoisted_1$1$1))],64)):createCommentVNode(``,true)}}});var _hoisted_1$4=[`width`,`height`,`viewBox`,`aria-labelledby`];var _hoisted_2$4=[`id`];var _hoisted_3$4=[`d`,`fill`,`stroke`,`stroke-width`];var _sfc_main$7=defineComponent({name:`MiniMap`,compatConfig:{MODE:3},props:{nodeColor:{type:[String,Function],default:`#e2e2e2`},nodeStrokeColor:{type:[String,Function],default:`transparent`},nodeClassName:{type:[String,Function]},nodeBorderRadius:{default:5},nodeStrokeWidth:{default:2},maskColor:{default:`rgb(240, 240, 240, 0.6)`},maskStrokeColor:{default:`none`},maskStrokeWidth:{default:1},position:{default:`bottom-right`},pannable:{type:Boolean,default:false},zoomable:{type:Boolean,default:false},width:{},height:{},ariaLabel:{default:`Vue Flow mini map`},inversePan:{type:Boolean,default:false},zoomStep:{default:1},offsetScale:{default:5},maskBorderRadius:{default:0}},emits:[`click`,`nodeClick`,`nodeDblclick`,`nodeMouseenter`,`nodeMousemove`,`nodeMouseleave`],setup(__props,{emit}){const slots=useSlots();const attrs=useAttrs();const defaultWidth=200;const defaultHeight=150;const{id:id2,edges,viewport,translateExtent,dimensions,emits,d3Selection,d3Zoom,getNodesInitialized}=useVueFlow();const el=ref();provide(Slots,slots);const elementWidth=toRef(()=>{var _a;return __props.width??((_a=attrs.style)==null?void 0:_a.width)??defaultWidth});const elementHeight=toRef(()=>{var _a;return __props.height??((_a=attrs.style)==null?void 0:_a.height)??defaultHeight});const shapeRendering=typeof window===`undefined`||!!window.chrome?`crispEdges`:`geometricPrecision`;const nodeColorFunc=computed(()=>typeof __props.nodeColor===`string`?()=>__props.nodeColor:__props.nodeColor);const nodeStrokeColorFunc=computed(()=>typeof __props.nodeStrokeColor===`string`?()=>__props.nodeStrokeColor:__props.nodeStrokeColor);const nodeClassNameFunc=computed(()=>typeof __props.nodeClassName===`string`?()=>__props.nodeClassName:typeof __props.nodeClassName===`function`?__props.nodeClassName:()=>``);const bb=computed(()=>getRectOfNodes(getNodesInitialized.value.filter(node=>!node.hidden)));const viewBB=computed(()=>({x:-viewport.value.x/viewport.value.zoom,y:-viewport.value.y/viewport.value.zoom,width:dimensions.value.width/viewport.value.zoom,height:dimensions.value.height/viewport.value.zoom}));const boundingRect=computed(()=>getNodesInitialized.value&&getNodesInitialized.value.length?getBoundsofRects(bb.value,viewBB.value):viewBB.value);const viewScale=computed(()=>{const scaledWidth=boundingRect.value.width/elementWidth.value;const scaledHeight=boundingRect.value.height/elementHeight.value;return Math.max(scaledWidth,scaledHeight)});const viewBox=computed(()=>{const viewWidth=viewScale.value*elementWidth.value;const viewHeight=viewScale.value*elementHeight.value;const offset=__props.offsetScale*viewScale.value;return{offset,x:boundingRect.value.x-(viewWidth-boundingRect.value.width)/2-offset,y:boundingRect.value.y-(viewHeight-boundingRect.value.height)/2-offset,width:viewWidth+offset*2,height:viewHeight+offset*2}});const d=computed(()=>{if(!viewBox.value.x||!viewBox.value.y)return``;return`
|
|
3
3
|
M${viewBox.value.x-viewBox.value.offset},${viewBox.value.y-viewBox.value.offset}
|
|
4
4
|
h${viewBox.value.width+viewBox.value.offset*2}
|
|
@@ -13,6 +13,6 @@ import{Gn as withKeys,Kn as withModifiers,Wn as vShow,h as VIcon}from"./ripple-B
|
|
|
13
13
|
a${__props.maskBorderRadius},${__props.maskBorderRadius} 0 0 1 -${__props.maskBorderRadius},-${__props.maskBorderRadius}
|
|
14
14
|
v${-(viewBB.value.height-2*__props.maskBorderRadius)}
|
|
15
15
|
a${__props.maskBorderRadius},${__props.maskBorderRadius} 0 0 1 ${__props.maskBorderRadius},-${__props.maskBorderRadius}z`});watchEffect(onCleanup=>{if(el.value){const selection2=select(el.value);const zoomHandler=event=>{if(event.sourceEvent.type!==`wheel`||!d3Selection.value||!d3Zoom.value)return;const factor=event.sourceEvent.ctrlKey&&isMacOs()?10:1;const pinchDelta=-event.sourceEvent.deltaY*(event.sourceEvent.deltaMode===1?.05:event.sourceEvent.deltaMode?1:.002)*__props.zoomStep;const nextZoom=viewport.value.zoom*2**(pinchDelta*factor);d3Zoom.value.scaleTo(d3Selection.value,nextZoom)};const panHandler=event=>{if(event.sourceEvent.type!==`mousemove`||!d3Selection.value||!d3Zoom.value)return;const moveScale=viewScale.value*Math.max(1,viewport.value.zoom)*(__props.inversePan?-1:1);const position={x:viewport.value.x-event.sourceEvent.movementX*moveScale,y:viewport.value.y-event.sourceEvent.movementY*moveScale};const extent=[[0,0],[dimensions.value.width,dimensions.value.height]];const nextTransform=identity.translate(position.x,position.y).scale(viewport.value.zoom);const constrainedTransform=d3Zoom.value.constrain()(nextTransform,extent,translateExtent.value);d3Zoom.value.transform(d3Selection.value,constrainedTransform)};const zoomAndPanHandler=zoom().wheelDelta(event=>wheelDelta(event)*(__props.zoomStep/10)).on(`zoom`,__props.pannable?panHandler:()=>{}).on(`zoom.wheel`,__props.zoomable?zoomHandler:()=>{});selection2.call(zoomAndPanHandler);onCleanup(()=>{selection2.on(`zoom`,null)})}},{flush:`post`});function onSvgClick(event){const[x,y]=pointer(event);emit(`click`,{event,position:{x,y}})}function onNodeClick(event,node){const param={event,node,connectedEdges:getConnectedEdges([node],edges.value)};emits.miniMapNodeClick(param);emit(`nodeClick`,param)}function onNodeDblClick(event,node){const param={event,node,connectedEdges:getConnectedEdges([node],edges.value)};emits.miniMapNodeDoubleClick(param);emit(`nodeDblclick`,param)}function onNodeMouseEnter(event,node){const param={event,node,connectedEdges:getConnectedEdges([node],edges.value)};emits.miniMapNodeMouseEnter(param);emit(`nodeMouseenter`,param)}function onNodeMouseMove(event,node){const param={event,node,connectedEdges:getConnectedEdges([node],edges.value)};emits.miniMapNodeMouseMove(param);emit(`nodeMousemove`,param)}function onNodeMouseLeave(event,node){const param={event,node,connectedEdges:getConnectedEdges([node],edges.value)};emits.miniMapNodeMouseLeave(param);emit(`nodeMouseleave`,param)}return(_ctx,_cache)=>{return openBlock(),createBlock(unref(_sfc_main$9),{position:_ctx.position,class:normalizeClass([`vue-flow__minimap`,{pannable:_ctx.pannable,zoomable:_ctx.zoomable}])},{default:withCtx(()=>[(openBlock(),createElementBlock(`svg`,{ref_key:`el`,ref:el,width:elementWidth.value,height:elementHeight.value,viewBox:[viewBox.value.x,viewBox.value.y,viewBox.value.width,viewBox.value.height].join(` `),role:`img`,"aria-labelledby":`vue-flow__minimap-${unref(id2)}`,onClick:onSvgClick},[_ctx.ariaLabel?(openBlock(),createElementBlock(`title`,{key:0,id:`vue-flow__minimap-${unref(id2)}`},toDisplayString(_ctx.ariaLabel),9,_hoisted_2$4)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(getNodesInitialized),node=>{return openBlock(),createBlock(_sfc_main$1$1,{id:node.id,key:node.id,f:``,position:node.computedPosition,dimensions:node.dimensions,selected:node.selected,dragging:node.dragging,style:normalizeStyle(node.style),class:normalizeClass(nodeClassNameFunc.value(node)),color:nodeColorFunc.value(node),"border-radius":_ctx.nodeBorderRadius,"stroke-color":nodeStrokeColorFunc.value(node),"stroke-width":_ctx.nodeStrokeWidth,"shape-rendering":unref(shapeRendering),type:node.type,hidden:node.hidden,onClick:$event=>onNodeClick($event,node),onDblclick:$event=>onNodeDblClick($event,node),onMouseenter:$event=>onNodeMouseEnter($event,node),onMousemove:$event=>onNodeMouseMove($event,node),onMouseleave:$event=>onNodeMouseLeave($event,node)},null,8,[`id`,`position`,`dimensions`,`selected`,`dragging`,`style`,`class`,`color`,`border-radius`,`stroke-color`,`stroke-width`,`shape-rendering`,`type`,`hidden`,`onClick`,`onDblclick`,`onMouseenter`,`onMousemove`,`onMouseleave`])}),128)),createBaseVNode(`path`,{class:`vue-flow__minimap-mask`,d:d.value,fill:_ctx.maskColor,stroke:_ctx.maskStrokeColor,"stroke-width":_ctx.maskStrokeWidth,"fill-rule":`evenodd`},null,8,_hoisted_3$4)],8,_hoisted_1$4))]),_:1},8,[`position`,`class`])}}});var CLEARANCE=14;var STUB=18;var BEND_COST=32;function erdObstacles(nodes=[],clearance=CLEARANCE){return nodes.map(node=>({id:node.id,left:node.position.x-clearance,right:node.position.x+node.dimensions.width+clearance,top:node.position.y-clearance,bottom:node.position.y+node.dimensions.height+clearance}))}function segmentBlocked(a,b,obstacles,ignoreStart=null,ignoreEnd=null){return obstacles.some(box=>box.id!==ignoreStart&&box.id!==ignoreEnd&&(a.x===b.x?a.x>box.left&&a.x<box.right&&Math.max(a.y,b.y)>box.top&&Math.min(a.y,b.y)<box.bottom:a.y>box.top&&a.y<box.bottom&&Math.max(a.x,b.x)>box.left&&Math.min(a.x,b.x)<box.right))}function compact(points){const result=[];for(const point of points){const last=result.at(-1);if(last&&last.x===point.x&&last.y===point.y)continue;const before=result.at(-2);if(before&&(before.x===last.x&&last.x===point.x||before.y===last.y&&last.y===point.y))result.pop();result.push(point)}return result}function erdPathClear(points,obstacles,source,target){return points?.length>1&&points.slice(1).every((point,index)=>!segmentBlocked(points[index],point,obstacles,index===0?source:null,index===points.length-2?target:null))}function segmentPenalty(a,b,occupied){let cost=0;const vertical=a.x===b.x;for(const[c,d]of occupied)if(vertical===(c.x===d.x)){const distance=Math.abs(vertical?a.x-c.x:a.y-c.y);if(distance>=7)continue;const overlap=vertical?Math.min(Math.max(a.y,b.y),Math.max(c.y,d.y))-Math.max(Math.min(a.y,b.y),Math.min(c.y,d.y)):Math.min(Math.max(a.x,b.x),Math.max(c.x,d.x))-Math.max(Math.min(a.x,b.x),Math.min(c.x,d.x));if(overlap>0)cost+=overlap*(distance<1?8:3)}else{const v1=vertical?a:c;const v2=vertical?b:d;const h1=vertical?c:a;const h2=vertical?d:b;if(v1.x>Math.min(h1.x,h2.x)&&v1.x<Math.max(h1.x,h2.x)&&h1.y>Math.min(v1.y,v2.y)&&h1.y<Math.max(v1.y,v2.y))cost+=48}return cost}function push(queue,item){let index=queue.length;queue.push(item);while(index>0){const parent=index-1>>1;if(queue[parent].score<=item.score)break;queue[index]=queue[parent];index=parent}queue[index]=item}function pop(queue){const first=queue[0];const last=queue.pop();if(queue.length){let index=0;while(index*2+1<queue.length){let child=index*2+1;if(child+1<queue.length&&queue[child+1].score<queue[child].score)child+=1;if(queue[child].score>=last.score)break;queue[index]=queue[child];index=child}queue[index]=last}return first}function routeErdConnection(route,obstacles,occupied=[],index=0,dragging=false){const start=route.start;const end=route.end;const stub=route.stubLength??STUB;const offsets={left:[-stub,0],right:[stub,0],top:[0,-stub],bottom:[0,stub]};const[sourceX,sourceY]=offsets[route.sourcePosition];const[targetX,targetY]=offsets[route.targetPosition];const from={x:start.x+sourceX,y:start.y+sourceY};const to={x:end.x+targetX,y:end.y+targetY};const basic=compact([start,from,{x:route.laneX,y:from.y},{x:route.laneX,y:to.y},to,end]);if(dragging)return{points:basic,obstructed:!erdPathClear(basic,obstacles,route.source,route.target)};if(obstacles.some(box=>[from,to].some(point=>point.x>box.left&&point.x<box.right&&point.y>box.top&&point.y<box.bottom))||segmentBlocked(start,from,obstacles.filter(box=>box.id!==route.source))||segmentBlocked(to,end,obstacles.filter(box=>box.id!==route.target)))return{points:basic,obstructed:true};const gap=4+index%7*8;const xs=[...new Set([from.x,to.x,route.laneX,...obstacles.flatMap(box=>[box.left-gap,box.right+gap])])].sort((a,b)=>a-b);const ys=[...new Set([from.y,to.y,...obstacles.flatMap(box=>[box.top-gap,box.bottom+gap])])].sort((a,b)=>a-b);const candidates=[...xs.map(x=>compact([start,from,{x,y:from.y},{x,y:to.y},to,end])),...ys.map(y=>compact([start,from,{x:from.x,y},{x:to.x,y},to,end]))].map(points=>({points,cost:points.slice(1).reduce((sum,b,i)=>sum+Math.abs(points[i].x-b.x)+Math.abs(points[i].y-b.y)+BEND_COST,0)})).sort((a,b)=>a.cost-b.cost);let best=null;let bestScore=Infinity;for(const{points,cost}of candidates){if(cost>=bestScore)break;if(!erdPathClear(points,obstacles,route.source,route.target))continue;let score=cost;for(let i=1;i<points.length&&score<bestScore;i+=1)score+=segmentPenalty(points[i-1],points[i],occupied);if(!best||score<bestScore){best=points;bestScore=score}}if(best)return{points:best,obstructed:false};const width=xs.length;const startId=ys.indexOf(from.y)*width+xs.indexOf(from.x);const endId=ys.indexOf(to.y)*width+xs.indexOf(to.x);const point=id=>({x:xs[id%width],y:ys[Math.floor(id/width)]});const distance=(a,b)=>Math.abs(a.x-b.x)+Math.abs(a.y-b.y);const costs=new Map([[startId*2,0]]);const previous=new Map;const queue=[];push(queue,{key:startId*2,cost:0,score:distance(from,to)});let finish=null;let explored=0;while(queue.length&&explored<2e3){explored+=1;const current=pop(queue);if(costs.get(current.key)!==current.cost)continue;const id=Math.floor(current.key/2);if(id===endId){finish=current.key;break}const x=id%width;const y=Math.floor(id/width);const a=point(id);const neighbours=[...x>0?[[id-1,0]]:[],...x+1<width?[[id+1,0]]:[],...y>0?[[id-width,1]]:[],...y+1<ys.length?[[id+width,1]]:[]];for(const[next,direction]of neighbours){const b=point(next);if(segmentBlocked(a,b,obstacles))continue;const key=next*2+direction;const cost=current.cost+distance(a,b)+(direction===current.key%2?0:BEND_COST);if(cost>=(costs.get(key)??Infinity))continue;costs.set(key,cost);previous.set(key,current.key);push(queue,{key,cost,score:cost+1.25*distance(b,to)})}}if(finish===null)return{points:basic,obstructed:true};const middle=[];for(let key=finish;key!==void 0;key=previous.get(key))middle.push(point(Math.floor(key/2)));const points=compact([start,...middle.reverse(),end]);return{points,obstructed:!erdPathClear(points,obstacles,route.source,route.target)}}function erdPolylinePath(points=[]){if(!points.length)return[``,0,0];const longest=[...points.slice(1).map((point,index)=>({a:points[index],b:point,length:Math.abs(point.x-points[index].x)+Math.abs(point.y-points[index].y)}))].sort((a,b)=>b.length-a.length)[0];return[points.map((point,index)=>`${index?`L`:`M`}${point.x} ${point.y}`).join(``),longest?(longest.a.x+longest.b.x)/2:points[0].x,longest?(longest.a.y+longest.b.y)/2:points[0].y]}var _sfc_main$6=Object.assign({inheritAttrs:false},{__name:`DatabaseErdEdge`,props:{data:{default:()=>({}),type:Object},id:{required:true,type:String},markerEnd:{default:``,type:String},sourceX:{required:true,type:Number},sourceY:{required:true,type:Number},sourcePosition:{default:`right`,type:String},targetX:{required:true,type:Number},targetY:{required:true,type:Number},targetPosition:{default:`left`,type:String},style:{default:()=>({}),type:Object}},setup(__props){const props=__props;const edgePath=computed(()=>erdPolylinePath(props.data.points));return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(unref(_sfc_main$d),{id:__props.id,"interaction-width":20,"marker-end":__props.markerEnd,path:edgePath.value[0],style:normalizeStyle(__props.style)},null,8,[`id`,`marker-end`,`path`,`style`]),__props.data.emphasized?(openBlock(),createBlock(unref(_sfc_main$e),{key:0,x:__props.sourceX+(__props.sourcePosition===`left`?-38:38),y:__props.sourceY-12,label:__props.data.cardinality.parent,"label-show-bg":true,"label-bg-padding":[3,2]},null,8,[`x`,`y`,`label`])):createCommentVNode(``,true),__props.data.emphasized?(openBlock(),createBlock(unref(_sfc_main$e),{key:1,x:__props.targetX+(__props.targetPosition===`left`?-38:38),y:__props.targetY-12,label:__props.data.cardinality.child,"label-show-bg":true,"label-bg-padding":[3,2]},null,8,[`x`,`y`,`label`])):createCommentVNode(``,true)],64)}}});var ERD_NODE_WIDTH=296;var ERD_HEADER_HEIGHT=64;var ERD_ROW_HEIGHT=28;var ERD_FOOTER_HEIGHT=28;function createErdNodes(schema,layout){const records=new Map((layout.nodes||[]).map(node=>[node.table,node]));const nodes=(schema.tables||[]).map(table=>{const record=records.get(table.qualifiedName)||{};const columns=erdColumns(table,schema.relationships,layout.columnMode,record.expanded);return{id:table.qualifiedName,position:{x:record.x||0,y:record.y||0},dimensions:{width:296,height:erdNodeHeight(columns,record.collapsed)},data:{table,columns,group:record.group||``,collapsed:record.collapsed===true,expanded:record.expanded===true,pinned:record.pinned===true}}});const membership=new Map(erdLayoutGroups(nodes,schema.relationships||[]).flatMap(group=>group.tables.map(id=>[id,group])));for(const node of nodes){node.data.layoutGroup=membership.get(node.id)?.id;node.data.groupName=layout.groups?.find(group=>group.id===node.data.group)?.name||membership.get(node.id)?.name}return nodes}function visibleErdNodes(nodes,relationships,layout){const neighbours=erdNeighbours(layout.focusTable,relationships);const connected=new Set(relationships.flatMap(relationship=>[relationship.sourceTable,relationship.referencedTable]));return nodes.map(node=>{const matchesFocus=!layout.focusTable||neighbours.has(node.id);const matchesGroup=!layout.activeGroup||layout.activeGroup===node.data.layoutGroup||layout.activeGroup===`erd-related`&&connected.has(node.id);return{...node,hidden:!matchesFocus||!matchesGroup}})}function erdColumns(table,relationships=[],mode=`keys`,expanded=false){if(mode===`all`||expanded)return table.columns||[];const names=new Set((table.keys||[]).flatMap(key=>key.columns));for(const relationship of relationships){if(relationship.sourceTable===table.qualifiedName)for(const name of relationship.columns)names.add(name);if(relationship.referencedTable===table.qualifiedName)for(const name of relationship.referencedColumns)names.add(name)}return(table.columns||[]).filter(column=>names.has(column.name))}function erdNodeHeight(columns=[],collapsed=false){return 64+(collapsed?0:Math.max(1,columns.length)*28+28)}function uniqueColumns(table,columns){return(table?.keys||[]).some(key=>key.columns.length>0&&key.columns.every(column=>columns.includes(column)))}function erdCardinality(relationship,parent,child){const columns=(relationship.columns||[]).map(name=>child?.columns?.find(column=>column.name===name));const known=columns.length>0&&columns.every(column=>typeof column?.nullable===`boolean`);const optional=columns.some(column=>column?.nullable===true);const parentMax=uniqueColumns(parent,relationship.referencedColumns||[])?`1`:`N`;const parentMin=optional?`0`:known?`1`:`?`;return{parent:parentMin===parentMax?parentMax:`${parentMin}..${parentMax}`,child:uniqueColumns(child,relationship.columns||[])?`0..1`:`0..N`,optional:optional||!known}}function erdNeighbours(table,relationships=[]){const ids=new Set(table?[table]:[]);for(const relationship of relationships){if(relationship.sourceTable===table)ids.add(relationship.referencedTable);if(relationship.referencedTable===table)ids.add(relationship.sourceTable)}return ids}function erdSearch(tables=[],search=``){const query=search.trim().toLowerCase();if(!query)return[];return tables.flatMap(table=>[...table.qualifiedName.toLowerCase().includes(query)?[{table:table.qualifiedName,column:``,title:table.name}]:[],...(table.columns||[]).filter(column=>column.name.toLowerCase().includes(query)).map(column=>({table:table.qualifiedName,column:column.name,title:`${table.name}.${column.name}`}))]).slice(0,40)}function erdLayoutGroups(nodes,relationships){const ids=new Set(nodes.map(node=>node.id));const neighbours=new Map(nodes.map(node=>[node.id,[]]));const connected=new Set;for(const relationship of relationships){const{sourceTable:source,referencedTable:target}=relationship;if(!ids.has(source)||!ids.has(target))continue;connected.add(source);connected.add(target);if(source===target)continue;neighbours.get(source).push(target);neighbours.get(target).push(source)}const labels=new Map(nodes.map(node=>[node.id,node.id]));const degree=new Map(nodes.map(node=>[node.id,neighbours.get(node.id).length]));const totals=new Map(degree);const totalDegree=[...degree.values()].reduce((sum,value)=>sum+value,0)||1;const ordered=[...ids].sort();for(let pass=0;pass<12;pass+=1){let changed=false;for(const id of ordered){const current=labels.get(id);totals.set(current,totals.get(current)-degree.get(id));const weights=new Map([[current,0]]);for(const neighbour of neighbours.get(id)){const label=labels.get(neighbour);weights.set(label,(weights.get(label)||0)+1)}let best=current;let score=(weights.get(current)||0)-degree.get(id)*totals.get(current)/totalDegree;for(const[label,weight]of[...weights].sort(([a],[b])=>a.localeCompare(b))){const candidate=weight-degree.get(id)*totals.get(label)/totalDegree;if(candidate>score+1e-4){score=candidate;best=label}}labels.set(id,best);totals.set(best,totals.get(best)+degree.get(id));changed||=best!==current}if(!changed)break}const groups=new Map;for(const node of nodes){const id=node.data?.group||(connected.has(node.id)?`erd-auto:${labels.get(node.id)}`:`erd-disconnected`);if(!groups.has(id))groups.set(id,[]);groups.get(id).push(node.id)}return[...groups].map(([id,tables])=>{const anchor=[...tables].sort((a,b)=>degree.get(b)-degree.get(a)||a.localeCompare(b))[0];return{id,tables,name:id===`erd-disconnected`?`Disconnected tables`:`${nodes.find(node=>node.id===anchor)?.data?.table?.name||anchor} & related`}})}function placeErdNodes(nodes,positions,stored=[],force=false){const previous=new Map(stored.map(node=>[node.table,node]));const suggested=new Map(positions.map(node=>[node.id,node]));const result=nodes.map(node=>{const saved=previous.get(node.id);const position=saved&&(!force||saved.pinned)?saved:suggested.get(node.id)||node.position;return{...node,position:{x:position.x||0,y:position.y||0}}});const fixed=new Set(stored.filter(node=>!force||node.pinned).map(node=>node.table));const occupied=result.filter(node=>fixed.has(node.id)).map(node=>({...node.position,...node.dimensions}));for(const node of result){if(fixed.has(node.id))continue;const rectangle={...node.position,...node.dimensions};let collision;while(collision=occupied.find(box=>rectangle.x<box.x+box.width+36&&rectangle.x+rectangle.width+36>box.x&&rectangle.y<box.y+box.height+36&&rectangle.y+rectangle.height+36>box.y))rectangle.y=collision.y+collision.height+48;node.position={x:rectangle.x,y:rectangle.y};occupied.push(rectangle)}return result}var _hoisted_1$3=[`title`];var _hoisted_2$3=[`data-column`,`title`];var _hoisted_3$3={class:`database-erd-node__key`};var _hoisted_4$3=[`title`];var _hoisted_5$3={key:1};var _sfc_main$5={__name:`DatabaseErdNode`,props:{controlsVisible:{default:true,type:Boolean},data:{required:true,type:Object},id:{required:true,type:String}},setup(__props){return(_ctx,_cache)=>{return openBlock(),createElementBlock(`article`,{class:normalizeClass([`database-erd-node`,{"database-erd-node--selected":__props.data.highlighted,"database-erd-node--dimmed":__props.data.dimmed}]),style:normalizeStyle({width:unref(296)+`px`})},[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.data.relationshipPorts,port=>{return openBlock(),createBlock(unref(_sfc_main$f),{id:port.id,key:port.id,class:normalizeClass([`database-erd-node__port`,`database-erd-node__port--${port.type}`]),position:port.position,style:normalizeStyle({top:port.y+`px`}),type:port.type},null,8,[`id`,`class`,`position`,`style`,`type`])}),128)),createBaseVNode(`header`,{style:normalizeStyle({height:unref(64)+`px`})},[createBaseVNode(`div`,{class:`database-erd-node__title`,title:__props.data.table.qualifiedName},[createBaseVNode(`small`,null,toDisplayString(__props.data.table.schema),1),createBaseVNode(`strong`,null,toDisplayString(__props.data.table.name),1)],8,_hoisted_1$3),createVNode(VBtn,{"aria-label":__props.data.pinned?`Unpin table`:`Pin table`,"aria-pressed":__props.data.pinned,class:`nodrag`,icon:__props.data.pinned?unref(mdiPin):unref(mdiPinOutline),size:`x-small`,variant:`text`,onClick:_cache[0]||(_cache[0]=withModifiers($event=>__props.data.onPin(__props.id),[`stop`]))},null,8,[`aria-label`,`aria-pressed`,`icon`]),__props.controlsVisible?(openBlock(),createBlock(VBtn,{key:0,"aria-label":__props.data.collapsed?`Expand table`:`Collapse table`,class:`nodrag`,icon:__props.data.collapsed?unref(mdiChevronDown):unref(mdiChevronUp),size:`x-small`,variant:`text`,onClick:_cache[1]||(_cache[1]=withModifiers($event=>__props.data.onToggle(__props.id),[`stop`]))},null,8,[`aria-label`,`icon`])):createCommentVNode(``,true)],4),!__props.data.collapsed?(openBlock(),createElementBlock(Fragment,{key:0},[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.data.columns,column=>{return openBlock(),createElementBlock(`div`,{key:column.name,class:normalizeClass([`database-erd-node__column`,{"database-erd-node__column--highlighted":__props.data.highlightedColumns?.includes(column.name)}]),"data-column":column.name,style:normalizeStyle({height:unref(28)+`px`}),title:`${column.name} · ${column.nativeType}${column.nullable?` · nullable`:``}`},[createBaseVNode(`span`,_hoisted_3$3,toDisplayString(__props.data.primaryColumns.has(column.name)?`PK`:__props.data.foreignColumns.has(column.name)?`FK`:__props.data.uniqueColumns.has(column.name)?`UQ`:``),1),createBaseVNode(`span`,null,toDisplayString(column.name),1),createBaseVNode(`small`,null,toDisplayString(column.nativeType)+toDisplayString(column.nullable?` ?`:``),1)],14,_hoisted_2$3)}),128)),!__props.data.columns.length?(openBlock(),createElementBlock(`div`,{key:0,class:`database-erd-node__empty`,style:normalizeStyle({height:unref(28)+`px`})},`No key columns`,4)):createCommentVNode(``,true),createBaseVNode(`footer`,{style:normalizeStyle({height:unref(28)+`px`})},[createBaseVNode(`span`,{title:__props.data.groupName},toDisplayString(__props.data.groupName||__props.data.table.kind),9,_hoisted_4$3),__props.data.columnMode===`keys`&&__props.data.table.columns.length>__props.data.keyColumnCount?(openBlock(),createElementBlock(`button`,{key:0,class:`nodrag`,type:`button`,onClick:_cache[2]||(_cache[2]=withModifiers($event=>__props.data.onExpand(__props.id),[`stop`]))},toDisplayString(__props.data.expanded?`Keys only`:`Show all ${__props.data.table.columns.length}`),1)):(openBlock(),createElementBlock(`span`,_hoisted_5$3,toDisplayString(__props.data.columns.length)+` columns`,1))],4)],64)):createCommentVNode(``,true)],6)}}};var DatabaseErdNode_default=_plugin_vue_export_helper_default(_sfc_main$5,[[`__scopeId`,`data-v-e62091f1`]]);function erdRouteSnapshot(routes=[]){return routes.map(({id,sourcePosition,targetPosition,points,obstructed})=>({id,sourcePosition,targetPosition,points:points.map(({x,y})=>({x,y})),obstructed:Boolean(obstructed)}))}function createErdRelationshipRoutes(nodes=[],relationships=[],{previousRoutes=[],dragging=false,fixedSides=false,calculatePaths=true,layoutPaths=new Map}={}){const nodeById=new Map(nodes.map(node=>[node.id,node]));const portsByNode=new Map(nodes.map(node=>[node.id,[]]));const previous=new Map(previousRoutes.map(route=>[route.id,{...route,start:route.points?.[0],end:route.points?.at(-1)}]));const routes=[];relationships.forEach((relationship,index)=>{const sourceNode=nodeById.get(relationship.referencedTable);const targetNode=nodeById.get(relationship.sourceTable);if(!sourceNode||!targetNode)return;const relationshipId=String(relationship.id||relationship.constraintName||`relationship-${index}`);const cardinality=erdCardinality(relationship,sourceNode.data.table,targetNode.data.table);(relationship.columns||[]).forEach((column,pairIndex)=>{const id=relationship.columns.length>1?`${relationshipId}:column-${pairIndex}`:relationshipId;const old=previous.get(id);const sourceColumn=sourceNode.data.collapsed?null:relationship.referencedColumns[pairIndex];const targetColumn=targetNode.data.collapsed?null:column;const reversed=sourceNode.position.x>targetNode.position.x+24;const self=sourceNode.id===targetNode.id;const sourcePosition=old?.sourcePosition||(fixedSides||!reversed?`right`:`left`);const targetPosition=old?.targetPosition||(self?sourcePosition:fixedSides||!reversed?`left`:`right`);const sourcePort={id:`erd-source:${id}`,column:sourceColumn,position:sourcePosition,type:`source`};const targetPort={id:`erd-target:${id}`,column:targetColumn,position:targetPosition,type:`target`};portsByNode.get(sourceNode.id).push(sourcePort);portsByNode.get(targetNode.id).push(targetPort);routes.push({id,relationshipId,relationship,pairIndex,cardinality,source:sourceNode.id,sourceNode,sourceColumn,sourcePosition,sourcePort,sourceHandle:sourcePort.id,target:targetNode.id,targetNode,targetColumn,targetPosition,targetPort,targetHandle:targetPort.id})})});for(const node of nodes){const groups=new Map;for(const port of portsByNode.get(node.id)){const key=`${port.position}:${port.column||``}`;if(!groups.has(key))groups.set(key,[]);groups.get(key).push(port)}for(const group of groups.values()){group.sort((a,b)=>a.id.localeCompare(b.id));group.forEach((port,index)=>{const row=(node.data.columns||node.data.table.columns||[]).findIndex(column=>column.name===port.column);port.column=row<0?null:port.column;port.offset=group.length===1?50:25+50*index/(group.length-1);port.y=row<0?64/2:64+row*28+28*port.offset/100;port.x=port.position===`left`?0:node.dimensions.width})}}const obstacles=erdObstacles(nodes);const occupied=[];for(const[index,route]of routes.entries()){route.start={x:route.sourceNode.position.x+route.sourcePort.x,y:route.sourceNode.position.y+route.sourcePort.y};route.end={x:route.targetNode.position.x+route.targetPort.x,y:route.targetNode.position.y+route.targetPort.y};route.laneX=route.source===route.target?route.sourceNode.position.x+route.sourceNode.dimensions.width+48+index*8:(route.start.x+route.end.x)/2+(index%7-3)*8;if(!calculatePaths)continue;const old=previous.get(route.id);const unchanged=old&&old.start.x===route.start.x&&old.start.y===route.start.y&&old.end.x===route.end.x&&old.end.y===route.end.y;const layoutPoints=layoutPaths.get(route.id);if(layoutPoints&&erdPathClear(layoutPoints,obstacles,route.source,route.target)&&Math.abs(layoutPoints[0].x-route.start.x)<1&&Math.abs(layoutPoints[0].y-route.start.y)<1&&Math.abs(layoutPoints.at(-1).x-route.end.x)<1&&Math.abs(layoutPoints.at(-1).y-route.end.y)<1){route.points=layoutPoints;route.obstructed=false}else if(unchanged&&(dragging||erdPathClear(old.points,obstacles,route.source,route.target))){route.points=old.points;route.obstructed=old.obstructed}else Object.assign(route,routeErdConnection(route,obstacles,occupied,index,dragging));route.points.slice(1).forEach((point,i)=>occupied.push([route.points[i],point]))}return{portsByNode,routes}}var _hoisted_1$2={class:`database-erd__option-actions`};var _hoisted_2$2={class:`database-erd__option-actions`};var _hoisted_3$2={key:0,class:`database-erd__filters`};var _hoisted_4$2={class:`database-erd__canvas`};var _hoisted_5$2={key:0,class:`database-erd__loading`,role:`status`,"aria-live":`polite`};var _hoisted_6$2={key:1,class:`database-erd__notice`,role:`status`};var _hoisted_7$2={key:2,class:`database-erd__notice`,role:`alert`};var _hoisted_8$2={key:3,class:`database-erd__notice`,role:`status`};var _hoisted_9$2={class:`database-erd__inspector-heading`};var _hoisted_10$2={class:`database-erd__constraint`};var _hoisted_11$2={class:`database-erd__inspector-actions`};var _sfc_main$4={__name:`DatabaseErd`,props:{focusRequest:{type:Object,default:null},toolbarTarget:{type:Object,default:null},draggable:{type:Boolean,default:true},centralTable:{type:String,default:``},layout:{default:()=>({nodes:[]}),type:Object},schema:{default:()=>({relationships:[],tables:[]}),type:Object}},emits:[`save-layout`,`select-table`,`inspect-table`],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;__expose({locate});const nodes=ref([]);const edges=ref([]);const erdRoot=ref(null);const optionsOpen=ref(false);const fullscreen=ref(false);const fullscreenAvailable=ref(false);const layoutError=ref(``);const layoutPending=ref(false);const diagramReady=ref(false);const columnMode=ref(props.layout.columnMode||`keys`);const focusTable=ref(props.layout.focusTable||``);const activeGroup=ref(props.layout.activeGroup||``);const groups=ref((props.layout.groups||[]).map(group=>({...group})));const views=ref(JSON.parse(JSON.stringify(props.layout.views||[])));const undoStack=ref([]);const redoStack=ref([]);const selectedTable=ref(``);const selectedRelationshipId=ref(``);const hoveredRelationshipId=ref(``);const searchText=ref(``);const searchChoice=ref(null);const searchColumn=ref(``);const viewDialog=ref(false);const viewName=ref(``);const groupDialog=ref(false);const editingGroup=ref(``);const groupName=ref(``);const groupTables=ref([]);const obstructedCount=ref(0);const feedback=useUiFeedback({source:`vibe64.database-erd.feedback`});const defaultEdgeOptions={type:`relationship`,markerEnd:{height:16,width:16,markerUnits:`userSpaceOnUse`,type:MarkerType.ArrowClosed}};const relationships=computed(()=>toRaw(props.schema.relationships||[]));const tables=computed(()=>toRaw(props.schema.tables||[]));const tableItems=computed(()=>tables.value.map(table=>({title:table.name,value:table.qualifiedName})));const searchMatches=computed(()=>erdSearch(tables.value,searchText.value||``));const selectedNode=computed(()=>nodes.value.find(node=>node.id===selectedTable.value));const selectedRelationship=computed(()=>relationships.value.find(relationship=>relationship.id===selectedRelationshipId.value));const selectedCardinality=computed(()=>selectedRelationship.value?erdCardinality(selectedRelationship.value,tables.value.find(table=>table.qualifiedName===selectedRelationship.value.referencedTable),tables.value.find(table=>table.qualifiedName===selectedRelationship.value.sourceTable)):{});const incomingCount=computed(()=>relationships.value.filter(relationship=>relationship.referencedTable===selectedTable.value).length);const outgoingCount=computed(()=>relationships.value.filter(relationship=>relationship.sourceTable===selectedTable.value).length);const connectedTables=computed(()=>new Set(relationships.value.flatMap(relationship=>[relationship.sourceTable,relationship.referencedTable])));const disconnectedCount=computed(()=>tables.value.filter(table=>!connectedTables.value.has(table.qualifiedName)).length);const visibleCount=computed(()=>nodes.value.filter(node=>!node.hidden).length);const automaticGroups=computed(()=>erdLayoutGroups(nodes.value,relationships.value).filter(group=>group.id.startsWith(`erd-auto:`)));const groupItems=computed(()=>[{title:`All tables`,value:``},...groups.value.map(group=>({title:group.name,value:group.id})),...automaticGroups.value.map(group=>({title:`Around ${tableName(group.id.slice(9))} (${group.tables.length} tables)`,value:group.id})),{title:`All tables with relationships`,value:`erd-related`},...disconnectedCount.value?[{title:`Tables without relationships`,value:`erd-disconnected`}]:[]]);const matchingView=computed(()=>views.value.find(view=>view.name.toLowerCase()===viewName.value.trim().toLowerCase()));let flow=null;let layoutWorker=null;let layoutRequestId=0;let rebuildId=0;let graphRefreshId=0;let routingPromise=null;let relationshipDragFrame=null;let routes=props.layout.routes||[];let storedNodes=props.layout.nodes||[];let draggingSnapshot=null;let pendingRemoteLayout=null;let appliedLayoutRevision=props.layout.revision||0;let disposed=false;let viewportSaveTimer=null;const layoutResolvers=new Map;function tableName(id){return tables.value.find(table=>table.qualifiedName===id)?.name||id}function snapshot(){return{routes:erdRouteSnapshot(routes),nodes:nodes.value.map(node=>({table:node.id,x:node.position.x,y:node.position.y,collapsed:node.data.collapsed,expanded:node.data.expanded,pinned:node.data.pinned,group:node.data.group,hidden:false})),columnMode:columnMode.value,focusTable:focusTable.value,activeGroup:activeGroup.value,groups:groups.value.map(group=>({...group})),viewport:{...flow?.getViewport?.()||{x:0,y:0,zoom:1}}}}function checkpoint(){undoStack.value=[...undoStack.value,snapshot()].slice(-30);redoStack.value=[]}function clearViewportSave(){clearTimeout(viewportSaveTimer);viewportSaveTimer=null}function persistPositions(){clearViewportSave();emit(`save-layout`,{...snapshot(),views:views.value})}function buildNodes(saved=storedNodes){return createErdNodes({tables:tables.value,relationships:relationships.value},{nodes:saved,columnMode:columnMode.value,groups:groups.value}).map(node=>{const{table,columns}=node.data;return{...node,type:`table`,draggable:props.draggable&&!node.data.pinned,dragHandle:`.database-erd-node header`,data:{...node.data,table:markRaw(table),columns:markRaw(columns),columnMode:columnMode.value,keyColumnCount:erdColumns(table,relationships.value).length,primaryColumns:new Set((table.keys||[]).filter(key=>key.primary).flatMap(key=>key.columns)),uniqueColumns:new Set((table.keys||[]).flatMap(key=>key.columns)),foreignColumns:new Set(relationships.value.filter(relationship=>relationship.sourceTable===table.qualifiedName).flatMap(relationship=>relationship.columns)),onToggle:toggleNode,onExpand:expandNode,onPin:togglePin}}})}function applyVisibility(){nodes.value=visibleErdNodes(nodes.value,relationships.value,{focusTable:focusTable.value,activeGroup:activeGroup.value})}function emphasize(){const selectedRoutes=routes.filter(route=>selectedRelationshipId.value?route.relationshipId===selectedRelationshipId.value:selectedTable.value&&(route.source===selectedTable.value||route.target===selectedTable.value));const selectedTables=new Set(selectedRoutes.flatMap(route=>[route.source,route.target]));if(selectedTable.value)selectedTables.add(selectedTable.value);const highlighted=hoveredRelationshipId.value?routes.filter(route=>route.relationshipId===hoveredRelationshipId.value||selectedRoutes.includes(route)):selectedRoutes;const highlightedIds=new Set(highlighted.map(route=>route.id));const hasSelection=Boolean(selectedRelationshipId.value||selectedTable.value);const columnsByTable=new Map;for(const route of highlighted)for(const[table,column]of[[route.source,route.sourceColumn],[route.target,route.targetColumn]]){if(!columnsByTable.has(table))columnsByTable.set(table,[]);if(column)columnsByTable.get(table).push(column)}for(const node of nodes.value){const columns=columnsByTable.get(node.id)||[];if(node.id===selectedTable.value&&searchColumn.value)columns.push(searchColumn.value);node.data.highlighted=node.id===selectedTable.value||columnsByTable.has(node.id);node.data.dimmed=hasSelection&&!selectedTables.has(node.id);const previous=node.data.highlightedColumns||[];if(previous.length!==columns.length||previous.some((column,index)=>column!==columns[index]))node.data.highlightedColumns=columns}for(const edge of edges.value){const active=highlightedIds.has(edge.id);edge.selected=edge.data.relationshipId===selectedRelationshipId.value;edge.data.emphasized=active;edge.style||={stroke:`rgb(var(--v-theme-primary))`,strokeDasharray:edge.data.cardinality.optional?`6 3`:void 0,strokeLinejoin:`round`};edge.style.strokeWidth=active?2.4:1.6;edge.style.strokeOpacity=hasSelection&&!active?.12:.85}}async function refreshGraph({dragging=false,reset=false,layoutPaths=new Map}={}){const request=++graphRefreshId;applyVisibility();if(routingPromise)await routingPromise.catch(()=>{});if(disposed||request!==graphRefreshId)return false;const routingNodes=nodes.value.filter(node=>!node.hidden).map(node=>({id:node.id,position:node.position,dimensions:node.dimensions,data:{table:node.data.table,columns:node.data.columns,collapsed:node.data.collapsed}}));const operation=requestWorker({kind:`routes`,nodes:JSON.parse(JSON.stringify(routingNodes)),relationships:JSON.parse(JSON.stringify(relationships.value)),options:{previousRoutes:reset?[]:erdRouteSnapshot(routes),dragging,fixedSides:reset,layoutPaths}});routingPromise=operation;let graph;try{graph=await operation}catch(error){if(!disposed&&request===graphRefreshId)layoutError.value=error.message||`The ERD connections could not be drawn.`;return false}finally{if(routingPromise===operation)routingPromise=null}if(disposed||request!==graphRefreshId)return false;layoutError.value=``;routes=graph.routes;nodes.value=nodes.value.map(node=>({...node,data:{...node.data,relationshipPorts:graph.portsByNode.get(node.id)||[]}}));edges.value=routes.map(route=>({id:route.id,type:`relationship`,source:route.source,target:route.target,sourceHandle:route.sourceHandle,targetHandle:route.targetHandle,ariaLabel:`${tableName(route.source)}.${route.sourceColumn||`(collapsed)`} → ${tableName(route.target)}.${route.targetColumn||`(collapsed)`}; ${route.cardinality.parent} parent(s) per child; ${route.cardinality.child} children per parent; ${route.relationship.constraintName}`,data:{relationshipId:route.relationshipId,points:route.points,cardinality:route.cardinality}}));obstructedCount.value=routes.filter(route=>route.obstructed).length;emphasize();await nextTick();if(disposed||request!==graphRefreshId)return false;flow?.updateNodeInternals?.(nodes.value.filter(node=>!node.hidden).map(node=>node.id));return true}function requestWorker(payload){const id=++layoutRequestId;return new Promise((resolve,reject)=>{const timeout=setTimeout(()=>{layoutResolvers.delete(id);reject(new Error(`The layout worker timed out.`))},15e3);layoutResolvers.set(id,{resolve,reject,timeout});layoutWorker.postMessage({...payload,id})})}async function rebuild({force=false}={}){if(!layoutWorker)return;const request=++rebuildId;graphRefreshId+=1;layoutPending.value=true;layoutError.value=``;const saved=nodes.value.length?snapshot().nodes:storedNodes;const initialViewport=!force&&(nodes.value.length?flow?.getViewport?.():saved.length?props.layout.viewport:null);try{const sourceNodes=buildNodes(saved);const savedTables=new Set(saved.map(node=>node.table));const needsSave=force||sourceNodes.some(node=>!savedTables.has(node.id));const graph=createErdRelationshipRoutes(sourceNodes,relationships.value,{fixedSides:true,calculatePaths:false});const layout=await requestWorker({nodes:sourceNodes.map(node=>({id:node.id,...node.dimensions,ports:graph.portsByNode.get(node.id)})),edges:graph.routes.map(route=>({id:route.id,source:route.source,target:route.target,sourceHandle:route.sourceHandle,targetHandle:route.targetHandle})),centralTable:props.centralTable,groups:erdLayoutGroups(sourceNodes,relationships.value)});if(disposed||request!==rebuildId)return;nodes.value=placeErdNodes(sourceNodes,layout.nodes,saved,force);if(!await refreshGraph({reset:force,layoutPaths:force||!saved.length?new Map(layout.paths.map(path=>[path.id,path.points])):new Map}))return;if(!await updateViewport(initialViewport,{animate:diagramReady.value}))return;diagramReady.value=true;if(needsSave||JSON.stringify(erdRouteSnapshot(routes))!==JSON.stringify(props.layout.routes||[]))persistPositions();if(layout.fallback)feedback.error(new Error(`The recommended layout was unavailable; a basic arrangement was used.`),`Layout needs attention.`)}catch(error){if(request===rebuildId)layoutError.value=error.message||`The ERD could not be arranged.`}finally{if(request===rebuildId)layoutPending.value=false}}async function restore(state,{remote=false}={}){const request=++rebuildId;layoutPending.value=true;columnMode.value=state.columnMode||`keys`;focusTable.value=state.focusTable||``;activeGroup.value=state.activeGroup||``;groups.value=(state.groups||[]).map(group=>({...group}));if(remote)views.value=JSON.parse(JSON.stringify(state.views||[]));else{selectedTable.value=``;selectedRelationshipId.value=``;hoveredRelationshipId.value=``}routes=state.routes||[];nodes.value=buildNodes(state.nodes);try{if(!await refreshGraph())return false;if(!remote){if(!await updateViewport(state.viewport))return false;persistPositions()}return true}finally{if(request===rebuildId)layoutPending.value=false}}async function undo(){if(!undoStack.value.length||layoutPending.value)return;redoStack.value.push(snapshot());await restore(undoStack.value.pop())}async function redo(){if(!redoStack.value.length||layoutPending.value)return;undoStack.value.push(snapshot());await restore(redoStack.value.pop())}async function changeColumnMode(mode){if(mode===columnMode.value||layoutPending.value)return;checkpoint();columnMode.value=mode;const saved=snapshot().nodes.map(node=>({...node,expanded:false}));nodes.value=buildNodes(saved);if(!await refreshGraph())return;persistPositions()}async function changeNode(id,changes){checkpoint();const saved=snapshot().nodes.map(node=>node.table===id?{...node,...changes}:node);nodes.value=buildNodes(saved);if(!await refreshGraph())return;persistPositions()}function toggleNode(id){return changeNode(id,{collapsed:!nodes.value.find(node=>node.id===id).data.collapsed})}function expandNode(id){return changeNode(id,{expanded:!nodes.value.find(node=>node.id===id).data.expanded})}function togglePin(id){return changeNode(id,{pinned:!nodes.value.find(node=>node.id===id).data.pinned})}function onNodeDragStart(){draggingSnapshot=snapshot()}function onNodeDrag(){if(relationshipDragFrame!==null)return;relationshipDragFrame=globalThis.requestAnimationFrame(()=>{relationshipDragFrame=null;refreshGraph({dragging:true})})}async function onNodeDragStop(){if(relationshipDragFrame!==null)globalThis.cancelAnimationFrame(relationshipDragFrame);relationshipDragFrame=null;const beforeDrag=draggingSnapshot;if(beforeDrag){undoStack.value=[...undoStack.value,beforeDrag].slice(-30);redoStack.value=[];draggingSnapshot=null}if(pendingRemoteLayout){const previous=new Map(beforeDrag.nodes.map(node=>[node.table,node]));const moved=new Map(snapshot().nodes.filter(node=>{const before=previous.get(node.table);return before&&(node.x!==before.x||node.y!==before.y)}).map(node=>[node.table,node]));const shared=pendingRemoteLayout;pendingRemoteLayout=null;const mergedNodes=shared.nodes.map(node=>{const position=moved.get(node.table);return position?{...node,x:position.x,y:position.y}:node});if(!await restore({...shared,nodes:mergedNodes},{remote:true}))return}if(!await refreshGraph())return;persistPositions()}function onNodeClick({node}){selectedTable.value=node.id;emit(`inspect-table`,node.id);selectedRelationshipId.value=``;hoveredRelationshipId.value=``;searchColumn.value=``;emphasize()}function onEdgeClick({edge}){selectedRelationshipId.value=edge.data.relationshipId;selectedTable.value=``;emit(`inspect-table`,``);emphasize()}function onEdgeHover({edge}){hoveredRelationshipId.value=edge.data.relationshipId;emphasize()}function onEdgeLeave(){hoveredRelationshipId.value=``;emphasize()}function clearSelection(){selectedTable.value=``;emit(`inspect-table`,``);selectedRelationshipId.value=``;hoveredRelationshipId.value=``;searchColumn.value=``;emphasize()}async function setFocus(id){checkpoint();focusTable.value=id;activeGroup.value=``;clearSelection();if(!await refreshGraph())return;if(!await fitDiagram())return;persistPositions()}async function changeGroupFilter(id){checkpoint();activeGroup.value=id;focusTable.value=``;clearSelection();if(!await refreshGraph())return;if(!await fitDiagram())return;persistPositions()}let appliedFocusRequest=null;watch([()=>props.focusRequest,()=>nodes.value.length,layoutPending],async([request,count,pending])=>{if(!request?.qualifiedName||request===appliedFocusRequest||!count||pending)return;if(!nodes.value.some(node=>node.id===request.qualifiedName))return;appliedFocusRequest=request;await locate({table:request.qualifiedName,column:``})},{flush:`post`});async function locate(item){if(!item||layoutPending.value||!nodes.value.length)return;checkpoint();focusTable.value=``;activeGroup.value=``;selectedRelationshipId.value=``;hoveredRelationshipId.value=``;selectedTable.value=item.table;emit(`inspect-table`,item.table);searchColumn.value=item.column;const saved=snapshot().nodes.map(node=>node.table===item.table?{...node,collapsed:false,expanded:Boolean(item.column)||node.expanded}:node);nodes.value=placeErdNodes(buildNodes(saved),[],saved);if(!await refreshGraph())return;const request=graphRefreshId;await flow?.fitView?.({nodes:[item.table],maxZoom:1.2,padding:.5,duration:220});if(disposed||request!==graphRefreshId)return;persistPositions()}async function resetPositions(){checkpoint();await rebuild({force:true})}async function updateViewport(viewport,{animate=true}={}){const request=graphRefreshId;await nextTick();await new Promise(resolve=>globalThis.requestAnimationFrame(()=>globalThis.requestAnimationFrame(resolve)));if(disposed||request!==graphRefreshId)return false;if(viewport)await flow?.setViewport?.(viewport,{duration:animate?180:0});else await flow?.fitView?.({nodes:nodes.value.filter(node=>!node.hidden).map(node=>node.id),duration:animate?220:0,padding:.18});return!disposed&&request===graphRefreshId}function fitDiagram(){return updateViewport()}function onFlowInit(instance){flow=instance}function onViewportMove(){clearViewportSave();if(layoutPending.value||draggingSnapshot||!nodes.value.length)return;viewportSaveTimer=setTimeout(()=>{viewportSaveTimer=null;if(!disposed&&!layoutPending.value&&!draggingSnapshot)persistPositions()},600)}function editGroup(id=``){optionsOpen.value=false;const group=groups.value.find(item=>item.id===id);editingGroup.value=group?.id||``;groupName.value=group?.name||``;groupTables.value=group?nodes.value.filter(node=>node.data.group===id).map(node=>node.id):selectedTable.value?[selectedTable.value]:[];groupDialog.value=true}async function saveGroup(){if(!groupName.value.trim()||!groupTables.value.length)return;checkpoint();const existing=groups.value.find(group=>group.name.toLowerCase()===groupName.value.trim().toLowerCase());const id=editingGroup.value||existing?.id||crypto.randomUUID();groups.value=[...groups.value.filter(group=>group.id!==id),{id,name:groupName.value.trim()}];const members=new Set(groupTables.value);const saved=snapshot().nodes.map(node=>({...node,group:members.has(node.table)?id:node.group===id?``:node.group}));nodes.value=buildNodes(saved);activeGroup.value=id;focusTable.value=``;clearSelection();groupDialog.value=false;await rebuild({force:true})}async function removeGroup(){checkpoint();const id=editingGroup.value;groups.value=groups.value.filter(group=>group.id!==id);if(activeGroup.value===id)activeGroup.value=``;const saved=snapshot().nodes.map(node=>({...node,group:node.group===id?``:node.group}));nodes.value=buildNodes(saved);groupDialog.value=false;await rebuild({force:true})}function saveView(){if(!viewName.value.trim()||!matchingView.value&&views.value.length>=20)return;const id=matchingView.value?.id||crypto.randomUUID();const view={...snapshot(),id,name:viewName.value.trim()};views.value=[...views.value.filter(item=>item.id!==id),view];viewDialog.value=false;persistPositions()}async function loadView(view){optionsOpen.value=false;checkpoint();await restore(view)}function removeView(id){views.value=views.value.filter(view=>view.id!==id);persistPositions()}function onFullscreenChange(){fullscreen.value=document.fullscreenElement===erdRoot.value;nextTick().then(()=>globalThis.requestAnimationFrame(()=>globalThis.requestAnimationFrame(fitDiagram)))}async function toggleFullscreen(){optionsOpen.value=false;try{if(fullscreen.value)await document.exitFullscreen();else await erdRoot.value.requestFullscreen()}catch(error){feedback.error(error,`The ERD could not change full screen mode.`)}}function onKeydown(event){if(event.target.closest(`input, textarea, [contenteditable=true]`))return;if((event.ctrlKey||event.metaKey)&&event.key.toLowerCase()===`z`){event.preventDefault();if(event.shiftKey)redo();else undo()}else if(event.key===`Escape`&&!viewDialog.value&&!groupDialog.value)clearSelection()}watch([()=>props.schema.refreshedAt,()=>props.schema.database,()=>props.schema.engine],()=>{if(layoutWorker)rebuild()});watch(()=>props.layout,layout=>{if(!layout.revision||layout.revision<=appliedLayoutRevision)return;appliedLayoutRevision=layout.revision;const current=snapshot();if([`columnMode`,`focusTable`,`activeGroup`].every(key=>layout[key]===current[key])&&JSON.stringify(layout.groups)===JSON.stringify(current.groups)&&layout.nodes.length===current.nodes.length&&layout.nodes.every((node,index)=>Object.entries(current.nodes[index]).every(([key,value])=>node[key]===value))){views.value=JSON.parse(JSON.stringify(layout.views||[]));pendingRemoteLayout=null;return}if(draggingSnapshot)pendingRemoteLayout=layout;else if(layoutWorker){checkpoint();restore(layout,{remote:true})}});onMounted(()=>{fullscreenAvailable.value=typeof erdRoot.value?.requestFullscreen===`function`;document.addEventListener(`fullscreenchange`,onFullscreenChange);layoutWorker=new Worker(new URL(`/assets/erdLayout.worker-DGG2ayPr.js`,``+import.meta.url),{type:`module`});layoutWorker.addEventListener(`message`,({data})=>{const resolver=layoutResolvers.get(data.id);if(!resolver)return;layoutResolvers.delete(data.id);clearTimeout(resolver.timeout);if(data.ok===false)resolver.reject(new Error(data.error));else resolver.resolve(data)});layoutWorker.addEventListener(`error`,event=>{for(const resolver of layoutResolvers.values()){clearTimeout(resolver.timeout);resolver.reject(new Error(event.message||`The layout worker failed.`))}layoutResolvers.clear()});rebuild()});onBeforeUnmount(()=>{clearViewportSave();disposed=true;rebuildId+=1;graphRefreshId+=1;if(relationshipDragFrame!==null)globalThis.cancelAnimationFrame(relationshipDragFrame);document.removeEventListener(`fullscreenchange`,onFullscreenChange);for(const resolver of layoutResolvers.values()){clearTimeout(resolver.timeout);resolver.reject(new Error(`ERD closed.`))}layoutResolvers.clear();layoutWorker?.terminate()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{ref_key:`erdRoot`,ref:erdRoot,class:normalizeClass([`database-erd`,{"database-erd--fullscreen":fullscreen.value}]),onKeydown},[(openBlock(),createBlock(Teleport,{to:__props.toolbarTarget||erdRoot.value,disabled:!__props.toolbarTarget||fullscreen.value},[createBaseVNode(`header`,{"aria-label":`ERD controls`,class:`database-erd__toolbar`,onKeydown:_cache[5]||(_cache[5]=$event=>__props.toolbarTarget&&!fullscreen.value&&onKeydown($event))},[createVNode(VAutocomplete,{modelValue:searchChoice.value,"onUpdate:modelValue":[_cache[0]||(_cache[0]=$event=>searchChoice.value=$event),locate],search:searchText.value,"onUpdate:search":_cache[1]||(_cache[1]=$event=>searchText.value=$event),class:`database-erd__search`,clearable:``,density:`compact`,"hide-details":``,"item-title":`title`,"item-value":item=>JSON.stringify([item.table,item.column]),items:searchMatches.value,label:`Find table or column`,"menu-props":{attach:erdRoot.value},"no-filter":``,"prepend-inner-icon":unref(mdiMagnify),"return-object":``,variant:`outlined`},null,8,[`modelValue`,`search`,`item-value`,`items`,`menu-props`,`prepend-inner-icon`]),createVNode(VBtn,{class:`database-erd__icon-button`,disabled:layoutPending.value||!nodes.value.length,icon:unref(mdiImageFilterCenterFocus),"aria-label":`Fit`,title:`Fit diagram`,size:`small`,variant:`text`,onClick:fitDiagram},null,8,[`disabled`,`icon`]),createVNode(VMenu,{modelValue:optionsOpen.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>optionsOpen.value=$event),attach:erdRoot.value,"close-on-content-click":false},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`database-erd__icon-button`,icon:unref(mdiTuneVariant),"aria-label":`Diagram options`,title:`Diagram options`,size:`small`,variant:`text`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VSheet,{class:`database-erd__options`,rounded:`lg`,elevation:`2`,"aria-label":`Diagram options`},{default:withCtx(()=>[_cache[28]||(_cache[28]=createBaseVNode(`strong`,null,`Display`,-1)),createVNode(VBtnToggle,{"model-value":columnMode.value,mandatory:``,density:`compact`,"onUpdate:modelValue":changeColumnMode},{default:withCtx(()=>[createVNode(VBtn,{value:`keys`,size:`small`},{default:withCtx(()=>[..._cache[23]||(_cache[23]=[createTextVNode(`Keys only`,-1)])]),_:1}),createVNode(VBtn,{value:`all`,size:`small`},{default:withCtx(()=>[..._cache[24]||(_cache[24]=[createTextVNode(`All columns`,-1)])]),_:1})]),_:1},8,[`model-value`]),createVNode(VSelect,{"model-value":activeGroup.value,density:`compact`,items:groupItems.value,label:`Show tables`,"menu-props":{attach:erdRoot.value},variant:`outlined`,hint:`Filter the diagram without changing table data or overview concepts.`,"persistent-hint":``,"onUpdate:modelValue":changeGroupFilter},null,8,[`model-value`,`items`,`menu-props`]),createVNode(VDivider),_cache[29]||(_cache[29]=createBaseVNode(`strong`,null,`Arrangement`,-1)),createBaseVNode(`div`,_hoisted_1$2,[createVNode(VBtn,{disabled:layoutPending.value||!nodes.value.length,"prepend-icon":unref(mdiRestore),size:`small`,title:`Arrange relationships while preserving pinned tables`,variant:`text`,onClick:resetPositions},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(`Reset positions`,-1)])]),_:1},8,[`disabled`,`prepend-icon`]),createVNode(VBtn,{disabled:layoutPending.value||!undoStack.value.length,icon:unref(mdiUndo),"aria-label":`Undo diagram change`,size:`small`,variant:`text`,onClick:undo},null,8,[`disabled`,`icon`]),createVNode(VBtn,{disabled:layoutPending.value||!redoStack.value.length,icon:unref(mdiRedo),"aria-label":`Redo diagram change`,size:`small`,variant:`text`,onClick:redo},null,8,[`disabled`,`icon`])]),createVNode(VDivider),createBaseVNode(`div`,_hoisted_2$2,[createVNode(VMenu,{attach:erdRoot.value},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{size:`small`,variant:`text`}),{default:withCtx(()=>[..._cache[26]||(_cache[26]=[createTextVNode(`Saved views`,-1)])]),_:1},16)]),default:withCtx(()=>[createVNode(VList,{density:`compact`},{default:withCtx(()=>[createVNode(VListItem,{title:`Save view…`,onClick:_cache[2]||(_cache[2]=$event=>{optionsOpen.value=false;viewName.value=``;viewDialog.value=true})}),(openBlock(true),createElementBlock(Fragment,null,renderList(views.value,view=>{return openBlock(),createBlock(VListItem,{key:view.id,title:view.name,onClick:$event=>loadView(view)},{append:withCtx(()=>[createVNode(VBtn,{icon:unref(mdiClose),"aria-label":`Delete view `+view.name,size:`x-small`,variant:`text`,onClick:withModifiers($event=>removeView(view.id),[`stop`])},null,8,[`icon`,`aria-label`,`onClick`])]),_:2},1032,[`title`,`onClick`])}),128))]),_:1})]),_:1},8,[`attach`]),createVNode(VBtn,{size:`small`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>editGroup())},{default:withCtx(()=>[..._cache[27]||(_cache[27]=[createTextVNode(`Edit table groups`,-1)])]),_:1}),fullscreenAvailable.value?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":fullscreen.value?unref(mdiFullscreenExit):unref(mdiFullscreen),size:`small`,variant:`text`,onClick:toggleFullscreen},{default:withCtx(()=>[createTextVNode(toDisplayString(fullscreen.value?`Exit full screen`:`Full screen`),1)]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true)]),renderSlot(_ctx.$slots,`options`,{close:()=>optionsOpen.value=false},void 0,true)]),_:3})]),_:3},8,[`modelValue`,`attach`])],32)],8,[`to`,`disabled`])),focusTable.value||activeGroup.value?(openBlock(),createElementBlock(`div`,_hoisted_3$2,[activeGroup.value?(openBlock(),createBlock(VChip,{key:0,size:`small`,closable:``,"onClick:close":_cache[6]||(_cache[6]=$event=>changeGroupFilter(``))},{default:withCtx(()=>[createTextVNode(toDisplayString(groupItems.value.find(item=>item.value===activeGroup.value)?.title),1)]),_:1})):createCommentVNode(``,true),focusTable.value?(openBlock(),createBlock(VChip,{key:1,size:`small`,closable:``,"onClick:close":_cache[7]||(_cache[7]=$event=>setFocus(``))},{default:withCtx(()=>[createTextVNode(`Focus: `+toDisplayString(tableName(focusTable.value)),1)]),_:1})):createCommentVNode(``,true),createBaseVNode(`span`,null,toDisplayString(visibleCount.value)+` / `+toDisplayString(nodes.value.length)+` tables`,1)])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$2,[!diagramReady.value&&!layoutError.value?(openBlock(),createElementBlock(`div`,_hoisted_5$2,[createVNode(VSkeletonLoader,{class:`database-erd__loading-preview`,type:`heading, text@2`,width:180,color:`transparent`,boilerplate:``,"aria-hidden":`true`}),_cache[30]||(_cache[30]=createBaseVNode(`span`,null,`Preparing diagram…`,-1))])):createCommentVNode(``,true),createVNode(unref(_sfc_main$1$2),{class:normalizeClass([`database-erd__flow`,{"database-erd__flow--ready":diagramReady.value}]),inert:!diagramReady.value?true:void 0,edges:edges.value,"onUpdate:edges":_cache[8]||(_cache[8]=$event=>edges.value=$event),nodes:nodes.value,"onUpdate:nodes":_cache[9]||(_cache[9]=$event=>nodes.value=$event),"default-edge-options":defaultEdgeOptions,"default-marker-color":`rgb(var(--v-theme-primary))`,"edges-updatable":false,"elements-selectable":true,"max-zoom":1.8,"min-zoom":.08,"nodes-connectable":false,"nodes-draggable":__props.draggable&&!layoutPending.value,onInit:onFlowInit,onNodeClick,onNodeDragStart,onNodeDrag,onNodeDragStop,onEdgeClick,onEdgeMouseEnter:onEdgeHover,onEdgeMouseLeave:onEdgeLeave,onPaneClick:clearSelection,onMoveStart:clearViewportSave,onMoveEnd:onViewportMove},{"node-table":withCtx(nodeProps=>[createVNode(DatabaseErdNode_default,normalizeProps(guardReactiveProps(nodeProps)),null,16)]),"edge-relationship":withCtx(edgeProps=>[createVNode(_sfc_main$6,normalizeProps(guardReactiveProps(edgeProps)),null,16)]),default:withCtx(()=>[createVNode(unref(_sfc_main$7),{pannable:``,zoomable:``})]),_:1},8,[`class`,`inert`,`edges`,`nodes`,`nodes-draggable`]),layoutPending.value&&diagramReady.value?(openBlock(),createElementBlock(`div`,_hoisted_6$2,`Arranging tables…`)):layoutError.value?(openBlock(),createElementBlock(`div`,_hoisted_7$2,[createTextVNode(toDisplayString(layoutError.value)+` `,1),createVNode(VBtn,{size:`x-small`,variant:`text`,onClick:_cache[10]||(_cache[10]=$event=>rebuild())},{default:withCtx(()=>[..._cache[31]||(_cache[31]=[createTextVNode(`Retry`,-1)])]),_:1})])):obstructedCount.value?(openBlock(),createElementBlock(`div`,_hoisted_8$2,`Some connections could not be routed around tables. Move tables or focus on a smaller group, then reset positions.`)):createCommentVNode(``,true),selectedRelationship.value||selectedNode.value?(openBlock(),createBlock(VSheet,{key:4,class:`database-erd__inspector`,rounded:`lg`,elevation:`2`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_9$2,[createBaseVNode(`strong`,null,toDisplayString(selectedRelationship.value?`Relationship`:selectedNode.value.data.table.name),1),createVNode(VBtn,{icon:unref(mdiClose),"aria-label":`Close diagram details`,size:`x-small`,variant:`text`,onClick:clearSelection},null,8,[`icon`])]),selectedRelationship.value?(openBlock(),createElementBlock(Fragment,{key:0},[createBaseVNode(`div`,_hoisted_10$2,toDisplayString(selectedRelationship.value.constraintName),1),(openBlock(true),createElementBlock(Fragment,null,renderList(selectedRelationship.value.columns,(column,index)=>{return openBlock(),createElementBlock(`div`,{key:column,class:`database-erd__mapping`},[createBaseVNode(`span`,null,toDisplayString(tableName(selectedRelationship.value.referencedTable))+`.`+toDisplayString(selectedRelationship.value.referencedColumns[index]),1),createBaseVNode(`span`,null,`→ `+toDisplayString(tableName(selectedRelationship.value.sourceTable))+`.`+toDisplayString(column),1)])}),128)),createBaseVNode(`p`,null,[createTextVNode(`Per child: `+toDisplayString(selectedCardinality.value.parent)+` parent`+toDisplayString(selectedCardinality.value.parent===`1`?``:`s`)+`.`,1),_cache[32]||(_cache[32]=createBaseVNode(`br`,null,null,-1)),createTextVNode(`Per parent: `+toDisplayString(selectedCardinality.value.child)+` children.`,1)]),_cache[36]||(_cache[36]=createBaseVNode(`p`,{class:`database-erd__muted`},`0 = optional · 1 = one · N = many · ? = unknown`,-1)),createBaseVNode(`dl`,null,[_cache[33]||(_cache[33]=createBaseVNode(`dt`,null,`On delete`,-1)),createBaseVNode(`dd`,null,toDisplayString(selectedRelationship.value.deleteAction||`Unknown`),1),_cache[34]||(_cache[34]=createBaseVNode(`dt`,null,`On update`,-1)),createBaseVNode(`dd`,null,toDisplayString(selectedRelationship.value.updateAction||`Unknown`),1)]),createVNode(VBtn,{size:`small`,variant:`tonal`,onClick:_cache[11]||(_cache[11]=$event=>setFocus(selectedRelationship.value.sourceTable))},{default:withCtx(()=>[..._cache[35]||(_cache[35]=[createTextVNode(`Focus child table`,-1)])]),_:1})],64)):selectedNode.value?(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`p`,null,toDisplayString(selectedNode.value.data.table.columns.length)+` columns · `+toDisplayString(incomingCount.value)+` incoming · `+toDisplayString(outgoingCount.value)+` outgoing`,1),createBaseVNode(`div`,_hoisted_11$2,[createVNode(VBtn,{size:`small`,variant:`tonal`,onClick:_cache[12]||(_cache[12]=$event=>setFocus(selectedNode.value.id))},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Focus on this table`,-1)])]),_:1}),createVNode(VBtn,{size:`small`,variant:`text`,onClick:_cache[13]||(_cache[13]=$event=>emit(`select-table`,selectedNode.value.data.table))},{default:withCtx(()=>[..._cache[38]||(_cache[38]=[createTextVNode(`Open data`,-1)])]),_:1}),createVNode(VBtn,{size:`small`,"prepend-icon":selectedNode.value.data.pinned?unref(mdiPin):unref(mdiPinOutline),variant:`text`,onClick:_cache[14]||(_cache[14]=$event=>togglePin(selectedNode.value.id))},{default:withCtx(()=>[createTextVNode(toDisplayString(selectedNode.value.data.pinned?`Unpin`:`Pin position`),1)]),_:1},8,[`prepend-icon`]),createVNode(VBtn,{size:`small`,variant:`text`,onClick:_cache[15]||(_cache[15]=$event=>editGroup(selectedNode.value.data.group))},{default:withCtx(()=>[..._cache[39]||(_cache[39]=[createTextVNode(`Edit group`,-1)])]),_:1})])],64)):createCommentVNode(``,true)]),_:1})):createCommentVNode(``,true)]),createVNode(VDialog,{modelValue:viewDialog.value,"onUpdate:modelValue":_cache[18]||(_cache[18]=$event=>viewDialog.value=$event),attach:erdRoot.value,"max-width":`440`},{default:withCtx(()=>[createVNode(VCard,{title:`Save diagram view`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VTextField,{modelValue:viewName.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>viewName.value=$event),label:`View name`,maxlength:`80`,autofocus:``,hint:matchingView.value?`This replaces the saved view with the same name.`:`Includes positions, pins, groups, focus, columns and zoom.`,"persistent-hint":``,onKeydown:withKeys(withModifiers(saveView,[`prevent`]),[`enter`])},null,8,[`modelValue`,`hint`,`onKeydown`])]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{onClick:_cache[17]||(_cache[17]=$event=>viewDialog.value=false)},{default:withCtx(()=>[..._cache[40]||(_cache[40]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{disabled:!viewName.value.trim()||!matchingView.value&&views.value.length>=20,onClick:saveView},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(`Save view`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`attach`]),createVNode(VDialog,{modelValue:groupDialog.value,"onUpdate:modelValue":_cache[22]||(_cache[22]=$event=>groupDialog.value=$event),attach:erdRoot.value,"max-width":`520`},{default:withCtx(()=>[createVNode(VCard,{title:`Table groups`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[groups.value.length?(openBlock(),createBlock(VSelect,{key:0,"model-value":editingGroup.value,items:[{title:`New group`,value:``},...groups.value.map(group=>({title:group.name,value:group.id}))],label:`Group to edit`,"menu-props":{attach:erdRoot.value},"onUpdate:modelValue":editGroup},null,8,[`model-value`,`items`,`menu-props`])):createCommentVNode(``,true),createVNode(VTextField,{modelValue:groupName.value,"onUpdate:modelValue":_cache[19]||(_cache[19]=$event=>groupName.value=$event),label:`Group name`,maxlength:`80`},null,8,[`modelValue`]),createVNode(VAutocomplete,{modelValue:groupTables.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>groupTables.value=$event),items:tableItems.value,label:`Tables in group`,multiple:``,chips:``,"closable-chips":``,"menu-props":{attach:erdRoot.value}},null,8,[`modelValue`,`items`,`menu-props`])]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[editingGroup.value?(openBlock(),createBlock(VBtn,{key:0,onClick:removeGroup},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(`Remove group`,-1)])]),_:1})):createCommentVNode(``,true),createVNode(VSpacer),createVNode(VBtn,{onClick:_cache[21]||(_cache[21]=$event=>groupDialog.value=false)},{default:withCtx(()=>[..._cache[43]||(_cache[43]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{disabled:!groupName.value.trim()||!groupTables.value.length,onClick:saveGroup},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(`Save group`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`attach`])],34)}}};var DatabaseErd_default=_plugin_vue_export_helper_default(_sfc_main$4,[[`__scopeId`,`data-v-fc7e62dc`]]);var _sfc_main$3=Object.assign({inheritAttrs:false},{__name:`DatabaseOverviewEdge`,props:{id:{type:String,required:true},sourceX:{type:Number,required:true},sourceY:{type:Number,required:true},targetX:{type:Number,required:true},targetY:{type:Number,required:true},sourcePosition:{type:String,required:true},targetPosition:{type:String,required:true},label:{type:String,default:``},markerEnd:{type:String,default:``},data:{type:Object,required:true},style:{type:Object,default:()=>({})}},setup(__props){const props=__props;const path=computed(()=>props.data.dragging?getSmoothStepPath(props):erdPolylinePath(props.data.points));return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(unref(_sfc_main$d),{id:__props.id,path:path.value[0],style:normalizeStyle(__props.style),"marker-end":__props.markerEnd,"interaction-width":20},null,8,[`id`,`path`,`style`,`marker-end`]),createVNode(unref(_sfc_main$e),{x:path.value[1],y:path.value[2],label:__props.label,"label-show-bg":true,"label-bg-padding":[4,3]},null,8,[`x`,`y`,`label`])],64)}}});var DATA_OVERVIEW_PATH=`data-overview.json`;var DATA_OVERVIEW_ABSTRACTIONS=[{value:`none`,title:`Not abstract`,description:`Make every physical table its own actor; do not combine tables.`},{value:`balanced`,title:`Balanced`,description:`Aim for 5–10 business concepts, with supporting tables inside them and only the main business connections shown.`},{value:`high`,title:`Very abstract`,description:`Aim for 3–5 broad business domains, including their supporting concepts across multiple relationships.`}];var DATA_OVERVIEW_INSTRUCTIONS=[`Vibe64's Data overview groups real database tables under main actors. It does not change the database.`,`Read the refreshed schema and relevant application models, migrations and documentation to choose meaningful actors and their supporting tables. Relationship distance does not determine membership.`,`Write data-overview.json in the project source root using: {"version":1,"abstraction":"balanced","reviewedTables":["public.bookings","public.invoice_groups","public.checklists","public.transactions"],"actors":[{"table":"public.bookings","name":"Bookings","description":"Bookings with invoice groups, checklists and transactions","tables":["public.bookings","public.invoice_groups","public.checklists","public.transactions"]}]}.`,`Use each schema table's exact reference field everywhere in this file, never its qualifiedName. MySQL/MariaDB references are database-relative (bookings); PostgreSQL references retain the application schema (public.bookings). Never store the selected MySQL database name: it changes between sessions and environments. Every actor's table must be included in its tables list. Each table has one home; put genuinely shared concepts in their own actor and retain their relationships. Technical or unclassified tables may remain outside the groups and appear under Other tables.`,`For an existing MySQL overview containing database-qualified names, convert it once to database-relative references. Confirm the old database prefix against the saved definition and current schema, then remove only that prefix from actor tables, memberships, reviewedTables, rings, position keys and mainRelationships. Preserve names, descriptions, positions, grouping and relationship choices; never discard missing tables or constraints to hide real schema changes. Check coverage afterward.`,`Choose supporting tables explicitly, even several relationships away. A broader Booking actor may contain invoice groups, checklists and transactions; a smaller one may contain only bookings and invoice groups, leaving Checklists and Transactions as separate actors. Follow the application's meaning and the user's preference.`,`Preserve existing authored groupings unless the task requires changing them. After a schema change, classify new tables, update renamed/removed references, then run vibe64-helper database refresh and vibe64-helper database overview --json to check coverage and warnings.`,`abstraction is none (each physical table is its own actor), balanced (business actors with supporting tables), or high (a few broad business actors). Follow the generation request's selected level and scope. reviewedTables records every exact table name you have reviewed, including tables deliberately left under Other tables. Preserve this record on incremental work. For new-tables-only generation, process coverage.unreviewed only; preserve existing actors, memberships, names and manual choices, while allowing new tables to join existing actors. Full regeneration may replace the grouping and should review all current tables.`,`Also author "rings": [["public.bookings"],["public.contacts","public.dogs","public.payments"]]. Rings run from the important business concepts in the centre out to smaller supporting concepts; each ring lists actors clockwise from the top. Include every actor exactly once. Choose the centre from application meaning, not just table count or technical foreign-key degree. Keep closely related actors in neighbouring angular sectors across rings. Use a few central actors, then major domains, then peripheral services. Vibe64 packs sparse rings together and calculates readable card sizes, compact spacing and routes. Preserve existing placement during incremental work, adding new actors near related concepts.`,`Balanced should normally produce 5–10 actors; high should normally produce 3–5. These are useful targets, not quotas: use fewer for small schemas and explain any necessary excess. Avoid making each small feature or infrastructure service its own actor. Group related capabilities into understandable business concepts; put administration together where appropriate.`,`For balanced and high, also write "mainRelationships": ["exact relationship reference from schema.relationships"]. MySQL references use table:constraint_name without a database prefix; PostgreSQL retains schema.table:constraint_name. Choose the real foreign keys that best express the main business connections between actors. Typically each concept has one or two main connections. Do not select every cross-actor FK: workspace ownership, created_by/updated_by, audit authorship, shared attachments and similar administrative dependencies usually belong only in the detailed view. Keep any such relationship that is itself central to this application. An empty list is valid when no business links exist. Preserve existing choices on incremental work, adding main connections for new concepts where needed. Not abstract may omit this field to show all connections.`,`Optional "positions" maps actor main-table names (or "other-tables") to {"x":number,"y":number}. These are user-dragged positions and override automatic rings. Preserve them during incremental updates; full regeneration may clear them to apply the new arrangement. Do not invent pixel coordinates.`,`Do not invent relationships or cardinalities; mainRelationships must use actual schema relationship reference fields. Vibe64 resolves these against the selected database and retains the actual endpoints and all physical relationships in the ERD; users can also show all overview connections. Do not read data rows or credentials merely to classify tables. Do not edit Vibe64 runtime artifacts.`].join(`
|
|
16
|
-
`);function validateDataOverview(value){const fail=message=>{throw new Error(`Data overview: ${message}`)};const record=(item,fields,label)=>{if(!item||typeof item!==`object`||Array.isArray(item))fail(`${label} must be an object.`);if(Object.keys(item).some(key=>!fields.includes(key)))fail(`${label} contains unknown fields.`)};const text=(item,label,limit)=>{if(typeof item!==`string`||!item.trim()||item.length>limit)fail(`${label} must be non-empty text of at most ${limit} characters.`);return item.trim()};record(value,[`version`,`actors`,`abstraction`,`reviewedTables`,`rings`,`mainRelationships`,`positions`],`document`);if(value.version!==1)fail(`version must be 1.`);if(!Array.isArray(value.actors)||value.actors.length>2e3)fail(`actors must be an array of at most 2000 items.`);if(value.abstraction!==void 0&&!DATA_OVERVIEW_ABSTRACTIONS.some(item=>item.value===value.abstraction))fail(`abstraction must be none, balanced or high.`);let reviewedTables;if(value.reviewedTables!==void 0){if(!Array.isArray(value.reviewedTables)||value.reviewedTables.length>2e3)fail(`reviewedTables must be an array of at most 2000 table names.`);reviewedTables=value.reviewedTables.map(entry=>text(entry,`reviewed table name`,512));if(new Set(reviewedTables).size!==reviewedTables.length)fail(`reviewedTables must not repeat a table.`)}const assigned=new Set;const actors=value.actors.map(actor=>{record(actor,[`table`,`name`,`description`,`tables`],`actor`);const table=text(actor.table,`actor table`,512);const name=text(actor.name,`actor name`,120);if(typeof actor.description!==`string`||actor.description.length>600)fail(`description must be text of at most 600 characters.`);if(!Array.isArray(actor.tables)||!actor.tables.length||actor.tables.length>2e3)fail(`${name} must include between 1 and 2000 tables.`);const tables=actor.tables.map(entry=>{const id=text(entry,`table name`,512);if(assigned.has(id))fail(`${id} belongs to more than one group or is repeated.`);assigned.add(id);return id});if(!tables.includes(table))fail(`${name} must include its main table ${table}.`);return{table,name,description:actor.description.trim(),tables}});if(assigned.size>2e3)fail(`at most 2000 tables may be classified.`);let rings;if(value.rings!==void 0){if(!Array.isArray(value.rings)||value.rings.length>2e3)fail(`rings must be an array of at most 2000 rings.`);const mainTables=new Set(actors.map(actor=>actor.table));const placed=new Set;rings=value.rings.map(ring=>{if(!Array.isArray(ring)||!ring.length||ring.length>2e3)fail(`each ring must contain actor main tables.`);return ring.map(entry=>{const table=text(entry,`ring actor`,512);if(!mainTables.has(table)||placed.has(table))fail(`rings must contain each actor exactly once, using its main table.`);placed.add(table);return table})});if(placed.size!==actors.length)fail(`rings must place every actor.`)}let mainRelationships;if(value.mainRelationships!==void 0){if(!Array.isArray(value.mainRelationships)||value.mainRelationships.length>2e3)fail(`mainRelationships must be an array of at most 2000 relationship IDs.`);mainRelationships=value.mainRelationships.map(entry=>text(entry,`main relationship ID`,1024));if(new Set(mainRelationships).size!==mainRelationships.length)fail(`mainRelationships must not repeat an ID.`)}let positions;if(value.positions!==void 0){const allowed=new Set([...actors.map(actor=>actor.table),`other-tables`]);record(value.positions,[...allowed],`positions`);positions=Object.fromEntries(Object.entries(value.positions).map(([table,position])=>{record(position,[`x`,`y`],`actor position`);if(![position.x,position.y].every(n=>typeof n===`number`&&Number.isFinite(n)&&Math.abs(n)<=1e6))fail(`actor coordinates must be finite numbers between -1000000 and 1000000.`);return[table,{x:position.x,y:position.y}]}))}return{version:1,actors,...value.abstraction!==void 0?{abstraction:value.abstraction}:{},...reviewedTables?{reviewedTables}:{},...rings?{rings}:{},...mainRelationships?{mainRelationships}:{},...positions?{positions}:{}}}function dataOverviewCoverage(schema={},definition={actors:[]}){const tables=new Set((schema.tables||[]).map(table=>table.qualifiedName));const assigned=new Set(definition.actors.flatMap(actor=>actor.tables));const relationships=new Set((schema.relationships||[]).map(relationship=>relationship.id));const reviewed=new Set([...definition.reviewedTables||[],...assigned]);return{total:tables.size,classified:[...tables].filter(table=>assigned.has(table)).length,others:[...tables].filter(table=>!assigned.has(table)),reviewed:[...tables].filter(table=>reviewed.has(table)).length,unreviewed:[...tables].filter(table=>!reviewed.has(table)),missing:[...assigned].filter(table=>!tables.has(table)),missingRelationships:(definition.mainRelationships||[]).filter(id=>!relationships.has(id))}}function dataOverviewGraph(schema,definition,{allRelationships=false}={}){const tables=new Map((schema.tables||[]).map(table=>[table.qualifiedName,table]));const coverage=dataOverviewCoverage(schema,definition);const groups=definition.actors.map(actor=>({...actor,id:`actor:${actor.table}`,missing:actor.tables.filter(id=>!tables.has(id))}));if(coverage.others.length)groups.push({id:`other-tables`,name:`Other tables`,table:``,description:`Technical and unclassified tables`,tables:coverage.others,missing:[]});const nodes=[];const endpoints=new Map;const largestGroup=Math.max(1,...groups.map(group=>group.tables.filter(id=>tables.has(id)).length));for(const[index,group]of groups.entries()){const members=group.tables.map(id=>tables.get(id)).filter(Boolean);for(const table of members)endpoints.set(table.qualifiedName,group.id);const scale=Math.sqrt(1+(Math.max(1,members.length)-1)/Math.max(1,largestGroup-1));const width=Math.floor(360*scale);const height=Math.floor(144*scale);nodes.push({id:group.id,type:`actor`,position:{x:index%3*460,y:Math.floor(index/3)*240},style:{width:`${width}px`,height:`${height}px`},dimensions:{width,height},data:{group,count:members.length,width,height}})}const projected=new Map;const main=!allRelationships&&definition.mainRelationships?new Set(definition.mainRelationships):null;for(const relationship of schema.relationships||[]){if(main&&!main.has(relationship.id))continue;const source=endpoints.get(relationship.referencedTable);const target=endpoints.get(relationship.sourceTable);if(!source||!target)continue;if(source===target)continue;const key=JSON.stringify([source,target]);if(!projected.has(key))projected.set(key,{source,target,relationships:[]});projected.get(key).relationships.push({...relationship,cardinality:erdCardinality(relationship,tables.get(relationship.referencedTable),tables.get(relationship.sourceTable))})}return{nodes,edges:[...projected.values()].map((edge,index)=>({id:`relationship:${index}`,source:edge.source,target:edge.target,sourceHandle:`out-right`,targetHandle:`in-left`,type:`overview`,markerEnd:{type:`arrowclosed`,width:16,height:16},label:edge.relationships.length===1?`${edge.relationships[0].cardinality.parent} : ${edge.relationships[0].cardinality.child}`:`${edge.relationships.length} relationships`,data:{relationships:edge.relationships},style:edge.relationships.every(rel=>rel.cardinality.optional)?{strokeDasharray:`5 4`}:{}})),groups,coverage}}var _hoisted_1$1={class:`database-overview__toolbar`,"aria-label":`Data overview controls`};var _hoisted_2$1={class:`database-overview__title`};var _hoisted_3$1={key:0};var _hoisted_4$1={key:1};var _hoisted_5$1={key:1};var _hoisted_6$1={class:`database-overview__option-actions`};var _hoisted_7$1={key:0,class:`database-overview__warning`,role:`alert`};var _hoisted_8$1={key:1,class:`database-overview__hint`};var _hoisted_9$1={key:2,class:`database-overview__warning`,role:`alert`};var _hoisted_10$1={key:3,class:`database-overview__warning`,role:`alert`};var _hoisted_11$1={class:`database-overview__canvas`};var _hoisted_12$1=[`inert`];var _hoisted_13$1=[`title`];var _hoisted_14$1=[`title`];var _hoisted_15$1={key:0};var _hoisted_16$1={key:0,class:`database-overview__status`,role:`status`};var _hoisted_17$1={key:1,class:`database-overview__status`,role:`alert`};var _hoisted_18$1={key:2,class:`database-overview__status`};var _hoisted_19$1={key:3,class:`database-overview__inspector`,"aria-label":`Overview details`};var _hoisted_20$1=[`aria-label`];var _hoisted_21$1={class:`database-overview__tables`,"aria-label":`Actor tables and fields`};var _hoisted_22$1={class:`database-overview__editor-actions`};var _hoisted_23$1={key:1,role:`alert`,class:`database-overview__warning`};var _sfc_main$2={__name:`DatabaseOverview`,props:{schema:{type:Object,required:true},overview:{type:Object,required:true},assistantAvailable:{type:Boolean,default:true},saveOverview:{type:Function,required:true}},emits:[`reload`,`request-assistant`,`select-table`,`inspect-table`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const feedback=useUiFeedback({source:`vibe64.database-overview.feedback`});const overviewOptions=ref(false);const allRelationships=ref(false);const graph=computed(()=>dataOverviewGraph(props.schema,props.overview.definition,{allRelationships:allRelationships.value}));const activeGroupId=ref(``);const activeGroup=computed(()=>graph.value.groups.find(group=>group.id===activeGroupId.value));const actorSchema=computed(()=>{const members=new Set(activeGroup.value?.tables||[]);return{...props.schema,tables:props.schema.tables.filter(table=>members.has(table.qualifiedName)),relationships:(props.schema.relationships||[]).filter(relationship=>members.has(relationship.sourceTable)||members.has(relationship.referencedTable))}});const actorErd=ref(null);const diagramControls=ref(null);const actorLayouts=ref({});const closeButton=ref(null);const tableSearch=ref(``);const selectedTableName=ref(``);watch(selectedTableName,name=>emit(`inspect-table`,name));const selectedPhysicalTable=computed(()=>actorSchema.value.tables.find(table=>table.qualifiedName===selectedTableName.value));const savingPosition=ref(false);let dragging=false;let positionBase;let localPositions;let queuedPositions;let returnFocus;const nodes=ref([]);const edges=ref([]);const flow=ref(null);const pending=ref(false);const layoutError=ref(``);const selection=ref(null);const editor=ref(false);const editorError=ref(``);const saving=ref(false);const generation=ref(false);const abstraction=ref(`balanced`);const generationScope=ref(`all`);const mergeTarget=ref(null);const draftActors=ref([]);const editing=ref(0);const draft=computed(()=>draftActors.value[editing.value]);const availableTables=computed(()=>{const assigned=new Set(draftActors.value.filter((_,index)=>index!==editing.value).flatMap(actor=>actor.tables));return[...new Set([...(props.schema.tables||[]).map(table=>table.qualifiedName),...draft.value?.tables||[]])].filter(id=>!assigned.has(id))});let baseHash=``;let baseDefinition;let worker;let layoutGraph;let requestId=0;let timer;let disposed=false;let fitAfterArrange=false;async function openActor(group){if(dragging)return;returnFocus=document.activeElement;selection.value=null;tableSearch.value=``;selectedTableName.value=group.table;activeGroupId.value=group.id;await nextTick();closeButton.value?.$el?.focus()}function closeActor(event){if(!activeGroup.value||editor.value||generation.value||event?.defaultPrevented)return;activeGroupId.value=``;selectedTableName.value=``;nextTick(()=>returnFocus?.focus?.())}function locateTable(table){selectedTableName.value=table.qualifiedName;actorErd.value?.locate({table:table.qualifiedName,column:``})}function locateColumn(column){actorErd.value?.locate({table:selectedTableName.value,column:column.name})}async function fit({automatic=false}={}){const current=requestId;await nextTick();await new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve)));if(!disposed&¤t===requestId&&!activeGroup.value)await flow.value?.fitView({padding:.06,maxZoom:1,minZoom:automatic?.5:.01,duration:0})}function arrange(){if(dragging||!worker||disposed)return;const id=++requestId;clearTimeout(timer);layoutError.value=``;selection.value=null;layoutGraph=graph.value;pending.value=layoutGraph.nodes.length>0;if(!pending.value){nodes.value=[];edges.value=[];return}const positions=localPositions||props.overview.definition.positions;worker.postMessage({id,kind:`overview`,nodes:layoutGraph.nodes.map(node=>({id:node.id,count:node.data.count,...node.dimensions})),overviewPositions:positions?JSON.parse(JSON.stringify(positions)):void 0,overviewRings:props.overview.definition.rings?.map(ring=>ring.map(table=>`actor:${table}`)),visibleEdges:layoutGraph.edges.map(edge=>({id:edge.id,source:edge.source,target:edge.target}))});timer=setTimeout(()=>{requestId+=1;pending.value=false;layoutError.value=`Actor arrangement timed out. Retry to arrange the overview.`},15e3)}function startActorDrag({node}){dragging=true;requestId+=1;clearTimeout(timer);pending.value=false;if(!savingPosition.value)positionBase={hash:props.overview.hash,definition:JSON.parse(JSON.stringify(props.overview.definition))};edges.value=edges.value.map(edge=>({...edge,data:{...edge.data,dragging:edge.data.dragging||edge.source===node.id||edge.target===node.id}}))}async function finishActorDrag(){dragging=false;if(!positionBase){arrange();return}await savePositions(Object.fromEntries(nodes.value.map(node=>[node.data.group.table||`other-tables`,{...node.position}])))}function resetActorPositions(){fitAfterArrange=true;savePositions({})}async function savePositions(positions){localPositions=positions;queuedPositions=positions;arrange();if(savingPosition.value)return;positionBase||={hash:props.overview.hash,definition:props.overview.definition};savingPosition.value=true;try{while(queuedPositions&&!disposed){const next=queuedPositions;queuedPositions=null;const result=await props.saveOverview({definition:{...positionBase.definition,positions:next},baseHash:positionBase.hash});if(!result?.ok)throw new Error(result?.error||`Actor positions could not be saved.`);positionBase=result.overview}}catch(error){queuedPositions=null;positionBase=null;feedback.error(error,`Actor positions could not be saved.`)}finally{localPositions=null;if(!dragging)positionBase=null;if(!disposed){savingPosition.value=false;arrange()}}}watch([()=>props.schema.refreshedAt,()=>props.overview.hash,()=>props.overview.error,allRelationships],()=>{if(!savingPosition.value)arrange()});onMounted(()=>{worker=new Worker(new URL(`/assets/erdLayout.worker-DGG2ayPr.js`,``+import.meta.url),{type:`module`});worker.onmessage=async({data})=>{if(disposed||data.id!==requestId)return;clearTimeout(timer);if(!data.ok){pending.value=false;layoutError.value=data.error||`The overview could not be arranged.`;return}const initial=!nodes.value.length;const positions=new Map(data.nodes.map(node=>[node.id,{x:node.x,y:node.y}]));nodes.value=layoutGraph.nodes.map(node=>({...node,position:positions.get(node.id)||node.position}));const routes=new Map(data.overviewRoutes.map(route=>[route.id,route]));edges.value=layoutGraph.edges.map(edge=>{const route=routes.get(edge.id);return{...edge,sourceHandle:route.sourceHandle,targetHandle:route.targetHandle,data:{...edge.data,points:route.points}}});if(data.overviewRoutes.some(route=>route.obstructed))layoutError.value=`Some connections could not avoid actors. Try showing only main connections.`;if(initial||fitAfterArrange)await fit({automatic:initial});if(!disposed&&data.id===requestId){fitAfterArrange=false;pending.value=false}};worker.onerror=()=>{clearTimeout(timer);pending.value=false;layoutError.value=`The overview layout worker failed. Reload overview to retry.`};arrange()});onBeforeUnmount(()=>{disposed=true;clearTimeout(timer);worker?.terminate()});function openGeneration(){overviewOptions.value=false;abstraction.value=props.overview.definition.abstraction||`balanced`;generationScope.value=props.overview.present&&graph.value.coverage.unreviewed.length?`new`:`all`;generation.value=true}function generate(){generation.value=false;emit(`request-assistant`,{abstraction:abstraction.value,scope:generationScope.value})}function reviewUngrouped(){emit(`request-assistant`,{abstraction:props.overview.definition.abstraction||`balanced`,scope:`ungrouped`,tables:[...graph.value.coverage.others]})}function openEditor(){overviewOptions.value=false;baseHash=props.overview.hash;baseDefinition=JSON.parse(JSON.stringify(props.overview.definition));draftActors.value=JSON.parse(JSON.stringify(baseDefinition.actors));editing.value=0;mergeTarget.value=null;editorError.value=``;editor.value=true}function editActor(table){openEditor();editing.value=draftActors.value.findIndex(actor=>actor.table===table)}function promoteTable(table){openEditor();for(const actor of draftActors.value)actor.tables=actor.tables.filter(id=>id!==table.qualifiedName);draftActors.value.push({table:table.qualifiedName,name:table.name,description:table.comment||``,tables:[table.qualifiedName]});editing.value=draftActors.value.length-1}function mergeActor(){const target=draftActors.value.find(actor=>actor.table===mergeTarget.value);if(!draft.value||!target||target===draft.value)return;target.tables=[...new Set([...target.tables,...draft.value.tables])];draftActors.value.splice(editing.value,1);editing.value=draftActors.value.indexOf(target);mergeTarget.value=null}watch(editing,()=>{mergeTarget.value=null});function addActor(){draftActors.value.push({table:``,name:``,description:``,tables:[]});editing.value=draftActors.value.length-1}function removeActor(){draftActors.value.splice(editing.value,1);editing.value=Math.max(0,editing.value-1)}function includeMainTable(){if(draft.value?.table&&!draft.value.tables.includes(draft.value.table))draft.value.tables.push(draft.value.table)}async function save(){if(saving.value)return;editorError.value=``;try{const edited={...baseDefinition,actors:draftActors.value,reviewedTables:[...new Set([...baseDefinition.reviewedTables||[],...baseDefinition.actors.flatMap(actor=>actor.tables),...draftActors.value.flatMap(actor=>actor.tables)])]};const mainTables=new Set(draftActors.value.map(actor=>actor.table));if(edited.positions)edited.positions=Object.fromEntries(Object.entries(edited.positions).filter(([table])=>table===`other-tables`||mainTables.has(table)));if(edited.rings){edited.rings=edited.rings.map(ring=>ring.filter(table=>mainTables.has(table))).filter(ring=>ring.length);const placed=new Set(edited.rings.flat());const added=[...mainTables].filter(table=>!placed.has(table));if(added.length)edited.rings.push(added)}const definition=validateDataOverview(edited);saving.value=true;const result=await props.saveOverview({definition,baseHash});if(disposed)return;if(!result||result.ok===false){editorError.value=result?.error||`The grouping could not be saved. Your edits are still here.`;return}editor.value=false}catch(error){if(!disposed)editorError.value=error.message||`The grouping could not be saved.`}finally{saving.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`database-overview`,tabindex:`-1`,onKeydown:withKeys(closeActor,[`esc`])},[createBaseVNode(`header`,_hoisted_1$1,[activeGroup.value?(openBlock(),createBlock(VBtn,{key:0,ref_key:`closeButton`,ref:closeButton,class:`database-overview__back`,"prepend-icon":unref(mdiArrowLeft),variant:`tonal`,onClick:closeActor},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`Back to data overview`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_2$1,[createBaseVNode(`strong`,null,toDisplayString(activeGroup.value?activeGroup.value.name:`Data overview`),1),activeGroup.value?(openBlock(),createElementBlock(`span`,_hoisted_3$1,toDisplayString(actorSchema.value.tables.length)+` tables`,1)):(openBlock(),createElementBlock(`span`,_hoisted_4$1,toDisplayString(graph.value.coverage.classified)+` / `+toDisplayString(graph.value.coverage.total)+` tables classified`,1))]),createBaseVNode(`div`,{ref_key:`diagramControls`,ref:diagramControls,class:`database-overview__controls`},[!activeGroup.value?(openBlock(),createElementBlock(Fragment,{key:0},[graph.value.coverage.others.length?(openBlock(),createBlock(VBtn,{key:0,disabled:!__props.assistantAvailable,variant:`tonal`,onClick:reviewUngrouped},{default:withCtx(()=>[createTextVNode(`Review `+toDisplayString(graph.value.coverage.others.length)+` ungrouped tables`,1)]),_:1},8,[`disabled`])):createCommentVNode(``,true),!__props.overview.present?(openBlock(),createBlock(VBtn,{key:1,disabled:!__props.assistantAvailable,size:`small`,variant:`tonal`,onClick:openGeneration},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`Create with AI`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{class:`database-overview__icon-button`,icon:unref(mdiImageFilterCenterFocus),size:`small`,variant:`text`,"aria-label":`Fit`,title:`Fit overview`,onClick:fit},null,8,[`icon`]),createVNode(VMenu,{modelValue:overviewOptions.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>overviewOptions.value=$event),"close-on-content-click":false},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`database-overview__icon-button`,icon:unref(mdiTuneVariant),size:`small`,variant:`text`,"aria-label":`Overview options`,title:`Overview options`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VSheet,{class:`database-overview__options`,rounded:`lg`,elevation:`2`,"aria-label":`Overview options`},{default:withCtx(()=>[createBaseVNode(`span`,null,`Not yet reviewed: `+toDisplayString(graph.value.coverage.unreviewed.length),1),__props.overview.definition.mainRelationships?(openBlock(),createBlock(VSwitch,{key:0,modelValue:allRelationships.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>allRelationships.value=$event),density:`compact`,"hide-details":``,label:`All connections`},null,8,[`modelValue`])):__props.overview.present?(openBlock(),createElementBlock(`small`,_hoisted_5$1,`Showing all connections. Review with AI to select the main ones.`)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_6$1,[createVNode(VBtn,{size:`small`,variant:`text`,"aria-label":`Zoom in`,onClick:_cache[1]||(_cache[1]=$event=>flow.value?.zoomIn())},{default:withCtx(()=>[..._cache[30]||(_cache[30]=[createTextVNode(`Zoom in`,-1)])]),_:1}),createVNode(VBtn,{size:`small`,variant:`text`,"aria-label":`Zoom out`,onClick:_cache[2]||(_cache[2]=$event=>flow.value?.zoomOut())},{default:withCtx(()=>[..._cache[31]||(_cache[31]=[createTextVNode(`Zoom out`,-1)])]),_:1})]),createVNode(VBtn,{disabled:savingPosition.value||pending.value,size:`small`,variant:`text`,onClick:resetActorPositions},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`Reset actor positions`,-1)])]),_:1},8,[`disabled`]),createVNode(VDivider),createVNode(VBtn,{disabled:savingPosition.value,size:`small`,variant:`text`,onClick:openEditor},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`Edit actors`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:!__props.assistantAvailable,size:`small`,variant:`tonal`,onClick:openGeneration},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.overview.present?`Review with AI`:`Create with AI`),1)]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:savingPosition.value,size:`small`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>emit(`reload`))},{default:withCtx(()=>[..._cache[34]||(_cache[34]=[createTextVNode(`Reload overview`,-1)])]),_:1},8,[`disabled`]),_cache[35]||(_cache[35]=createBaseVNode(`small`,null,`Drag a concept to move it. Drag empty space to pan; scroll to zoom.`,-1))]),_:1})]),_:1},8,[`modelValue`])],64)):createCommentVNode(``,true)],512)]),__props.overview.error?(openBlock(),createElementBlock(`p`,_hoisted_7$1,toDisplayString(__props.overview.error)+` Your tables remain available under Other tables. Repair `+toDisplayString(unref(DATA_OVERVIEW_PATH))+` or edit the actors.`,1)):!__props.overview.present?(openBlock(),createElementBlock(`p`,_hoisted_8$1,`Choose the main actors with AI or Edit actors. Supporting tables can belong together across several relationships.`)):createCommentVNode(``,true),graph.value.coverage.missing.length?(openBlock(),createElementBlock(`p`,_hoisted_9$1,`Missing from the refreshed schema: `+toDisplayString(graph.value.coverage.missing.join(`, `))+`. Review the grouping after renaming or removing tables.`,1)):createCommentVNode(``,true),graph.value.coverage.missingRelationships.length?(openBlock(),createElementBlock(`p`,_hoisted_10$1,toDisplayString(graph.value.coverage.missingRelationships.length)+` main connections are missing from the refreshed schema. Review with AI or repair `+toDisplayString(unref(DATA_OVERVIEW_PATH))+`.`,1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_11$1,[createBaseVNode(`div`,{class:normalizeClass([`database-overview__map`,{"database-overview__map--faded":activeGroup.value}]),inert:activeGroup.value?true:void 0},[createVNode(unref(_sfc_main$1$2),{nodes:nodes.value,"onUpdate:nodes":_cache[5]||(_cache[5]=$event=>nodes.value=$event),edges:edges.value,"onUpdate:edges":_cache[6]||(_cache[6]=$event=>edges.value=$event),"min-zoom":.01,"max-zoom":1.5,"nodes-connectable":false,"edges-updatable":false,"node-drag-threshold":4,onNodeDragStart:startActorDrag,onNodeDragStop:finishActorDrag,onInit:_cache[7]||(_cache[7]=$event=>flow.value=$event),onNodeClick:_cache[8]||(_cache[8]=$event=>openActor($event.node.data.group)),onEdgeClick:_cache[9]||(_cache[9]=$event=>selection.value=$event.edge.data.relationships),onPaneClick:_cache[10]||(_cache[10]=$event=>selection.value=null)},{"node-actor":withCtx(({data})=>[createBaseVNode(`article`,{class:`database-overview__actor`,style:normalizeStyle({width:data.width+`px`,height:data.height+`px`})},[(openBlock(true),createElementBlock(Fragment,null,renderList(Object.values(unref(Position)),side=>{return openBlock(),createElementBlock(Fragment,{key:side},[createVNode(unref(_sfc_main$f),{id:`in-${side}`,type:`target`,position:side,style:normalizeStyle(side===`left`||side===`right`?{top:`32px`}:{})},null,8,[`id`,`position`,`style`]),createVNode(unref(_sfc_main$f),{id:`out-${side}`,type:`source`,position:side,style:normalizeStyle(side===`left`||side===`right`?{top:`32px`}:{})},null,8,[`id`,`position`,`style`])],64)}),128)),createBaseVNode(`header`,null,[createBaseVNode(`strong`,{title:data.group.name},toDisplayString(data.group.name),9,_hoisted_13$1),createVNode(VBtn,{class:`nodrag`,size:`small`,variant:`tonal`,"aria-label":`Explore `+data.group.name,onClick:withModifiers($event=>openActor(data.group),[`stop`])},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(`Explore`,-1)])]),_:1},8,[`aria-label`,`onClick`])]),createBaseVNode(`p`,{title:data.group.description},toDisplayString(data.group.description),9,_hoisted_14$1),createBaseVNode(`small`,null,[createTextVNode(toDisplayString(data.count)+` tables`,1),data.group.missing.length?(openBlock(),createElementBlock(`span`,_hoisted_15$1,` · `+toDisplayString(data.group.missing.length)+` missing`,1)):createCommentVNode(``,true)])],4)]),"edge-overview":withCtx(edgeProps=>[createVNode(_sfc_main$3,normalizeProps(guardReactiveProps(edgeProps)),null,16)]),_:1},8,[`nodes`,`edges`])],10,_hoisted_12$1),pending.value?(openBlock(),createElementBlock(`span`,_hoisted_16$1,`Arranging actors…`)):layoutError.value?(openBlock(),createElementBlock(`span`,_hoisted_17$1,[createTextVNode(toDisplayString(layoutError.value)+` `,1),createVNode(VBtn,{size:`small`,onClick:arrange},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Retry`,-1)])]),_:1})])):createCommentVNode(``,true),!graph.value.groups.length?(openBlock(),createElementBlock(`span`,_hoisted_18$1,`No tables in the refreshed schema.`)):createCommentVNode(``,true),selection.value?(openBlock(),createElementBlock(`aside`,_hoisted_19$1,[createVNode(VBtn,{class:`database-overview__close`,size:`small`,variant:`text`,"aria-label":`Close overview details`,onClick:_cache[11]||(_cache[11]=$event=>selection.value=null)},{default:withCtx(()=>[..._cache[38]||(_cache[38]=[createTextVNode(`Close`,-1)])]),_:1}),_cache[39]||(_cache[39]=createBaseVNode(`strong`,null,`Actual relationships`,-1)),_cache[40]||(_cache[40]=createBaseVNode(`p`,null,`Cardinalities describe these tables, including when their actor is collapsed.`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(selection.value,relationship=>{return openBlock(),createElementBlock(`section`,{key:relationship.id,class:`database-overview__relationship`},[createBaseVNode(`strong`,null,toDisplayString(relationship.constraintName||relationship.id),1),createBaseVNode(`p`,null,toDisplayString(relationship.referencedTable)+` (`+toDisplayString(relationship.cardinality.parent)+`) → `+toDisplayString(relationship.sourceTable)+` (`+toDisplayString(relationship.cardinality.child)+`)`,1),(openBlock(true),createElementBlock(Fragment,null,renderList(relationship.columns,(column,index)=>{return openBlock(),createElementBlock(`p`,{key:column},toDisplayString(relationship.referencedColumns[index])+` ← `+toDisplayString(column),1)}),128)),createBaseVNode(`small`,null,`On delete: `+toDisplayString(relationship.deleteAction||`unspecified`)+` · On update: `+toDisplayString(relationship.updateAction||`unspecified`),1)])}),128))])):createCommentVNode(``,true),activeGroup.value?(openBlock(),createElementBlock(`section`,{key:4,class:`database-overview__detail`,"aria-label":`ERD for ${activeGroup.value.name}`},[createBaseVNode(`aside`,_hoisted_21$1,[createVNode(VTextField,{modelValue:tableSearch.value,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>tableSearch.value=$event),label:`Find tables`,clearable:``,density:`compact`,"hide-details":``},null,8,[`modelValue`]),createVNode(DatabaseTableList_default,{"interactive-columns":``,schema:actorSchema.value,"selected-table-name":selectedTableName.value,search:tableSearch.value,onSelectTable:locateTable,onSelectColumn:locateColumn},null,8,[`schema`,`selected-table-name`,`search`])]),(openBlock(),createBlock(DatabaseErd_default,{key:activeGroup.value.id,ref_key:`actorErd`,ref:actorErd,"toolbar-target":diagramControls.value,schema:actorSchema.value,"central-table":activeGroup.value.table,layout:actorLayouts.value[activeGroup.value.id],onSaveLayout:_cache[13]||(_cache[13]=$event=>actorLayouts.value[activeGroup.value.id]=$event),onInspectTable:_cache[14]||(_cache[14]=$event=>selectedTableName.value=$event),onSelectTable:_cache[15]||(_cache[15]=$event=>emit(`select-table`,$event,activeGroup.value.name))},{options:withCtx(({close})=>[createVNode(VDivider),_cache[43]||(_cache[43]=createBaseVNode(`strong`,null,`Overview concept`,-1)),activeGroup.value.table?(openBlock(),createBlock(VBtn,{key:0,size:`small`,variant:`text`,onClick:$event=>{close();editActor(activeGroup.value.table)}},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(`Edit or merge actor`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true),selectedPhysicalTable.value&&!__props.overview.definition.actors.some(actor=>actor.table===selectedTableName.value)?(openBlock(),createBlock(VBtn,{key:1,size:`small`,variant:`text`,onClick:$event=>{close();promoteTable(selectedPhysicalTable.value)}},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(`Make main actor`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true)]),_:1},8,[`toolbar-target`,`schema`,`central-table`,`layout`]))],8,_hoisted_20$1)):createCommentVNode(``,true)]),createVNode(VDialog,{modelValue:generation.value,"onUpdate:modelValue":_cache[19]||(_cache[19]=$event=>generation.value=$event),"max-width":`560`},{default:withCtx(()=>[createVNode(VCard,{title:`Generate data overview`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VSelect,{modelValue:abstraction.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>abstraction.value=$event),items:unref(DATA_OVERVIEW_ABSTRACTIONS),label:`Abstraction`},null,8,[`modelValue`,`items`]),createBaseVNode(`p`,null,toDisplayString(unref(DATA_OVERVIEW_ABSTRACTIONS).find(item=>item.value===abstraction.value)?.description),1),createVNode(VRadioGroup,{modelValue:generationScope.value,"onUpdate:modelValue":_cache[17]||(_cache[17]=$event=>generationScope.value=$event),label:`Tables to review`},{default:withCtx(()=>[createVNode(VRadio,{value:`new`,disabled:!graph.value.coverage.unreviewed.length,label:`Process new tables only (${graph.value.coverage.unreviewed.length})`},null,8,[`disabled`,`label`]),createVNode(VRadio,{value:`all`,label:`Regenerate everything`})]),_:1},8,[`modelValue`]),createBaseVNode(`p`,null,toDisplayString(generationScope.value===`new`?`Keeps your existing actors and adjustments. Tables deliberately left in Other tables count as reviewed.`:`Replaces the existing grouping, including manual adjustments. Your database is unchanged.`),1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{onClick:_cache[18]||(_cache[18]=$event=>generation.value=false)},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{variant:`tonal`,onClick:generate},{default:withCtx(()=>[..._cache[45]||(_cache[45]=[createTextVNode(`Generate overview`,-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:editor.value,"onUpdate:modelValue":_cache[27]||(_cache[27]=$event=>editor.value=$event),"max-width":`760`,persistent:saving.value},{default:withCtx(()=>[createVNode(VCard,{title:`Edit main actors`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[_cache[49]||(_cache[49]=createBaseVNode(`p`,null,`Group supporting tables at any depth. Tables without a group appear under Other tables. Shared concepts can be their own actor.`,-1)),createVNode(VSelect,{modelValue:editing.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>editing.value=$event),items:draftActors.value.map((actor,index)=>({title:actor.name||`New actor`,value:index})),label:`Actor`,"hide-details":``},null,8,[`modelValue`,`items`]),createBaseVNode(`div`,_hoisted_22$1,[createVNode(VBtn,{size:`small`,onClick:addActor},{default:withCtx(()=>[..._cache[46]||(_cache[46]=[createTextVNode(`Add actor`,-1)])]),_:1}),draft.value?(openBlock(),createBlock(VBtn,{key:0,size:`small`,onClick:removeActor},{default:withCtx(()=>[..._cache[47]||(_cache[47]=[createTextVNode(`Remove actor`,-1)])]),_:1})):createCommentVNode(``,true)]),draft.value?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VTextField,{modelValue:draft.value.name,"onUpdate:modelValue":_cache[21]||(_cache[21]=$event=>draft.value.name=$event),label:`Name`,maxlength:`120`},null,8,[`modelValue`]),createVNode(VAutocomplete,{modelValue:draft.value.table,"onUpdate:modelValue":[_cache[22]||(_cache[22]=$event=>draft.value.table=$event),includeMainTable],items:availableTables.value,label:`Main table`},null,8,[`modelValue`,`items`]),createVNode(VTextarea,{modelValue:draft.value.description,"onUpdate:modelValue":_cache[23]||(_cache[23]=$event=>draft.value.description=$event),label:`What this actor contains`,maxlength:`600`,rows:`2`},null,8,[`modelValue`]),createVNode(VAutocomplete,{modelValue:draft.value.tables,"onUpdate:modelValue":[_cache[24]||(_cache[24]=$event=>draft.value.tables=$event),includeMainTable],items:availableTables.value,label:`Included tables`,multiple:``,chips:``,"closable-chips":``},null,8,[`modelValue`,`items`]),draftActors.value.length>1?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VSelect,{modelValue:mergeTarget.value,"onUpdate:modelValue":_cache[25]||(_cache[25]=$event=>mergeTarget.value=$event),items:draftActors.value.flatMap((actor,index)=>index===editing.value?[]:[{title:actor.name,value:actor.table}]),label:`Merge into another actor`,clearable:``},null,8,[`modelValue`,`items`]),createVNode(VBtn,{size:`small`,disabled:!mergeTarget.value,onClick:mergeActor},{default:withCtx(()=>[..._cache[48]||(_cache[48]=[createTextVNode(`Merge actor and its tables`,-1)])]),_:1},8,[`disabled`])],64)):createCommentVNode(``,true)],64)):createCommentVNode(``,true),editorError.value?(openBlock(),createElementBlock(`p`,_hoisted_23$1,toDisplayString(editorError.value),1)):createCommentVNode(``,true),createBaseVNode(`small`,null,`Saved in `+toDisplayString(unref(DATA_OVERVIEW_PATH))+` with the project source. Database tables and records are unchanged.`,1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:saving.value,onClick:_cache[26]||(_cache[26]=$event=>editor.value=false)},{default:withCtx(()=>[..._cache[50]||(_cache[50]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:saving.value,"min-width":`108`,onClick:save},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Saving…`:`Save actors`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])],32)}}};var DatabaseOverview_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-7fe56596`]]);var _sfc_main$1={__name:`DatabaseSqlEditor`,props:{engine:{default:`postgresql`,type:String},modelValue:{default:``,type:String},runAvailable:{default:true,type:Boolean},schema:{default:()=>({}),type:Object}},emits:[`focus-run`,`run`,`update:modelValue`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const editorHost=ref(null);let editor=null;function completionSchema(schema={}){return Object.fromEntries((Array.isArray(schema.tables)?schema.tables:[]).map(table=>[table.qualifiedName,(Array.isArray(table.columns)?table.columns:[]).map(column=>column.name)]))}function sqlLanguage(){return sql({dialect:databaseClientDialect(props.engine).codeMirrorDialect,schema:completionSchema(props.schema),upperCaseKeywords:true})}function extensions(){return[lineNumbers(),history(),drawSelection(),highlightActiveLine(),bracketMatching(),syntaxHighlighting(defaultHighlightStyle,{fallback:true}),sqlLanguage(),keymap.of([{key:`Tab`,run(){if(!props.runAvailable)return false;emit(`focus-run`);return true}},{key:`Mod-Enter`,preventDefault:true,run(){emit(`run`);return true}},...defaultKeymap,...historyKeymap]),EditorView.lineWrapping,EditorView.contentAttributes.of({"aria-keyshortcuts":`Control+Enter Meta+Enter`,"aria-label":`SQL query editor`}),EditorView.updateListener.of(update=>{if(update.docChanged)emit(`update:modelValue`,update.state.doc.toString())}),EditorView.theme({"&":{backgroundColor:`transparent`,color:`rgb(var(--v-theme-on-surface))`,fontSize:`0.84rem`,height:`100%`},".cm-content":{caretColor:`rgb(var(--v-theme-primary))`,fontFamily:`var(--vibe64-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace)`,lineHeight:`1.55`,padding:`0.75rem 0`},".cm-cursor":{borderLeftColor:`rgb(var(--v-theme-primary))`},".cm-gutters":{backgroundColor:`transparent`,borderRight:`1px solid rgba(var(--v-theme-on-surface), 0.08)`,color:`rgba(var(--v-theme-on-surface), 0.42)`},".cm-activeLine, .cm-activeLineGutter":{backgroundColor:`rgba(var(--v-theme-primary), 0.055)`},".cm-focused":{outline:`none`}})]}function createEditor(){if(!editorHost.value)return;editor?.destroy();editor=new EditorView({parent:editorHost.value,state:EditorState.create({doc:props.modelValue,extensions:extensions()})})}onMounted(createEditor);watch(()=>props.modelValue,value=>{if(!editor||editor.state.doc.toString()===value)return;editor.dispatch({changes:{from:0,insert:value,to:editor.state.doc.length}})});watch(()=>[props.engine,props.schema],()=>{if(editor)createEditor()},{deep:true});onBeforeUnmount(()=>editor?.destroy());return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{ref_key:`editorHost`,ref:editorHost,class:`database-sql-editor`},null,512)}}};var DatabaseSqlEditor_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-8edfd5f4`]]);var _hoisted_1={class:`database-workspace`,"aria-label":`Session database browser`};var _hoisted_2={class:`database-workspace__header database-workspace__header--skeleton`};var _hoisted_3={class:`database-workspace__loading`,role:`status`};var _hoisted_4={key:1,class:`database-workspace__load-error`,role:`alert`};var _hoisted_5={class:`database-workspace__header`};var _hoisted_6={class:`database-workspace__identity`};var _hoisted_7={class:`database-workspace__mark`,"aria-hidden":`true`};var _hoisted_8={class:`database-workspace__header-actions`};var _hoisted_9={class:`database-workspace__navigator`};var _hoisted_10={key:1,class:`database-workspace__nav-scroll`};var _hoisted_11=[`onClick`];var _hoisted_12={key:0,class:`database-workspace__empty-copy`};var _hoisted_13={key:2,class:`database-workspace__nav-scroll`};var _hoisted_14=[`onClick`];var _hoisted_15={key:0,class:`database-workspace__empty-copy`};var _hoisted_16={class:`database-workspace__main`};var _hoisted_17=[`inert`,`aria-hidden`];var _hoisted_18={class:`database-workspace__query`};var _hoisted_19={class:`database-workspace__query-toolbar`};var _hoisted_20={class:`database-workspace__query-actions`};var _hoisted_21={class:`database-workspace__query-options`};var _hoisted_22={class:`database-workspace__editor-wrap`};var _hoisted_23={class:`database-workspace__results`};var _hoisted_24=[`title`];var _hoisted_25={key:0,class:`database-workspace__result-skeleton`,role:`status`};var _hoisted_26={key:1,class:`database-workspace__table-wrap`};var _hoisted_27=[`title`];var _hoisted_28={class:`database-workspace__row-number`};var _hoisted_29=[`title`];var _hoisted_30=[`aria-label`,`onClick`];var _hoisted_31={class:`database-workspace__row-actions`};var _hoisted_32={key:0,class:`database-workspace__empty-copy`};var _hoisted_33={key:2,class:`database-workspace__command-result`};var _hoisted_34={key:3,class:`database-workspace__empty-result`};var _hoisted_35={id:`database-copilot-panel`,class:`database-workspace__copilot`};var _hoisted_36={class:`database-workspace__copilot-mark`};var _hoisted_37={key:0,class:`database-workspace__copilot-body`};var _hoisted_38={key:0};var _hoisted_39={key:0,class:`database-workspace__assistant-skeleton`,role:`status`};var _hoisted_40={class:`database-workspace__assistant-context`};var _hoisted_41={key:1,class:`database-workspace__copilot-unavailable`};var _hoisted_42={key:0};var _sfc_main={__name:`Vibe64DatabaseWorkspace`,props:{openRequest:{type:Object,default:null},active:{default:true,type:Boolean},assistantAvailable:{default:true,type:Boolean},assistantUnavailableMessage:{default:``,type:String},projectSlug:{default:``,type:String},sessionId:{default:``,type:String},sessionsApiPath:{default:``,type:[String,Object,Function]}},emits:[`request-overview-assistant`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;function requestOverviewAssistant({abstraction=`balanced`,scope=`all`,tables=[]}={}){const level=DATA_OVERVIEW_ABSTRACTIONS.find(item=>item.value===abstraction)||DATA_OVERVIEW_ABSTRACTIONS[1];const tableReferences=tables.map(name=>schema.value.tables.find(table=>table.qualifiedName===name)?.reference||name);const scopeInstruction=scope===`ungrouped`?`Review only these currently ungrouped tables: ${JSON.stringify(tableReferences)}. Preserve existing actors, names, descriptions, memberships and manual choices. Classify these tables into existing or new actors where appropriate. Explain any deliberately retained under Other tables. Preserve reviewedTables and record this review.`:scope===`new`?`Process only coverage.unreviewed tables. Preserve existing actors, names, descriptions, memberships and manual choices. New tables may join an existing actor or form a new one. Preserve reviewedTables and add the newly reviewed tables, including those deliberately left under Other tables.`:`Regenerate the whole grouping at the selected abstraction level, replacing existing actor choices as needed. Review every current table and record every one in reviewedTables, including those deliberately left under Other tables.`;emit(`request-overview-assistant`,{title:`Data overview`,displayMessage:`${scope===`ungrouped`?`Review ${tableReferences.length} ungrouped tables`:scope===`new`?`Process new tables only`:`Regenerate the data overview`}: ${level.title}.`,message:`Create or review this project's Data overview. Run \`vibe64-database overview --json\` to read its current definition, refreshed schema and exact authoring instructions. Inspect the relevant application source to understand the main actors. Selected abstraction: ${level.title} (${level.value}). ${level.description} ${scopeInstruction} Save the grouping in data-overview.json with abstraction set to "${level.value}". Supporting tables may be several relationships away. Change only this grouping file; do not change database records, schema or other application files. Run \`vibe64-database refresh\` followed by \`vibe64-database overview --json\`, fix invalid or missing references, and report coverage plus any tables left under Other tables.`,dedupeKey:`database-overview`})}const{assistantCommand,assistantEndpoint,assistantBusy,cancelQuery,cancelling,deleteRow,deleteSnippet,deleting,error,insertRow,inserting,loading,lookupBusy,refreshSchema,refreshing,reload,runQuery,running,saveLayout,saveOverview,saveSnippet,searchLookup,state,updateCell,updating}=useVibe64DatabaseTools({active:computed(()=>props.active),projectSlug:computed(()=>props.projectSlug),sessionId:computed(()=>props.sessionId)});const activeView=ref(`overview`);const route=useRoute();const router=useRouter();const openedViews=reactive({overview:true,erd:false,data:false});watch(activeView,view=>{openedViews[view]=true},{flush:`sync`});const diagramReturn=shallowRef(null);const diagramSelections=reactive({overview:``,erd:``});const copilotOpen=ref(false);const erdLayout=ref({nodes:[]});const diagramSavesPending=ref(0);let disposed=false;const navigatorTab=ref(`tables`);const tableSearch=ref(``);const selectedTableName=ref(``);const sqlText=ref(``);const queryResult=ref(null);const activeQueryId=ref(``);const resultSearch=ref(``);const hydratedSessionId=ref(``);const filters=ref([]);const filterDialog=ref(false);const filterDraft=reactive({column:``,operator:`=`,value:``});const filterOperators=[`=`,`<>`,`>`,`>=`,`<`,`<=`,`LIKE`,`IS NULL`,`IS NOT NULL`];const cellDialog=ref(false);const editingCell=ref(null);const editingText=ref(``);const editingNull=ref(false);const cellValidationError=ref(``);const lookupItems=ref([]);const lookupSearch=ref(``);const selectedLookupItem=ref(null);const deleteDialog=ref(false);const pendingDelete=ref(null);const insertDialog=ref(false);const insertValues=reactive({});const insertIncluded=reactive({});const insertValidationError=ref(``);const snippetDialog=ref(false);const snippetName=ref(``);const runButton=ref(null);const tableQueryStates=new Map;let lookupTimer=null;const schema=computed(()=>state.value?.schema||{relationships:[],schemas:[],tables:[]});const connection=computed(()=>state.value?.connection||{});const workspace=computed(()=>state.value?.workspace||{history:[],snippets:[]});const databaseScopeLabel=computed(()=>connection.value.developmentDatabaseScope===`project`?`Shared project database`:connection.value.developmentDatabaseScope===`session`?`Session database`:`Resolved database`);const assistantConfigured=computed(()=>Boolean(state.value?.assistant?.available));const assistantCanRun=computed(()=>assistantConfigured.value);const assistantStatusLabel=computed(()=>{const assistant=state.value?.assistant;if(!assistantConfigured.value)return`Unavailable`;return`${vibe64AssistantSelectionLabel({engineId:assistant.engineId,modelId:assistant.model,variantId:assistant.variantId})}${assistant.backupUsed?` · Shared backup`:``}`});const assistantUnavailableCopy=computed(()=>{return state.value?.assistant?.message||`Ask the owner to configure Helper in Model routing. Database browsing and editing work without AI.`});const selectedTable=computed(()=>schema.value.tables.find(table=>table.qualifiedName===selectedTableName.value)||null);const assistantTableName=computed(()=>{const name=activeView.value===`data`?selectedTableName.value:diagramSelections[activeView.value];return schema.value.tables.some(table=>table.qualifiedName===name)?name:``});const currentQueryIsDefault=computed(()=>Boolean(selectedTable.value&&sqlText.value.trim()===defaultTableSql(selectedTable.value)));const refreshedLabel=computed(()=>shortDate(schema.value.refreshedAt));const filterColumnOptions=computed(()=>(selectedTable.value?.columns||[]).map(column=>({title:`${column.name} · ${column.nativeType}`,value:column.name})));const editingColumn=computed(()=>editingCell.value?queryResult.value?.columns?.[editingCell.value.columnIndex]:null);const insertColumns=computed(()=>(selectedTable.value?.columns||[]).filter(column=>!column.immutable));const hasInsertValues=computed(()=>insertColumns.value.some(column=>insertIncluded[column.name]));const filteredResultRows=computed(()=>{const rows=Array.isArray(queryResult.value?.rows)?queryResult.value.rows:[];const search=resultSearch.value.trim().toLowerCase();return rows.map((row,index)=>({index,row})).filter(({row})=>!search||row.some(value=>displayValue(value).toLowerCase().includes(search)))});const assistantBinding=useAssistantConversation({boundedTask:{command:assistantCommand,endpoint:assistantEndpoint,scope:()=>props.sessionId,input:messages=>({messages:messages.map(({content:text,role,table})=>({content:text,role,table}))}),result:result=>({content:result.answer,intent:result.intent,role:`assistant`,sql:result.sql}),onResult(result,{message:{table}}){const lastQuery=result.queries?.at(-1)?.result;if(lastQuery&&activeView.value===`data`&&table===selectedTableName.value){queryResult.value=lastQuery;rememberSelectedTableState()}}},active:assistantCanRun,data:()=>({table:assistantTableName.value}),presentation:computed(()=>({assistantLabel:`Copilot`,visible:true,variant:`task`,submitOnEnter:false,submitOnModifierEnter:true,placeholder:assistantTableName.value?`Ask about this table…`:`Ask about this database…`,ariaLabel:`Message database copilot`,submitAriaLabel:`Ask database copilot`}))});const assistantAdapter=assistantBinding.adapter;const resultTitle=computed(()=>{if(!queryResult.value)return`Results`;if(queryResult.value.kind===`command`)return`Statement complete`;return`${queryResult.value.fullRowCount??queryResult.value.rows?.length??0} rows`});const resultEditHint=computed(()=>{if(queryResult.value?.kind!==`result-set`)return``;if(!queryResult.value.rows?.length)return`No rows to edit`;const metadata=queryResult.value.cellMeta||[];if(metadata.some(row=>row.some(cell=>cell?.editable)))return`Pencil-marked cells are editable—click one to change its source value`;const reason=metadata.flat().find(cell=>cell?.reason)?.reason;return reason?`Read-only result: ${reason}`:`Read-only result`});const resultSubtitle=computed(()=>{if(!queryResult.value)return``;const truncation=queryResult.value.truncated?` · limited result`:``;const editHint=resultEditHint.value?` · ${resultEditHint.value}`:``;return`${queryResult.value.durationMs||0} ms${truncation}${editHint}`});watch([state,()=>props.active,activeView],([next,active])=>{if(!active||!next)return;if(hydratedSessionId.value!==props.sessionId){hydratedSessionId.value=props.sessionId;tableQueryStates.clear();selectedTableName.value=``;sqlText.value=``;queryResult.value=null;filters.value=[];assistantBinding.runtime.value.clearHistory();copilotOpen.value=false;diagramReturn.value=null;diagramSelections.overview=``;diagramSelections.erd=``;erdLayout.value=next.layout||{nodes:[]}}if(activeView.value!==`data`)return;if(!selectedTableName.value){if(sqlText.value.trim())return;const firstTable=next.schema?.tables?.[0];if(firstTable)openTable(firstTable,{rememberCurrent:false})}else if(!next.schema?.tables?.some(table=>table.qualifiedName===selectedTableName.value)){const firstTable=next.schema?.tables?.[0];if(firstTable)openTable(firstTable,{rememberCurrent:false});else{selectedTableName.value=``;sqlText.value=``;queryResult.value=null;filters.value=[]}}},{immediate:true});watch(()=>props.sessionId,()=>{if(hydratedSessionId.value!==props.sessionId){hydratedSessionId.value=``;activeView.value=`overview`;openedViews.erd=false;openedViews.data=false}},{immediate:true});let appliedOpenRequest=null;watch([()=>route.query.databaseView,()=>props.openRequest,()=>props.active,()=>props.sessionId],([view,request,active])=>{if(!active)return;if(request?.qualifiedName&&request!==appliedOpenRequest){appliedOpenRequest=request;activeView.value=`erd`}else activeView.value=[`overview`,`erd`,`data`].includes(view)?view:`overview`},{immediate:true});watch(activeView,view=>{const routeView=[`overview`,`erd`,`data`].includes(route.query.databaseView)?route.query.databaseView:`overview`;if(props.active&&routeView!==view)router.replace({path:route.path,query:{...route.query,databaseView:view}})},{flush:`post`,immediate:true});const colleagueDatabase=inject(VIBE64_COLLEAGUE_DATABASE_KEY,null);const displayedDatabase={get projectSlug(){return props.projectSlug},get sessionId(){return props.sessionId},get view(){return activeView.value},get table(){return activeView.value===`data`?selectedTable.value?.qualifiedName||``:``},selectTable(qualifiedName){if(disposed||!props.active||!state.value)throw new Error(`Database is not available in this session.`);const table=schema.value.tables.find(candidate=>candidate.qualifiedName===qualifiedName);if(!table)throw new Error(`The requested table is not in this session’s database snapshot.`);if(running.value)throw new Error(`A query is running. Wait for it to finish or cancel that query before selecting a table.`);navigatorTab.value=`tables`;tableSearch.value=``;openTable(table)},get screen(){if(state.value)return`workspace`;if(loading.value||!error.value)return`loading`;return`unavailable`}};watchEffect(()=>{if(!colleagueDatabase)return;if(props.active)colleagueDatabase.value=displayedDatabase;else if(colleagueDatabase.value===displayedDatabase)colleagueDatabase.value=null});onBeforeUnmount(()=>{if(colleagueDatabase?.value===displayedDatabase)colleagueDatabase.value=null});watch([()=>state.value?.layout,()=>props.active,diagramSavesPending],([layout,active,pending])=>{if(active&&!pending&&layout&&layout.revision>(erdLayout.value.revision||0))erdLayout.value=layout},{immediate:true});onBeforeUnmount(()=>{disposed=true;clearTimeout(lookupTimer)});watch([cellDialog,lookupSearch],([open])=>{clearTimeout(lookupTimer);if(!open||!editingColumn.value?.lookup)return;lookupTimer=setTimeout(()=>void loadLookup(),220)},{immediate:true});watch(selectedLookupItem,item=>{if(!item||!editingColumn.value?.lookup||!editingCell.value)return;const lookup=editingColumn.value.lookup;const sourceColumn=editingColumn.value.origin?.column;const sourceIndex=lookup.sourceColumns.indexOf(sourceColumn);const referencedColumn=lookup.referencedColumns[sourceIndex];if(referencedColumn&&Object.hasOwn(item.keys||{},referencedColumn)){const value=item.keys[referencedColumn];editingNull.value=value==null;editingText.value=value==null?``:String(value)}});function shortDate(value=``){if(!value)return`never`;const date=new Date(value);return Number.isNaN(date.getTime())?String(value):date.toLocaleString([],{dateStyle:`medium`,timeStyle:`short`})}function firstSqlLine(value=``){return String(value||``).trim().split(`
|
|
16
|
+
`);function validateDataOverview(value){const fail=message=>{throw new Error(`Data overview: ${message}`)};const record=(item,fields,label)=>{if(!item||typeof item!==`object`||Array.isArray(item))fail(`${label} must be an object.`);if(Object.keys(item).some(key=>!fields.includes(key)))fail(`${label} contains unknown fields.`)};const text=(item,label,limit)=>{if(typeof item!==`string`||!item.trim()||item.length>limit)fail(`${label} must be non-empty text of at most ${limit} characters.`);return item.trim()};record(value,[`version`,`actors`,`abstraction`,`reviewedTables`,`rings`,`mainRelationships`,`positions`],`document`);if(value.version!==1)fail(`version must be 1.`);if(!Array.isArray(value.actors)||value.actors.length>2e3)fail(`actors must be an array of at most 2000 items.`);if(value.abstraction!==void 0&&!DATA_OVERVIEW_ABSTRACTIONS.some(item=>item.value===value.abstraction))fail(`abstraction must be none, balanced or high.`);let reviewedTables;if(value.reviewedTables!==void 0){if(!Array.isArray(value.reviewedTables)||value.reviewedTables.length>2e3)fail(`reviewedTables must be an array of at most 2000 table names.`);reviewedTables=value.reviewedTables.map(entry=>text(entry,`reviewed table name`,512));if(new Set(reviewedTables).size!==reviewedTables.length)fail(`reviewedTables must not repeat a table.`)}const assigned=new Set;const actors=value.actors.map(actor=>{record(actor,[`table`,`name`,`description`,`tables`],`actor`);const table=text(actor.table,`actor table`,512);const name=text(actor.name,`actor name`,120);if(typeof actor.description!==`string`||actor.description.length>600)fail(`description must be text of at most 600 characters.`);if(!Array.isArray(actor.tables)||!actor.tables.length||actor.tables.length>2e3)fail(`${name} must include between 1 and 2000 tables.`);const tables=actor.tables.map(entry=>{const id=text(entry,`table name`,512);if(assigned.has(id))fail(`${id} belongs to more than one group or is repeated.`);assigned.add(id);return id});if(!tables.includes(table))fail(`${name} must include its main table ${table}.`);return{table,name,description:actor.description.trim(),tables}});if(assigned.size>2e3)fail(`at most 2000 tables may be classified.`);let rings;if(value.rings!==void 0){if(!Array.isArray(value.rings)||value.rings.length>2e3)fail(`rings must be an array of at most 2000 rings.`);const mainTables=new Set(actors.map(actor=>actor.table));const placed=new Set;rings=value.rings.map(ring=>{if(!Array.isArray(ring)||!ring.length||ring.length>2e3)fail(`each ring must contain actor main tables.`);return ring.map(entry=>{const table=text(entry,`ring actor`,512);if(!mainTables.has(table)||placed.has(table))fail(`rings must contain each actor exactly once, using its main table.`);placed.add(table);return table})});if(placed.size!==actors.length)fail(`rings must place every actor.`)}let mainRelationships;if(value.mainRelationships!==void 0){if(!Array.isArray(value.mainRelationships)||value.mainRelationships.length>2e3)fail(`mainRelationships must be an array of at most 2000 relationship IDs.`);mainRelationships=value.mainRelationships.map(entry=>text(entry,`main relationship ID`,1024));if(new Set(mainRelationships).size!==mainRelationships.length)fail(`mainRelationships must not repeat an ID.`)}let positions;if(value.positions!==void 0){const allowed=new Set([...actors.map(actor=>actor.table),`other-tables`]);record(value.positions,[...allowed],`positions`);positions=Object.fromEntries(Object.entries(value.positions).map(([table,position])=>{record(position,[`x`,`y`],`actor position`);if(![position.x,position.y].every(n=>typeof n===`number`&&Number.isFinite(n)&&Math.abs(n)<=1e6))fail(`actor coordinates must be finite numbers between -1000000 and 1000000.`);return[table,{x:position.x,y:position.y}]}))}return{version:1,actors,...value.abstraction!==void 0?{abstraction:value.abstraction}:{},...reviewedTables?{reviewedTables}:{},...rings?{rings}:{},...mainRelationships?{mainRelationships}:{},...positions?{positions}:{}}}function dataOverviewCoverage(schema={},definition={actors:[]}){const tables=new Set((schema.tables||[]).map(table=>table.qualifiedName));const assigned=new Set(definition.actors.flatMap(actor=>actor.tables));const relationships=new Set((schema.relationships||[]).map(relationship=>relationship.id));const reviewed=new Set([...definition.reviewedTables||[],...assigned]);return{total:tables.size,classified:[...tables].filter(table=>assigned.has(table)).length,others:[...tables].filter(table=>!assigned.has(table)),reviewed:[...tables].filter(table=>reviewed.has(table)).length,unreviewed:[...tables].filter(table=>!reviewed.has(table)),missing:[...assigned].filter(table=>!tables.has(table)),missingRelationships:(definition.mainRelationships||[]).filter(id=>!relationships.has(id))}}function dataOverviewGraph(schema,definition,{allRelationships=false}={}){const tables=new Map((schema.tables||[]).map(table=>[table.qualifiedName,table]));const coverage=dataOverviewCoverage(schema,definition);const groups=definition.actors.map(actor=>({...actor,id:`actor:${actor.table}`,missing:actor.tables.filter(id=>!tables.has(id))}));if(coverage.others.length)groups.push({id:`other-tables`,name:`Other tables`,table:``,description:`Technical and unclassified tables`,tables:coverage.others,missing:[]});const nodes=[];const endpoints=new Map;const largestGroup=Math.max(1,...groups.map(group=>group.tables.filter(id=>tables.has(id)).length));for(const[index,group]of groups.entries()){const members=group.tables.map(id=>tables.get(id)).filter(Boolean);for(const table of members)endpoints.set(table.qualifiedName,group.id);const scale=Math.sqrt(1+(Math.max(1,members.length)-1)/Math.max(1,largestGroup-1));const width=Math.floor(360*scale);const height=Math.floor(144*scale);nodes.push({id:group.id,type:`actor`,position:{x:index%3*460,y:Math.floor(index/3)*240},style:{width:`${width}px`,height:`${height}px`},dimensions:{width,height},data:{group,count:members.length,width,height}})}const projected=new Map;const main=!allRelationships&&definition.mainRelationships?new Set(definition.mainRelationships):null;for(const relationship of schema.relationships||[]){if(main&&!main.has(relationship.id))continue;const source=endpoints.get(relationship.referencedTable);const target=endpoints.get(relationship.sourceTable);if(!source||!target)continue;if(source===target)continue;const key=JSON.stringify([source,target]);if(!projected.has(key))projected.set(key,{source,target,relationships:[]});projected.get(key).relationships.push({...relationship,cardinality:erdCardinality(relationship,tables.get(relationship.referencedTable),tables.get(relationship.sourceTable))})}return{nodes,edges:[...projected.values()].map((edge,index)=>({id:`relationship:${index}`,source:edge.source,target:edge.target,sourceHandle:`out-right`,targetHandle:`in-left`,type:`overview`,markerEnd:{type:`arrowclosed`,width:16,height:16},label:edge.relationships.length===1?`${edge.relationships[0].cardinality.parent} : ${edge.relationships[0].cardinality.child}`:`${edge.relationships.length} relationships`,data:{relationships:edge.relationships},style:edge.relationships.every(rel=>rel.cardinality.optional)?{strokeDasharray:`5 4`}:{}})),groups,coverage}}var _hoisted_1$1={class:`database-overview__toolbar`,"aria-label":`Data overview controls`};var _hoisted_2$1={class:`database-overview__title`};var _hoisted_3$1={key:0};var _hoisted_4$1={key:1};var _hoisted_5$1={key:1};var _hoisted_6$1={class:`database-overview__option-actions`};var _hoisted_7$1={key:0,class:`database-overview__warning`,role:`alert`};var _hoisted_8$1={key:1,class:`database-overview__hint`};var _hoisted_9$1={key:2,class:`database-overview__warning`,role:`alert`};var _hoisted_10$1={key:3,class:`database-overview__warning`,role:`alert`};var _hoisted_11$1={class:`database-overview__canvas`};var _hoisted_12$1=[`inert`];var _hoisted_13$1=[`title`];var _hoisted_14$1=[`title`];var _hoisted_15$1={key:0};var _hoisted_16$1={key:0,class:`database-overview__status`,role:`status`};var _hoisted_17$1={key:1,class:`database-overview__status`,role:`alert`};var _hoisted_18$1={key:2,class:`database-overview__status`};var _hoisted_19$1={key:3,class:`database-overview__inspector`,"aria-label":`Overview details`};var _hoisted_20$1=[`aria-label`];var _hoisted_21$1={class:`database-overview__tables`,"aria-label":`Actor tables and fields`};var _hoisted_22$1={class:`database-overview__editor-actions`};var _hoisted_23$1={key:1,role:`alert`,class:`database-overview__warning`};var _sfc_main$2={__name:`DatabaseOverview`,props:{schema:{type:Object,required:true},overview:{type:Object,required:true},assistantAvailable:{type:Boolean,default:true},saveOverview:{type:Function,required:true}},emits:[`reload`,`request-assistant`,`select-table`,`inspect-table`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const feedback=useUiFeedback({source:`vibe64.database-overview.feedback`});const overviewOptions=ref(false);const allRelationships=ref(false);const graph=computed(()=>dataOverviewGraph(props.schema,props.overview.definition,{allRelationships:allRelationships.value}));const activeGroupId=ref(``);const activeGroup=computed(()=>graph.value.groups.find(group=>group.id===activeGroupId.value));const actorSchema=computed(()=>{const members=new Set(activeGroup.value?.tables||[]);return{...props.schema,tables:props.schema.tables.filter(table=>members.has(table.qualifiedName)),relationships:(props.schema.relationships||[]).filter(relationship=>members.has(relationship.sourceTable)||members.has(relationship.referencedTable))}});const actorErd=ref(null);const diagramControls=ref(null);const actorLayouts=ref({});const closeButton=ref(null);const tableSearch=ref(``);const selectedTableName=ref(``);watch(selectedTableName,name=>emit(`inspect-table`,name));const selectedPhysicalTable=computed(()=>actorSchema.value.tables.find(table=>table.qualifiedName===selectedTableName.value));const savingPosition=ref(false);let dragging=false;let positionBase;let localPositions;let queuedPositions;let returnFocus;const nodes=ref([]);const edges=ref([]);const flow=ref(null);const pending=ref(false);const layoutError=ref(``);const selection=ref(null);const editor=ref(false);const editorError=ref(``);const saving=ref(false);const generation=ref(false);const abstraction=ref(`balanced`);const generationScope=ref(`all`);const mergeTarget=ref(null);const draftActors=ref([]);const editing=ref(0);const draft=computed(()=>draftActors.value[editing.value]);const availableTables=computed(()=>{const assigned=new Set(draftActors.value.filter((_,index)=>index!==editing.value).flatMap(actor=>actor.tables));return[...new Set([...(props.schema.tables||[]).map(table=>table.qualifiedName),...draft.value?.tables||[]])].filter(id=>!assigned.has(id))});let baseHash=``;let baseDefinition;let worker;let layoutGraph;let requestId=0;let timer;let disposed=false;let fitAfterArrange=false;async function openActor(group){if(dragging)return;returnFocus=document.activeElement;selection.value=null;tableSearch.value=``;selectedTableName.value=group.table;activeGroupId.value=group.id;await nextTick();closeButton.value?.$el?.focus()}function closeActor(event){if(!activeGroup.value||editor.value||generation.value||event?.defaultPrevented)return;activeGroupId.value=``;selectedTableName.value=``;nextTick(()=>returnFocus?.focus?.())}function locateTable(table){selectedTableName.value=table.qualifiedName;actorErd.value?.locate({table:table.qualifiedName,column:``})}function locateColumn(column){actorErd.value?.locate({table:selectedTableName.value,column:column.name})}async function fit({automatic=false}={}){const current=requestId;await nextTick();await new Promise(resolve=>requestAnimationFrame(()=>requestAnimationFrame(resolve)));if(!disposed&¤t===requestId&&!activeGroup.value)await flow.value?.fitView({padding:.06,maxZoom:1,minZoom:automatic?.5:.01,duration:0})}function arrange(){if(dragging||!worker||disposed)return;const id=++requestId;clearTimeout(timer);layoutError.value=``;selection.value=null;layoutGraph=graph.value;pending.value=layoutGraph.nodes.length>0;if(!pending.value){nodes.value=[];edges.value=[];return}const positions=localPositions||props.overview.definition.positions;worker.postMessage({id,kind:`overview`,nodes:layoutGraph.nodes.map(node=>({id:node.id,count:node.data.count,...node.dimensions})),overviewPositions:positions?JSON.parse(JSON.stringify(positions)):void 0,overviewRings:props.overview.definition.rings?.map(ring=>ring.map(table=>`actor:${table}`)),visibleEdges:layoutGraph.edges.map(edge=>({id:edge.id,source:edge.source,target:edge.target}))});timer=setTimeout(()=>{requestId+=1;pending.value=false;layoutError.value=`Actor arrangement timed out. Retry to arrange the overview.`},15e3)}function startActorDrag({node}){dragging=true;requestId+=1;clearTimeout(timer);pending.value=false;if(!savingPosition.value)positionBase={hash:props.overview.hash,definition:JSON.parse(JSON.stringify(props.overview.definition))};edges.value=edges.value.map(edge=>({...edge,data:{...edge.data,dragging:edge.data.dragging||edge.source===node.id||edge.target===node.id}}))}async function finishActorDrag(){dragging=false;if(!positionBase){arrange();return}await savePositions(Object.fromEntries(nodes.value.map(node=>[node.data.group.table||`other-tables`,{...node.position}])))}function resetActorPositions(){fitAfterArrange=true;savePositions({})}async function savePositions(positions){localPositions=positions;queuedPositions=positions;arrange();if(savingPosition.value)return;positionBase||={hash:props.overview.hash,definition:props.overview.definition};savingPosition.value=true;try{while(queuedPositions&&!disposed){const next=queuedPositions;queuedPositions=null;const result=await props.saveOverview({definition:{...positionBase.definition,positions:next},baseHash:positionBase.hash});if(!result?.ok)throw new Error(result?.error||`Actor positions could not be saved.`);positionBase=result.overview}}catch(error){queuedPositions=null;positionBase=null;feedback.error(error,`Actor positions could not be saved.`)}finally{localPositions=null;if(!dragging)positionBase=null;if(!disposed){savingPosition.value=false;arrange()}}}watch([()=>props.schema.refreshedAt,()=>props.overview.hash,()=>props.overview.error,allRelationships],()=>{if(!savingPosition.value)arrange()});onMounted(()=>{worker=new Worker(new URL(`/assets/erdLayout.worker-DGG2ayPr.js`,``+import.meta.url),{type:`module`});worker.onmessage=async({data})=>{if(disposed||data.id!==requestId)return;clearTimeout(timer);if(!data.ok){pending.value=false;layoutError.value=data.error||`The overview could not be arranged.`;return}const initial=!nodes.value.length;const positions=new Map(data.nodes.map(node=>[node.id,{x:node.x,y:node.y}]));nodes.value=layoutGraph.nodes.map(node=>({...node,position:positions.get(node.id)||node.position}));const routes=new Map(data.overviewRoutes.map(route=>[route.id,route]));edges.value=layoutGraph.edges.map(edge=>{const route=routes.get(edge.id);return{...edge,sourceHandle:route.sourceHandle,targetHandle:route.targetHandle,data:{...edge.data,points:route.points}}});if(data.overviewRoutes.some(route=>route.obstructed))layoutError.value=`Some connections could not avoid actors. Try showing only main connections.`;if(initial||fitAfterArrange)await fit({automatic:initial});if(!disposed&&data.id===requestId){fitAfterArrange=false;pending.value=false}};worker.onerror=()=>{clearTimeout(timer);pending.value=false;layoutError.value=`The overview layout worker failed. Reload overview to retry.`};arrange()});onBeforeUnmount(()=>{disposed=true;clearTimeout(timer);worker?.terminate()});function openGeneration(){overviewOptions.value=false;abstraction.value=props.overview.definition.abstraction||`balanced`;generationScope.value=props.overview.present&&graph.value.coverage.unreviewed.length?`new`:`all`;generation.value=true}function generate(){generation.value=false;emit(`request-assistant`,{abstraction:abstraction.value,scope:generationScope.value})}function reviewUngrouped(){emit(`request-assistant`,{abstraction:props.overview.definition.abstraction||`balanced`,scope:`ungrouped`,tables:[...graph.value.coverage.others]})}function openEditor(){overviewOptions.value=false;baseHash=props.overview.hash;baseDefinition=JSON.parse(JSON.stringify(props.overview.definition));draftActors.value=JSON.parse(JSON.stringify(baseDefinition.actors));editing.value=0;mergeTarget.value=null;editorError.value=``;editor.value=true}function editActor(table){openEditor();editing.value=draftActors.value.findIndex(actor=>actor.table===table)}function promoteTable(table){openEditor();for(const actor of draftActors.value)actor.tables=actor.tables.filter(id=>id!==table.qualifiedName);draftActors.value.push({table:table.qualifiedName,name:table.name,description:table.comment||``,tables:[table.qualifiedName]});editing.value=draftActors.value.length-1}function mergeActor(){const target=draftActors.value.find(actor=>actor.table===mergeTarget.value);if(!draft.value||!target||target===draft.value)return;target.tables=[...new Set([...target.tables,...draft.value.tables])];draftActors.value.splice(editing.value,1);editing.value=draftActors.value.indexOf(target);mergeTarget.value=null}watch(editing,()=>{mergeTarget.value=null});function addActor(){draftActors.value.push({table:``,name:``,description:``,tables:[]});editing.value=draftActors.value.length-1}function removeActor(){draftActors.value.splice(editing.value,1);editing.value=Math.max(0,editing.value-1)}function includeMainTable(){if(draft.value?.table&&!draft.value.tables.includes(draft.value.table))draft.value.tables.push(draft.value.table)}async function save(){if(saving.value)return;editorError.value=``;try{const edited={...baseDefinition,actors:draftActors.value,reviewedTables:[...new Set([...baseDefinition.reviewedTables||[],...baseDefinition.actors.flatMap(actor=>actor.tables),...draftActors.value.flatMap(actor=>actor.tables)])]};const mainTables=new Set(draftActors.value.map(actor=>actor.table));if(edited.positions)edited.positions=Object.fromEntries(Object.entries(edited.positions).filter(([table])=>table===`other-tables`||mainTables.has(table)));if(edited.rings){edited.rings=edited.rings.map(ring=>ring.filter(table=>mainTables.has(table))).filter(ring=>ring.length);const placed=new Set(edited.rings.flat());const added=[...mainTables].filter(table=>!placed.has(table));if(added.length)edited.rings.push(added)}const definition=validateDataOverview(edited);saving.value=true;const result=await props.saveOverview({definition,baseHash});if(disposed)return;if(!result||result.ok===false){editorError.value=result?.error||`The grouping could not be saved. Your edits are still here.`;return}editor.value=false}catch(error){if(!disposed)editorError.value=error.message||`The grouping could not be saved.`}finally{saving.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`database-overview`,tabindex:`-1`,onKeydown:withKeys(closeActor,[`esc`])},[createBaseVNode(`header`,_hoisted_1$1,[activeGroup.value?(openBlock(),createBlock(VBtn,{key:0,ref_key:`closeButton`,ref:closeButton,class:`database-overview__back`,"prepend-icon":unref(mdiArrowLeft),variant:`tonal`,onClick:closeActor},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`Back to data overview`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_2$1,[createBaseVNode(`strong`,null,toDisplayString(activeGroup.value?activeGroup.value.name:`Data overview`),1),activeGroup.value?(openBlock(),createElementBlock(`span`,_hoisted_3$1,toDisplayString(actorSchema.value.tables.length)+` tables`,1)):(openBlock(),createElementBlock(`span`,_hoisted_4$1,toDisplayString(graph.value.coverage.classified)+` / `+toDisplayString(graph.value.coverage.total)+` tables classified`,1))]),createBaseVNode(`div`,{ref_key:`diagramControls`,ref:diagramControls,class:`database-overview__controls`},[!activeGroup.value?(openBlock(),createElementBlock(Fragment,{key:0},[graph.value.coverage.others.length?(openBlock(),createBlock(VBtn,{key:0,disabled:!__props.assistantAvailable,variant:`tonal`,onClick:reviewUngrouped},{default:withCtx(()=>[createTextVNode(`Review `+toDisplayString(graph.value.coverage.others.length)+` ungrouped tables`,1)]),_:1},8,[`disabled`])):createCommentVNode(``,true),!__props.overview.present?(openBlock(),createBlock(VBtn,{key:1,disabled:!__props.assistantAvailable,size:`small`,variant:`tonal`,onClick:openGeneration},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`Create with AI`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{class:`database-overview__icon-button`,icon:unref(mdiImageFilterCenterFocus),size:`small`,variant:`text`,"aria-label":`Fit`,title:`Fit overview`,onClick:fit},null,8,[`icon`]),createVNode(VMenu,{modelValue:overviewOptions.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>overviewOptions.value=$event),"close-on-content-click":false},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`database-overview__icon-button`,icon:unref(mdiTuneVariant),size:`small`,variant:`text`,"aria-label":`Overview options`,title:`Overview options`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VSheet,{class:`database-overview__options`,rounded:`lg`,elevation:`2`,"aria-label":`Overview options`},{default:withCtx(()=>[createBaseVNode(`span`,null,`Not yet reviewed: `+toDisplayString(graph.value.coverage.unreviewed.length),1),__props.overview.definition.mainRelationships?(openBlock(),createBlock(VSwitch,{key:0,modelValue:allRelationships.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>allRelationships.value=$event),density:`compact`,"hide-details":``,label:`All connections`},null,8,[`modelValue`])):__props.overview.present?(openBlock(),createElementBlock(`small`,_hoisted_5$1,`Showing all connections. Review with AI to select the main ones.`)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_6$1,[createVNode(VBtn,{size:`small`,variant:`text`,"aria-label":`Zoom in`,onClick:_cache[1]||(_cache[1]=$event=>flow.value?.zoomIn())},{default:withCtx(()=>[..._cache[30]||(_cache[30]=[createTextVNode(`Zoom in`,-1)])]),_:1}),createVNode(VBtn,{size:`small`,variant:`text`,"aria-label":`Zoom out`,onClick:_cache[2]||(_cache[2]=$event=>flow.value?.zoomOut())},{default:withCtx(()=>[..._cache[31]||(_cache[31]=[createTextVNode(`Zoom out`,-1)])]),_:1})]),createVNode(VBtn,{disabled:savingPosition.value||pending.value,size:`small`,variant:`text`,onClick:resetActorPositions},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`Reset actor positions`,-1)])]),_:1},8,[`disabled`]),createVNode(VDivider),createVNode(VBtn,{disabled:savingPosition.value,size:`small`,variant:`text`,onClick:openEditor},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`Edit actors`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:!__props.assistantAvailable,size:`small`,variant:`tonal`,onClick:openGeneration},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.overview.present?`Review with AI`:`Create with AI`),1)]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:savingPosition.value,size:`small`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>emit(`reload`))},{default:withCtx(()=>[..._cache[34]||(_cache[34]=[createTextVNode(`Reload overview`,-1)])]),_:1},8,[`disabled`]),_cache[35]||(_cache[35]=createBaseVNode(`small`,null,`Drag a concept to move it. Drag empty space to pan; scroll to zoom.`,-1))]),_:1})]),_:1},8,[`modelValue`])],64)):createCommentVNode(``,true)],512)]),__props.overview.error?(openBlock(),createElementBlock(`p`,_hoisted_7$1,toDisplayString(__props.overview.error)+` Your tables remain available under Other tables. Repair `+toDisplayString(unref(DATA_OVERVIEW_PATH))+` or edit the actors.`,1)):!__props.overview.present?(openBlock(),createElementBlock(`p`,_hoisted_8$1,`Choose the main actors with AI or Edit actors. Supporting tables can belong together across several relationships.`)):createCommentVNode(``,true),graph.value.coverage.missing.length?(openBlock(),createElementBlock(`p`,_hoisted_9$1,`Missing from the refreshed schema: `+toDisplayString(graph.value.coverage.missing.join(`, `))+`. Review the grouping after renaming or removing tables.`,1)):createCommentVNode(``,true),graph.value.coverage.missingRelationships.length?(openBlock(),createElementBlock(`p`,_hoisted_10$1,toDisplayString(graph.value.coverage.missingRelationships.length)+` main connections are missing from the refreshed schema. Review with AI or repair `+toDisplayString(unref(DATA_OVERVIEW_PATH))+`.`,1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_11$1,[createBaseVNode(`div`,{class:normalizeClass([`database-overview__map`,{"database-overview__map--faded":activeGroup.value}]),inert:activeGroup.value?true:void 0},[createVNode(unref(_sfc_main$1$2),{nodes:nodes.value,"onUpdate:nodes":_cache[5]||(_cache[5]=$event=>nodes.value=$event),edges:edges.value,"onUpdate:edges":_cache[6]||(_cache[6]=$event=>edges.value=$event),"min-zoom":.01,"max-zoom":1.5,"nodes-connectable":false,"edges-updatable":false,"node-drag-threshold":4,onNodeDragStart:startActorDrag,onNodeDragStop:finishActorDrag,onInit:_cache[7]||(_cache[7]=$event=>flow.value=$event),onNodeClick:_cache[8]||(_cache[8]=$event=>openActor($event.node.data.group)),onEdgeClick:_cache[9]||(_cache[9]=$event=>selection.value=$event.edge.data.relationships),onPaneClick:_cache[10]||(_cache[10]=$event=>selection.value=null)},{"node-actor":withCtx(({data})=>[createBaseVNode(`article`,{class:`database-overview__actor`,style:normalizeStyle({width:data.width+`px`,height:data.height+`px`})},[(openBlock(true),createElementBlock(Fragment,null,renderList(Object.values(unref(Position)),side=>{return openBlock(),createElementBlock(Fragment,{key:side},[createVNode(unref(_sfc_main$f),{id:`in-${side}`,type:`target`,position:side,style:normalizeStyle(side===`left`||side===`right`?{top:`32px`}:{})},null,8,[`id`,`position`,`style`]),createVNode(unref(_sfc_main$f),{id:`out-${side}`,type:`source`,position:side,style:normalizeStyle(side===`left`||side===`right`?{top:`32px`}:{})},null,8,[`id`,`position`,`style`])],64)}),128)),createBaseVNode(`header`,null,[createBaseVNode(`strong`,{title:data.group.name},toDisplayString(data.group.name),9,_hoisted_13$1),createVNode(VBtn,{class:`nodrag`,size:`small`,variant:`tonal`,"aria-label":`Explore `+data.group.name,onClick:withModifiers($event=>openActor(data.group),[`stop`])},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(`Explore`,-1)])]),_:1},8,[`aria-label`,`onClick`])]),createBaseVNode(`p`,{title:data.group.description},toDisplayString(data.group.description),9,_hoisted_14$1),createBaseVNode(`small`,null,[createTextVNode(toDisplayString(data.count)+` tables`,1),data.group.missing.length?(openBlock(),createElementBlock(`span`,_hoisted_15$1,` · `+toDisplayString(data.group.missing.length)+` missing`,1)):createCommentVNode(``,true)])],4)]),"edge-overview":withCtx(edgeProps=>[createVNode(_sfc_main$3,normalizeProps(guardReactiveProps(edgeProps)),null,16)]),_:1},8,[`nodes`,`edges`])],10,_hoisted_12$1),pending.value?(openBlock(),createElementBlock(`span`,_hoisted_16$1,`Arranging actors…`)):layoutError.value?(openBlock(),createElementBlock(`span`,_hoisted_17$1,[createTextVNode(toDisplayString(layoutError.value)+` `,1),createVNode(VBtn,{size:`small`,onClick:arrange},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Retry`,-1)])]),_:1})])):createCommentVNode(``,true),!graph.value.groups.length?(openBlock(),createElementBlock(`span`,_hoisted_18$1,`No tables in the refreshed schema.`)):createCommentVNode(``,true),selection.value?(openBlock(),createElementBlock(`aside`,_hoisted_19$1,[createVNode(VBtn,{class:`database-overview__close`,size:`small`,variant:`text`,"aria-label":`Close overview details`,onClick:_cache[11]||(_cache[11]=$event=>selection.value=null)},{default:withCtx(()=>[..._cache[38]||(_cache[38]=[createTextVNode(`Close`,-1)])]),_:1}),_cache[39]||(_cache[39]=createBaseVNode(`strong`,null,`Actual relationships`,-1)),_cache[40]||(_cache[40]=createBaseVNode(`p`,null,`Cardinalities describe these tables, including when their actor is collapsed.`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(selection.value,relationship=>{return openBlock(),createElementBlock(`section`,{key:relationship.id,class:`database-overview__relationship`},[createBaseVNode(`strong`,null,toDisplayString(relationship.constraintName||relationship.id),1),createBaseVNode(`p`,null,toDisplayString(relationship.referencedTable)+` (`+toDisplayString(relationship.cardinality.parent)+`) → `+toDisplayString(relationship.sourceTable)+` (`+toDisplayString(relationship.cardinality.child)+`)`,1),(openBlock(true),createElementBlock(Fragment,null,renderList(relationship.columns,(column,index)=>{return openBlock(),createElementBlock(`p`,{key:column},toDisplayString(relationship.referencedColumns[index])+` ← `+toDisplayString(column),1)}),128)),createBaseVNode(`small`,null,`On delete: `+toDisplayString(relationship.deleteAction||`unspecified`)+` · On update: `+toDisplayString(relationship.updateAction||`unspecified`),1)])}),128))])):createCommentVNode(``,true),activeGroup.value?(openBlock(),createElementBlock(`section`,{key:4,class:`database-overview__detail`,"aria-label":`ERD for ${activeGroup.value.name}`},[createBaseVNode(`aside`,_hoisted_21$1,[createVNode(VTextField,{modelValue:tableSearch.value,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>tableSearch.value=$event),label:`Find tables`,clearable:``,density:`compact`,"hide-details":``},null,8,[`modelValue`]),createVNode(DatabaseTableList_default,{"interactive-columns":``,schema:actorSchema.value,"selected-table-name":selectedTableName.value,search:tableSearch.value,onSelectTable:locateTable,onSelectColumn:locateColumn},null,8,[`schema`,`selected-table-name`,`search`])]),(openBlock(),createBlock(DatabaseErd_default,{key:activeGroup.value.id,ref_key:`actorErd`,ref:actorErd,"toolbar-target":diagramControls.value,schema:actorSchema.value,"central-table":activeGroup.value.table,layout:actorLayouts.value[activeGroup.value.id],onSaveLayout:_cache[13]||(_cache[13]=$event=>actorLayouts.value[activeGroup.value.id]=$event),onInspectTable:_cache[14]||(_cache[14]=$event=>selectedTableName.value=$event),onSelectTable:_cache[15]||(_cache[15]=$event=>emit(`select-table`,$event,activeGroup.value.name))},{options:withCtx(({close})=>[createVNode(VDivider),_cache[43]||(_cache[43]=createBaseVNode(`strong`,null,`Overview concept`,-1)),activeGroup.value.table?(openBlock(),createBlock(VBtn,{key:0,size:`small`,variant:`text`,onClick:$event=>{close();editActor(activeGroup.value.table)}},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(`Edit or merge actor`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true),selectedPhysicalTable.value&&!__props.overview.definition.actors.some(actor=>actor.table===selectedTableName.value)?(openBlock(),createBlock(VBtn,{key:1,size:`small`,variant:`text`,onClick:$event=>{close();promoteTable(selectedPhysicalTable.value)}},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(`Make main actor`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true)]),_:1},8,[`toolbar-target`,`schema`,`central-table`,`layout`]))],8,_hoisted_20$1)):createCommentVNode(``,true)]),createVNode(VDialog,{modelValue:generation.value,"onUpdate:modelValue":_cache[19]||(_cache[19]=$event=>generation.value=$event),"max-width":`560`},{default:withCtx(()=>[createVNode(VCard,{title:`Generate data overview`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VSelect,{modelValue:abstraction.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>abstraction.value=$event),items:unref(DATA_OVERVIEW_ABSTRACTIONS),label:`Abstraction`},null,8,[`modelValue`,`items`]),createBaseVNode(`p`,null,toDisplayString(unref(DATA_OVERVIEW_ABSTRACTIONS).find(item=>item.value===abstraction.value)?.description),1),createVNode(VRadioGroup,{modelValue:generationScope.value,"onUpdate:modelValue":_cache[17]||(_cache[17]=$event=>generationScope.value=$event),label:`Tables to review`},{default:withCtx(()=>[createVNode(VRadio,{value:`new`,disabled:!graph.value.coverage.unreviewed.length,label:`Process new tables only (${graph.value.coverage.unreviewed.length})`},null,8,[`disabled`,`label`]),createVNode(VRadio,{value:`all`,label:`Regenerate everything`})]),_:1},8,[`modelValue`]),createBaseVNode(`p`,null,toDisplayString(generationScope.value===`new`?`Keeps your existing actors and adjustments. Tables deliberately left in Other tables count as reviewed.`:`Replaces the existing grouping, including manual adjustments. Your database is unchanged.`),1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{onClick:_cache[18]||(_cache[18]=$event=>generation.value=false)},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{variant:`tonal`,onClick:generate},{default:withCtx(()=>[..._cache[45]||(_cache[45]=[createTextVNode(`Generate overview`,-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:editor.value,"onUpdate:modelValue":_cache[27]||(_cache[27]=$event=>editor.value=$event),"max-width":`760`,persistent:saving.value},{default:withCtx(()=>[createVNode(VCard,{title:`Edit main actors`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[_cache[49]||(_cache[49]=createBaseVNode(`p`,null,`Group supporting tables at any depth. Tables without a group appear under Other tables. Shared concepts can be their own actor.`,-1)),createVNode(VSelect,{modelValue:editing.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>editing.value=$event),items:draftActors.value.map((actor,index)=>({title:actor.name||`New actor`,value:index})),label:`Actor`,"hide-details":``},null,8,[`modelValue`,`items`]),createBaseVNode(`div`,_hoisted_22$1,[createVNode(VBtn,{size:`small`,onClick:addActor},{default:withCtx(()=>[..._cache[46]||(_cache[46]=[createTextVNode(`Add actor`,-1)])]),_:1}),draft.value?(openBlock(),createBlock(VBtn,{key:0,size:`small`,onClick:removeActor},{default:withCtx(()=>[..._cache[47]||(_cache[47]=[createTextVNode(`Remove actor`,-1)])]),_:1})):createCommentVNode(``,true)]),draft.value?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VTextField,{modelValue:draft.value.name,"onUpdate:modelValue":_cache[21]||(_cache[21]=$event=>draft.value.name=$event),label:`Name`,maxlength:`120`},null,8,[`modelValue`]),createVNode(VAutocomplete,{modelValue:draft.value.table,"onUpdate:modelValue":[_cache[22]||(_cache[22]=$event=>draft.value.table=$event),includeMainTable],items:availableTables.value,label:`Main table`},null,8,[`modelValue`,`items`]),createVNode(VTextarea,{modelValue:draft.value.description,"onUpdate:modelValue":_cache[23]||(_cache[23]=$event=>draft.value.description=$event),label:`What this actor contains`,maxlength:`600`,rows:`2`},null,8,[`modelValue`]),createVNode(VAutocomplete,{modelValue:draft.value.tables,"onUpdate:modelValue":[_cache[24]||(_cache[24]=$event=>draft.value.tables=$event),includeMainTable],items:availableTables.value,label:`Included tables`,multiple:``,chips:``,"closable-chips":``},null,8,[`modelValue`,`items`]),draftActors.value.length>1?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VSelect,{modelValue:mergeTarget.value,"onUpdate:modelValue":_cache[25]||(_cache[25]=$event=>mergeTarget.value=$event),items:draftActors.value.flatMap((actor,index)=>index===editing.value?[]:[{title:actor.name,value:actor.table}]),label:`Merge into another actor`,clearable:``},null,8,[`modelValue`,`items`]),createVNode(VBtn,{size:`small`,disabled:!mergeTarget.value,onClick:mergeActor},{default:withCtx(()=>[..._cache[48]||(_cache[48]=[createTextVNode(`Merge actor and its tables`,-1)])]),_:1},8,[`disabled`])],64)):createCommentVNode(``,true)],64)):createCommentVNode(``,true),editorError.value?(openBlock(),createElementBlock(`p`,_hoisted_23$1,toDisplayString(editorError.value),1)):createCommentVNode(``,true),createBaseVNode(`small`,null,`Saved in `+toDisplayString(unref(DATA_OVERVIEW_PATH))+` with the project source. Database tables and records are unchanged.`,1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:saving.value,onClick:_cache[26]||(_cache[26]=$event=>editor.value=false)},{default:withCtx(()=>[..._cache[50]||(_cache[50]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:saving.value,"min-width":`108`,onClick:save},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Saving…`:`Save actors`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])],32)}}};var DatabaseOverview_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-7fe56596`]]);var _sfc_main$1={__name:`DatabaseSqlEditor`,props:{engine:{default:`postgresql`,type:String},modelValue:{default:``,type:String},runAvailable:{default:true,type:Boolean},schema:{default:()=>({}),type:Object}},emits:[`focus-run`,`run`,`update:modelValue`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const editorHost=ref(null);let editor=null;function completionSchema(schema={}){return Object.fromEntries((Array.isArray(schema.tables)?schema.tables:[]).map(table=>[table.qualifiedName,(Array.isArray(table.columns)?table.columns:[]).map(column=>column.name)]))}function sqlLanguage(){return sql({dialect:databaseClientDialect(props.engine).codeMirrorDialect,schema:completionSchema(props.schema),upperCaseKeywords:true})}function extensions(){return[lineNumbers(),history(),drawSelection(),highlightActiveLine(),bracketMatching(),syntaxHighlighting(defaultHighlightStyle,{fallback:true}),sqlLanguage(),keymap.of([{key:`Tab`,run(){if(!props.runAvailable)return false;emit(`focus-run`);return true}},{key:`Mod-Enter`,preventDefault:true,run(){emit(`run`);return true}},...defaultKeymap,...historyKeymap]),EditorView.lineWrapping,EditorView.contentAttributes.of({"aria-keyshortcuts":`Control+Enter Meta+Enter`,"aria-label":`SQL query editor`}),EditorView.updateListener.of(update=>{if(update.docChanged)emit(`update:modelValue`,update.state.doc.toString())}),EditorView.theme({"&":{backgroundColor:`transparent`,color:`rgb(var(--v-theme-on-surface))`,fontSize:`0.84rem`,height:`100%`},".cm-content":{caretColor:`rgb(var(--v-theme-primary))`,fontFamily:`var(--vibe64-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace)`,lineHeight:`1.55`,padding:`0.75rem 0`},".cm-cursor":{borderLeftColor:`rgb(var(--v-theme-primary))`},".cm-gutters":{backgroundColor:`transparent`,borderRight:`1px solid rgba(var(--v-theme-on-surface), 0.08)`,color:`rgba(var(--v-theme-on-surface), 0.42)`},".cm-activeLine, .cm-activeLineGutter":{backgroundColor:`rgba(var(--v-theme-primary), 0.055)`},".cm-focused":{outline:`none`}})]}function createEditor(){if(!editorHost.value)return;editor?.destroy();editor=new EditorView({parent:editorHost.value,state:EditorState.create({doc:props.modelValue,extensions:extensions()})})}onMounted(createEditor);watch(()=>props.modelValue,value=>{if(!editor||editor.state.doc.toString()===value)return;editor.dispatch({changes:{from:0,insert:value,to:editor.state.doc.length}})});watch(()=>[props.engine,props.schema],()=>{if(editor)createEditor()},{deep:true});onBeforeUnmount(()=>editor?.destroy());return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{ref_key:`editorHost`,ref:editorHost,class:`database-sql-editor`},null,512)}}};var DatabaseSqlEditor_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-8edfd5f4`]]);var _hoisted_1={class:`database-workspace`,"aria-label":`Session database browser`};var _hoisted_2={class:`database-workspace__header database-workspace__header--skeleton`};var _hoisted_3={class:`database-workspace__loading`,role:`status`};var _hoisted_4={key:1,class:`database-workspace__load-error`,role:`alert`};var _hoisted_5={class:`database-workspace__header`};var _hoisted_6={class:`database-workspace__identity`};var _hoisted_7={class:`database-workspace__mark`,"aria-hidden":`true`};var _hoisted_8={class:`database-workspace__header-actions`};var _hoisted_9={class:`database-workspace__navigator`};var _hoisted_10={key:1,class:`database-workspace__nav-scroll`};var _hoisted_11=[`onClick`];var _hoisted_12={key:0,class:`database-workspace__empty-copy`};var _hoisted_13={key:2,class:`database-workspace__nav-scroll`};var _hoisted_14=[`onClick`];var _hoisted_15={key:0,class:`database-workspace__empty-copy`};var _hoisted_16={class:`database-workspace__main`};var _hoisted_17=[`inert`,`aria-hidden`];var _hoisted_18={class:`database-workspace__query`};var _hoisted_19={class:`database-workspace__query-toolbar`};var _hoisted_20={class:`database-workspace__query-actions`};var _hoisted_21={class:`database-workspace__query-options`};var _hoisted_22={class:`database-workspace__editor-wrap`};var _hoisted_23={class:`database-workspace__results`};var _hoisted_24=[`title`];var _hoisted_25={key:0,class:`database-workspace__result-skeleton`,role:`status`};var _hoisted_26={key:1,class:`database-workspace__table-wrap`};var _hoisted_27=[`title`];var _hoisted_28={class:`database-workspace__row-number`};var _hoisted_29=[`title`];var _hoisted_30=[`aria-label`,`onClick`];var _hoisted_31={class:`database-workspace__row-actions`};var _hoisted_32={key:0,class:`database-workspace__empty-copy`};var _hoisted_33={key:2,class:`database-workspace__command-result`};var _hoisted_34={key:3,class:`database-workspace__empty-result`};var _hoisted_35={id:`database-copilot-panel`,class:`database-workspace__copilot`};var _hoisted_36={class:`database-workspace__copilot-mark`};var _hoisted_37={key:0,class:`database-workspace__copilot-body`};var _hoisted_38={key:0};var _hoisted_39={key:0,class:`database-workspace__assistant-skeleton`,role:`status`};var _hoisted_40={class:`database-workspace__assistant-context`};var _hoisted_41={key:1,class:`database-workspace__copilot-unavailable`};var _hoisted_42={key:0};var _sfc_main={__name:`Vibe64DatabaseWorkspace`,props:{openRequest:{type:Object,default:null},active:{default:true,type:Boolean},assistantAvailable:{default:true,type:Boolean},assistantUnavailableMessage:{default:``,type:String},projectSlug:{default:``,type:String},sessionId:{default:``,type:String},sessionsApiPath:{default:``,type:[String,Object,Function]}},emits:[`request-overview-assistant`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;function requestOverviewAssistant({abstraction=`balanced`,scope=`all`,tables=[]}={}){const level=DATA_OVERVIEW_ABSTRACTIONS.find(item=>item.value===abstraction)||DATA_OVERVIEW_ABSTRACTIONS[1];const tableReferences=tables.map(name=>schema.value.tables.find(table=>table.qualifiedName===name)?.reference||name);const scopeInstruction=scope===`ungrouped`?`Review only these currently ungrouped tables: ${JSON.stringify(tableReferences)}. Preserve existing actors, names, descriptions, memberships and manual choices. Classify these tables into existing or new actors where appropriate. Explain any deliberately retained under Other tables. Preserve reviewedTables and record this review.`:scope===`new`?`Process only coverage.unreviewed tables. Preserve existing actors, names, descriptions, memberships and manual choices. New tables may join an existing actor or form a new one. Preserve reviewedTables and add the newly reviewed tables, including those deliberately left under Other tables.`:`Regenerate the whole grouping at the selected abstraction level, replacing existing actor choices as needed. Review every current table and record every one in reviewedTables, including those deliberately left under Other tables.`;emit(`request-overview-assistant`,{title:`Data overview`,displayMessage:`${scope===`ungrouped`?`Review ${tableReferences.length} ungrouped tables`:scope===`new`?`Process new tables only`:`Regenerate the data overview`}: ${level.title}.`,message:`Create or review this project's Data overview. Run \`vibe64-database overview --json\` to read its current definition, refreshed schema and exact authoring instructions. Inspect the relevant application source to understand the main actors. Selected abstraction: ${level.title} (${level.value}). ${level.description} ${scopeInstruction} Save the grouping in data-overview.json with abstraction set to "${level.value}". Supporting tables may be several relationships away. Change only this grouping file; do not change database records, schema or other application files. Run \`vibe64-database refresh\` followed by \`vibe64-database overview --json\`, fix invalid or missing references, and report coverage plus any tables left under Other tables.`,dedupeKey:`database-overview`})}const{assistantCommand,assistantEndpoint,assistantBusy,cancelQuery,cancelling,deleteRow,deleteSnippet,deleting,error,insertRow,inserting,loading,lookupBusy,refreshSchema,refreshing,reload,runQuery,running,saveLayout,saveOverview,saveSnippet,searchLookup,state,updateCell,updating}=useVibe64DatabaseTools({active:computed(()=>props.active),projectSlug:computed(()=>props.projectSlug),sessionId:computed(()=>props.sessionId)});const activeView=ref(`overview`);const route=useRoute();const router=useRouter();const openedViews=reactive({overview:true,erd:false,data:false});watch(activeView,view=>{openedViews[view]=true},{flush:`sync`});const diagramReturn=shallowRef(null);const diagramSelections=reactive({overview:``,erd:``});const copilotOpen=ref(false);const erdLayout=ref({nodes:[]});const diagramSavesPending=ref(0);let disposed=false;const navigatorTab=ref(`tables`);const tableSearch=ref(``);const selectedTableName=ref(``);const sqlText=ref(``);const queryResult=ref(null);const activeQueryId=ref(``);const resultSearch=ref(``);const hydratedSessionId=ref(``);const filters=ref([]);const filterDialog=ref(false);const filterDraft=reactive({column:``,operator:`=`,value:``});const filterOperators=[`=`,`<>`,`>`,`>=`,`<`,`<=`,`LIKE`,`IS NULL`,`IS NOT NULL`];const cellDialog=ref(false);const editingCell=ref(null);const editingText=ref(``);const editingNull=ref(false);const cellValidationError=ref(``);const lookupItems=ref([]);const lookupSearch=ref(``);const selectedLookupItem=ref(null);const deleteDialog=ref(false);const pendingDelete=ref(null);const insertDialog=ref(false);const insertValues=reactive({});const insertIncluded=reactive({});const insertValidationError=ref(``);const snippetDialog=ref(false);const snippetName=ref(``);const runButton=ref(null);const tableQueryStates=new Map;let lookupTimer=null;const schema=computed(()=>state.value?.schema||{relationships:[],schemas:[],tables:[]});const connection=computed(()=>state.value?.connection||{});const workspace=computed(()=>state.value?.workspace||{history:[],snippets:[]});const databaseScopeLabel=computed(()=>connection.value.developmentDatabaseScope===`project`?`Shared project database`:connection.value.developmentDatabaseScope===`session`?`Session database`:`Resolved database`);const assistantConfigured=computed(()=>Boolean(state.value?.assistant?.available));const assistantCanRun=computed(()=>assistantConfigured.value);const assistantStatusLabel=computed(()=>{const assistant=state.value?.assistant;if(!assistantConfigured.value)return`Unavailable`;return vibe64AssistantSelectionLabel({engineId:assistant.engineId,modelId:assistant.model,variantId:assistant.variantId})});const assistantUnavailableCopy=computed(()=>{return state.value?.assistant?.message||`Ask the owner to choose an Explain & check model in AI setup. Database browsing and editing work without AI.`});const selectedTable=computed(()=>schema.value.tables.find(table=>table.qualifiedName===selectedTableName.value)||null);const assistantTableName=computed(()=>{const name=activeView.value===`data`?selectedTableName.value:diagramSelections[activeView.value];return schema.value.tables.some(table=>table.qualifiedName===name)?name:``});const currentQueryIsDefault=computed(()=>Boolean(selectedTable.value&&sqlText.value.trim()===defaultTableSql(selectedTable.value)));const refreshedLabel=computed(()=>shortDate(schema.value.refreshedAt));const filterColumnOptions=computed(()=>(selectedTable.value?.columns||[]).map(column=>({title:`${column.name} · ${column.nativeType}`,value:column.name})));const editingColumn=computed(()=>editingCell.value?queryResult.value?.columns?.[editingCell.value.columnIndex]:null);const insertColumns=computed(()=>(selectedTable.value?.columns||[]).filter(column=>!column.immutable));const hasInsertValues=computed(()=>insertColumns.value.some(column=>insertIncluded[column.name]));const filteredResultRows=computed(()=>{const rows=Array.isArray(queryResult.value?.rows)?queryResult.value.rows:[];const search=resultSearch.value.trim().toLowerCase();return rows.map((row,index)=>({index,row})).filter(({row})=>!search||row.some(value=>displayValue(value).toLowerCase().includes(search)))});const assistantBinding=useAssistantConversation({boundedTask:{command:assistantCommand,endpoint:assistantEndpoint,scope:()=>props.sessionId,input:messages=>({messages:messages.map(({content:text,role,table})=>({content:text,role,table}))}),result:result=>({content:result.answer,intent:result.intent,role:`assistant`,sql:result.sql}),onResult(result,{message:{table}}){const lastQuery=result.queries?.at(-1)?.result;if(lastQuery&&activeView.value===`data`&&table===selectedTableName.value){queryResult.value=lastQuery;rememberSelectedTableState()}}},active:assistantCanRun,data:()=>({table:assistantTableName.value}),presentation:computed(()=>({assistantLabel:`Copilot`,visible:true,variant:`task`,submitOnEnter:false,submitOnModifierEnter:true,placeholder:assistantTableName.value?`Ask about this table…`:`Ask about this database…`,ariaLabel:`Message database copilot`,submitAriaLabel:`Ask database copilot`}))});const assistantAdapter=assistantBinding.adapter;const resultTitle=computed(()=>{if(!queryResult.value)return`Results`;if(queryResult.value.kind===`command`)return`Statement complete`;return`${queryResult.value.fullRowCount??queryResult.value.rows?.length??0} rows`});const resultEditHint=computed(()=>{if(queryResult.value?.kind!==`result-set`)return``;if(!queryResult.value.rows?.length)return`No rows to edit`;const metadata=queryResult.value.cellMeta||[];if(metadata.some(row=>row.some(cell=>cell?.editable)))return`Pencil-marked cells are editable—click one to change its source value`;const reason=metadata.flat().find(cell=>cell?.reason)?.reason;return reason?`Read-only result: ${reason}`:`Read-only result`});const resultSubtitle=computed(()=>{if(!queryResult.value)return``;const truncation=queryResult.value.truncated?` · limited result`:``;const editHint=resultEditHint.value?` · ${resultEditHint.value}`:``;return`${queryResult.value.durationMs||0} ms${truncation}${editHint}`});watch([state,()=>props.active,activeView],([next,active])=>{if(!active||!next)return;if(hydratedSessionId.value!==props.sessionId){hydratedSessionId.value=props.sessionId;tableQueryStates.clear();selectedTableName.value=``;sqlText.value=``;queryResult.value=null;filters.value=[];assistantBinding.runtime.value.clearHistory();copilotOpen.value=false;diagramReturn.value=null;diagramSelections.overview=``;diagramSelections.erd=``;erdLayout.value=next.layout||{nodes:[]}}if(activeView.value!==`data`)return;if(!selectedTableName.value){if(sqlText.value.trim())return;const firstTable=next.schema?.tables?.[0];if(firstTable)openTable(firstTable,{rememberCurrent:false})}else if(!next.schema?.tables?.some(table=>table.qualifiedName===selectedTableName.value)){const firstTable=next.schema?.tables?.[0];if(firstTable)openTable(firstTable,{rememberCurrent:false});else{selectedTableName.value=``;sqlText.value=``;queryResult.value=null;filters.value=[]}}},{immediate:true});watch(()=>props.sessionId,()=>{if(hydratedSessionId.value!==props.sessionId){hydratedSessionId.value=``;activeView.value=`overview`;openedViews.erd=false;openedViews.data=false}},{immediate:true});let appliedOpenRequest=null;watch([()=>route.query.databaseView,()=>props.openRequest,()=>props.active,()=>props.sessionId],([view,request,active])=>{if(!active)return;if(request?.qualifiedName&&request!==appliedOpenRequest){appliedOpenRequest=request;activeView.value=`erd`}else activeView.value=[`overview`,`erd`,`data`].includes(view)?view:`overview`},{immediate:true});watch(activeView,view=>{const routeView=[`overview`,`erd`,`data`].includes(route.query.databaseView)?route.query.databaseView:`overview`;if(props.active&&routeView!==view)router.replace({path:route.path,query:{...route.query,databaseView:view}})},{flush:`post`,immediate:true});const colleagueDatabase=inject(VIBE64_COLLEAGUE_DATABASE_KEY,null);const displayedDatabase={get projectSlug(){return props.projectSlug},get sessionId(){return props.sessionId},get view(){return activeView.value},get table(){return activeView.value===`data`?selectedTable.value?.qualifiedName||``:``},selectTable(qualifiedName){if(disposed||!props.active||!state.value)throw new Error(`Database is not available in this session.`);const table=schema.value.tables.find(candidate=>candidate.qualifiedName===qualifiedName);if(!table)throw new Error(`The requested table is not in this session’s database snapshot.`);if(running.value)throw new Error(`A query is running. Wait for it to finish or cancel that query before selecting a table.`);navigatorTab.value=`tables`;tableSearch.value=``;openTable(table)},get screen(){if(state.value)return`workspace`;if(loading.value||!error.value)return`loading`;return`unavailable`}};watchEffect(()=>{if(!colleagueDatabase)return;if(props.active)colleagueDatabase.value=displayedDatabase;else if(colleagueDatabase.value===displayedDatabase)colleagueDatabase.value=null});onBeforeUnmount(()=>{if(colleagueDatabase?.value===displayedDatabase)colleagueDatabase.value=null});watch([()=>state.value?.layout,()=>props.active,diagramSavesPending],([layout,active,pending])=>{if(active&&!pending&&layout&&layout.revision>(erdLayout.value.revision||0))erdLayout.value=layout},{immediate:true});onBeforeUnmount(()=>{disposed=true;clearTimeout(lookupTimer)});watch([cellDialog,lookupSearch],([open])=>{clearTimeout(lookupTimer);if(!open||!editingColumn.value?.lookup)return;lookupTimer=setTimeout(()=>void loadLookup(),220)},{immediate:true});watch(selectedLookupItem,item=>{if(!item||!editingColumn.value?.lookup||!editingCell.value)return;const lookup=editingColumn.value.lookup;const sourceColumn=editingColumn.value.origin?.column;const sourceIndex=lookup.sourceColumns.indexOf(sourceColumn);const referencedColumn=lookup.referencedColumns[sourceIndex];if(referencedColumn&&Object.hasOwn(item.keys||{},referencedColumn)){const value=item.keys[referencedColumn];editingNull.value=value==null;editingText.value=value==null?``:String(value)}});function shortDate(value=``){if(!value)return`never`;const date=new Date(value);return Number.isNaN(date.getTime())?String(value):date.toLocaleString([],{dateStyle:`medium`,timeStyle:`short`})}function firstSqlLine(value=``){return String(value||``).trim().split(`
|
|
17
17
|
`)[0].slice(0,80)||`SQL statement`}function quoteIdentifier(name=``){return databaseClientDialect(schema.value.engine).quoteIdentifier(name)}function qualifiedTable(table={}){return[table.schema,table.name].filter(Boolean).map(quoteIdentifier).join(`.`)}function defaultTableSql(table={}){return`SELECT *\nFROM ${[`mysql`,`mariadb`].includes(schema.value.engine)?quoteIdentifier(table.name):qualifiedTable(table)};`}function rememberSelectedTableState(){if(!selectedTableName.value)return;tableQueryStates.set(selectedTableName.value,{filters:filters.value.map(filter=>({...filter})),queryResult:queryResult.value,sqlText:sqlText.value})}async function openTable(table={},{rememberCurrent=true}={}){if(!table.qualifiedName||running.value)return;if(rememberCurrent)rememberSelectedTableState();selectedTableName.value=table.qualifiedName;resultSearch.value=``;activeView.value=`data`;const saved=tableQueryStates.get(table.qualifiedName);if(saved){filters.value=saved.filters.map(filter=>({...filter}));sqlText.value=saved.sqlText;queryResult.value=saved.queryResult;return}filters.value=[];sqlText.value=defaultTableSql(table);queryResult.value=null;await executeQuery({automatic:true})}function selectTable(table={}){return openTable(table)}function selectTableFromErd(table={},view=activeView.value,label=``){if(!table.qualifiedName||running.value)return;diagramReturn.value={view,label:label||(view===`erd`?`ERD`:`Overview`),focusTarget:globalThis.document?.activeElement};navigatorTab.value=`tables`;tableSearch.value=``;return selectTable(table)}function returnToDiagram(){if(!diagramReturn.value)return;activeView.value=diagramReturn.value.view;nextTick(()=>diagramReturn.value?.focusTarget?.focus?.({preventScroll:true}))}function loadSql(value=``){filters.value=[];sqlText.value=String(value||``);activeView.value=`data`;rememberSelectedTableState()}function updateSqlText(value=``){sqlText.value=String(value||``);rememberSelectedTableState()}async function resetTableQuery(){if(!selectedTable.value||running.value)return;filters.value=[];resultSearch.value=``;sqlText.value=defaultTableSql(selectedTable.value);queryResult.value=null;tableQueryStates.delete(selectedTable.value.qualifiedName);await executeQuery({automatic:true})}function sqlLiteral(value=``,column={}){const raw=String(value??``);if(/^(?:smallint|integer|bigint|decimal|numeric|real|double|float|int|tinyint|mediumint)/iu.test(column.dataType||column.nativeType)&&/^-?(?:\d+\.?\d*|\.\d+)$/u.test(raw.trim()))return raw.trim();if(/^(?:boolean|bool)/iu.test(column.dataType||column.nativeType)&&/^(?:true|false)$/iu.test(raw.trim()))return raw.trim().toUpperCase();return databaseClientDialect(schema.value.engine).stringLiteral(raw)}function regenerateFilteredSql(){if(!selectedTable.value)return;const predicates=filters.value.map(filter=>{const column=selectedTable.value.columns.find(candidate=>candidate.name===filter.column)||{};return filter.operator.startsWith(`IS `)?`${quoteIdentifier(filter.column)} ${filter.operator}`:`${quoteIdentifier(filter.column)} ${filter.operator} ${sqlLiteral(filter.value,column)}`});sqlText.value=`${defaultTableSql(selectedTable.value).replace(/;$/u,``)}${predicates.length?`\nWHERE ${predicates.join(`
|
|
18
|
-
AND `)}`:``};`;rememberSelectedTableState()}function addFilter(){filters.value.push({id:crypto.randomUUID(),...filterDraft});filterDialog.value=false;filterDraft.value=``;regenerateFilteredSql()}function removeFilter(id=``){filters.value=filters.value.filter(filter=>filter.id!==id);regenerateFilteredSql()}function focusRunButton(){(runButton.value?.$el||runButton.value)?.focus?.()}async function requestRun(){if(!sqlText.value.trim()||running.value)return;await executeQuery()}async function executeQuery({automatic=currentQueryIsDefault.value}={}){const queryId=crypto.randomUUID();const querySql=sqlText.value;activeQueryId.value=queryId;try{const result=await runQuery({automatic,confirmationDatabase:connection.value.database,confirmed:true,queryId,readOnly:automatic,sql:querySql,writeUnlocked:true});if(result){queryResult.value=result;rememberSelectedTableState()}if(!automatic)await reload()}finally{if(activeQueryId.value===queryId)activeQueryId.value=``}}async function cancelActiveQuery(){if(activeQueryId.value)await cancelQuery(activeQueryId.value)}async function refreshDatabaseSchema(){await refreshSchema()}function displayValue(value){if(value===null)return`NULL`;if(value===void 0)return``;if(typeof value===`object`)return JSON.stringify(value);return String(value)}function resultColumnLabel(column={}){return(queryResult.value?.columns?.filter(candidate=>candidate.label===column.label)||[]).length>1?`${column.label} · ${column.index+1}`:column.label}function cellMetadata(rowIndex,columnIndex){return queryResult.value?.cellMeta?.[rowIndex]?.[columnIndex]||{editable:false,reason:`This result is read-only.`}}function cellTitle(rowIndex,columnIndex){const meta=cellMetadata(rowIndex,columnIndex);return meta.editable?`Double-click to edit the physical source value`:meta.reason}function openCellEditor(rowIndex,columnIndex){const meta=cellMetadata(rowIndex,columnIndex);if(!meta.editable)return;const value=queryResult.value.rows[rowIndex][columnIndex];editingCell.value={columnIndex,meta,rowIndex,value};editingNull.value=value===null;editingText.value=value==null?``:typeof value===`object`?JSON.stringify(value,null,2):String(value);cellValidationError.value=``;lookupItems.value=[];lookupSearch.value=``;selectedLookupItem.value=null;cellDialog.value=true}async function loadLookup(){const lookup=editingColumn.value?.lookup;if(!lookup)return;const result=await searchLookup({relationshipId:lookup.relationshipId,search:lookupSearch.value});lookupItems.value=result?.items||[]}function parsedValue(text,original,column={}){if(editingNull.value)return null;if(typeof original===`number`){const number=Number(text);if(!Number.isFinite(number))throw new Error(`Enter a valid number.`);return number}if(typeof original===`boolean`){if(!/^(?:true|false)$/iu.test(text.trim()))throw new Error(`Enter true or false.`);return text.trim().toLowerCase()===`true`}if(original&&typeof original===`object`)return JSON.parse(text);if(/json/iu.test(column.databaseType||``)&&(text.trim().startsWith(`[`)||text.trim().startsWith(`{`)))return JSON.parse(text);return text}async function saveCell(){if(!editingCell.value)return;cellValidationError.value=``;let value;try{value=parsedValue(editingText.value,editingCell.value.value,editingColumn.value)}catch(error){cellValidationError.value=String(error?.message||`Enter a valid value.`);return}if(!await updateCell({edit:editingCell.value.meta,value}))return;cellDialog.value=false;await refreshVisibleRows()}function rowDeleteIdentity(rowIndex){const sources=queryResult.value?.rowMeta?.[rowIndex]||[];return sources.length===1?sources[0]:null}function requestDeleteRow(rowIndex){pendingDelete.value=rowDeleteIdentity(rowIndex);if(pendingDelete.value)deleteDialog.value=true}async function confirmDeleteRow(){if(!pendingDelete.value)return;if(!await deleteRow({confirmed:true,key:pendingDelete.value.key,table:pendingDelete.value.table}))return;deleteDialog.value=false;pendingDelete.value=null;await refreshVisibleRows()}function openInsertDialog(){if(!selectedTable.value)return;insertValidationError.value=``;for(const column of insertColumns.value){insertValues[column.name]=``;insertIncluded[column.name]=!column.nullable&&!column.default}insertDialog.value=true}function insertValue(column={}){const value=insertValues[column.name];if(value===``&&column.nullable)return null;return parsedValue(String(value??``),``,{databaseType:column.nativeType})}async function saveInsertedRow(){insertValidationError.value=``;let values;try{values=Object.fromEntries(insertColumns.value.filter(column=>insertIncluded[column.name]).map(column=>[column.name,insertValue(column)]))}catch(error){insertValidationError.value=String(error?.message||`Enter valid row values.`);return}if(!await insertRow({table:{name:selectedTable.value.name,schema:selectedTable.value.schema},values}))return;insertDialog.value=false;await refreshVisibleRows()}async function refreshVisibleRows(){const replaySafeCommands=new Set([`DESC`,`DESCRIBE`,`EXPLAIN`,`SELECT`,`SHOW`]);if(queryResult.value?.kind===`result-set`&&replaySafeCommands.has(String(queryResult.value.command||``).toUpperCase())&&sqlText.value.trim()){await executeQuery();return}queryResult.value=null;await reload()}async function saveCurrentSnippet(){if(!await saveSnippet({name:snippetName.value,sql:sqlText.value}))return;snippetDialog.value=false;snippetName.value=``;navigatorTab.value=`saved`;await reload()}async function removeSnippet(id){await deleteSnippet(id);await reload()}let diagramSaveQueue=Promise.resolve();let diagramSaveRevision=0;function saveDiagramLayout(layout){const sessionId=props.sessionId;const revision=++diagramSaveRevision;const previousLayout=erdLayout.value;const pending=JSON.parse(JSON.stringify(layout));pending.revision=previousLayout.revision||0;diagramSavesPending.value+=1;erdLayout.value=pending;diagramSaveQueue=diagramSaveQueue.catch(()=>null).then(async()=>{try{if(disposed||props.sessionId!==sessionId)return;const result=await saveLayout(pending);if(!disposed&&props.sessionId===sessionId&&revision===diagramSaveRevision)erdLayout.value=result?.layout||previousLayout}catch{if(!disposed&&props.sessionId===sessionId&&revision===diagramSaveRevision)erdLayout.value=previousLayout}finally{diagramSavesPending.value-=1}});return diagramSaveQueue}function useAssistantSql(sql){filters.value=[];updateSqlText(sql);activeView.value=`data`}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[unref(loading)&&!unref(state)?(openBlock(),createElementBlock(Fragment,{key:0},[createBaseVNode(`header`,_hoisted_2,[createVNode(VSkeletonLoader,{type:`avatar, list-item-two-line, button@3`})]),createBaseVNode(`div`,_hoisted_3,[createBaseVNode(`aside`,null,[createVNode(VSkeletonLoader,{type:`list-item-two-line@8`})]),createBaseVNode(`main`,null,[createVNode(VSkeletonLoader,{type:`heading, paragraph, table-heading, table-row@7`})])])],64)):unref(error)&&!unref(state)?(openBlock(),createElementBlock(`div`,_hoisted_4,[createVNode(VIcon,{icon:unref(mdiDatabaseAlertOutline),size:`38`},null,8,[`icon`]),_cache[31]||(_cache[31]=createBaseVNode(`strong`,null,`Session database could not open.`,-1)),createBaseVNode(`span`,null,toDisplayString(unref(error)),1),createVNode(VBtn,{color:`primary`,type:`button`,variant:`tonal`,onClick:unref(reload)},{default:withCtx(()=>[..._cache[30]||(_cache[30]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`onClick`])])):(openBlock(),createElementBlock(Fragment,{key:2},[createBaseVNode(`header`,_hoisted_5,[createBaseVNode(`div`,_hoisted_6,[createBaseVNode(`span`,_hoisted_7,[createVNode(VIcon,{icon:unref(mdiDatabaseOutline),size:`20`},null,8,[`icon`])]),createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(connection.value.database||`Session database`),1),createBaseVNode(`span`,null,toDisplayString(connection.value.label)+` · `+toDisplayString(databaseScopeLabel.value)+` · `+toDisplayString(schema.value.tables.length)+` objects · refreshed `+toDisplayString(refreshedLabel.value),1)])]),createVNode(VBtnToggle,{modelValue:activeView.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>activeView.value=$event),mandatory:``,density:`compact`,variant:`outlined`},{default:withCtx(()=>[createVNode(VBtn,{value:`overview`,"data-vibe64-guide":`database-overview`,"prepend-icon":unref(mdiGraphOutline),size:`small`},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`Overview`,-1)])]),_:1},8,[`prepend-icon`]),createVNode(VBtn,{value:`erd`,"data-vibe64-guide":`database-erd`,"prepend-icon":unref(mdiGraphOutline),size:`small`},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`ERD`,-1)])]),_:1},8,[`prepend-icon`]),createVNode(VBtn,{value:`data`,"data-vibe64-guide":`database-data`,"prepend-icon":unref(mdiTableSearch),size:`small`},{default:withCtx(()=>[..._cache[34]||(_cache[34]=[createTextVNode(`Data`,-1)])]),_:1},8,[`prepend-icon`])]),_:1},8,[`modelValue`]),createBaseVNode(`div`,_hoisted_8,[createVNode(VBtn,{"append-icon":copilotOpen.value?unref(mdiChevronRight):unref(mdiChevronLeft),"aria-expanded":copilotOpen.value,"aria-controls":`database-copilot-panel`,"prepend-icon":unref(mdiCreationOutline),size:`small`,title:copilotOpen.value?`Collapse database copilot`:`Open database copilot`,type:`button`,variant:copilotOpen.value?`tonal`:`outlined`,onClick:_cache[1]||(_cache[1]=$event=>copilotOpen.value=!copilotOpen.value)},{default:withCtx(()=>[..._cache[35]||(_cache[35]=[createTextVNode(` Copilot `,-1)])]),_:1},8,[`append-icon`,`aria-expanded`,`prepend-icon`,`title`,`variant`]),createVNode(VBtn,{"aria-busy":unref(refreshing)?`true`:void 0,disabled:unref(refreshing)||unref(running),"prepend-icon":unref(mdiRefresh),size:`small`,type:`button`,variant:`tonal`,onClick:refreshDatabaseSchema},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(` Refresh schema `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])])]),createBaseVNode(`div`,{class:normalizeClass([`database-workspace__body`,{"database-workspace__body--copilot-open":copilotOpen.value,"database-workspace__body--overview":activeView.value===`overview`}])},[createBaseVNode(`aside`,_hoisted_9,[createVNode(VTextField,{modelValue:tableSearch.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>tableSearch.value=$event),"aria-label":`Find tables and views`,class:`database-workspace__table-search`,clearable:``,density:`compact`,"hide-details":``,"prepend-inner-icon":unref(mdiMagnify),placeholder:`Find tables…`,variant:`outlined`},null,8,[`modelValue`,`prepend-inner-icon`]),createVNode(VBtnToggle,{modelValue:navigatorTab.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>navigatorTab.value=$event),mandatory:``,density:`compact`,variant:`text`},{default:withCtx(()=>[createVNode(VBtn,{size:`x-small`,value:`tables`},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Tables`,-1)])]),_:1}),createVNode(VBtn,{size:`x-small`,value:`saved`},{default:withCtx(()=>[..._cache[38]||(_cache[38]=[createTextVNode(`Saved`,-1)])]),_:1}),createVNode(VBtn,{size:`x-small`,value:`history`},{default:withCtx(()=>[..._cache[39]||(_cache[39]=[createTextVNode(`History`,-1)])]),_:1})]),_:1},8,[`modelValue`]),navigatorTab.value===`tables`?(openBlock(),createBlock(DatabaseTableList_default,{key:0,active:__props.active&&activeView.value!==`overview`,schema:schema.value,"selected-table-name":selectedTableName.value,search:tableSearch.value,database:connection.value.database,running:unref(running),onSelectTable:selectTable},{"table-actions":withCtx(()=>[unref(state)?.writeAccess?.available!==false?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiPlus),size:`x-small`,title:`Insert a row into this table`,variant:`text`,onClick:openInsertDialog},{default:withCtx(()=>[..._cache[40]||(_cache[40]=[createTextVNode(`Add row`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true)]),_:1},8,[`active`,`schema`,`selected-table-name`,`search`,`database`,`running`])):navigatorTab.value===`saved`?(openBlock(),createElementBlock(`div`,_hoisted_10,[(openBlock(true),createElementBlock(Fragment,null,renderList(workspace.value.snippets,snippet=>{return openBlock(),createElementBlock(`button`,{key:snippet.id,class:`database-workspace__saved-query`,type:`button`,onClick:$event=>loadSql(snippet.sql)},[createVNode(VIcon,{icon:unref(mdiBookmarkOutline),size:`15`},null,8,[`icon`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(snippet.name),1),createBaseVNode(`small`,null,toDisplayString(shortDate(snippet.updatedAt)),1)]),createVNode(VBtn,{icon:unref(mdiDeleteOutline),size:`x-small`,title:`Delete snippet`,type:`button`,variant:`text`,onClick:withModifiers($event=>removeSnippet(snippet.id),[`stop`])},null,8,[`icon`,`onClick`])],8,_hoisted_11)}),128)),workspace.value.snippets.length===0?(openBlock(),createElementBlock(`p`,_hoisted_12,`Saved queries stay with this session.`)):createCommentVNode(``,true)])):(openBlock(),createElementBlock(`div`,_hoisted_13,[(openBlock(true),createElementBlock(Fragment,null,renderList(workspace.value.history,entry=>{return openBlock(),createElementBlock(`button`,{key:entry.id,class:`database-workspace__saved-query`,type:`button`,onClick:$event=>loadSql(entry.sql)},[createVNode(VIcon,{color:entry.ok?void 0:`error`,icon:entry.ok?unref(mdiHistory):unref(mdiAlertCircleOutline),size:`15`},null,8,[`color`,`icon`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(firstSqlLine(entry.sql)),1),createBaseVNode(`small`,null,toDisplayString(shortDate(entry.at))+` · `+toDisplayString(entry.durationMs)+` ms`,1)])],8,_hoisted_14)}),128)),workspace.value.history.length===0?(openBlock(),createElementBlock(`p`,_hoisted_15,`Statements you run appear here.`)):createCommentVNode(``,true)]))]),createBaseVNode(`main`,_hoisted_16,[openedViews.overview?(openBlock(),createBlock(DatabaseOverview_default,{class:normalizeClass([`database-workspace__view`,{"database-workspace__view--hidden":activeView.value!==`overview`}]),inert:activeView.value!==`overview`||!__props.active,"aria-hidden":activeView.value!==`overview`,key:__props.sessionId,schema:schema.value,overview:unref(state)?.overview||{present:false,hash:``,definition:{version:1,actors:[]}},"assistant-available":__props.assistantAvailable,"save-overview":unref(saveOverview),onSelectTable:_cache[4]||(_cache[4]=(table,label)=>selectTableFromErd(table,`overview`,label)),onInspectTable:_cache[5]||(_cache[5]=$event=>diagramSelections.overview=$event),onReload:unref(reload),onRequestAssistant:requestOverviewAssistant},null,8,[`class`,`inert`,`aria-hidden`,`schema`,`overview`,`assistant-available`,`save-overview`,`onReload`])):createCommentVNode(``,true),openedViews.erd?(openBlock(),createBlock(DatabaseErd_default,{key:__props.sessionId,class:normalizeClass([`database-workspace__view`,{"database-workspace__view--hidden":activeView.value!==`erd`}]),inert:activeView.value!==`erd`||!__props.active,"aria-hidden":activeView.value!==`erd`,layout:erdLayout.value,"focus-request":__props.openRequest,schema:schema.value,onSaveLayout:saveDiagramLayout,onSelectTable:_cache[6]||(_cache[6]=table=>selectTableFromErd(table,`erd`)),onInspectTable:_cache[7]||(_cache[7]=$event=>diagramSelections.erd=$event)},null,8,[`class`,`inert`,`aria-hidden`,`layout`,`focus-request`,`schema`])):createCommentVNode(``,true),openedViews.data?(openBlock(),createElementBlock(`div`,{key:2,class:normalizeClass([`database-workspace__view database-workspace__data`,{"database-workspace__view--hidden":activeView.value!==`data`}]),inert:activeView.value!==`data`||!__props.active,"aria-hidden":activeView.value!==`data`},[createBaseVNode(`section`,_hoisted_18,[createBaseVNode(`header`,_hoisted_19,[createBaseVNode(`div`,_hoisted_20,[diagramReturn.value?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiChevronLeft),size:`small`,variant:`text`,onClick:returnToDiagram},{default:withCtx(()=>[createTextVNode(` Back to `+toDisplayString(diagramReturn.value.label),1)]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true),createVNode(VBtn,{ref_key:`runButton`,ref:runButton,"aria-busy":unref(running)?`true`:void 0,"aria-keyshortcuts":`Control+Enter Meta+Enter`,color:`primary`,disabled:unref(running)||!sqlText.value.trim(),"prepend-icon":unref(mdiPlay),size:`small`,title:`Run SQL, including write statements (Ctrl/Cmd+Enter, or Tab then Enter from the editor)`,type:`button`,variant:`flat`,onClick:requestRun},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(` Run `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`]),createVNode(VBtn,{"aria-busy":unref(cancelling)?`true`:void 0,disabled:!unref(running)||unref(cancelling)||!activeQueryId.value,"prepend-icon":unref(mdiStop),size:`small`,type:`button`,variant:`tonal`,onClick:cancelActiveQuery},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(` Cancel `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`]),createVNode(VBtn,{disabled:!selectedTable.value,"prepend-icon":unref(mdiFilterPlusOutline),size:`small`,type:`button`,variant:`text`,onClick:_cache[8]||(_cache[8]=$event=>filterDialog.value=true)},{default:withCtx(()=>[..._cache[43]||(_cache[43]=[createTextVNode(` Filter `,-1)])]),_:1},8,[`disabled`,`prepend-icon`]),createVNode(VBtn,{disabled:unref(running)||!selectedTable.value,"prepend-icon":unref(mdiRestore),size:`small`,title:`Restore and run this table’s default SELECT * query`,type:`button`,variant:`text`,onClick:resetTableQuery},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(` Reset to SELECT * `,-1)])]),_:1},8,[`disabled`,`prepend-icon`]),(openBlock(true),createElementBlock(Fragment,null,renderList(filters.value,filter=>{return openBlock(),createBlock(VChip,{key:filter.id,closable:``,size:`small`,"onClick:close":$event=>removeFilter(filter.id)},{default:withCtx(()=>[createTextVNode(toDisplayString(filter.column)+` `+toDisplayString(filter.operator)+` `+toDisplayString(filter.value),1)]),_:2},1032,[`onClick:close`])}),128))]),createBaseVNode(`div`,_hoisted_21,[createVNode(VBtn,{disabled:!sqlText.value.trim(),"prepend-icon":unref(mdiBookmarkPlusOutline),size:`small`,type:`button`,variant:`text`,onClick:_cache[9]||(_cache[9]=$event=>snippetDialog.value=true)},{default:withCtx(()=>[..._cache[45]||(_cache[45]=[createTextVNode(` Save `,-1)])]),_:1},8,[`disabled`,`prepend-icon`])])]),createBaseVNode(`div`,_hoisted_22,[createVNode(DatabaseSqlEditor_default,{engine:schema.value.engine,"model-value":sqlText.value,"run-available":!unref(running)&&Boolean(sqlText.value.trim()),schema:schema.value,onFocusRun:focusRunButton,onRun:requestRun,"onUpdate:modelValue":updateSqlText},null,8,[`engine`,`model-value`,`run-available`,`schema`])])]),createBaseVNode(`section`,_hoisted_23,[createBaseVNode(`header`,null,[createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(resultTitle.value),1),queryResult.value?(openBlock(),createElementBlock(`span`,{key:0,title:resultSubtitle.value},toDisplayString(resultSubtitle.value),9,_hoisted_24)):createCommentVNode(``,true)]),queryResult.value?.kind===`result-set`?(openBlock(),createBlock(VTextField,{key:0,modelValue:resultSearch.value,"onUpdate:modelValue":_cache[10]||(_cache[10]=$event=>resultSearch.value=$event),"aria-label":`Find in query results`,clearable:``,density:`compact`,"hide-details":``,"prepend-inner-icon":unref(mdiMagnify),placeholder:`Find in results…`,variant:`outlined`},null,8,[`modelValue`,`prepend-inner-icon`])):createCommentVNode(``,true)]),unref(running)&&!queryResult.value?(openBlock(),createElementBlock(`div`,_hoisted_25,[createVNode(VSkeletonLoader,{type:`table-heading, table-row@7`})])):queryResult.value?.kind===`result-set`?(openBlock(),createElementBlock(`div`,_hoisted_26,[createBaseVNode(`table`,null,[createBaseVNode(`thead`,null,[createBaseVNode(`tr`,null,[_cache[46]||(_cache[46]=createBaseVNode(`th`,{class:`database-workspace__row-number`},`#`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(queryResult.value.columns,column=>{return openBlock(),createElementBlock(`th`,{key:column.index,title:column.origin?`${column.origin.schema}.${column.origin.table}.${column.origin.column}`:column.databaseType},[createBaseVNode(`span`,null,toDisplayString(resultColumnLabel(column)),1),createBaseVNode(`small`,null,toDisplayString(column.databaseType),1)],8,_hoisted_27)}),128)),_cache[47]||(_cache[47]=createBaseVNode(`th`,{class:`database-workspace__row-actions`},`Actions`,-1))])]),createBaseVNode(`tbody`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(filteredResultRows.value,entry=>{return openBlock(),createElementBlock(`tr`,{key:entry.index},[createBaseVNode(`th`,_hoisted_28,toDisplayString(entry.index+1),1),(openBlock(true),createElementBlock(Fragment,null,renderList(entry.row,(value,columnIndex)=>{return openBlock(),createElementBlock(`td`,{key:columnIndex,class:normalizeClass({"database-workspace__cell--editable":cellMetadata(entry.index,columnIndex).editable}),title:cellTitle(entry.index,columnIndex)},[cellMetadata(entry.index,columnIndex).editable?(openBlock(),createElementBlock(`button`,{key:0,"aria-label":`Edit ${resultColumnLabel(queryResult.value.columns[columnIndex])}: ${displayValue(value)}`,class:`database-workspace__cell-editor`,type:`button`,onClick:$event=>openCellEditor(entry.index,columnIndex)},[createBaseVNode(`span`,{class:normalizeClass({"database-workspace__null":value===null})},toDisplayString(displayValue(value)),3),createVNode(VIcon,{icon:unref(mdiPencilOutline),size:`15`},null,8,[`icon`])],8,_hoisted_30)):(openBlock(),createElementBlock(`span`,{key:1,class:normalizeClass({"database-workspace__null":value===null})},toDisplayString(displayValue(value)),3))],10,_hoisted_29)}),128)),createBaseVNode(`td`,_hoisted_31,[createVNode(VBtn,{disabled:!rowDeleteIdentity(entry.index),icon:unref(mdiDeleteOutline),size:`x-small`,title:`Delete source row`,type:`button`,variant:`text`,onClick:$event=>requestDeleteRow(entry.index)},null,8,[`disabled`,`icon`,`onClick`])])])}),128))])]),filteredResultRows.value.length===0?(openBlock(),createElementBlock(`p`,_hoisted_32,`No result rows match this search.`)):createCommentVNode(``,true)])):queryResult.value?.kind===`command`?(openBlock(),createElementBlock(`div`,_hoisted_33,[createVNode(VIcon,{icon:unref(mdiCheckCircleOutline),color:`success`,size:`32`},null,8,[`icon`]),createBaseVNode(`strong`,null,toDisplayString(queryResult.value.command||`Statement`)+` completed`,1),createBaseVNode(`span`,null,toDisplayString(queryResult.value.affectedRows)+` affected rows · `+toDisplayString(queryResult.value.durationMs)+` ms`,1),(openBlock(true),createElementBlock(Fragment,null,renderList(queryResult.value.warnings,warning=>{return openBlock(),createElementBlock(`p`,{key:warning},toDisplayString(warning),1)}),128)),createVNode(VBtn,{"aria-busy":unref(refreshing)?`true`:void 0,disabled:unref(refreshing)||unref(running),"prepend-icon":unref(mdiRefresh),size:`small`,title:`Refresh tables, constraints, and ERD relationships after schema-changing SQL`,type:`button`,variant:`tonal`,onClick:refreshDatabaseSchema},{default:withCtx(()=>[..._cache[48]||(_cache[48]=[createTextVNode(` Refresh schema / ERD `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])])):(openBlock(),createElementBlock(`div`,_hoisted_34,[createVNode(VIcon,{icon:unref(mdiTableSearch),size:`34`},null,8,[`icon`]),_cache[49]||(_cache[49]=createBaseVNode(`strong`,null,`Run the editable SQL above.`,-1)),_cache[50]||(_cache[50]=createBaseVNode(`span`,null,`Direct physical fields remain editable whenever this result includes a complete primary or unique key.`,-1))]))])],10,_hoisted_17)):createCommentVNode(``,true)]),withDirectives(createBaseVNode(`aside`,_hoisted_35,[createBaseVNode(`header`,null,[createBaseVNode(`span`,_hoisted_36,[createVNode(VIcon,{icon:unref(mdiCreationOutline),size:`18`},null,8,[`icon`])]),createBaseVNode(`div`,null,[_cache[51]||(_cache[51]=createBaseVNode(`strong`,null,`Database copilot`,-1)),createBaseVNode(`small`,null,toDisplayString(assistantStatusLabel.value),1)]),createVNode(VBtn,{icon:unref(mdiClose),size:`small`,title:`Collapse database copilot`,type:`button`,variant:`text`,onClick:_cache[11]||(_cache[11]=$event=>copilotOpen.value=false)},null,8,[`icon`])]),assistantCanRun.value?(openBlock(),createElementBlock(`div`,_hoisted_37,[_cache[53]||(_cache[53]=createBaseVNode(`div`,{class:`database-workspace__assistant-note`},` Looks up bounded parts of the refreshed schema as needed. Database credentials stay server-side, schema metadata is untrusted, and it can run only read-only queries. `,-1)),createVNode(unref(AssistantConversationElement_default),{adapter:unref(assistantAdapter),"configuration-mode":`hidden`,label:`Database copilot`},{"message-actions":withCtx(({message})=>[message.table?(openBlock(),createElementBlock(`small`,_hoisted_38,toDisplayString(message.table),1)):createCommentVNode(``,true),message.sql?(openBlock(),createBlock(VBtn,{key:1,"prepend-icon":unref(mdiCodeTags),size:`x-small`,type:`button`,variant:`tonal`,onClick:$event=>useAssistantSql(message.sql)},{default:withCtx(()=>[..._cache[52]||(_cache[52]=[createTextVNode(` Put SQL in editor `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true)]),hints:withCtx(()=>[unref(assistantBusy)?(openBlock(),createElementBlock(`div`,_hoisted_39,[createVNode(VSkeletonLoader,{type:`list-item-two-line, paragraph`})])):createCommentVNode(``,true)]),"composer-tools":withCtx(()=>[createBaseVNode(`small`,_hoisted_40,toDisplayString(assistantTableName.value?`Table: ${assistantTableName.value}`:`Whole database`),1)]),_:1},8,[`adapter`])])):(openBlock(),createElementBlock(`div`,_hoisted_41,[createVNode(VIcon,{icon:unref(mdiInformationOutline),size:`26`},null,8,[`icon`]),_cache[54]||(_cache[54]=createBaseVNode(`strong`,null,`Copilot is unavailable`,-1)),createBaseVNode(`span`,null,toDisplayString(assistantUnavailableCopy.value),1)]))],512),[[vShow,copilotOpen.value]])],2)],64)),createVNode(VDialog,{modelValue:filterDialog.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>filterDialog.value=$event),"max-width":`38rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[55]||(_cache[55]=[createTextVNode(`Add a table filter`,-1)])]),_:1}),createVNode(VCardText,{class:`database-workspace__filter-form`},{default:withCtx(()=>[createVNode(VSelect,{modelValue:filterDraft.column,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>filterDraft.column=$event),items:filterColumnOptions.value,label:`Column`,variant:`outlined`},null,8,[`modelValue`,`items`]),createVNode(VSelect,{modelValue:filterDraft.operator,"onUpdate:modelValue":_cache[13]||(_cache[13]=$event=>filterDraft.operator=$event),items:filterOperators,label:`Operator`,variant:`outlined`},null,8,[`modelValue`]),!filterDraft.operator.startsWith(`IS `)?(openBlock(),createBlock(VTextField,{key:0,modelValue:filterDraft.value,"onUpdate:modelValue":_cache[14]||(_cache[14]=$event=>filterDraft.value=$event),label:`Value`,variant:`outlined`},null,8,[`modelValue`])):createCommentVNode(``,true),_cache[56]||(_cache[56]=createBaseVNode(`p`,null,`The generated SELECT remains ordinary editable SQL.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{type:`button`,variant:`text`,onClick:_cache[15]||(_cache[15]=$event=>filterDialog.value=false)},{default:withCtx(()=>[..._cache[57]||(_cache[57]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,disabled:!filterDraft.column,type:`button`,variant:`flat`,onClick:addFilter},{default:withCtx(()=>[..._cache[58]||(_cache[58]=[createTextVNode(`Add filter`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:cellDialog.value,"onUpdate:modelValue":_cache[22]||(_cache[22]=$event=>cellDialog.value=$event),"max-width":`42rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(`Edit `+toDisplayString(editingColumn.value?.label),1)]),_:1}),createVNode(VCardText,{class:`database-workspace__edit-form`},{default:withCtx(()=>[editingColumn.value?.origin?(openBlock(),createElementBlock(`p`,_hoisted_42,[createBaseVNode(`code`,null,toDisplayString(editingColumn.value.origin.schema)+`.`+toDisplayString(editingColumn.value.origin.table)+`.`+toDisplayString(editingColumn.value.origin.column),1)])):createCommentVNode(``,true),editingColumn.value?.lookup?(openBlock(),createBlock(VAutocomplete,{key:1,modelValue:selectedLookupItem.value,"onUpdate:modelValue":_cache[17]||(_cache[17]=$event=>selectedLookupItem.value=$event),search:lookupSearch.value,"onUpdate:search":_cache[18]||(_cache[18]=$event=>lookupSearch.value=$event),hint:unref(lookupBusy)?`Searching lookup table…`:`Suggestions come from the declared foreign-key target.`,items:lookupItems.value,"item-title":`display`,label:`Choose from referenced table`,"no-filter":``,"persistent-hint":``,"return-object":``,variant:`outlined`},null,8,[`modelValue`,`search`,`hint`,`items`])):createCommentVNode(``,true),createVNode(VCheckbox,{modelValue:editingNull.value,"onUpdate:modelValue":_cache[19]||(_cache[19]=$event=>editingNull.value=$event),label:`Set NULL`},null,8,[`modelValue`]),createVNode(VTextarea,{modelValue:editingText.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>editingText.value=$event),"auto-grow":``,disabled:editingNull.value,"error-messages":cellValidationError.value,label:`Value`,"max-rows":`10`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`error-messages`]),_cache[59]||(_cache[59]=createBaseVNode(`small`,null,`Objects and arrays use JSON. Number and boolean values keep their database-result type.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(updating),type:`button`,variant:`text`,onClick:_cache[21]||(_cache[21]=$event=>cellDialog.value=false)},{default:withCtx(()=>[..._cache[60]||(_cache[60]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(updating)?`true`:void 0,color:`primary`,disabled:unref(updating),type:`button`,variant:`flat`,onClick:saveCell},{default:withCtx(()=>[..._cache[61]||(_cache[61]=[createTextVNode(`Save value`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:deleteDialog.value,"onUpdate:modelValue":_cache[24]||(_cache[24]=$event=>deleteDialog.value=$event),"max-width":`34rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[62]||(_cache[62]=[createTextVNode(`Delete this source row?`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[_cache[63]||(_cache[63]=createTextVNode(`This deletes exactly one row from `,-1)),createBaseVNode(`code`,null,toDisplayString(pendingDelete.value?.table?.schema)+`.`+toDisplayString(pendingDelete.value?.table?.name),1),_cache[64]||(_cache[64]=createTextVNode(` using the key included in the query result.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(deleting),type:`button`,variant:`text`,onClick:_cache[23]||(_cache[23]=$event=>deleteDialog.value=false)},{default:withCtx(()=>[..._cache[65]||(_cache[65]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(deleting)?`true`:void 0,color:`error`,disabled:unref(deleting),type:`button`,variant:`flat`,onClick:confirmDeleteRow},{default:withCtx(()=>[..._cache[66]||(_cache[66]=[createTextVNode(`Delete row`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:insertDialog.value,"onUpdate:modelValue":_cache[26]||(_cache[26]=$event=>insertDialog.value=$event),"max-width":`48rem`,scrollable:``},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(`Insert into `+toDisplayString(selectedTable.value?.qualifiedName),1)]),_:1}),createVNode(VCardText,{class:`database-workspace__insert-form`},{default:withCtx(()=>[insertValidationError.value?(openBlock(),createBlock(VAlert,{key:0,class:`database-workspace__insert-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(insertValidationError.value),1)]),_:1})):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(insertColumns.value,column=>{return openBlock(),createElementBlock(`div`,{key:column.name},[createVNode(VCheckbox,{modelValue:insertIncluded[column.name],"onUpdate:modelValue":$event=>insertIncluded[column.name]=$event,label:column.name,"hide-details":``},null,8,[`modelValue`,`onUpdate:modelValue`,`label`]),createVNode(VTextField,{modelValue:insertValues[column.name],"onUpdate:modelValue":$event=>insertValues[column.name]=$event,disabled:!insertIncluded[column.name],hint:column.default?`Default: ${column.default}`:column.nativeType,"persistent-hint":``,variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`,`disabled`,`hint`])])}),128))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(inserting),type:`button`,variant:`text`,onClick:_cache[25]||(_cache[25]=$event=>insertDialog.value=false)},{default:withCtx(()=>[..._cache[67]||(_cache[67]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(inserting)?`true`:void 0,color:`primary`,disabled:unref(inserting)||!hasInsertValues.value,type:`button`,variant:`flat`,onClick:saveInsertedRow},{default:withCtx(()=>[..._cache[68]||(_cache[68]=[createTextVNode(`Insert row`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:snippetDialog.value,"onUpdate:modelValue":_cache[29]||(_cache[29]=$event=>snippetDialog.value=$event),"max-width":`30rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[69]||(_cache[69]=[createTextVNode(`Save SQL snippet`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VTextField,{modelValue:snippetName.value,"onUpdate:modelValue":_cache[27]||(_cache[27]=$event=>snippetName.value=$event),autofocus:``,label:`Name`,variant:`outlined`},null,8,[`modelValue`])]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{type:`button`,variant:`text`,onClick:_cache[28]||(_cache[28]=$event=>snippetDialog.value=false)},{default:withCtx(()=>[..._cache[70]||(_cache[70]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,disabled:!snippetName.value.trim(),type:`button`,variant:`flat`,onClick:saveCurrentSnippet},{default:withCtx(()=>[..._cache[71]||(_cache[71]=[createTextVNode(`Save`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])])}}};var Vibe64DatabaseWorkspace_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-ccf10ded`]]);export{Vibe64DatabaseWorkspace_default as default};
|
|
18
|
+
AND `)}`:``};`;rememberSelectedTableState()}function addFilter(){filters.value.push({id:crypto.randomUUID(),...filterDraft});filterDialog.value=false;filterDraft.value=``;regenerateFilteredSql()}function removeFilter(id=``){filters.value=filters.value.filter(filter=>filter.id!==id);regenerateFilteredSql()}function focusRunButton(){(runButton.value?.$el||runButton.value)?.focus?.()}async function requestRun(){if(!sqlText.value.trim()||running.value)return;await executeQuery()}async function executeQuery({automatic=currentQueryIsDefault.value}={}){const queryId=crypto.randomUUID();const querySql=sqlText.value;activeQueryId.value=queryId;try{const result=await runQuery({automatic,confirmationDatabase:connection.value.database,confirmed:true,queryId,readOnly:automatic,sql:querySql,writeUnlocked:true});if(result){queryResult.value=result;rememberSelectedTableState()}if(!automatic)await reload()}finally{if(activeQueryId.value===queryId)activeQueryId.value=``}}async function cancelActiveQuery(){if(activeQueryId.value)await cancelQuery(activeQueryId.value)}async function refreshDatabaseSchema(){await refreshSchema()}function displayValue(value){if(value===null)return`NULL`;if(value===void 0)return``;if(typeof value===`object`)return JSON.stringify(value);return String(value)}function resultColumnLabel(column={}){return(queryResult.value?.columns?.filter(candidate=>candidate.label===column.label)||[]).length>1?`${column.label} · ${column.index+1}`:column.label}function cellMetadata(rowIndex,columnIndex){return queryResult.value?.cellMeta?.[rowIndex]?.[columnIndex]||{editable:false,reason:`This result is read-only.`}}function cellTitle(rowIndex,columnIndex){const meta=cellMetadata(rowIndex,columnIndex);return meta.editable?`Double-click to edit the physical source value`:meta.reason}function openCellEditor(rowIndex,columnIndex){const meta=cellMetadata(rowIndex,columnIndex);if(!meta.editable)return;const value=queryResult.value.rows[rowIndex][columnIndex];editingCell.value={columnIndex,meta,rowIndex,value};editingNull.value=value===null;editingText.value=value==null?``:typeof value===`object`?JSON.stringify(value,null,2):String(value);cellValidationError.value=``;lookupItems.value=[];lookupSearch.value=``;selectedLookupItem.value=null;cellDialog.value=true}async function loadLookup(){const lookup=editingColumn.value?.lookup;if(!lookup)return;const result=await searchLookup({relationshipId:lookup.relationshipId,search:lookupSearch.value});lookupItems.value=result?.items||[]}function parsedValue(text,original,column={}){if(editingNull.value)return null;if(typeof original===`number`){const number=Number(text);if(!Number.isFinite(number))throw new Error(`Enter a valid number.`);return number}if(typeof original===`boolean`){if(!/^(?:true|false)$/iu.test(text.trim()))throw new Error(`Enter true or false.`);return text.trim().toLowerCase()===`true`}if(original&&typeof original===`object`)return JSON.parse(text);if(/json/iu.test(column.databaseType||``)&&(text.trim().startsWith(`[`)||text.trim().startsWith(`{`)))return JSON.parse(text);return text}async function saveCell(){if(!editingCell.value)return;cellValidationError.value=``;let value;try{value=parsedValue(editingText.value,editingCell.value.value,editingColumn.value)}catch(error){cellValidationError.value=String(error?.message||`Enter a valid value.`);return}if(!await updateCell({edit:editingCell.value.meta,value}))return;cellDialog.value=false;await refreshVisibleRows()}function rowDeleteIdentity(rowIndex){const sources=queryResult.value?.rowMeta?.[rowIndex]||[];return sources.length===1?sources[0]:null}function requestDeleteRow(rowIndex){pendingDelete.value=rowDeleteIdentity(rowIndex);if(pendingDelete.value)deleteDialog.value=true}async function confirmDeleteRow(){if(!pendingDelete.value)return;if(!await deleteRow({confirmed:true,key:pendingDelete.value.key,table:pendingDelete.value.table}))return;deleteDialog.value=false;pendingDelete.value=null;await refreshVisibleRows()}function openInsertDialog(){if(!selectedTable.value)return;insertValidationError.value=``;for(const column of insertColumns.value){insertValues[column.name]=``;insertIncluded[column.name]=!column.nullable&&!column.default}insertDialog.value=true}function insertValue(column={}){const value=insertValues[column.name];if(value===``&&column.nullable)return null;return parsedValue(String(value??``),``,{databaseType:column.nativeType})}async function saveInsertedRow(){insertValidationError.value=``;let values;try{values=Object.fromEntries(insertColumns.value.filter(column=>insertIncluded[column.name]).map(column=>[column.name,insertValue(column)]))}catch(error){insertValidationError.value=String(error?.message||`Enter valid row values.`);return}if(!await insertRow({table:{name:selectedTable.value.name,schema:selectedTable.value.schema},values}))return;insertDialog.value=false;await refreshVisibleRows()}async function refreshVisibleRows(){const replaySafeCommands=new Set([`DESC`,`DESCRIBE`,`EXPLAIN`,`SELECT`,`SHOW`]);if(queryResult.value?.kind===`result-set`&&replaySafeCommands.has(String(queryResult.value.command||``).toUpperCase())&&sqlText.value.trim()){await executeQuery();return}queryResult.value=null;await reload()}async function saveCurrentSnippet(){if(!await saveSnippet({name:snippetName.value,sql:sqlText.value}))return;snippetDialog.value=false;snippetName.value=``;navigatorTab.value=`saved`;await reload()}async function removeSnippet(id){await deleteSnippet(id);await reload()}let diagramSaveQueue=Promise.resolve();let diagramSaveRevision=0;function saveDiagramLayout(layout){const sessionId=props.sessionId;const revision=++diagramSaveRevision;const previousLayout=erdLayout.value;const pending=JSON.parse(JSON.stringify(layout));pending.revision=previousLayout.revision||0;diagramSavesPending.value+=1;erdLayout.value=pending;diagramSaveQueue=diagramSaveQueue.catch(()=>null).then(async()=>{try{if(disposed||props.sessionId!==sessionId)return;const result=await saveLayout(pending);if(!disposed&&props.sessionId===sessionId&&revision===diagramSaveRevision)erdLayout.value=result?.layout||previousLayout}catch{if(!disposed&&props.sessionId===sessionId&&revision===diagramSaveRevision)erdLayout.value=previousLayout}finally{diagramSavesPending.value-=1}});return diagramSaveQueue}function useAssistantSql(sql){filters.value=[];updateSqlText(sql);activeView.value=`data`}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[unref(loading)&&!unref(state)?(openBlock(),createElementBlock(Fragment,{key:0},[createBaseVNode(`header`,_hoisted_2,[createVNode(VSkeletonLoader,{type:`avatar, list-item-two-line, button@3`})]),createBaseVNode(`div`,_hoisted_3,[createBaseVNode(`aside`,null,[createVNode(VSkeletonLoader,{type:`list-item-two-line@8`})]),createBaseVNode(`main`,null,[createVNode(VSkeletonLoader,{type:`heading, paragraph, table-heading, table-row@7`})])])],64)):unref(error)&&!unref(state)?(openBlock(),createElementBlock(`div`,_hoisted_4,[createVNode(VIcon,{icon:unref(mdiDatabaseAlertOutline),size:`38`},null,8,[`icon`]),_cache[31]||(_cache[31]=createBaseVNode(`strong`,null,`Session database could not open.`,-1)),createBaseVNode(`span`,null,toDisplayString(unref(error)),1),createVNode(VBtn,{color:`primary`,type:`button`,variant:`tonal`,onClick:unref(reload)},{default:withCtx(()=>[..._cache[30]||(_cache[30]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`onClick`])])):(openBlock(),createElementBlock(Fragment,{key:2},[createBaseVNode(`header`,_hoisted_5,[createBaseVNode(`div`,_hoisted_6,[createBaseVNode(`span`,_hoisted_7,[createVNode(VIcon,{icon:unref(mdiDatabaseOutline),size:`20`},null,8,[`icon`])]),createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(connection.value.database||`Session database`),1),createBaseVNode(`span`,null,toDisplayString(connection.value.label)+` · `+toDisplayString(databaseScopeLabel.value)+` · `+toDisplayString(schema.value.tables.length)+` objects · refreshed `+toDisplayString(refreshedLabel.value),1)])]),createVNode(VBtnToggle,{modelValue:activeView.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>activeView.value=$event),mandatory:``,density:`compact`,variant:`outlined`},{default:withCtx(()=>[createVNode(VBtn,{value:`overview`,"data-vibe64-guide":`database-overview`,"prepend-icon":unref(mdiGraphOutline),size:`small`},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`Overview`,-1)])]),_:1},8,[`prepend-icon`]),createVNode(VBtn,{value:`erd`,"data-vibe64-guide":`database-erd`,"prepend-icon":unref(mdiGraphOutline),size:`small`},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`ERD`,-1)])]),_:1},8,[`prepend-icon`]),createVNode(VBtn,{value:`data`,"data-vibe64-guide":`database-data`,"prepend-icon":unref(mdiTableSearch),size:`small`},{default:withCtx(()=>[..._cache[34]||(_cache[34]=[createTextVNode(`Data`,-1)])]),_:1},8,[`prepend-icon`])]),_:1},8,[`modelValue`]),createBaseVNode(`div`,_hoisted_8,[createVNode(VBtn,{"append-icon":copilotOpen.value?unref(mdiChevronRight):unref(mdiChevronLeft),"aria-expanded":copilotOpen.value,"aria-controls":`database-copilot-panel`,"prepend-icon":unref(mdiCreationOutline),size:`small`,title:copilotOpen.value?`Collapse database copilot`:`Open database copilot`,type:`button`,variant:copilotOpen.value?`tonal`:`outlined`,onClick:_cache[1]||(_cache[1]=$event=>copilotOpen.value=!copilotOpen.value)},{default:withCtx(()=>[..._cache[35]||(_cache[35]=[createTextVNode(` Copilot `,-1)])]),_:1},8,[`append-icon`,`aria-expanded`,`prepend-icon`,`title`,`variant`]),createVNode(VBtn,{"aria-busy":unref(refreshing)?`true`:void 0,disabled:unref(refreshing)||unref(running),"prepend-icon":unref(mdiRefresh),size:`small`,type:`button`,variant:`tonal`,onClick:refreshDatabaseSchema},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(` Refresh schema `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])])]),createBaseVNode(`div`,{class:normalizeClass([`database-workspace__body`,{"database-workspace__body--copilot-open":copilotOpen.value,"database-workspace__body--overview":activeView.value===`overview`}])},[createBaseVNode(`aside`,_hoisted_9,[createVNode(VTextField,{modelValue:tableSearch.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>tableSearch.value=$event),"aria-label":`Find tables and views`,class:`database-workspace__table-search`,clearable:``,density:`compact`,"hide-details":``,"prepend-inner-icon":unref(mdiMagnify),placeholder:`Find tables…`,variant:`outlined`},null,8,[`modelValue`,`prepend-inner-icon`]),createVNode(VBtnToggle,{modelValue:navigatorTab.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>navigatorTab.value=$event),mandatory:``,density:`compact`,variant:`text`},{default:withCtx(()=>[createVNode(VBtn,{size:`x-small`,value:`tables`},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Tables`,-1)])]),_:1}),createVNode(VBtn,{size:`x-small`,value:`saved`},{default:withCtx(()=>[..._cache[38]||(_cache[38]=[createTextVNode(`Saved`,-1)])]),_:1}),createVNode(VBtn,{size:`x-small`,value:`history`},{default:withCtx(()=>[..._cache[39]||(_cache[39]=[createTextVNode(`History`,-1)])]),_:1})]),_:1},8,[`modelValue`]),navigatorTab.value===`tables`?(openBlock(),createBlock(DatabaseTableList_default,{key:0,active:__props.active&&activeView.value!==`overview`,schema:schema.value,"selected-table-name":selectedTableName.value,search:tableSearch.value,database:connection.value.database,running:unref(running),onSelectTable:selectTable},{"table-actions":withCtx(()=>[unref(state)?.writeAccess?.available!==false?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiPlus),size:`x-small`,title:`Insert a row into this table`,variant:`text`,onClick:openInsertDialog},{default:withCtx(()=>[..._cache[40]||(_cache[40]=[createTextVNode(`Add row`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true)]),_:1},8,[`active`,`schema`,`selected-table-name`,`search`,`database`,`running`])):navigatorTab.value===`saved`?(openBlock(),createElementBlock(`div`,_hoisted_10,[(openBlock(true),createElementBlock(Fragment,null,renderList(workspace.value.snippets,snippet=>{return openBlock(),createElementBlock(`button`,{key:snippet.id,class:`database-workspace__saved-query`,type:`button`,onClick:$event=>loadSql(snippet.sql)},[createVNode(VIcon,{icon:unref(mdiBookmarkOutline),size:`15`},null,8,[`icon`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(snippet.name),1),createBaseVNode(`small`,null,toDisplayString(shortDate(snippet.updatedAt)),1)]),createVNode(VBtn,{icon:unref(mdiDeleteOutline),size:`x-small`,title:`Delete snippet`,type:`button`,variant:`text`,onClick:withModifiers($event=>removeSnippet(snippet.id),[`stop`])},null,8,[`icon`,`onClick`])],8,_hoisted_11)}),128)),workspace.value.snippets.length===0?(openBlock(),createElementBlock(`p`,_hoisted_12,`Saved queries stay with this session.`)):createCommentVNode(``,true)])):(openBlock(),createElementBlock(`div`,_hoisted_13,[(openBlock(true),createElementBlock(Fragment,null,renderList(workspace.value.history,entry=>{return openBlock(),createElementBlock(`button`,{key:entry.id,class:`database-workspace__saved-query`,type:`button`,onClick:$event=>loadSql(entry.sql)},[createVNode(VIcon,{color:entry.ok?void 0:`error`,icon:entry.ok?unref(mdiHistory):unref(mdiAlertCircleOutline),size:`15`},null,8,[`color`,`icon`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(firstSqlLine(entry.sql)),1),createBaseVNode(`small`,null,toDisplayString(shortDate(entry.at))+` · `+toDisplayString(entry.durationMs)+` ms`,1)])],8,_hoisted_14)}),128)),workspace.value.history.length===0?(openBlock(),createElementBlock(`p`,_hoisted_15,`Statements you run appear here.`)):createCommentVNode(``,true)]))]),createBaseVNode(`main`,_hoisted_16,[openedViews.overview?(openBlock(),createBlock(DatabaseOverview_default,{class:normalizeClass([`database-workspace__view`,{"database-workspace__view--hidden":activeView.value!==`overview`}]),inert:activeView.value!==`overview`||!__props.active,"aria-hidden":activeView.value!==`overview`,key:__props.sessionId,schema:schema.value,overview:unref(state)?.overview||{present:false,hash:``,definition:{version:1,actors:[]}},"assistant-available":__props.assistantAvailable,"save-overview":unref(saveOverview),onSelectTable:_cache[4]||(_cache[4]=(table,label)=>selectTableFromErd(table,`overview`,label)),onInspectTable:_cache[5]||(_cache[5]=$event=>diagramSelections.overview=$event),onReload:unref(reload),onRequestAssistant:requestOverviewAssistant},null,8,[`class`,`inert`,`aria-hidden`,`schema`,`overview`,`assistant-available`,`save-overview`,`onReload`])):createCommentVNode(``,true),openedViews.erd?(openBlock(),createBlock(DatabaseErd_default,{key:__props.sessionId,class:normalizeClass([`database-workspace__view`,{"database-workspace__view--hidden":activeView.value!==`erd`}]),inert:activeView.value!==`erd`||!__props.active,"aria-hidden":activeView.value!==`erd`,layout:erdLayout.value,"focus-request":__props.openRequest,schema:schema.value,onSaveLayout:saveDiagramLayout,onSelectTable:_cache[6]||(_cache[6]=table=>selectTableFromErd(table,`erd`)),onInspectTable:_cache[7]||(_cache[7]=$event=>diagramSelections.erd=$event)},null,8,[`class`,`inert`,`aria-hidden`,`layout`,`focus-request`,`schema`])):createCommentVNode(``,true),openedViews.data?(openBlock(),createElementBlock(`div`,{key:2,class:normalizeClass([`database-workspace__view database-workspace__data`,{"database-workspace__view--hidden":activeView.value!==`data`}]),inert:activeView.value!==`data`||!__props.active,"aria-hidden":activeView.value!==`data`},[createBaseVNode(`section`,_hoisted_18,[createBaseVNode(`header`,_hoisted_19,[createBaseVNode(`div`,_hoisted_20,[diagramReturn.value?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiChevronLeft),size:`small`,variant:`text`,onClick:returnToDiagram},{default:withCtx(()=>[createTextVNode(` Back to `+toDisplayString(diagramReturn.value.label),1)]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true),createVNode(VBtn,{ref_key:`runButton`,ref:runButton,"aria-busy":unref(running)?`true`:void 0,"aria-keyshortcuts":`Control+Enter Meta+Enter`,color:`primary`,disabled:unref(running)||!sqlText.value.trim(),"prepend-icon":unref(mdiPlay),size:`small`,title:`Run SQL, including write statements (Ctrl/Cmd+Enter, or Tab then Enter from the editor)`,type:`button`,variant:`flat`,onClick:requestRun},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(` Run `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`]),createVNode(VBtn,{"aria-busy":unref(cancelling)?`true`:void 0,disabled:!unref(running)||unref(cancelling)||!activeQueryId.value,"prepend-icon":unref(mdiStop),size:`small`,type:`button`,variant:`tonal`,onClick:cancelActiveQuery},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(` Cancel `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`]),createVNode(VBtn,{disabled:!selectedTable.value,"prepend-icon":unref(mdiFilterPlusOutline),size:`small`,type:`button`,variant:`text`,onClick:_cache[8]||(_cache[8]=$event=>filterDialog.value=true)},{default:withCtx(()=>[..._cache[43]||(_cache[43]=[createTextVNode(` Filter `,-1)])]),_:1},8,[`disabled`,`prepend-icon`]),createVNode(VBtn,{disabled:unref(running)||!selectedTable.value,"prepend-icon":unref(mdiRestore),size:`small`,title:`Restore and run this table’s default SELECT * query`,type:`button`,variant:`text`,onClick:resetTableQuery},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(` Reset to SELECT * `,-1)])]),_:1},8,[`disabled`,`prepend-icon`]),(openBlock(true),createElementBlock(Fragment,null,renderList(filters.value,filter=>{return openBlock(),createBlock(VChip,{key:filter.id,closable:``,size:`small`,"onClick:close":$event=>removeFilter(filter.id)},{default:withCtx(()=>[createTextVNode(toDisplayString(filter.column)+` `+toDisplayString(filter.operator)+` `+toDisplayString(filter.value),1)]),_:2},1032,[`onClick:close`])}),128))]),createBaseVNode(`div`,_hoisted_21,[createVNode(VBtn,{disabled:!sqlText.value.trim(),"prepend-icon":unref(mdiBookmarkPlusOutline),size:`small`,type:`button`,variant:`text`,onClick:_cache[9]||(_cache[9]=$event=>snippetDialog.value=true)},{default:withCtx(()=>[..._cache[45]||(_cache[45]=[createTextVNode(` Save `,-1)])]),_:1},8,[`disabled`,`prepend-icon`])])]),createBaseVNode(`div`,_hoisted_22,[createVNode(DatabaseSqlEditor_default,{engine:schema.value.engine,"model-value":sqlText.value,"run-available":!unref(running)&&Boolean(sqlText.value.trim()),schema:schema.value,onFocusRun:focusRunButton,onRun:requestRun,"onUpdate:modelValue":updateSqlText},null,8,[`engine`,`model-value`,`run-available`,`schema`])])]),createBaseVNode(`section`,_hoisted_23,[createBaseVNode(`header`,null,[createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(resultTitle.value),1),queryResult.value?(openBlock(),createElementBlock(`span`,{key:0,title:resultSubtitle.value},toDisplayString(resultSubtitle.value),9,_hoisted_24)):createCommentVNode(``,true)]),queryResult.value?.kind===`result-set`?(openBlock(),createBlock(VTextField,{key:0,modelValue:resultSearch.value,"onUpdate:modelValue":_cache[10]||(_cache[10]=$event=>resultSearch.value=$event),"aria-label":`Find in query results`,clearable:``,density:`compact`,"hide-details":``,"prepend-inner-icon":unref(mdiMagnify),placeholder:`Find in results…`,variant:`outlined`},null,8,[`modelValue`,`prepend-inner-icon`])):createCommentVNode(``,true)]),unref(running)&&!queryResult.value?(openBlock(),createElementBlock(`div`,_hoisted_25,[createVNode(VSkeletonLoader,{type:`table-heading, table-row@7`})])):queryResult.value?.kind===`result-set`?(openBlock(),createElementBlock(`div`,_hoisted_26,[createBaseVNode(`table`,null,[createBaseVNode(`thead`,null,[createBaseVNode(`tr`,null,[_cache[46]||(_cache[46]=createBaseVNode(`th`,{class:`database-workspace__row-number`},`#`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(queryResult.value.columns,column=>{return openBlock(),createElementBlock(`th`,{key:column.index,title:column.origin?`${column.origin.schema}.${column.origin.table}.${column.origin.column}`:column.databaseType},[createBaseVNode(`span`,null,toDisplayString(resultColumnLabel(column)),1),createBaseVNode(`small`,null,toDisplayString(column.databaseType),1)],8,_hoisted_27)}),128)),_cache[47]||(_cache[47]=createBaseVNode(`th`,{class:`database-workspace__row-actions`},`Actions`,-1))])]),createBaseVNode(`tbody`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(filteredResultRows.value,entry=>{return openBlock(),createElementBlock(`tr`,{key:entry.index},[createBaseVNode(`th`,_hoisted_28,toDisplayString(entry.index+1),1),(openBlock(true),createElementBlock(Fragment,null,renderList(entry.row,(value,columnIndex)=>{return openBlock(),createElementBlock(`td`,{key:columnIndex,class:normalizeClass({"database-workspace__cell--editable":cellMetadata(entry.index,columnIndex).editable}),title:cellTitle(entry.index,columnIndex)},[cellMetadata(entry.index,columnIndex).editable?(openBlock(),createElementBlock(`button`,{key:0,"aria-label":`Edit ${resultColumnLabel(queryResult.value.columns[columnIndex])}: ${displayValue(value)}`,class:`database-workspace__cell-editor`,type:`button`,onClick:$event=>openCellEditor(entry.index,columnIndex)},[createBaseVNode(`span`,{class:normalizeClass({"database-workspace__null":value===null})},toDisplayString(displayValue(value)),3),createVNode(VIcon,{icon:unref(mdiPencilOutline),size:`15`},null,8,[`icon`])],8,_hoisted_30)):(openBlock(),createElementBlock(`span`,{key:1,class:normalizeClass({"database-workspace__null":value===null})},toDisplayString(displayValue(value)),3))],10,_hoisted_29)}),128)),createBaseVNode(`td`,_hoisted_31,[createVNode(VBtn,{disabled:!rowDeleteIdentity(entry.index),icon:unref(mdiDeleteOutline),size:`x-small`,title:`Delete source row`,type:`button`,variant:`text`,onClick:$event=>requestDeleteRow(entry.index)},null,8,[`disabled`,`icon`,`onClick`])])])}),128))])]),filteredResultRows.value.length===0?(openBlock(),createElementBlock(`p`,_hoisted_32,`No result rows match this search.`)):createCommentVNode(``,true)])):queryResult.value?.kind===`command`?(openBlock(),createElementBlock(`div`,_hoisted_33,[createVNode(VIcon,{icon:unref(mdiCheckCircleOutline),color:`success`,size:`32`},null,8,[`icon`]),createBaseVNode(`strong`,null,toDisplayString(queryResult.value.command||`Statement`)+` completed`,1),createBaseVNode(`span`,null,toDisplayString(queryResult.value.affectedRows)+` affected rows · `+toDisplayString(queryResult.value.durationMs)+` ms`,1),(openBlock(true),createElementBlock(Fragment,null,renderList(queryResult.value.warnings,warning=>{return openBlock(),createElementBlock(`p`,{key:warning},toDisplayString(warning),1)}),128)),createVNode(VBtn,{"aria-busy":unref(refreshing)?`true`:void 0,disabled:unref(refreshing)||unref(running),"prepend-icon":unref(mdiRefresh),size:`small`,title:`Refresh tables, constraints, and ERD relationships after schema-changing SQL`,type:`button`,variant:`tonal`,onClick:refreshDatabaseSchema},{default:withCtx(()=>[..._cache[48]||(_cache[48]=[createTextVNode(` Refresh schema / ERD `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])])):(openBlock(),createElementBlock(`div`,_hoisted_34,[createVNode(VIcon,{icon:unref(mdiTableSearch),size:`34`},null,8,[`icon`]),_cache[49]||(_cache[49]=createBaseVNode(`strong`,null,`Run the editable SQL above.`,-1)),_cache[50]||(_cache[50]=createBaseVNode(`span`,null,`Direct physical fields remain editable whenever this result includes a complete primary or unique key.`,-1))]))])],10,_hoisted_17)):createCommentVNode(``,true)]),withDirectives(createBaseVNode(`aside`,_hoisted_35,[createBaseVNode(`header`,null,[createBaseVNode(`span`,_hoisted_36,[createVNode(VIcon,{icon:unref(mdiCreationOutline),size:`18`},null,8,[`icon`])]),createBaseVNode(`div`,null,[_cache[51]||(_cache[51]=createBaseVNode(`strong`,null,`Database copilot`,-1)),createBaseVNode(`small`,null,toDisplayString(assistantStatusLabel.value),1)]),createVNode(VBtn,{icon:unref(mdiClose),size:`small`,title:`Collapse database copilot`,type:`button`,variant:`text`,onClick:_cache[11]||(_cache[11]=$event=>copilotOpen.value=false)},null,8,[`icon`])]),assistantCanRun.value?(openBlock(),createElementBlock(`div`,_hoisted_37,[_cache[53]||(_cache[53]=createBaseVNode(`div`,{class:`database-workspace__assistant-note`},` Looks up bounded parts of the refreshed schema as needed. Database credentials stay server-side, schema metadata is untrusted, and it can run only read-only queries. `,-1)),createVNode(unref(AssistantConversationElement_default),{adapter:unref(assistantAdapter),"configuration-mode":`hidden`,label:`Database copilot`},{"message-actions":withCtx(({message})=>[message.table?(openBlock(),createElementBlock(`small`,_hoisted_38,toDisplayString(message.table),1)):createCommentVNode(``,true),message.sql?(openBlock(),createBlock(VBtn,{key:1,"prepend-icon":unref(mdiCodeTags),size:`x-small`,type:`button`,variant:`tonal`,onClick:$event=>useAssistantSql(message.sql)},{default:withCtx(()=>[..._cache[52]||(_cache[52]=[createTextVNode(` Put SQL in editor `,-1)])]),_:1},8,[`prepend-icon`,`onClick`])):createCommentVNode(``,true)]),hints:withCtx(()=>[unref(assistantBusy)?(openBlock(),createElementBlock(`div`,_hoisted_39,[createVNode(VSkeletonLoader,{type:`list-item-two-line, paragraph`})])):createCommentVNode(``,true)]),"composer-tools":withCtx(()=>[createBaseVNode(`small`,_hoisted_40,toDisplayString(assistantTableName.value?`Table: ${assistantTableName.value}`:`Whole database`),1)]),_:1},8,[`adapter`])])):(openBlock(),createElementBlock(`div`,_hoisted_41,[createVNode(VIcon,{icon:unref(mdiInformationOutline),size:`26`},null,8,[`icon`]),_cache[54]||(_cache[54]=createBaseVNode(`strong`,null,`Copilot is unavailable`,-1)),createBaseVNode(`span`,null,toDisplayString(assistantUnavailableCopy.value),1)]))],512),[[vShow,copilotOpen.value]])],2)],64)),createVNode(VDialog,{modelValue:filterDialog.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>filterDialog.value=$event),"max-width":`38rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[55]||(_cache[55]=[createTextVNode(`Add a table filter`,-1)])]),_:1}),createVNode(VCardText,{class:`database-workspace__filter-form`},{default:withCtx(()=>[createVNode(VSelect,{modelValue:filterDraft.column,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>filterDraft.column=$event),items:filterColumnOptions.value,label:`Column`,variant:`outlined`},null,8,[`modelValue`,`items`]),createVNode(VSelect,{modelValue:filterDraft.operator,"onUpdate:modelValue":_cache[13]||(_cache[13]=$event=>filterDraft.operator=$event),items:filterOperators,label:`Operator`,variant:`outlined`},null,8,[`modelValue`]),!filterDraft.operator.startsWith(`IS `)?(openBlock(),createBlock(VTextField,{key:0,modelValue:filterDraft.value,"onUpdate:modelValue":_cache[14]||(_cache[14]=$event=>filterDraft.value=$event),label:`Value`,variant:`outlined`},null,8,[`modelValue`])):createCommentVNode(``,true),_cache[56]||(_cache[56]=createBaseVNode(`p`,null,`The generated SELECT remains ordinary editable SQL.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{type:`button`,variant:`text`,onClick:_cache[15]||(_cache[15]=$event=>filterDialog.value=false)},{default:withCtx(()=>[..._cache[57]||(_cache[57]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,disabled:!filterDraft.column,type:`button`,variant:`flat`,onClick:addFilter},{default:withCtx(()=>[..._cache[58]||(_cache[58]=[createTextVNode(`Add filter`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:cellDialog.value,"onUpdate:modelValue":_cache[22]||(_cache[22]=$event=>cellDialog.value=$event),"max-width":`42rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(`Edit `+toDisplayString(editingColumn.value?.label),1)]),_:1}),createVNode(VCardText,{class:`database-workspace__edit-form`},{default:withCtx(()=>[editingColumn.value?.origin?(openBlock(),createElementBlock(`p`,_hoisted_42,[createBaseVNode(`code`,null,toDisplayString(editingColumn.value.origin.schema)+`.`+toDisplayString(editingColumn.value.origin.table)+`.`+toDisplayString(editingColumn.value.origin.column),1)])):createCommentVNode(``,true),editingColumn.value?.lookup?(openBlock(),createBlock(VAutocomplete,{key:1,modelValue:selectedLookupItem.value,"onUpdate:modelValue":_cache[17]||(_cache[17]=$event=>selectedLookupItem.value=$event),search:lookupSearch.value,"onUpdate:search":_cache[18]||(_cache[18]=$event=>lookupSearch.value=$event),hint:unref(lookupBusy)?`Searching lookup table…`:`Suggestions come from the declared foreign-key target.`,items:lookupItems.value,"item-title":`display`,label:`Choose from referenced table`,"no-filter":``,"persistent-hint":``,"return-object":``,variant:`outlined`},null,8,[`modelValue`,`search`,`hint`,`items`])):createCommentVNode(``,true),createVNode(VCheckbox,{modelValue:editingNull.value,"onUpdate:modelValue":_cache[19]||(_cache[19]=$event=>editingNull.value=$event),label:`Set NULL`},null,8,[`modelValue`]),createVNode(VTextarea,{modelValue:editingText.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>editingText.value=$event),"auto-grow":``,disabled:editingNull.value,"error-messages":cellValidationError.value,label:`Value`,"max-rows":`10`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`error-messages`]),_cache[59]||(_cache[59]=createBaseVNode(`small`,null,`Objects and arrays use JSON. Number and boolean values keep their database-result type.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(updating),type:`button`,variant:`text`,onClick:_cache[21]||(_cache[21]=$event=>cellDialog.value=false)},{default:withCtx(()=>[..._cache[60]||(_cache[60]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(updating)?`true`:void 0,color:`primary`,disabled:unref(updating),type:`button`,variant:`flat`,onClick:saveCell},{default:withCtx(()=>[..._cache[61]||(_cache[61]=[createTextVNode(`Save value`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:deleteDialog.value,"onUpdate:modelValue":_cache[24]||(_cache[24]=$event=>deleteDialog.value=$event),"max-width":`34rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[62]||(_cache[62]=[createTextVNode(`Delete this source row?`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[_cache[63]||(_cache[63]=createTextVNode(`This deletes exactly one row from `,-1)),createBaseVNode(`code`,null,toDisplayString(pendingDelete.value?.table?.schema)+`.`+toDisplayString(pendingDelete.value?.table?.name),1),_cache[64]||(_cache[64]=createTextVNode(` using the key included in the query result.`,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(deleting),type:`button`,variant:`text`,onClick:_cache[23]||(_cache[23]=$event=>deleteDialog.value=false)},{default:withCtx(()=>[..._cache[65]||(_cache[65]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(deleting)?`true`:void 0,color:`error`,disabled:unref(deleting),type:`button`,variant:`flat`,onClick:confirmDeleteRow},{default:withCtx(()=>[..._cache[66]||(_cache[66]=[createTextVNode(`Delete row`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:insertDialog.value,"onUpdate:modelValue":_cache[26]||(_cache[26]=$event=>insertDialog.value=$event),"max-width":`48rem`,scrollable:``},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(`Insert into `+toDisplayString(selectedTable.value?.qualifiedName),1)]),_:1}),createVNode(VCardText,{class:`database-workspace__insert-form`},{default:withCtx(()=>[insertValidationError.value?(openBlock(),createBlock(VAlert,{key:0,class:`database-workspace__insert-error`,density:`compact`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(insertValidationError.value),1)]),_:1})):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(insertColumns.value,column=>{return openBlock(),createElementBlock(`div`,{key:column.name},[createVNode(VCheckbox,{modelValue:insertIncluded[column.name],"onUpdate:modelValue":$event=>insertIncluded[column.name]=$event,label:column.name,"hide-details":``},null,8,[`modelValue`,`onUpdate:modelValue`,`label`]),createVNode(VTextField,{modelValue:insertValues[column.name],"onUpdate:modelValue":$event=>insertValues[column.name]=$event,disabled:!insertIncluded[column.name],hint:column.default?`Default: ${column.default}`:column.nativeType,"persistent-hint":``,variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`,`disabled`,`hint`])])}),128))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(inserting),type:`button`,variant:`text`,onClick:_cache[25]||(_cache[25]=$event=>insertDialog.value=false)},{default:withCtx(()=>[..._cache[67]||(_cache[67]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{"aria-busy":unref(inserting)?`true`:void 0,color:`primary`,disabled:unref(inserting)||!hasInsertValues.value,type:`button`,variant:`flat`,onClick:saveInsertedRow},{default:withCtx(()=>[..._cache[68]||(_cache[68]=[createTextVNode(`Insert row`,-1)])]),_:1},8,[`aria-busy`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),createVNode(VDialog,{modelValue:snippetDialog.value,"onUpdate:modelValue":_cache[29]||(_cache[29]=$event=>snippetDialog.value=$event),"max-width":`30rem`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[69]||(_cache[69]=[createTextVNode(`Save SQL snippet`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VTextField,{modelValue:snippetName.value,"onUpdate:modelValue":_cache[27]||(_cache[27]=$event=>snippetName.value=$event),autofocus:``,label:`Name`,variant:`outlined`},null,8,[`modelValue`])]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{type:`button`,variant:`text`,onClick:_cache[28]||(_cache[28]=$event=>snippetDialog.value=false)},{default:withCtx(()=>[..._cache[70]||(_cache[70]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,disabled:!snippetName.value.trim(),type:`button`,variant:`flat`,onClick:saveCurrentSnippet},{default:withCtx(()=>[..._cache[71]||(_cache[71]=[createTextVNode(`Save`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])])}}};var Vibe64DatabaseWorkspace_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-795f594d`]]);export{Vibe64DatabaseWorkspace_default as default};
|