vibe64 0.1.34 → 0.1.36
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 +1919 -1660
- package/bin/server.js +158 -111
- package/bin/upgrade-state.js +5783 -5605
- package/dist/assets/GithubBrowserTabs-BzJF4k9Y.js +1 -0
- package/dist/assets/{StudioErrorNotice-sQfmeR-z.js → StudioErrorNotice-BdllGqRy.js} +1 -1
- package/dist/assets/{Vibe64AsyncModuleState-Dx7YKRPp.js → Vibe64AsyncModuleState-Bi0TqlIu.js} +1 -1
- package/dist/assets/Vibe64AuthSettingsButton-BuvmwGiT.js +5 -0
- package/dist/assets/Vibe64AuthSettingsButton-M44SSmZ9.css +1 -0
- package/dist/assets/{Vibe64DashboardBackButton-yE6cyYg2.js → Vibe64DashboardBackButton-Ccd4hpD6.js} +1 -1
- package/dist/assets/Vibe64DashboardShell-D67m4aWz.js +1 -0
- package/dist/assets/{Vibe64DashboardShell-MBkUHjs-.css → Vibe64DashboardShell-De2mbdpI.css} +1 -1
- package/dist/assets/{Vibe64DatabaseWorkspace-BONJdxBS.js → Vibe64DatabaseWorkspace-D3uK1gDm.js} +3 -3
- package/dist/assets/{Vibe64DatabaseWorkspace-CR4pzzcf.css → Vibe64DatabaseWorkspace-DPDMxhAW.css} +1 -1
- package/dist/assets/Vibe64OutputControls-BfESn5kJ.js +8 -0
- package/dist/assets/Vibe64OutputControls-D2CCECo5.css +1 -0
- package/dist/assets/{Vibe64RepositoryWorkspace-ByQlZbyO.js → Vibe64RepositoryWorkspace-0jAxvdA8.js} +2 -2
- package/dist/assets/{Vibe64RepositoryWorkspace-CVHcT93M.css → Vibe64RepositoryWorkspace-Agyt4O-V.css} +1 -1
- package/dist/assets/Vibe64SessionFiles-B3ONZrBL.css +1 -0
- package/dist/assets/Vibe64SessionFiles-BCOJ4QmR.js +41 -0
- package/dist/assets/{Vibe64TemporaryAiFixAction-BGlcrq4d.js → Vibe64TemporaryAiFixAction-DM2jpPbQ.js} +1 -1
- package/dist/assets/{Vibe64UiStoryboardView-Brlwdvqi.js → Vibe64UiStoryboardView-DP5af46a.js} +1 -1
- package/dist/assets/{Vibe64UnavailableSessions-zwlWlcZD.js → Vibe64UnavailableSessions-C7XwH1SS.js} +1 -1
- package/dist/assets/{_sessionId_-CvOkQbVy.js → _sessionId_-B1Ymr7c_.js} +1 -1
- package/dist/assets/{_sessionTool_-Dwod5ns9.js → _sessionTool_-DVYdREoI.js} +1 -1
- package/dist/assets/_slug_-CQseA9pt.css +1 -0
- package/dist/assets/_slug_-CYO2vjCd.js +24 -0
- package/dist/assets/{access-BVu5XYm2.js → access-Cb7dkN53.js} +1 -1
- package/dist/assets/app-BvgY7oVf.js +1 -0
- package/dist/assets/app-CZu7oxUO.css +1 -0
- package/dist/assets/{assistantRouting-CwbwfkwB.js → assistantRouting-B38ujQ7x.js} +1 -1
- package/dist/assets/{changes-olY8cnFK.js → changes-lsBcuikn.js} +1 -1
- package/dist/assets/client-CRI5CNKl.js +2 -0
- package/dist/assets/client-TGaWwOhc.css +1 -0
- package/dist/assets/conversation-CDEt9jBx.js +17 -0
- package/dist/assets/conversation-vxJGwmtW.css +1 -0
- package/dist/assets/{dashboard-BnXD-H4R.js → dashboard-D8HOAw46.js} +1 -1
- package/dist/assets/definitions-DLTX17nI.js +1 -0
- package/dist/assets/{env-DJhnLOH7.css → env-BzRtyO0w.css} +1 -1
- package/dist/assets/env-DJezQixO.js +1 -0
- package/dist/assets/health-BJvooRnJ.css +1 -0
- package/dist/assets/health-CtKdN_Nf.js +1 -0
- package/dist/assets/{history-BxlpB-YH.js → history-BdZFOtz4.js} +1 -1
- package/dist/assets/{incoming-BOxRVlOM.js → incoming-VsQNnL9m.js} +1 -1
- package/dist/assets/index-C-osVUKw.css +1 -0
- package/dist/assets/index-C4K3ntms.js +138 -0
- package/dist/assets/{integrations-BFltGDVI.js → integrations-CMQ9EDmt.js} +2 -2
- package/dist/assets/issues-DHpY5hSr.js +1 -0
- package/dist/assets/learning-DXlMuwzh.js +1 -0
- package/dist/assets/mdi-yXT-CQ6u.js +1 -0
- package/dist/assets/placement-NpX2s7u8.js +1 -0
- package/dist/assets/pull-requests-BcKNEUYH.js +1 -0
- package/dist/assets/{repository-JWLVST3D.js → repository-ClEgntHW.js} +1 -1
- package/dist/assets/roboto-latin-wght-normal-ccAYIvAh.woff2 +0 -0
- package/dist/assets/{session-C5Nj8Dlq.js → session-BlD46q-d.js} +1 -1
- package/dist/assets/settings-BwukeIKe.js +1 -0
- package/dist/assets/shared-BM2SV6fi.js +2 -0
- package/dist/assets/studioGateApi-DcCqiD9V.js +1 -0
- package/dist/assets/studioUrls-DmMMIScP.js +1 -0
- package/dist/assets/useArchivedVibe64Sessions-D5zUA-BC.js +1 -0
- package/dist/assets/useCommand-Bqxb-naz.js +1 -0
- package/dist/assets/useEndpointResource-DWoQ2keu.js +1 -0
- package/dist/assets/useRealtimeEvent-Bwapstla.js +1 -0
- package/dist/assets/{useUiFeedback-0FqKuZRP.js → useUiFeedback-BPBF_0bp.js} +1 -1
- package/dist/assets/useVibe64ConversationLog-Dy6YTPQn.js +1 -0
- package/dist/assets/useVibe64DatabaseTools-d6L09ugW.js +1 -0
- package/dist/assets/useVibe64Learning-cNKTv64W.js +1 -0
- package/dist/assets/useVibe64ProjectScope-Bp1ImZlz.js +1 -0
- package/dist/assets/useVibe64SessionData-C_jqncih.js +1 -0
- package/dist/assets/useVibe64SessionSelection-uCEIWd3b.js +1 -0
- package/dist/assets/useVibe64SystemGraph-B4RmsC9Y.js +1 -0
- package/dist/assets/{useVibe64Terminal-BPnN25WH.js → useVibe64Terminal-BbghGR4x.js} +1 -1
- package/dist/assets/vibe64AssistantHost-BL1bnKm8.js +1 -0
- package/dist/assets/{vibe64SessionFocus-kqPOPaOH.js → vibe64SessionFocus-DSJKVuRN.js} +1 -1
- package/dist/assets/{vibe64SessionInfo-BHxtTrLX.js → vibe64SessionInfo-B_r1OMN0.js} +1 -1
- package/dist/assets/{vibe64SessionPanelModel-BMf64fv7.js → vibe64SessionPanelModel-DDorOuiL.js} +1 -1
- package/dist/assets/{vibe64SessionToolDefinitions-NfLd1HZI.js → vibe64SessionToolDefinitions-BualCK_5.js} +1 -1
- package/dist/index.html +21 -20
- package/docs/colleague-usage/account-profile-and-appearance.md +8 -2
- package/docs/colleague-usage/ai-accounts-and-routing.md +123 -15
- package/docs/colleague-usage/ai-onboarding.md +230 -0
- package/docs/colleague-usage/coding-agent-goal-pause.md +5 -5
- package/docs/colleague-usage/coding-agents.md +17 -0
- package/docs/colleague-usage/colleague-watches.md +4 -23
- package/docs/colleague-usage/colleague.md +10 -2
- package/docs/colleague-usage/connected-projects.md +2 -2
- package/docs/colleague-usage/conversation-context.md +2 -0
- package/docs/colleague-usage/dashboard-navigation.md +19 -27
- package/docs/colleague-usage/database.md +6 -11
- package/docs/colleague-usage/development-copies.md +2 -1
- package/docs/colleague-usage/development-env.md +6 -0
- package/docs/colleague-usage/github-work.md +9 -0
- package/docs/colleague-usage/health-checks.md +11 -5
- package/docs/colleague-usage/integrations.md +3 -1
- package/docs/colleague-usage/learning-code-questions.md +23 -51
- package/docs/colleague-usage/learning-course-catalogue.md +8 -6
- package/docs/colleague-usage/learning-environment.md +345 -0
- package/docs/colleague-usage/learning-history.md +70 -101
- package/docs/colleague-usage/learning-mode-ui.md +122 -214
- package/docs/colleague-usage/learning-practice-projects.md +168 -78
- package/docs/colleague-usage/learning-teacher-guide.md +48 -26
- package/docs/colleague-usage/learning-with-colleague.md +171 -216
- package/docs/colleague-usage/lesson-authoring.md +32 -24
- package/docs/colleague-usage/managed-app-access.md +7 -0
- package/docs/colleague-usage/message-delivery-recovery.md +7 -6
- package/docs/colleague-usage/preview-browser-checks.md +9 -1
- package/docs/colleague-usage/preview-starting-application.md +0 -1
- package/docs/colleague-usage/preview.md +9 -1
- package/docs/colleague-usage/project-messages.md +2 -2
- package/docs/colleague-usage/project-setup.md +9 -2
- package/docs/colleague-usage/running-vibe64-on-your-computer.md +61 -0
- package/docs/colleague-usage/sessions.md +25 -33
- package/docs/colleague-usage/teaching-content.md +11 -40
- package/docs/colleague-usage/temporary-chats.md +23 -2
- package/docs/colleague-usage/voice-chat.md +5 -10
- package/docs/colleague-usage/voice-face-and-speaking-voice.md +6 -8
- package/docs/colleague-usage/voice-recovery.md +3 -2
- package/docs/templates/learn-topic/README.md +6 -6
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/lesson.json +28 -7
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/notes.md +19 -0
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/steps/check-understanding.md +3 -0
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/steps/explain-idea.md +3 -0
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/steps/try-it.md +3 -0
- package/docs/templates/learn-topic/training/outline.md +1 -1
- package/docs/training-content.md +179 -65
- 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-runtime/patterns/assistant-surface/PATTERN.md +3 -2
- package/node_modules/@jskit-ai/assistant-runtime/patterns/assistant-surface/example/integrations.json +3 -2
- package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/patterns/ai-connections/PATTERN.md +4 -3
- package/node_modules/@jskit-ai/connectors-catalog/src/shared/ai-models.json +0 -1
- package/node_modules/@local/vibe64-accounts/package.json +1 -0
- package/node_modules/@local/vibe64-colleague/package.json +2 -1
- package/node_modules/@local/vibe64-core/package.json +3 -0
- package/node_modules/@local/vibe64-execution/package.json +1 -0
- package/node_modules/@local/vibe64-execution/src/server/engines/stdioBridge.js +9 -9
- package/node_modules/@local/vibe64-genesis/README.md +10 -37
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +790 -779
- package/node_modules/@local/vibe64-genesis/package.json +1 -0
- package/node_modules/@local/vibe64-genesis/src/server/agentSpecs.js +255 -0
- package/node_modules/@local/vibe64-genesis/src/server/index.js +473 -450
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +148 -148
- package/node_modules/@local/vibe64-project/package.json +2 -1
- package/node_modules/@local/vibe64-runtime/package.json +1 -2
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +526 -512
- package/node_modules/@local/vibe64-runtime/src/shared/assistantRoutingScores.json +0 -1
- package/node_modules/@local/vibe64-source-editor/package.json +1 -0
- package/node_modules/@local/vibe64-terminals/package.json +1 -0
- package/node_modules/@local/vibe64-terminals/src/server/opencodeSessionEnvironmentPlugin.js +129 -131
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1508 -1456
- package/node_modules/@local/vibe64-training/package.json +13 -27
- package/package.json +7 -7
- package/server.bundle.mjs +40946 -41456
- package/dist/assets/GithubBrowserTabs-DO5PHon-.js +0 -1
- package/dist/assets/GithubMarkdown-BQ6MfCDJ.js +0 -3
- package/dist/assets/GithubMarkdown-U7-j-qNI.css +0 -1
- package/dist/assets/Vibe64DashboardShell-CuCVMhOc.js +0 -1
- package/dist/assets/Vibe64OutputControls-DAAmA09l.js +0 -8
- package/dist/assets/Vibe64OutputControls-DPBsyDZM.css +0 -1
- package/dist/assets/Vibe64SessionFiles-B0u9HKdF.js +0 -107
- package/dist/assets/Vibe64SessionFiles-NjOMVwPR.css +0 -1
- package/dist/assets/_slug_-B31c15cc.css +0 -1
- package/dist/assets/_slug_-Dy35qLo1.js +0 -1
- package/dist/assets/app-DRXCcv05.css +0 -1
- package/dist/assets/app-zt7HwQKT.js +0 -1
- package/dist/assets/client-BrV4QPwG.js +0 -2
- package/dist/assets/client-C1bwIlu6.css +0 -1
- package/dist/assets/definitions-DaOPIkyB.js +0 -1
- package/dist/assets/env-DN0vW4EI.js +0 -1
- package/dist/assets/health-7oIQODer.css +0 -1
- package/dist/assets/health-Z6m96GDr.js +0 -1
- package/dist/assets/index-BUq-MczL.js +0 -86
- package/dist/assets/index-DtmBqE3h.css +0 -1
- package/dist/assets/issues-1iS5zoed.js +0 -1
- package/dist/assets/layout-BkWVNT37.js +0 -1
- package/dist/assets/mdi-C54lQ0i_.js +0 -1
- package/dist/assets/placement-DLsU3pCW.js +0 -1
- package/dist/assets/pull-requests-BJOwNL4k.js +0 -1
- package/dist/assets/settings-c273Ikrm.js +0 -1
- package/dist/assets/shared-YZb7ocaK.js +0 -2
- package/dist/assets/studioGateApi-DhA9IJGZ.js +0 -1
- package/dist/assets/studioUrls-Dj8rXeXO.js +0 -1
- package/dist/assets/useArchivedVibe64Sessions-CVZx2Rtm.js +0 -1
- package/dist/assets/useCommand-DWuxfAV0.js +0 -1
- package/dist/assets/useEndpointResource-MWVNfmMa.js +0 -1
- package/dist/assets/useVibe64ConversationLog-8cKh1eDm.js +0 -1
- package/dist/assets/useVibe64DatabaseTools-BcRG1s3i.js +0 -1
- package/dist/assets/useVibe64LearningMode-Bl0dGdCh.js +0 -28
- package/dist/assets/useVibe64LearningMode-C3PcXdVg.css +0 -1
- package/dist/assets/useVibe64ProjectScope-DOEVkBqX.js +0 -1
- package/dist/assets/useVibe64SessionData-DFTyLzci.js +0 -1
- package/dist/assets/useVibe64SessionSelection-j9lsllx4.js +0 -1
- package/dist/assets/useVibe64SystemGraph-tNkIwSBQ.js +0 -1
- package/dist/assets/vibe64AssistantHost-DdE_-lZF.js +0 -1
- package/dist/assets/vibe64LessonDashboard-DlKYjisq.js +0 -1
- package/dist/assets/vibe64ProjectScope.local-DqT6e5un.js +0 -1
- package/docs/colleague-usage/learning-chat-retention.md +0 -74
- package/docs/colleague-usage/learning-diagrams-and-voice.md +0 -97
- package/docs/colleague-usage/learning-lesson-watch.md +0 -95
- package/docs/colleague-usage/learning-native-session.md +0 -206
- package/docs/colleague-usage/learning-practical-exercises.md +0 -71
- package/docs/colleague-usage/learning-practical-gestures.md +0 -48
- package/docs/colleague-usage/learning-session-creation.md +0 -95
- package/docs/colleague-usage/lesson-practical-assessment.md +0 -54
- package/docs/colleague-usage/preview-lesson-presentation.md +0 -56
- package/docs/templates/learn-topic/training/lessons/TOPIC-01/lesson.md +0 -44
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Vibe64OutputControls-DAAmA09l.js","assets/ripple-BVltMmyV.js","assets/runtime-core.esm-bundler-DGXg_mpN.js","assets/ripple-DqhAt1Ze.css","assets/useEndpointResource-MWVNfmMa.js","assets/vibe64ProjectScope.local-DqT6e5un.js","assets/normalize-CO2KHj_d.js","assets/deepFreeze-BgoYkoTa.js","assets/VMenu-C_x18lwb.js","assets/VOverlay-CeMZurIN.js","assets/VAvatar-DPzqDH4r.js","assets/VAvatar-9ilDR2r2.css","assets/lazy-NHSwD9FS.js","assets/VOverlay-DG-PukqI.css","assets/createSimpleFunctional-CZTGuNuR.js","assets/ssrBoot-Rlh6kLbD.js","assets/VDivider-BMEqUoAB.js","assets/VDivider-DvkP_iX7.css","assets/VMenu-D_W8zRGm.css","assets/VChip-CcI-Oo2J.js","assets/VChip-PprDbmQn.css","assets/VTextField-BR2eZeFT.js","assets/VTextField-BiatYyd3.css","assets/vibe64AssistantHost-DdE_-lZF.js","assets/mdi-C54lQ0i_.js","assets/VBtn-B2MBK2DL.js","assets/VBtn-uSpaN2Ha.css","assets/VAlert-P256xaE0.js","assets/VAlert-DVXMoK42.css","assets/VCheckbox-C7A1ZW4D.js","assets/VCheckbox-ChRKi1kj.css","assets/VDialog-Bu3EfKb1.js","assets/VDialog-DP-kc9Gx.css","assets/VCard-mXy0k4aS.js","assets/VCard-dv-Dc592.css","assets/VSpacer-Dhmsvk4t.js","assets/VSpacer-DfbUir7X.css","assets/_plugin-vue_export-helper-DNW4j-dv.js","assets/useVibe64Terminal-BPnN25WH.js","assets/preload-helper-BvdcsxN9.js","assets/VSheet-DZWsu0kL.js","assets/VSheet-BbLSwuzR.css","assets/StudioErrorNotice-sQfmeR-z.js","assets/StudioErrorNotice-1K8E_MXD.css","assets/browserLocalStorage-B4C7rHrs.js","assets/clipboard-CZs9aH3L.js","assets/useVibe64Terminal-Bk2QOSDO.css","assets/usePaths-Db88-HOm.js","assets/useApi-BPuI6ZR9-CFWU1m37.js","assets/surface-DY1u73tB.js","assets/placement-CwTqWLQH.js","assets/pathname-Bb895US8.js","assets/useCommand-DWuxfAV0.js","assets/error-Dug56can.js","assets/useUiFeedback-0FqKuZRP.js","assets/useVibe64ProjectScope-DOEVkBqX.js","assets/vibe64BrowserTabOrigin-SF9E31vi.js","assets/index-BUq-MczL.js","assets/VSelect-DL3HaA5m.js","assets/VSelect-y7fezdfU.css","assets/layout-BkWVNT37.js","assets/VAutocomplete-BDb95qJX.js","assets/VAutocomplete-D48FgPMA.css","assets/VRow-Cpw7OHQV.js","assets/VRow-DIr3-SqU.css","assets/VExpansionPanels-Dgjrop0V.js","assets/VExpansionPanels-cvCWEkWz.css","assets/client-BrV4QPwG.js","assets/VSkeletonLoader-CttxM1tw.js","assets/VSkeletonLoader-LCPSxykp.css","assets/VSwitch-BRHeDJkH.js","assets/VSwitch-FGoTnWb6.css","assets/shared-YZb7ocaK.js","assets/assistantRouting-CwbwfkwB.js","assets/studioUrls-Dj8rXeXO.js","assets/shared-BEwrtWSp.js","assets/vibe64ApiResponses-DNLY1Kel.js","assets/client-C1bwIlu6.css","assets/VTextarea-DbqamXJd.js","assets/VTextarea-DDl63AeD.css","assets/thinkingText-DewCOEcu.js","assets/useVibe64DatabaseTools-BcRG1s3i.js","assets/useVibe64SystemGraph-tNkIwSBQ.js","assets/vibe64LessonDashboard-DlKYjisq.js","assets/index-DtmBqE3h.css","assets/Vibe64TemporaryAiFixAction-BGlcrq4d.js","assets/Vibe64TemporaryAiFixAction-D_mq1dFE.css","assets/vibe64SessionPanelModel-BMf64fv7.js","assets/vibe64SessionViewModel-DR4tOlGM.js","assets/Vibe64OutputControls-DPBsyDZM.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{Gn as withKeys,Kn as withModifiers,Wn as vShow,d as VProgressLinear,h as VIcon,q as useTheme,zn as Transition}from"./ripple-BVltMmyV.js";import{$n as normalizeProps,B as h,Cn as toRaw,D as createVNode,E as createTextVNode,En as toValue,H as hasInjectionContext,Ht as watch,J as inject,O as defineAsyncComponent,On as unref,Pt as useId,T as createStaticVNode,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,hn as proxyRefs,it as onBeforeUnmount,k as defineComponent,mt as openBlock,o as Fragment,pn as onScopeDispose,qt as withCtx,tr as toDisplayString,tt as nextTick,u as Teleport,un as isRef,v as createBlock,vn as ref,w as createSlots,wt as resolveDynamicComponent,xn as shallowRef,xt as renderSlot,y as createCommentVNode,z as guardReactiveProps}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{n as useShellWebErrorRuntime}from"./error-Dug56can.js";import{J as useQueryClient,T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-MWVNfmMa.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{M as useRealtimeSocket,i as projectSlugFromPathname,j as useRealtimeEvent,n as normalizeProjectRoutePath,r as projectAppPath,s as vibe64ProjectScopedStorageKey,u as getHttpWebClient}from"./vibe64ProjectScope.local-DqT6e5un.js";import{t as __vitePreload}from"./preload-helper-BvdcsxN9.js";import{t as VSelect}from"./VSelect-DL3HaA5m.js";import{g as useDisplay,n as VBadge}from"./VAvatar-DPzqDH4r.js";import{c as VListItemTitle,n as VList,s as VListItem,t as VMenu}from"./VMenu-C_x18lwb.js";import{t as VChip}from"./VChip-CcI-Oo2J.js";import{t as VTextField}from"./VTextField-BR2eZeFT.js";import{c as VIBE64_COLLEAGUE_LAYOUT_KEY,d as VIBE64_COLLEAGUE_VIEW_KEY,f as VIBE64_HOST_CONVERSATION_KEY,i as VIBE64_COLLEAGUE_BODY_KEY,l as VIBE64_COLLEAGUE_PLAN_KEY,m as VIBE64_TRAINING_LEARNER_GESTURE_KEY,n as VIBE64_ASSISTANT_VIEWER_KEY,r as VIBE64_BROWSER_NAVIGATION_KEY,s as VIBE64_COLLEAGUE_LAUNCHER_KEY,t as VIBE64_ASSISTANT_HOST_KEY,u as VIBE64_COLLEAGUE_PREVIEW_KEY}from"./vibe64AssistantHost-DdE_-lZF.js";import{$ as mdiConsoleNetworkOutline,A as mdiCheckCircleOutline,An as mdiPlus,B as mdiClose,Bn as mdiSchoolOutline,Bt as mdiHistory,D as mdiCameraOutline,Dn as mdiPinOutline,En as mdiPin,F as mdiCircle,Fn as mdiRefresh,Ft as mdiGithub,Gn as mdiSourceBranchSync,Gt as mdiIncognito,H as mdiCloudDownloadOutline,I as mdiCircleOutline,In as mdiRestart,J as mdiCogOutline,Jn as mdiSourcePull,Kn as mdiSourceCommit,Kt as mdiInformationOutline,L as mdiCircleSlice4,Ln as mdiRestore,N as mdiChevronRight,O as mdiCheck,Qn as mdiStop,Rn as mdiRobotOutline,S as mdiAutorenew,Sn as mdiPaperclip,Tn as mdiPencilOutline,Vn as mdiSend,Wn as mdiSourceBranch,Zn as mdiStarOutline,_r as mdiWrenchOutline,ar as mdiTuneVariant,bn as mdiMonitor,bt as mdiFileDocumentEditOutline,dt as mdiDotsVertical,f as mdiArchiveCheckOutline,g as mdiArrowLeft,gt as mdiEyePlusOutline,hn as mdiMagnify,hr as mdiWeatherSunny,j as mdiChevronDown,kn as mdiPlayCircleOutline,l as mdiAlertCircleOutline,m as mdiArchiveOutline,mr as mdiWeatherNight,n as mdiAccountCogOutline,nt as mdiContentSaveOutline,o as mdiAccountOutline,s as mdiAccountStarOutline,tt as mdiContentSaveAlertOutline,u as mdiArchiveArrowDownOutline,ut as mdiDotsHorizontalCircleOutline,x as mdiAutoFix,xt as mdiFileDocumentOutline,y as mdiArrowTopRight}from"./mdi-C54lQ0i_.js";import{i as VBtnToggle,r as VProgressCircular,t as VBtn}from"./VBtn-B2MBK2DL.js";import{t as VAlert}from"./VAlert-P256xaE0.js";import{t as VCheckbox}from"./VCheckbox-C7A1ZW4D.js";import{t as VDivider}from"./VDivider-BMEqUoAB.js";import{t as VSheet}from"./VSheet-DZWsu0kL.js";import{t as VDialog}from"./VDialog-Bu3EfKb1.js";import{a as Vibe64StarredFilesList_default,c as conversationAttribution,d as _sfc_main$40,f as _sfc_main$41,h as assistantAttachmentFilesFromPasteEvent,i as sourceEditorLinkTarget,l as Vibe64ConversationStatus_default,m as useVibe64AttachmentCommands,n as Vibe64SessionSourceEditor_default,o as thinkingMessagePresentation,p as useAgentAttachments,r as Vibe64ConversationLog_default,s as usesCommentaryForThinking,t as Vibe64SessionFiles_default,u as _sfc_main$39}from"./Vibe64SessionFiles-B0u9HKdF.js";import{i as VCardTitle,n as VCardText,o as VCardActions,t as VCard}from"./VCard-mXy0k4aS.js";import{t as VSpacer}from"./VSpacer-Dhmsvk4t.js";import{i as VExpansionPanelText,n as VExpansionPanel,t as VExpansionPanels}from"./VExpansionPanels-Dgjrop0V.js";import{a as ProviderAccountsSetup_default,c as ModelRoutingForm_default,f as VForm,i as useVibe64Accounts,l as useModelRouting,n as accountRowsForStatus,o as CODEX_RECONNECT_REQUIRED_CODE,r as AiConnectionsSettings_default,s as CODEX_RECONNECT_REQUIRED_MESSAGE,u as VIBE64_ACCOUNTS_CHANGED_EVENT}from"./client-BrV4QPwG.js";import{t as VSkeletonLoader}from"./VSkeletonLoader-CttxM1tw.js";import{t as VSwitch}from"./VSwitch-BRHeDJkH.js";import{t as VTextarea}from"./VTextarea-DbqamXJd.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{a as Vibe64Terminal_default,f as isDynamicImportError,i as useShellAsyncModuleRecoveryRuntime,l as dynamicImportErrorMessage,n as createWebSocketTerminalDriver,o as Vibe64TerminalSurface_default,s as terminalLastMeaningfulLine,t as useVibe64Terminal}from"./useVibe64Terminal-BPnN25WH.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{c as vibe64AssistantSelectionLabel,d as defaultVibe64AgentSettings,f as normalizeVibe64AgentSettings,l as VIBE64_AGENT_PROVIDERS,n as normalizedPromptHintSuggestion,o as normalizeVibe64ConversationAttachments,p as VIBE64_ASSISTANT_ACCESS_ERROR_CODES,r as normalizedPromptHintSuggestions,s as VIBE64_AGENT_TASK_RESULT_SCHEMA,t as normalizedPromptHintDraft,u as VIBE64_DEFAULT_AGENT_PROVIDER_ID}from"./shared-YZb7ocaK.js";import{c as assistantRoutingOutcomeNotice,d as assistantRoutingStatusLabel,l as assistantRoutingRequestCanBeReplaced,o as assistantModeLabel,s as assistantRoutingFromMetadata,t as ASSISTANT_MODES,u as assistantRoutingStatusIsPending}from"./assistantRouting-CwbwfkwB.js";import{t as useCommand}from"./useCommand-DWuxfAV0.js";import{t as useUiFeedback}from"./useUiFeedback-0FqKuZRP.js";import{i as studioApiPath,n as resolveWebSocketUrl,r as scopedDevelopmentApiUrl,t as resolveStudioRequestUrl}from"./studioUrls-Dj8rXeXO.js";import{t as StudioErrorNotice_default}from"./StudioErrorNotice-sQfmeR-z.js";import{r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{t as writeClipboardText}from"./clipboard-CZs9aH3L.js";import"./shared-BEwrtWSp.js";import{n as vibe64ApiResponseError,r as vibe64ResourceResponseError,t as vibe64ApiError}from"./vibe64ApiResponses-DNLY1Kel.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-DOEVkBqX.js";import{n as vibe64RealtimeOriginPayload,t as vibe64BrowserTabOriginId}from"./vibe64BrowserTabOrigin-SF9E31vi.js";import{a as lessonDashboardScope,n as LESSON_DASHBOARD_SESSION_TOOLS,r as VIBE64_LESSON_DASHBOARD_KEY,t as LESSON_DASHBOARD_PROJECT_SECTIONS}from"./vibe64LessonDashboard-DlKYjisq.js";import{$t as AssistantComposerSupport_default,A as agentTurnControlPayloadFromContext,At as latestAssistantMessageAwaitingUserReply,B as vibe64OutputRunPath,D as VIBE64_SOURCE_EDITOR_FILE_CHANGED_EVENT,E as VIBE64_SESSION_CHANGED_EVENT,F as vibe64AgentTerminalPath,Gt as unmatchedOptimisticMessages,It as mainConversationId,Jt as AssistantConversationElement_default,Lt as mainConversationTarget,Mt as createTrainingNavigation,Nt as useTrainingPresentationCue,P as vibe64AgentTerminalControlTextPath,Pt as useTrainingLearnerGestures,Q as vibe64SessionPath,Qt as AssistantGoalControl_default,R as vibe64GlobalCodexTerminalPath,Rt as temporaryConversationId,S as VIBE64_API_SUFFIX,St as createAssistantApi,T as VIBE64_SESSIONS_API_SUFFIX,X as vibe64SessionCheckUpdatesPath,Xt as AssistantQuestionInputs_default,Yt as AssistantModelControl_default,Z as vibe64SessionEventMatchesScope,_ as readRefOrGetterValue,an as parseLongTextReviewBlocks,b as useVibe64AssistantCatalog,bt as useAssistantConversation,cn as VTab,dn as VMain,et as vibe64SessionPromptHintsCancelPath,fn as VContainer,g as Vibe64SessionAssistantMenu_default,gn as VAppBar,gt as vibe64SourceEditorStarsPath,h as trainingPresentationReceipt,hn as VBottomSheet,in as LongTextPreviewBlocks_default,ln as VTooltip,m as executeTrainingPresentationOperation,n as writeAppearance,nt as vibe64SessionQueryKey,o as _sfc_main$42,p as useTrainingWorkspaceObservation,qt as useAssistantQuestions,sn as VTabs,t as readAppearance,tt as vibe64SessionPromptHintsPath,v as onVibe64AccountConnectionsDialogRequested,vt as vibe64TemporaryConversationPath,xt as useAssistantConversationFactory,y as requestVibe64AccountConnectionsDialog,yt as vibe64TemporaryConversationsPath,zt as useVibe64Voice}from"./index-BUq-MczL.js";import{t as Vibe64TemporaryAiFixAction_default}from"./Vibe64TemporaryAiFixAction-BGlcrq4d.js";import{a as vibe64SessionDebugDurationMs,c as vibe64SessionDebugSummary,l as vibe64SessionSourcePath,n as enrichVibe64SessionForDisplay,o as vibe64SessionDebugError,r as vibe64SessionMatchesPurpose,s as vibe64SessionDebugLog,t as blockingVibe64SessionPageError}from"./vibe64SessionPanelModel-BMf64fv7.js";import{a as vibe64SessionPullRequest,c as vibe64SessionStatusLabel,i as vibe64SessionDisplayTitle,o as vibe64SessionRevision,s as vibe64SessionStatusColor,t as isArchivedVibe64Session}from"./vibe64SessionViewModel-DR4tOlGM.js";import{D as projectSettingsQueryKey,E as projectSelectionQueryKey,b as VIBE64_PROJECT_CREATE_API_SUFFIX,c as PROJECT_SELECTION_ENDPOINT,l as PROJECT_SETTINGS_ENDPOINT,p as VIBE64_CONNECTIONS_CHANGED_EVENT,x as VIBE64_PROJECT_SELECT_API_SUFFIX,y as VIBE64_PROJECT_CHANGED_EVENT}from"./studioGateApi-DhA9IJGZ.js";import{t as Vibe64DashboardBackButton_default}from"./Vibe64DashboardBackButton-yE6cyYg2.js";import{t as githubProjectAvailable}from"./vibe64GithubProject-CdFrbVHp.js";import{i as Vibe64CreatePullRequestDialog_default,n as Vibe64AssistantSessionDialog_default,r as Vibe64WorkflowSelector_default,t as focusCreatedVibe64SessionTab}from"./vibe64SessionFocus-kqPOPaOH.js";import{t as Vibe64AsyncModuleState_default}from"./Vibe64AsyncModuleState-Dx7YKRPp.js";import{t as vibe64SessionInfoFacts}from"./vibe64SessionInfo-BHxtTrLX.js";import{t as Vibe64DashboardShell_default}from"./Vibe64DashboardShell-CuCVMhOc.js";import{a as vibe64SessionToolIdFromRouteSegment,i as vibe64SessionToolDashboardSuffix,o as vibe64SessionToolRouteSegment,r as VIBE64_SESSION_TOOL_DEFINITIONS}from"./vibe64SessionToolDefinitions-NfLd1HZI.js";import{a as mountedSessionDetailRefreshReason,c as sessionRecordHasActiveAgentWork,d as sessionWithAgentTurnRealtimeOverlay,i as mountedSessionDetailLoadState,l as agentTurnRealtimeOverlayFromPayload,n as useVibe64SessionData,o as mountedSessionRealtimeShouldRefresh,r as latestSessionDetailRecord,s as mountedSessionRecord,u as latestAgentTurnRealtimeOverlay}from"./useVibe64SessionData-DFTyLzci.js";import{t as useVibe64ConversationLog}from"./useVibe64ConversationLog-8cKh1eDm.js";import{t as Vibe64UnavailableSessions_default}from"./Vibe64UnavailableSessions-zwlWlcZD.js";import{n as repositoryStatusRealtimeShouldRefresh,r as repositoryStatusSessionId,t as repositoryStatusRealtimeNeedsCanonicalCheck}from"./vibe64RepositoryRealtime-DXk0Jai3.js";function useAssistantSuggestions({active=true,requestKey=``,draft=``,configuration={},generate,onSelect=()=>false,debounceMs=750,minIntervalMs=0}={}){const items=ref([]);const loading=ref(false);const preview=ref(``);const error=ref(``);const dismissedKey=ref(null);const composerFocused=ref(false);const currentDraft=computed(()=>String(toValue(draft)??``).trim());const configurationKey=computed(()=>JSON.stringify(toValue(configuration)??{}));const key=computed(()=>JSON.stringify([toValue(requestKey),currentDraft.value,configurationKey.value]));const eligible=computed(()=>toValue(active)!==false&&typeof unref(generate)===`function`&&dismissedKey.value!==key.value);const visible=computed(()=>eligible.value&&(loading.value||items.value.length>0));let timer;let request;let lastStartedAt=-Infinity;function cancel(){clearTimeout(timer);const previous=request;request=null;previous?.abort();loading.value=false}watch([eligible,key,()=>unref(generate)],()=>{cancel();items.value=[];preview.value=``;error.value=``;if(!eligible.value)return;const controller=new AbortController;request=controller;const input={draft:currentDraft.value,configuration:JSON.parse(configurationKey.value),signal:controller.signal};const run=unref(generate);loading.value=true;timer=setTimeout(async()=>{lastStartedAt=Date.now();try{const result=await run(input);if(request!==controller)return;if(!Array.isArray(result)||result.some(item=>!item?.label?.trim()||!item?.prompt?.trim()))throw new TypeError(`Suggestions must contain a label and prompt.`);items.value=result.map(({label,prompt})=>({label:label.trim(),prompt:prompt.trim()}))}catch(failure){if(request===controller&&!controller.signal.aborted)error.value=String(failure.message||failure)}finally{if(request===controller){request=null;loading.value=false}}},Math.max(0,Number(toValue(debounceMs))||0,lastStartedAt+Math.max(0,Number(toValue(minIntervalMs))||0)-Date.now()))},{immediate:true,flush:`sync`});function currentSuggestion(value){return items.value.find(item=>item.label===value?.label&&item.prompt===value?.prompt)}function previewSuggestion(value){preview.value=currentDraft.value?``:currentSuggestion(value)?.prompt||``;return Boolean(preview.value)}function select(value){const suggestion=currentSuggestion(value);if(!suggestion||!eligible.value)return false;preview.value=``;return onSelect(suggestion.prompt)!==false}function dismiss(){preview.value=``;dismissedKey.value=key.value}function focus(){if(toValue(active)===false||composerFocused.value)return;composerFocused.value=true}function blur(){preview.value=``;composerFocused.value=false}watch(()=>toValue(active),value=>{if(value===false){composerFocused.value=false;dismissedKey.value=null}},{flush:`sync`});watch(currentDraft,()=>{preview.value=``},{flush:`sync`});onScopeDispose(cancel);return{items,loading,preview,error,visible,composerFocused,previewSuggestion,select,dismiss,focus,blur}}var VIBE64_SESSION_PRESENCE_CHANGED_EVENT=`vibe64.session.presence.changed`;var VIBE64_SESSION_PRESENCE_DEBOUNCE_MS=5e3;var VIBE64_SESSION_PRESENCE_IDLE_MS=1e4;var VIBE64_RESOURCE_RECOVERY_KEY=Symbol(`vibe64-resource-recovery`);var VIBE64_ENDPOINT=studioApiPath(`vibe64`);var VIBE64_SESSIONS_ENDPOINT=`${VIBE64_ENDPOINT}/sessions`;function appendQueryParam(url=``,key=``,value=``){const normalizedValue=String(value||``).trim();if(!normalizedValue)return url;return`${url}${String(url||``).includes(`?`)?`&`:`?`}${encodeURIComponent(key)}=${encodeURIComponent(normalizedValue)}`}function vibe64AgentTerminalWebSocketUrl(sessionId,terminalSessionId){const endpoint=appendQueryParam(`${vibe64AgentTerminalPath(VIBE64_SESSIONS_ENDPOINT,sessionId,terminalSessionId)}/ws`,`originId`,vibe64BrowserTabOriginId());return resolveWebSocketUrl(endpoint)}function vibe64GlobalCodexTerminalWebSocketUrl(_scopeId,terminalSessionId){return resolveWebSocketUrl(`${vibe64GlobalCodexTerminalPath(VIBE64_ENDPOINT,terminalSessionId)}/ws`)}function vibe64OutputTerminalWebSocketUrl(sessionId,terminalSessionId,sessionsEndpoint=VIBE64_SESSIONS_ENDPOINT){return resolveWebSocketUrl(`${vibe64OutputRunPath(sessionsEndpoint,sessionId,terminalSessionId)}/ws`)}var _sfc_main$38={__name:`Vibe64ColleagueLauncherTarget`,setup(__props){const target=inject(VIBE64_COLLEAGUE_LAUNCHER_KEY,null);const enabled=Boolean(target);let currentElement;function setTarget(element){if(element)target.value=element;else if(target.value===currentElement)target.value=null;currentElement=element}return(_ctx,_cache)=>{return unref(enabled)?(openBlock(),createElementBlock(`div`,{key:0,ref:setTarget,class:`vibe64-colleague-launcher-target`},null,512)):createCommentVNode(``,true)}}};var Vibe64ColleagueLauncherTarget_default=_plugin_vue_export_helper_default(_sfc_main$38,[[`__scopeId`,`data-v-8e7b0e92`]]);var _hoisted_1$30={class:`studio-app-shell-layout__top-right`};var SWIPE_MIN_DISTANCE_PX=64;var SWIPE_INTENT_DISTANCE_PX=12;var SWIPE_MAX_DURATION_MS=700;var SWIPE_HORIZONTAL_RATIO=2;var BROWSER_GESTURE_EDGE_PX=24;var _sfc_main$37={__name:`StudioAppShellLayout`,props:{mobilePaneSwipeEnabled:Boolean,chatCollapsed:Boolean,showLearningModeControl:Boolean,learningMode:Boolean,fillViewport:Boolean},emits:[`update:chatCollapsed`,`update:learningMode`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;let paneSwipe=null;watch(()=>[props.mobilePaneSwipeEnabled,props.chatCollapsed,props.learningMode],cancelPaneSwipe);function cancelPaneSwipe(){paneSwipe=null}function startPaneSwipe(event,header=false){cancelPaneSwipe();if(!props.mobilePaneSwipeEnabled||event.defaultPrevented||event.touches.length!==1||window.getSelection()?.isCollapsed===false)return;const target=event.target;if(target.closest(`
|
|
3
|
-
input, textarea, select, [contenteditable]:not([contenteditable="false"]),
|
|
4
|
-
[role="textbox"], [role="slider"], [role="separator"], [role="dialog"], [role="menu"],
|
|
5
|
-
[draggable="true"], canvas, iframe, video, audio, .cm-editor, .xterm, [data-pane-swipe-ignore]
|
|
6
|
-
`))return;if(!header&&target.closest(`a, button, [role="button"], svg`))return;for(let node=target;node;node=node.parentElement){const style=window.getComputedStyle(node);if(style.touchAction===`none`||style.touchAction.startsWith(`pan-`))return;if(node.scrollWidth>node.clientWidth+1&&/^(auto|scroll)$/u.test(style.overflowX))return;if(node===event.currentTarget)break}const touch=event.touches[0];if(touch.clientX<BROWSER_GESTURE_EDGE_PX||touch.clientX>window.innerWidth-BROWSER_GESTURE_EDGE_PX)return;paneSwipe={id:touch.identifier,x:touch.clientX,y:touch.clientY,startedAt:event.timeStamp,chatCollapsed:props.chatCollapsed}}function movePaneSwipe(event){if(!paneSwipe)return;if(!props.mobilePaneSwipeEnabled||event.defaultPrevented||event.touches.length!==1||event.timeStamp-paneSwipe.startedAt>SWIPE_MAX_DURATION_MS){cancelPaneSwipe();return}const touch=event.touches[0];const horizontalDistance=Math.abs(touch.clientX-paneSwipe.x);const verticalDistance=Math.abs(touch.clientY-paneSwipe.y);if(touch.identifier!==paneSwipe.id||verticalDistance>SWIPE_INTENT_DISTANCE_PX&&horizontalDistance<verticalDistance*SWIPE_HORIZONTAL_RATIO){cancelPaneSwipe();return}if(!(horizontalDistance>SWIPE_INTENT_DISTANCE_PX&&horizontalDistance>=verticalDistance*SWIPE_HORIZONTAL_RATIO))return;if(!event.cancelable){cancelPaneSwipe();return}event.preventDefault()}function endPaneSwipe(event){const swipe=paneSwipe;cancelPaneSwipe();if(!swipe||!props.mobilePaneSwipeEnabled||event.defaultPrevented||event.touches.length||props.chatCollapsed!==swipe.chatCollapsed||event.timeStamp-swipe.startedAt>SWIPE_MAX_DURATION_MS||window.getSelection()?.isCollapsed===false)return;const touch=Array.from(event.changedTouches).find(item=>item.identifier===swipe.id);if(!touch)return;const dx=touch.clientX-swipe.x;const horizontalDistance=Math.abs(dx);const verticalDistance=Math.abs(touch.clientY-swipe.y);if(horizontalDistance<SWIPE_MIN_DISTANCE_PX||horizontalDistance<verticalDistance*SWIPE_HORIZONTAL_RATIO)return;if(event.cancelable)event.preventDefault();emit(`update:chatCollapsed`,dx<0)}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VAppBar,{border:``,class:normalizeClass([`shell-layout__app-bar bg-surface`,{"studio-app-shell-layout--learning":__props.learningMode}]),density:`comfortable`,elevation:`0`,"data-testid":`jskit-shell-app-bar`,onTouchstartPassive:_cache[1]||(_cache[1]=$event=>startPaneSwipe($event,true)),onTouchmove:movePaneSwipe,onTouchend:endPaneSwipe,onTouchcancel:cancelPaneSwipe},{default:withCtx(()=>[__props.showLearningModeControl?(openBlock(),createBlock(VBtn,{key:0,class:normalizeClass([`studio-app-shell-layout__learning-plate`,{"studio-app-shell-layout__learning-plate--active":__props.learningMode}]),"aria-label":`Learning mode`,"aria-pressed":__props.learningMode,title:__props.learningMode?`Leave Learning mode`:`Enter Learning mode`,density:`comfortable`,icon:``,size:`small`,variant:__props.learningMode?`flat`:`outlined`,onClick:_cache[0]||(_cache[0]=$event=>emit(`update:learningMode`,!__props.learningMode))},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createBaseVNode(`span`,{"aria-hidden":`true`},`L`,-1)])]),_:1},8,[`class`,`aria-pressed`,`title`,`variant`])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`top-left`,{},void 0,true),createVNode(VSpacer),createBaseVNode(`div`,_hoisted_1$30,[createVNode(unref(_sfc_main$42),{target:`shell-layout:top-right`}),renderSlot(_ctx.$slots,`top-right`,{},void 0,true),createVNode(Vibe64ColleagueLauncherTarget_default)])]),_:3},8,[`class`]),createVNode(VMain,{class:normalizeClass([`bg-background`,{"studio-app-shell-layout--learning":__props.learningMode,"studio-app-shell-layout--learning-stacked":__props.learningMode&&!__props.mobilePaneSwipeEnabled,"studio-app-shell-layout--fill-viewport":__props.fillViewport}])},{default:withCtx(()=>[createVNode(VContainer,{fluid:``,class:normalizeClass([`shell-layout__content studio-app-shell-layout__content`,{"studio-app-shell-layout__content--fill-viewport":__props.fillViewport}]),onTouchstartPassive:startPaneSwipe,onTouchmove:movePaneSwipe,onTouchend:endPaneSwipe,onTouchcancel:cancelPaneSwipe},{default:withCtx(()=>[renderSlot(_ctx.$slots,`default`,{},void 0,true)]),_:3},8,[`class`])]),_:3},8,[`class`])],64)}}};var StudioAppShellLayout_default=_plugin_vue_export_helper_default(_sfc_main$37,[[`__scopeId`,`data-v-a72a9c73`]]);var cachedProjectSelections=new Map;function useProjectSelectionGate(emit,{scopeSelectionToCurrentProject=false}={}){const creating=ref(false);const selectingSlug=ref(``);const newProjectName=ref(``);const projectSlug=useVibe64ProjectSlug();const selectionPath=computed(()=>projectSelectionGateEndpoint({projectSlug:projectSlug.value,scopeSelectionToCurrentProject}));const selectionResource=useEndpointResource({fallbackLoadError:`Projects could not load.`,path:selectionPath,queryKey:computed(()=>projectSelectionGateQueryKey({ownershipFilter:ROUTE_VISIBILITY_PUBLIC,projectSlug:projectSlug.value,scopeSelectionToCurrentProject,surfaceId:`app`})),refreshOnPull:true,requestRecoveryLabel:`Projects`,realtime:{event:VIBE64_PROJECT_CHANGED_EVENT}});const projectSelectionView=proxyRefs({isInitialLoading:selectionResource.isInitialLoading,isLoading:selectionResource.isLoading,loadError:selectionResource.loadError,record:selectionResource.data,refresh:selectionResource.reload});const createProjectCommand=useCommand({access:`never`,apiSuffix:VIBE64_PROJECT_CREATE_API_SUFFIX,buildCommandOptions:()=>({method:`POST`,path:PROJECT_SELECTION_ENDPOINT}),buildRawPayload:(_model,{context})=>({name:context.name||``}),fallbackRunError:`Project could not be created.`,messages:{error:`Project could not be created.`,success:`Project created.`},onRunSuccess:loadProjectSelection,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.projects.create`,surfaceId:`app`,writeMethod:`POST`});const selectProjectCommand=useCommand({access:`never`,apiSuffix:VIBE64_PROJECT_SELECT_API_SUFFIX,buildCommandOptions:()=>({method:`POST`,path:`${PROJECT_SELECTION_ENDPOINT}/select`}),buildRawPayload:(_model,{context})=>({slug:context.slug||``}),fallbackRunError:`Project could not be selected.`,messages:{error:`Project could not be selected.`,success:`Project selected.`},onRunSuccess:loadProjectSelection,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.projects.select`,surfaceId:`app`,writeMethod:`POST`});const cachedProjectSelection=computed(()=>cachedProjectSelections.get(projectSlug.value)||null);const projectSelection=computed(()=>projectSelectionView.record||cachedProjectSelection.value||{});const projects=computed(()=>Array.isArray(projectSelection.value.projects)?projectSelection.value.projects:[]);const projectsRoot=computed(()=>String(projectSelection.value.projectsRoot||`~/vibe64`));const hasSelection=computed(()=>projectSelection.value.hasSelection===true);const selectionReady=computed(()=>Boolean(projectSelectionView.record||cachedProjectSelection.value));const selectionInitialLoading=computed(()=>Boolean(projectSelectionView.isInitialLoading&&!selectionReady.value));const busy=computed(()=>creating.value||Boolean(selectingSlug.value));const saveError=computed(()=>{if(createProjectCommand.messageType===`error`)return String(createProjectCommand.message||``);if(selectProjectCommand.messageType===`error`)return String(selectProjectCommand.message||``);return``});const errorMessage=computed(()=>String(projectSelectionView.loadError||saveError.value||``));watch([projectSelection,errorMessage],([selection,error])=>{if(selection&&Object.keys(selection).length>0)cachedProjectSelections.set(projectSlug.value,selection);if(error){emit(`error`,error);return}if(selection?.hasSelection===true){emit(`ready`,selection);return}emit(`missing`,selection||{})},{immediate:true});return{busy,createProject,creating,errorMessage,hasSelection,loadProjectSelection,newProjectName,projectSelection,projects,projectsRoot,selectProject,selectingSlug,selectionInitialLoading,selectionReady};async function loadProjectSelection(){await projectSelectionView.refresh()}async function createProject(){const name=newProjectName.value.trim();if(!name)return;creating.value=true;try{const response=await createProjectCommand.run({name});newProjectName.value=``;return String(response?.currentProject?.slug||``).trim()}finally{creating.value=false}}async function selectProject(slug){selectingSlug.value=String(slug||``);try{return await selectProjectCommand.run({slug:selectingSlug.value})?selectingSlug.value:``}finally{selectingSlug.value=``}}}function projectSelectionGateEndpoint({projectSlug=``,scopeSelectionToCurrentProject=false}={}){return scopeSelectionToCurrentProject?scopedDevelopmentApiUrl(PROJECT_SELECTION_ENDPOINT,projectSlug,{scopeGlobalPaths:true}):PROJECT_SELECTION_ENDPOINT}function projectSelectionGateQueryKey({ownershipFilter,projectSlug=``,scopeSelectionToCurrentProject=false,surfaceId}={}){const baseKey=projectSelectionQueryKey(surfaceId,ownershipFilter,projectSlug);return scopeSelectionToCurrentProject?[...baseKey,`route-selection`]:baseKey}var _hoisted_1$29={class:`project-selection-gate`};var _hoisted_2$25=[`inert`,`aria-hidden`];var _hoisted_3$23={class:`project-selection-gate__header`};var _hoisted_4$21={class:`project-selection-gate__path`};var _hoisted_5$19={key:0,class:`project-selection-gate__list`};var _hoisted_6$18={class:`project-selection-gate__project-path`};var _sfc_main$36={__name:`ProjectSelectionGate`,props:{independentContent:Boolean,retainIndependentContent:Boolean,beforeRetry:{type:Function,default:null},runtimeReady:{type:Boolean,default:true},runtimeError:{type:String,default:``},forcePicker:{type:Boolean,default:false},navigateOnSelect:{type:Boolean,default:false},scopeSelectionToCurrentProject:{type:Boolean,default:false}},emits:[`missing`,`ready`,`error`,`retry-runtime`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const router=useRouter();const recovering=ref(false);const recoveryError=ref(``);let disposed=false;onBeforeUnmount(()=>{disposed=true});const{busy,createProject,creating,errorMessage,hasSelection,loadProjectSelection,newProjectName,projectSelection,projects,projectsRoot,selectProject,selectingSlug,selectionInitialLoading,selectionReady}=useProjectSelectionGate(emit,{scopeSelectionToCurrentProject:props.scopeSelectionToCurrentProject});const displayError=computed(()=>recoveryError.value||errorMessage.value||props.runtimeError);const selectedSlotVisible=computed(()=>hasSelection.value&&!props.forcePicker);const pickerVisible=computed(()=>selectionReady.value&&(props.forcePicker||!hasSelection.value));const loadingVisible=computed(()=>!props.independentContent&&!displayError.value&&(selectionInitialLoading.value||!props.runtimeReady));const contentActive=computed(()=>props.independentContent||!loadingVisible.value&&props.runtimeReady&&selectedSlotVisible.value);const retainedContentMounted=ref(false);watch(contentActive,active=>{if(active)retainedContentMounted.value=true},{immediate:true,flush:`sync`});async function retryProject(){if(recovering.value)return;recovering.value=true;recoveryError.value=``;try{await props.beforeRetry?.();if(disposed)return;await loadProjectSelection();if(!disposed&&!errorMessage.value&&!props.runtimeReady)emit(`retry-runtime`)}catch(error){recoveryError.value=String(error?.message||`Project could not load. Try again.`)}finally{recovering.value=false}}async function handleSelectProject(slug=``){const selected=await selectProject(slug);if(props.navigateOnSelect&&selected)router.push(projectAppPath(selected))}async function handleCreateProject(){const selected=await createProject();if(props.navigateOnSelect&&selected)router.push(projectAppPath(selected))}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$29,[displayError.value&&!__props.independentContent?(openBlock(),createBlock(StudioErrorNotice_default,{key:0,title:`Project could not load`,error:displayError.value,compact:``},{actions:withCtx(()=>[createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,disabled:recovering.value,onClick:retryProject},{default:withCtx(()=>[createTextVNode(toDisplayString(recovering.value?`Checking project…`:`Try again`),1)]),_:1},8,[`disabled`])]),_:1},8,[`error`])):createCommentVNode(``,true),loadingVisible.value?(openBlock(),createBlock(VSkeletonLoader,{key:1,"aria-label":`Loading project`,class:`project-selection-gate__loading`,type:`article`})):createCommentVNode(``,true),__props.retainIndependentContent&&retainedContentMounted.value?withDirectives((openBlock(),createElementBlock(`div`,{key:2,inert:!contentActive.value,"aria-hidden":!contentActive.value?`true`:void 0,class:`project-selection-gate__retained-content`},[renderSlot(_ctx.$slots,`default`,{projectSelection:unref(projectSelection),reload:unref(loadProjectSelection),contentActive:contentActive.value},void 0,true)],8,_hoisted_2$25)),[[vShow,contentActive.value]]):createCommentVNode(``,true),!__props.retainIndependentContent&&contentActive.value?renderSlot(_ctx.$slots,`default`,{projectSelection:unref(projectSelection),reload:unref(loadProjectSelection),contentActive:contentActive.value},void 0,true,3):createCommentVNode(``,true),!__props.independentContent&&!loadingVisible.value&&__props.runtimeReady&&pickerVisible.value?(openBlock(),createBlock(VSheet,{key:4,class:`project-selection-gate__picker`,rounded:`lg`,border:``},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_3$23,[createBaseVNode(`div`,null,[_cache[1]||(_cache[1]=createBaseVNode(`p`,{class:`project-selection-gate__eyebrow`},`Project`,-1)),_cache[2]||(_cache[2]=createBaseVNode(`h2`,{class:`project-selection-gate__title`},`Choose a project`,-1)),createBaseVNode(`p`,_hoisted_4$21,toDisplayString(unref(projectsRoot)),1)])]),unref(projects).length?(openBlock(),createElementBlock(`div`,_hoisted_5$19,[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(projects),project=>{return openBlock(),createBlock(VBtn,{key:project.path,class:`project-selection-gate__project`,disabled:unref(busy),loading:unref(selectingSlug)===project.slug,variant:`tonal`,onClick:$event=>handleSelectProject(project.slug)},{default:withCtx(()=>[createBaseVNode(`span`,null,toDisplayString(project.slug),1),createBaseVNode(`span`,_hoisted_6$18,toDisplayString(project.path),1)]),_:2},1032,[`disabled`,`loading`,`onClick`])}),128))])):createCommentVNode(``,true),createVNode(VForm,{class:`project-selection-gate__create`,onSubmit:withModifiers(handleCreateProject,[`prevent`])},{default:withCtx(()=>[createVNode(VTextField,{modelValue:unref(newProjectName),"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>isRef(newProjectName)?newProjectName.value=$event:null),autocomplete:`off`,density:`comfortable`,"hide-details":`auto`,label:`New project folder`,disabled:unref(busy)},null,8,[`modelValue`,`disabled`]),createVNode(VBtn,{color:`primary`,disabled:!unref(newProjectName).trim()||unref(busy),loading:unref(creating),type:`submit`,variant:`flat`},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Create project `,-1)])]),_:1},8,[`disabled`,`loading`])]),_:1})]),_:1})):createCommentVNode(``,true)])}}};var ProjectSelectionGate_default=_plugin_vue_export_helper_default(_sfc_main$36,[[`__scopeId`,`data-v-6da5efed`]]);var VIBE64_PREFERRED_NAME_MAX_LENGTH=80;function normalizePreferredNameDraft(value=``){return String(value||``).normalize(`NFC`).replace(/\s+/gu,` `).trim()}function preferredNameDraftState(value=``){const preferredName=normalizePreferredNameDraft(value);const length=[...preferredName].length;let error=``;if(/\p{Cc}/u.test(preferredName))error=`Name cannot contain control characters.`;else if(length>80)error=`Name cannot exceed ${80} characters.`;return{error,length,preferredName,valid:!error}}var _hoisted_1$28={class:`vibe64-auth-settings`};var _hoisted_2$24={key:0,class:`vibe64-auth-settings__provider-attention`,"aria-label":`Needs attention`};var _hoisted_3$22={key:0,class:`vibe64-personal-profile`,"aria-labelledby":`vibe64-personal-profile-title`};var _hoisted_4$20={class:`vibe64-personal-profile__actions`};var _sfc_main$35={__name:`Vibe64AuthSettingsButton`,setup(__props){const accountProviderOptions=Object.freeze([{icon:mdiRobotOutline,id:`ai`,label:`AI Accounts`},{icon:mdiGithub,id:`github`,label:`GitHub`}]);const providerOptions=computed(()=>[...personalProfileAvailable.value?[{icon:mdiAccountOutline,id:`profile`,label:`You`}]:[],...accountProviderOptions]);const dialogOpen=ref(false);const theme=useTheme();const appearance=ref(readAppearance());const appearanceChoices=Object.freeze([{icon:mdiWeatherSunny,label:`Light`,value:`light`},{icon:mdiWeatherNight,label:`Dark`,value:`dark`},{icon:mdiMonitor,label:`System`,value:`system`}]);function chooseAppearance(value){if(!value)return;appearance.value=value;theme.change(value);writeAppearance(value)}const selectedProviderId=ref(`ai`);const aiConnectionsSettings=ref(null);const aiConnectionsBusy=ref(false);const accounts=useVibe64Accounts();const preferredNameField=ref(null);const preferredNameDraft=ref(``);const preferredNameSaving=computed(()=>accounts.savePersonalAiProfileCommand.isRunning===true);const personalProfile=computed(()=>accounts.status.value?.personalProfile||null);const personalProfileAvailable=computed(()=>personalProfile.value?.available===true);const preferredNameValidation=computed(()=>preferredNameDraftState(preferredNameDraft.value));const preferredNameChanged=computed(()=>preferredNameValidation.value.preferredName!==String(personalProfile.value?.preferredName||``));const statusLoaded=computed(()=>{return Boolean(accounts.status.value&&Array.isArray(accounts.status.value.accounts))});const allAccountRows=computed(()=>{return accountRowsForStatus(accounts.status.value,[`github`],{includeFallbackRows:false})});const selectedAccountRows=computed(()=>{return accountRowsForStatus(accounts.status.value,[selectedProviderId.value],{includeFallbackRows:true})});const selectedProvider=computed(()=>{return providerOptions.value.find(provider=>provider.id===selectedProviderId.value)||providerOptions.value[0]});const selectedProviderTitle=computed(()=>{return`${selectedProvider.value.label} Connection`});const selectedProviderLede=computed(()=>{if(selectedProvider.value.id===`github`)return`Configure the GitHub account and Git identity used by this local Vibe64 editor.`;return`Connect the AI accounts used by this Vibe64 editor.`});const credentialsNeedAttention=computed(()=>{if(!statusLoaded.value)return false;return allAccountRows.value.some(account=>account.connected!==true)});function normalizeProviderId(providerId=``){const normalized=String(providerId||``).trim();return providerOptions.value.some(provider=>provider.id===normalized)?normalized:``}async function openDialog(options={}){const profileRequested=String(options.section||``).trim()===`profile`;const requestedAi=options.codexReconnectRequired===true?`codex`:String(options.providerId||``).trim();const requestedProviderId=normalizeProviderId(requestedAi)||(requestedAi?`ai`:``);if(requestedProviderId)selectedProviderId.value=requestedProviderId;dialogOpen.value=true;if(profileRequested)await accounts.reloadLocalStatus();else if(options.codexReconnectRequired===true)await accounts.reloadLocalStatus();else if(options.refresh!==false)await accounts.refresh();if(profileRequested&&personalProfileAvailable.value){selectedProviderId.value=`profile`;await focusPreferredName();return}if(requestedProviderId){selectedProviderId.value=requestedProviderId;await nextTick();if(requestedProviderId===`ai`&&requestedAi!==`ai`)aiConnectionsSettings.value?.openProvider(requestedAi,options);return}selectedProviderId.value=`ai`}async function focusPreferredName(){await nextTick();preferredNameField.value?.focus?.()}async function savePreferredName(){if(preferredNameSaving.value||!preferredNameChanged.value||!preferredNameValidation.value.valid)return;await accounts.savePersonalAiProfile({preferredName:preferredNameValidation.value.preferredName})}function providerNeedsAttention(providerId=``){return allAccountRows.value.some(account=>account.id===providerId&&account.connected!==true)}function handleAccountConnectionsDialogRequest(event){openDialog(event?.detail||{})}let disposeAccountConnectionsDialogRequest=()=>null;onMounted(()=>{disposeAccountConnectionsDialogRequest=onVibe64AccountConnectionsDialogRequested(handleAccountConnectionsDialogRequest)});onBeforeUnmount(()=>{disposeAccountConnectionsDialogRequest()});watch(()=>personalProfile.value?.preferredName,preferredName=>{preferredNameDraft.value=String(preferredName||``)},{immediate:true});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$28,[createVNode(VBtn,{class:normalizeClass([`vibe64-auth-settings__button`,credentialsNeedAttention.value?`vibe64-auth-settings__button--needs-attention`:``]),density:`comfortable`,icon:unref(mdiAccountCogOutline),size:`large`,title:`Account settings`,type:`button`,variant:`tonal`,"aria-label":`Account settings`,onClick:openDialog},null,8,[`class`,`icon`]),createVNode(VDialog,{modelValue:dialogOpen.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>dialogOpen.value=$event),persistent:aiConnectionsBusy.value,"max-width":`1120`,scrollable:``},{default:withCtx(()=>[createVNode(VCard,{class:`vibe64-auth-settings__dialog`,rounded:`lg`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`vibe64-auth-settings__dialog-title`},{default:withCtx(()=>[_cache[5]||(_cache[5]=createBaseVNode(`div`,null,[createBaseVNode(`h2`,null,`Account settings`),createBaseVNode(`p`,null,`Choose how Vibe64 identifies you and connect its coding tools.`)],-1)),createVNode(VBtn,{density:`comfortable`,icon:unref(mdiClose),title:`Close account settings`,disabled:aiConnectionsBusy.value,type:`button`,variant:`text`,"aria-label":`Close account settings`,onClick:_cache[0]||(_cache[0]=$event=>dialogOpen.value=false)},null,8,[`icon`,`disabled`])]),_:1}),createVNode(VTabs,{modelValue:selectedProviderId.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>selectedProviderId.value=$event),class:`vibe64-auth-settings__provider-tabs`,color:`primary`,density:`comfortable`,"show-arrows":``},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(providerOptions.value,provider=>{return openBlock(),createBlock(VTab,{key:provider.id,class:`vibe64-auth-settings__provider-tab`,"prepend-icon":provider.icon,value:provider.id,disabled:aiConnectionsBusy.value},{default:withCtx(()=>[createTextVNode(toDisplayString(provider.label)+` `,1),providerNeedsAttention(provider.id)?(openBlock(),createElementBlock(`span`,_hoisted_2$24)):createCommentVNode(``,true)]),_:2},1032,[`prepend-icon`,`value`,`disabled`])}),128))]),_:1},8,[`modelValue`]),createVNode(VDivider),createVNode(VCardText,{class:`vibe64-auth-settings__dialog-body`},{default:withCtx(()=>[selectedProviderId.value===`profile`?(openBlock(),createElementBlock(`section`,_hoisted_3$22,[_cache[6]||(_cache[6]=createBaseVNode(`div`,{class:`vibe64-personal-profile__heading`},[createBaseVNode(`h3`,{id:`vibe64-personal-profile-title`},`Your profile`),createBaseVNode(`p`,null,`You — all projects`)],-1)),createVNode(VTextField,{ref_key:`preferredNameField`,ref:preferredNameField,modelValue:preferredNameDraft.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>preferredNameDraft.value=$event),"data-vibe64-personal-profile":``,density:`comfortable`,"error-messages":preferredNameValidation.value.error?[preferredNameValidation.value.error]:[],"hide-details":`auto`,label:`What should Vibe64 call you?`,variant:`outlined`,onKeydown:withKeys(withModifiers(savePreferredName,[`prevent`]),[`enter`])},null,8,[`modelValue`,`error-messages`,`onKeydown`]),_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`vibe64-personal-profile__supporting-text`},` This name is used in Vibe64 welcomes and collaboration cues across this installation. Leave it blank to use your computer account name. `,-1)),createBaseVNode(`div`,_hoisted_4$20,[createVNode(VBtn,{class:`vibe64-personal-profile__save`,color:`primary`,disabled:preferredNameSaving.value||!preferredNameChanged.value||!preferredNameValidation.value.valid,type:`button`,variant:`flat`,onClick:savePreferredName},{default:withCtx(()=>[createTextVNode(toDisplayString(preferredNameSaving.value?`Saving…`:`Save name`),1)]),_:1},8,[`disabled`])]),_cache[8]||(_cache[8]=createBaseVNode(`div`,{class:`vibe64-personal-profile__heading vibe64-personal-profile__appearance`},[createBaseVNode(`h3`,{id:`vibe64-appearance-title`},`Appearance`),createBaseVNode(`p`,null,`This browser`)],-1)),createVNode(VBtnToggle,{"model-value":appearance.value,"aria-labelledby":`vibe64-appearance-title`,class:`vibe64-personal-profile__appearance-choice`,color:`primary`,"data-vibe64-appearance":``,density:`comfortable`,divided:``,mandatory:``,rounded:`xl`,variant:`outlined`,"onUpdate:modelValue":chooseAppearance},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(appearanceChoices),choice=>{return openBlock(),createBlock(VBtn,{key:choice.value,"prepend-icon":choice.icon,value:choice.value},{default:withCtx(()=>[createTextVNode(toDisplayString(choice.label),1)]),_:2},1032,[`prepend-icon`,`value`])}),128))]),_:1},8,[`model-value`]),_cache[9]||(_cache[9]=createBaseVNode(`p`,{class:`vibe64-personal-profile__supporting-text`},` System follows your device's light or dark setting. `,-1))])):createCommentVNode(``,true),selectedProviderId.value===`ai`?(openBlock(),createBlock(unref(AiConnectionsSettings_default),{key:1,ref_key:`aiConnectionsSettings`,ref:aiConnectionsSettings,"is-owner":``,onBusy:_cache[3]||(_cache[3]=$event=>aiConnectionsBusy.value=$event)},null,512)):createCommentVNode(``,true),selectedProviderId.value===`github`?(openBlock(),createBlock(unref(ProviderAccountsSetup_default),{key:2,accounts:unref(accounts),"account-rows":selectedAccountRows.value,"status-loaded":statusLoaded.value,title:selectedProviderTitle.value,lede:selectedProviderLede.value,"needed-label":`Connection needed`,"ready-label":`Connection ready`,"show-continue":false},null,8,[`accounts`,`account-rows`,`status-loaded`,`title`,`lede`])):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])])}}};var Vibe64AuthSettingsButton_default=_plugin_vue_export_helper_default(_sfc_main$35,[[`__scopeId`,`data-v-f9fdca2f`]]);var _sfc_main$34={__name:`Vibe64LearningPracticeProjectSelector`,props:{panel:{type:Object,default:null}},setup(__props){const props=__props;const choices=computed(()=>props.panel?.learningPracticeChoices||[]);return(_ctx,_cache)=>{return choices.value.length?(openBlock(),createBlock(VMenu,{key:0,location:`bottom start`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`vibe64-learning-practice-selector`,variant:`text`,"aria-label":`Choose practice project`,title:`Choose practice project`}),{default:withCtx(()=>[createVNode(VIcon,{class:`vibe64-learning-practice-selector__lead`,icon:unref(mdiSchoolOutline),size:`18`},null,8,[`icon`]),_cache[0]||(_cache[0]=createBaseVNode(`span`,null,`Practice project`,-1)),createVNode(VIcon,{icon:unref(mdiChevronDown),size:`18`},null,8,[`icon`])]),_:1},16)]),default:withCtx(()=>[createVNode(VList,{density:`compact`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(choices.value,choice=>{return openBlock(),createBlock(VListItem,{key:choice.attemptId,title:choice.projectSlug,subtitle:`Saved lesson workspace`,onClick:$event=>__props.panel.selectLearningPracticeProject(choice,$event)},null,8,[`title`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true)}}};var Vibe64LearningPracticeProjectSelector_default=_plugin_vue_export_helper_default(_sfc_main$34,[[`__scopeId`,`data-v-2df5a5af`]]);var _hoisted_1$27={class:`studio-autopilot__composer-delivery`};var _sfc_main$33={__name:`Vibe64ComposerDelivery`,props:{stopVisible:Boolean,stopEnabled:Boolean,stopping:Boolean,canSubmit:Boolean,sending:Boolean,submitMode:{type:String,default:`send`},submitAriaLabel:{type:String,default:`Send message`},submitTitle:{type:String,default:`Send message`}},emits:[`submit`,`stop`],setup(__props,{expose:__expose}){const sendButton=ref(null);__expose({focus:()=>(sendButton.value?.$el||sendButton.value)?.focus?.()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$27,[__props.stopVisible?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Stop`,title:`Stop assistant`,disabled:!__props.stopEnabled,"aria-busy":__props.stopping?`true`:void 0,icon:unref(mdiStop),size:`small`,variant:`text`,class:`studio-autopilot__composer-action`,onClick:_cache[0]||(_cache[0]=$event=>_ctx.$emit(`stop`))},null,8,[`disabled`,`aria-busy`,`icon`])):createCommentVNode(``,true),createVNode(VBtn,{ref_key:`sendButton`,ref:sendButton,"aria-label":__props.submitAriaLabel,title:__props.submitTitle,disabled:!__props.canSubmit,"aria-busy":__props.sending&&!__props.canSubmit?`true`:void 0,color:`primary`,size:`small`,variant:`flat`,icon:__props.submitMode===`send`?unref(mdiSend):unref(mdiArrowTopRight),class:`studio-autopilot__composer-action`,onClick:_cache[1]||(_cache[1]=$event=>_ctx.$emit(`submit`))},null,8,[`aria-label`,`title`,`disabled`,`aria-busy`,`icon`])])}}};var Vibe64ComposerDelivery_default=_plugin_vue_export_helper_default(_sfc_main$33,[[`__scopeId`,`data-v-9e56f63d`]]);var _hoisted_1$26={class:`d-flex align-center justify-space-between px-4`};var _hoisted_2$23={class:`d-flex`};var _hoisted_3$21={class:`chat-modes__details-body`};var _hoisted_4$19={key:0,class:`text-body-small px-4 pb-2`,role:`status`};var _hoisted_5$18={key:2,class:`text-body-small px-4 pb-2`,role:`status`};var _hoisted_6$17={key:3,class:`px-4 pt-2 pb-2`};var _hoisted_7$17={key:0,class:`text-body-small text-error`,role:`alert`};var _hoisted_8$17={class:`chat-modes__model`};var _hoisted_9$14={class:`chat-modes__model`};var _hoisted_10$12={class:`px-4 pb-3`};var _hoisted_11$12={key:0,class:`text-body-small`};var _hoisted_12$12={key:1,class:`text-body-small mt-2`};var _hoisted_13$12={key:0,class:`text-body-small`};var _hoisted_14$12={class:`px-4 pb-3`};var _sfc_main$32={__name:`Vibe64ChatModeControls`,props:{session:{type:Object,default:null},goal:{type:Object,default:null},sessionsApiPath:{type:[String,Object,Function],default:``},purposes:{type:Object,default:null},savePreferences:{type:Function,default:null},requiredMode:{type:String,default:``},temporary:Boolean,disabled:Boolean,active:Boolean,connecting:Boolean,canConfigure:Boolean,loading:Boolean,loadError:{type:String,default:``}},emits:[`saved`,`reload`,`custom`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const preferences=computed(()=>assistantRoutingFromMetadata(props.session?.metadata));const mode=ref(``);const review=ref(false);const modelOverride=ref(null);const saving=ref(false);const saveError=ref(``);const detailsOpen=ref(false);const modeMenu=ref(null);const routingOpen=ref(false);const routingFocusRole=ref(``);const routingSaving=ref(false);const modeIcons={custom:mdiTuneVariant,senior:mdiAccountStarOutline,junior:mdiAccountOutline,auto:mdiAutoFix};const modes=computed(()=>ASSISTANT_MODES.filter(({id})=>(!props.temporary||id!==`auto`)&&(!props.requiredMode||id===`custom`||id===props.requiredMode)));const modeLabel=computed(()=>assistantModeLabel(mode.value));const savedWorkflowEngineId=computed(()=>preferences.value?.workflowEngineId||props.session?.assistantSelection?.engineId);const workflowEngineId=ref(``);watch(savedWorkflowEngineId,value=>{workflowEngineId.value=value},{immediate:true});const{resource:workflows,connectedWorkflows,loadError:workflowError}=useModelRouting({enabled:computed(()=>detailsOpen.value&&!props.temporary&&mode.value!==`custom`),workflowsOnly:true});const workflowChoices=computed(()=>connectedWorkflows.value.map(choice=>({...choice,props:{disabled:!choice.available,"aria-disabled":!choice.available?`true`:void 0,subtitle:choice.error||void 0}})));const decisions=computed(()=>props.purposes||{});const hasGoal=computed(()=>Boolean(props.goal&&![`completed`,`complete`].includes(props.goal.status)));const reviewAvailable=computed(()=>!props.temporary&&!hasGoal.value&&mode.value===`auto`);const updatedPreferences=computed(()=>({mode:mode.value,review:review.value,...!props.temporary&&workflowEngineId.value?{workflowEngineId:workflowEngineId.value}:{},...modelOverride.value?{override:modelOverride.value}:{}}));watch(preferences,value=>{mode.value=value?.mode||``;review.value=value?.review===true;modelOverride.value=value?.override||null},{immediate:true});function roleLabel(role){if(role===`custom`&&preferences.value?.mode!==`custom`)return`Choose an orchestrator, model and thinking level.`;const decision=decisions.value[role===`router`?`request_routing`:role];if(decision&&!decision.available)return decision.message||`Unavailable`;const selection=decision?.effectiveSelection;if(!selection)return canConfigureMessage();return`${vibe64AssistantSelectionLabel(selection)}${decision?.backupUsed?` · Shared backup`:``}`}function canConfigureMessage(){return props.canConfigure?`Choose a model in routing settings.`:`Ask the owner to configure this mode.`}const autoDescription=computed(()=>decisions.value.auto?.available===false?decisions.value.auto.message:`Senior for plans and reviews; Junior otherwise · Router: ${roleLabel(`router`)}`);const description=computed(()=>{if(!mode.value)return props.session?.assistantSelection?`Current model · ${vibe64AssistantSelectionLabel(props.session.assistantSelection)}`:`Choose an assistant`;if(mode.value===`auto`)return autoDescription.value;const selectedOverride=preferences.value?.mode===mode.value&&preferences.value.override;return selectedOverride&&!decisions.value[mode.value]?`${vibe64AssistantSelectionLabel(selectedOverride)} · custom`:roleLabel(mode.value)});const triggerLabel=computed(()=>`Chat mode${modeLabel.value?`: ${modeLabel.value}`:``}. ${description.value}${review.value&&reviewAvailable.value?`. Automatic deslop by Senior on`:``}`);const reviewDescription=computed(()=>{if(hasGoal.value)return`Auto and automatic review apply after the current goal finishes.`;if(!reviewAvailable.value)return`Automatic review is available in Auto only.`;if(decisions.value.review?.available===false)return decisions.value.review.message;return``});const command=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,placementSource:`vibe64.sessions.assistant-selection.update`,buildCommandOptions:()=>({method:`PATCH`,path:vibe64SessionPath(readRefOrGetterValue(props.sessionsApiPath),props.session.sessionId,`/assistant-selection`)}),buildRawPayload:()=>vibe64RealtimeOriginPayload({assistantRouting:updatedPreferences.value}),onRunSuccess:result=>{if(result?.ok===false)throw new Error(result.error||`Chat mode could not be saved.`)},fallbackRunError:`Chat mode could not be saved.`,suppressSuccessMessage:true,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,writeMethod:`PATCH`});function openCustom(){if(props.disabled||saving.value)return;detailsOpen.value=false;emit(`custom`,modeMenu.value?.activatorEl)}async function save(nextMode=mode.value,nextReview=review.value,nextWorkflow=workflowEngineId.value){if(saving.value||props.disabled||!modes.value.some(({id})=>id===nextMode)||nextMode===`auto`&&props.temporary)return;if(nextWorkflow!==workflowEngineId.value&&(props.temporary||nextMode===`custom`||!workflowChoices.value.some(choice=>choice.engineId===nextWorkflow&&choice.available)))return;const previous={mode:mode.value,review:review.value,workflowEngineId:workflowEngineId.value,override:modelOverride.value};if(nextMode!==mode.value||nextWorkflow!==workflowEngineId.value)modelOverride.value=null;mode.value=nextMode;review.value=!props.temporary&&nextReview;workflowEngineId.value=nextWorkflow;saving.value=true;saveError.value=``;try{const result=props.savePreferences?await props.savePreferences(updatedPreferences.value):await command.run();if(result?.ok===false)throw new Error(result.error||`Chat mode could not be saved.`);emit(`saved`)}catch(error){mode.value=previous.mode;review.value=previous.review;workflowEngineId.value=previous.workflowEngineId;modelOverride.value=previous.override;saveError.value=error.message||`Chat mode could not be saved.`}finally{saving.value=false}}function configure(){if(!props.canConfigure)return;routingFocusRole.value=``;detailsOpen.value=false;routingOpen.value=true}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VMenu,{ref_key:`modeMenu`,ref:modeMenu,modelValue:detailsOpen.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>detailsOpen.value=$event),"close-on-content-click":false,location:`top start`,width:344,"max-width":`calc(100vw - 24px)`},{activator:withCtx(({props:activatorProps})=>[createVNode(VBtn,mergeProps(activatorProps,{class:`chat-modes__trigger`,variant:`text`,size:`small`,icon:modeIcons[mode.value]||unref(`M8 13C6.14 13 4.59 14.28 4.14 16H2V18H4.14C4.59 19.72 6.14 21 8 21S11.41 19.72 11.86 18H22V16H11.86C11.41 14.28 9.86 13 8 13M8 19C6.9 19 6 18.1 6 17C6 15.9 6.9 15 8 15S10 15.9 10 17C10 18.1 9.1 19 8 19M19.86 6C19.41 4.28 17.86 3 16 3S12.59 4.28 12.14 6H2V8H12.14C12.59 9.72 14.14 11 16 11S19.41 9.72 19.86 8H22V6H19.86M16 9C14.9 9 14 8.1 14 7C14 5.9 14.9 5 16 5S18 5.9 18 7C18 8.1 17.1 9 16 9Z`),"aria-label":triggerLabel.value,title:triggerLabel.value,"aria-busy":saving.value?`true`:void 0}),null,16,[`icon`,`aria-label`,`title`,`aria-busy`])]),default:withCtx(()=>[createVNode(VCard,{class:`chat-modes__details`,rounded:`lg`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$26,[_cache[12]||(_cache[12]=createBaseVNode(`strong`,null,`Chat mode`,-1)),createBaseVNode(`div`,_hoisted_2$23,[__props.canConfigure&&(__props.temporary||mode.value===`custom`)?(openBlock(),createBlock(VBtn,{key:0,icon:unref(mdiCogOutline),variant:`text`,width:`48`,height:`48`,"aria-label":`Configure model routing`,title:`Configure model routing`,onClick:configure},null,8,[`icon`])):createCommentVNode(``,true),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,width:`48`,height:`48`,"aria-label":`Close chat mode`,title:`Close`,onClick:_cache[0]||(_cache[0]=$event=>detailsOpen.value=false)},null,8,[`icon`])])]),createBaseVNode(`div`,_hoisted_3$21,[__props.connecting||__props.active||saving.value||!mode.value?(openBlock(),createElementBlock(`p`,_hoisted_4$19,toDisplayString(__props.connecting?`Connecting assistant…`:saving.value?`Saving mode…`:__props.active?`For your next request`:description.value),1)):createCommentVNode(``,true),saveError.value?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,density:`compact`,class:`mx-3 mb-2`},{default:withCtx(()=>[createTextVNode(toDisplayString(saveError.value),1)]),_:1})):createCommentVNode(``,true),hasGoal.value?(openBlock(),createElementBlock(`p`,_hoisted_5$18,`Model and Senior/Junior changes apply to the next goal turn. Another orchestrator or Auto applies after this goal finishes.`)):createCommentVNode(``,true),!__props.temporary&&mode.value!==`custom`?(openBlock(),createElementBlock(`div`,_hoisted_6$17,[createVNode(VSelect,{"model-value":workflowEngineId.value,items:workflowChoices.value,"item-title":`label`,"item-value":`engineId`,label:`Orchestrator`,variant:`outlined`,density:`compact`,"hide-details":``,"no-data-text":`No orchestrators have connected models.`,loading:__props.connecting||unref(workflows).isInitialLoading.value,disabled:__props.disabled||saving.value||!mode.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>save(mode.value,review.value,$event))},createSlots({_:2},[__props.canConfigure?{name:`append`,fn:withCtx(()=>[createVNode(VBtn,{icon:unref(mdiCogOutline),variant:`text`,width:`48`,height:`48`,"aria-label":`Configure model routing`,title:`Configure model routing`,onClick:configure},null,8,[`icon`])]),key:`0`}:void 0]),1032,[`model-value`,`items`,`loading`,`disabled`]),_cache[14]||(_cache[14]=createBaseVNode(`p`,{class:`text-body-small mt-2`},`Switch coding tools and keep this conversation.`,-1)),unref(workflowError)?(openBlock(),createElementBlock(`p`,_hoisted_7$17,[createTextVNode(toDisplayString(unref(workflowError))+` `,1),createVNode(VBtn,{variant:`text`,onClick:_cache[2]||(_cache[2]=$event=>unref(workflows).reload())},{default:withCtx(()=>[..._cache[13]||(_cache[13]=[createTextVNode(`Retry`,-1)])]),_:1})])):createCommentVNode(``,true)])):createCommentVNode(``,true),createVNode(VList,{lines:false,class:`py-0`},{default:withCtx(()=>[createVNode(VListItem,{title:__props.requiredMode?`Choose model`:`Custom`,"prepend-icon":modeIcons.custom,active:mode.value===`custom`,role:`button`,"aria-pressed":mode.value===`custom`,disabled:__props.disabled||saving.value,color:`primary`,"min-height":`60`,onClick:openCustom},{subtitle:withCtx(()=>[createBaseVNode(`span`,_hoisted_8$17,toDisplayString(mode.value===`custom`?description.value:roleLabel(`custom`)),1)]),append:withCtx(()=>[mode.value===`custom`?(openBlock(),createBlock(VIcon,{key:0,icon:unref(mdiCheck),size:`18`,"aria-label":`Selected`},null,8,[`icon`])):createCommentVNode(``,true)]),_:1},8,[`title`,`prepend-icon`,`active`,`aria-pressed`,`disabled`])]),_:1}),__props.loadError?(openBlock(),createBlock(VAlert,{key:4,type:`error`,variant:`tonal`,density:`compact`,class:`mx-3 mb-2`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.loadError)+` `,1),createVNode(VBtn,{variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>emit(`reload`))},{default:withCtx(()=>[..._cache[15]||(_cache[15]=[createTextVNode(`Retry`,-1)])]),_:1})]),_:1})):__props.loading?(openBlock(),createBlock(VSkeletonLoader,{key:5,type:`list-item-two-line@${modes.value.length-1}`},null,8,[`type`])):(openBlock(),createElementBlock(Fragment,{key:6},[createVNode(VList,{"aria-label":`Choose chat mode`,lines:false,class:`py-0`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(modes.value.filter(({id})=>id!==`custom`),choice=>{return openBlock(),createBlock(VListItem,{key:choice.id,title:choice.label,"prepend-icon":modeIcons[choice.id],active:mode.value===choice.id,"aria-pressed":mode.value===choice.id,role:`button`,disabled:__props.disabled||saving.value||decisions.value[choice.id]?.available!==true,color:`primary`,"min-height":`60`,"aria-disabled":__props.disabled||saving.value||decisions.value[choice.id]?.available!==true?`true`:void 0,onClick:$event=>save(choice.id)},{subtitle:withCtx(()=>[createBaseVNode(`span`,_hoisted_9$14,toDisplayString(mode.value===choice.id?description.value:choice.id===`auto`?autoDescription.value:roleLabel(choice.id)),1)]),append:withCtx(()=>[mode.value===choice.id?(openBlock(),createBlock(VIcon,{key:0,icon:unref(mdiCheck),size:`18`,"aria-label":`Selected`},null,8,[`icon`])):createCommentVNode(``,true)]),_:2},1032,[`title`,`prepend-icon`,`active`,`aria-pressed`,`disabled`,`aria-disabled`,`onClick`])}),128))]),_:1}),createBaseVNode(`div`,_hoisted_10$12,[__props.requiredMode?(openBlock(),createElementBlock(`p`,_hoisted_11$12,`Merge repairs always use Senior. Model changes apply to the next turn.`)):createCommentVNode(``,true),decisions.value[mode.value]?.backupReason===`keep_workflow_together`?(openBlock(),createElementBlock(`p`,_hoisted_12$12,`Senior and Junior use the shared backup together to keep this workflow in one orchestrator.`)):createCommentVNode(``,true),!__props.temporary&&mode.value===`auto`?(openBlock(),createElementBlock(Fragment,{key:2},[_cache[16]||(_cache[16]=createBaseVNode(`p`,{class:`text-body-small`},`Senior always reviews Junior's completed work. Deslop is optional.`,-1)),createVNode(VSwitch,{"model-value":review.value,disabled:__props.disabled||saving.value||__props.connecting||!reviewAvailable.value,label:`Deslop during Senior review`,"hide-details":``,color:`primary`,density:`compact`,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>save(mode.value,$event))},null,8,[`model-value`,`disabled`]),reviewDescription.value?(openBlock(),createElementBlock(`p`,_hoisted_13$12,toDisplayString(reviewDescription.value),1)):createCommentVNode(``,true)],64)):createCommentVNode(``,true)])],64)),createBaseVNode(`div`,_hoisted_14$12,[renderSlot(_ctx.$slots,`default`,{},void 0,true)])])]),_:3})]),_:3},8,[`modelValue`]),__props.canConfigure?(openBlock(),createBlock(VDialog,{key:0,modelValue:routingOpen.value,"onUpdate:modelValue":_cache[9]||(_cache[9]=$event=>routingOpen.value=$event),"max-width":`38rem`,persistent:routingSaving.value,scrollable:``,"aria-label":`Model routing`,onAfterEnter:_cache[10]||(_cache[10]=$event=>routingFocusRole.value=decisions.value.auto?.missingRoles?.[0]||``),onAfterLeave:_cache[11]||(_cache[11]=$event=>modeMenu.value?.activatorEl?.focus())},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[routingOpen.value?(openBlock(),createBlock(unref(ModelRoutingForm_default),{key:0,"engine-id":workflowEngineId.value,"focus-role":routingFocusRole.value,onBusy:_cache[6]||(_cache[6]=$event=>routingSaving.value=$event),onClose:_cache[7]||(_cache[7]=$event=>routingOpen.value=false),onSaved:_cache[8]||(_cache[8]=$event=>{routingSaving.value=false;routingOpen.value=false})},null,8,[`engine-id`,`focus-role`])):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])):createCommentVNode(``,true)],64)}}};var Vibe64ChatModeControls_default=_plugin_vue_export_helper_default(_sfc_main$32,[[`__scopeId`,`data-v-3ea2a11b`]]);var _sfc_main$31={__name:`Vibe64AgentSettingsMenu`,props:{agentSettings:{type:Object,default:()=>({})},assistantSelection:{type:Object,default:()=>({})},disabled:Boolean,location:{type:String,default:`top start`}},emits:[`update-setting`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const menuOpen=ref(false);const currentSettings=computed(()=>normalizeVibe64AgentSettings({...props.agentSettings,providerId:props.assistantSelection.engineId}));const draft=ref(currentSettings.value);watch([currentSettings,menuOpen],()=>{draft.value={...currentSettings.value}});const engineId=computed(()=>props.assistantSelection.engineId);const modelProviderId=computed(()=>props.assistantSelection.modelProviderId);const catalog=useVibe64AssistantCatalog({active:computed(()=>menuOpen.value&&Boolean(engineId.value&&modelProviderId.value)),engineId,modelProviderId,providerConnectedOnly:true});const provider=computed(()=>engineId.value&&catalog.modelEngine.value?.engineId===engineId.value?catalog.modelEngine.value.modelProviders.find(row=>row.id===modelProviderId.value&&row.connected):null);const models=computed(()=>(provider.value?.models||[]).filter(model=>model.status===`available`));const modelRows=computed(()=>[{id:``,label:`Use main chat model`},...models.value]);const selectedModel=computed(()=>models.value.find(model=>model.id===(draft.value.model||props.assistantSelection.modelId)));const variantRows=computed(()=>[{id:``,label:`Automatic`},...selectedModel.value?.variants||[]]);const catalogLoading=computed(()=>catalog.modelPage.isInitialLoading.value);const catalogError=computed(()=>catalog.modelPage.loadError.value||``);const summary=computed(()=>{const modelId=currentSettings.value.model||props.assistantSelection.modelId;return modelId?vibe64AssistantSelectionLabel({engineId:engineId.value,modelId,variantId:currentSettings.value.thinking}):`Use main chat model`});const canSave=computed(()=>!props.disabled&&!catalogLoading.value&&!catalogError.value&&Boolean(selectedModel.value)&&variantRows.value.some(row=>row.id===draft.value.thinking)&&[`model`,`thinking`].some(key=>draft.value[key]!==currentSettings.value[key]));function select(key,value){if(props.disabled)return;if(key===`model`&&modelRows.value.some(row=>row.id===value)){draft.value={...draft.value,model:value};if(!variantRows.value.some(row=>row.id===draft.value.thinking))draft.value.thinking=``}else if(key===`thinking`&&variantRows.value.some(row=>row.id===value))draft.value={...draft.value,thinking:value}}function apply(){if(!canSave.value)return;const selected={...draft.value};for(const key of[`model`,`thinking`])if(selected[key]!==currentSettings.value[key])emit(`update-setting`,key,selected[key]);menuOpen.value=false}return(_ctx,_cache)=>{return openBlock(),createBlock(unref(AssistantModelControl_default),{modelValue:menuOpen.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>menuOpen.value=$event),location:__props.location,"provider-rows":provider.value?[{id:provider.value.id,label:provider.value.label}]:[],"model-provider-id":modelProviderId.value,"model-rows":modelRows.value,"model-id":draft.value.model,"variant-rows":variantRows.value,"variant-id":draft.value.thinking,"selection-summary":summary.value,"button-title":`AI controls: ${summary.value}`,"changes-disabled":__props.disabled,"can-save":canSave.value,"catalog-loading":catalogLoading.value,"catalog-error":catalogError.value,onSelectModel:_cache[2]||(_cache[2]=$event=>select(`model`,$event)),onSelectVariant:_cache[3]||(_cache[3]=$event=>select(`thinking`,$event)),onApply:apply,onReload:unref(catalog).reload},{footer:withCtx(()=>[createVNode(VBtn,{"aria-label":`Close AI controls`,"min-height":`48`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>menuOpen.value=false)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(` Close `,-1)])]),_:1})]),_:1},8,[`modelValue`,`location`,`provider-rows`,`model-provider-id`,`model-rows`,`model-id`,`variant-rows`,`variant-id`,`selection-summary`,`button-title`,`changes-disabled`,`can-save`,`catalog-loading`,`catalog-error`,`onReload`])}}};function routedChatMessage(request,local=null){if(local?.status===`pending`&&local.id===request?.messageId&&[`failed`,`uncertain`].includes(request?.delivery))return local;if(local?.status===`uncertain`&&local.id===request?.messageId&&request?.delivery===`failed`)return local;if(!request||!request.input||request.stopped||request.followup||![`routing`,`sending`,`uncertain`,`failed`].includes(request.delivery))return null;return{...local,id:request.messageId,text:request.input.displayMessage||request.input.message,payload:local?.payload||request.input,status:[`failed`,`uncertain`].includes(request.delivery)?request.delivery:`pending`,error:request.error||``}}function chatTurnsWithRouting(turns,request,checking=false){const result=chatTurnsWithDelivery(turns,request,checking);const notice=assistantRoutingOutcomeNotice(request);if(!notice||result.some(turn=>turn.system?.messageId===notice.messageId))return result;return[...result,{turnId:notice.messageId,system:{role:`system`,...notice}}]}function chatTurnsWithDelivery(turns,request,checking){if(!request)return turns;const matches=turn=>turn.user?.messageId===request.messageId||turn.optimistic?.id===request.messageId;if(turns.some(turn=>matches(turn)&&(!turn.optimistic&&turn.user?.receipt!==false||turn.optimistic?.status===`accepted`)))return turns;if([`failed`,`uncertain`].includes(request.delivery)&&turns.some(turn=>matches(turn)&&turn.optimistic?.status===`pending`))return turns;const message=routedChatMessage(request);if(!message){if(request.delivery!==`accepted`&&!request.followup)return turns;return turns.map(turn=>matches(turn)&&turn.optimistic?{...turn,...turn.system?.delivery?.messageId===request.messageId?{system:void 0}:{},optimistic:{...turn.optimistic,status:`accepted`,error:``}}:turn)}return(turns.some(matches)?turns:[...turns,{turnId:`routing:${message.id}`,user:{role:`user`,text:message.text,messageId:message.id,attachments:request.input.displayAttachments||[]},messages:[]}]).map(turn=>!matches(turn)||turn.optimistic?.status===`uncertain`&&message.status===`failed`?turn:{...turn,optimistic:{...turn.optimistic,id:message.id,status:message.status,error:message.error},system:{role:`system`,text:assistantRoutingStatusLabel(request),...message.status===`uncertain`?{delivery:{messageId:message.id,error:message.error,checking}}:{}}})}var _sfc_main$30={__name:`Vibe64EphemeralConversationMessages`,props:{adapter:{type:Object,required:true},recoveryMessage:{type:Object,default:null},routingRequest:{type:Object,default:null},working:{type:Boolean,default:void 0},sessionId:{type:String,default:``},scrollKey:{type:String,default:``},assistantLabel:{type:String,default:`Temporary AI`},emptyMessage:{type:String,default:`Ask a focused question without adding it to the main conversation.`},userLabel:{type:String,default:`You`}},emits:[`resend`,`cancel`,`edit`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const displayAdapter=computed(()=>{const supplied=props.adapter;let turns=(supplied.conversation.turns||[]).map(turn=>{const selection=turn.metadata?.assistantSelection;const present=message=>{if(!message)return message;const recordedSelection=message.assistantSelection||message.metadata?.assistantSelection||selection;const displayed=thinkingMessagePresentation(message,recordedSelection);return displayed&&{...displayed,...conversationAttribution(recordedSelection,message.assistantRouting||message.metadata?.assistantRouting||turn.metadata?.assistantRouting)}};return{...turn,...conversationAttribution(selection,turn.metadata?.assistantRouting),assistant:present(turn.assistant),thinking:turn.thinking?.map(present).filter(Boolean),commentary:turn.commentary?.map(present).filter(Boolean),messages:turn.messages?.map(present).filter(Boolean)}});const notice=props.recoveryMessage;if(notice&&!turns.some(turn=>(turn.messages||[turn.system]).some(message=>message?.messageId===notice.id)))turns=[...turns,{turnId:notice.id,system:{...notice,messageId:notice.id},messages:[{...notice,messageId:notice.id}]}];turns=chatTurnsWithRouting(supplied.delivery?supplied.delivery.turns(turns):turns,props.routingRequest,supplied.delivery?.state.sending===true);return{...supplied,delivery:null,conversation:{...supplied.conversation,cancellableDelivery:true,working:props.working??supplied.conversation.working,turns,assistantLabel:props.assistantLabel,scrollKey:props.scrollKey,variant:`task`,visible:true,userMessageFormat:`plain`,progressPreviewLimit:usesCommentaryForThinking(turns.at(-1)?.metadata?.assistantSelection)?1:0,systemLabel:`System`,welcomeMessage:turns.length?``:props.emptyMessage},actions:{...supplied.actions,resend:id=>emit(`resend`,id),checkDelivery:id=>emit(`resend`,id),cancel:id=>emit(`cancel`,id),edit:id=>emit(`edit`,id)}}});return(_ctx,_cache)=>{return openBlock(),createBlock(unref(AssistantConversationElement_default),{adapter:displayAdapter.value},createSlots({attachments:withCtx(({items})=>[createVNode(_sfc_main$39,{items,"session-id":__props.sessionId},null,8,[`items`,`session-id`])]),"system-message":withCtx(({message})=>[createVNode(Vibe64ConversationStatus_default,{message,onCheckDelivery:_cache[0]||(_cache[0]=$event=>emit(`resend`,$event))},createSlots({_:2},[_ctx.$slots[`message-text`]?{name:`default`,fn:withCtx(()=>[renderSlot(_ctx.$slots,`message-text`,{message})]),key:`0`}:void 0]),1032,[`message`])]),_:2},[_ctx.$slots.hints?{name:`hints`,fn:withCtx(()=>[renderSlot(_ctx.$slots,`hints`)]),key:`0`}:void 0,_ctx.$slots.composer?{name:`composer`,fn:withCtx(()=>[renderSlot(_ctx.$slots,`composer`)]),key:`1`}:void 0]),1032,[`adapter`])}}};function chatText(value=``){return String(value||``).trim()}function createChatMessageId({now=Date.now(),originId=vibe64BrowserTabOriginId(),sequence=0}={}){const origin=chatText(originId);const timestamp=Number(now);if(!origin||!Number.isFinite(timestamp))throw new TypeError(`Chat message ids require a browser origin and timestamp.`);const number=Number.isSafeInteger(sequence)&&sequence>0?sequence:1;return`message_${origin.replace(/[^A-Za-z0-9_-]+/gu,`_`)}_${timestamp.toString(36)}_${number.toString(36)}`}function chatMessagePayload(message=``,attachments=[]){const text=chatText(message);if(!text)return null;const files=Array.isArray(attachments)?attachments:[];const attachmentIds=files.map(attachment=>chatText(attachment?.attachmentId)).filter(Boolean);const displayAttachments=normalizeVibe64ConversationAttachments(files.filter(attachment=>chatText(attachment?.attachmentId)));return{...attachmentIds.length?{attachmentIds}:{},...displayAttachments.length?{displayAttachments}:{},displayMessage:text,message:text}}function temporaryAiId(prefix=`temporary`){return`${prefix}_${crypto.randomUUID()}`}function temporaryAiText(value=``){return String(value||``).trim()}function temporaryAiRequestError(response={},fallback=`Temporary AI request failed.`){return Object.assign(new Error(vibe64ApiResponseError(response,fallback)),{code:temporaryAiText(response.code),conversationExpired:response.conversationExpired===true||response.code===`vibe64_conversation_closed`,status:temporaryAiText(response.status)})}function temporaryAiTurnIsActive(status=``){const normalizedStatus=temporaryAiText(status);return[`starting`,`inProgress`].includes(normalizedStatus)||normalizedStatus===`preparing`}function temporaryAiMessages(turns=[]){return turns.flatMap(turn=>(turn.messages||[turn.system,turn.user,...turn.thinking||[],...turn.commentary||[],turn.assistant].filter(Boolean)).map(message=>({...message,id:message.messageId||message.id,...message.role===`user`?{attachments:turn.user?.attachments||[]}:{},status:message.status||(message.complete===false?`inProgress`:`completed`),assistantSelection:turn.metadata?.assistantSelection,assistantRouting:turn.metadata?.assistantRouting})))}function useVibe64TemporaryAi({active=()=>true,agentSettings=()=>defaultVibe64AgentSettings(),assistantReady=()=>false,onTaskFinished=null,operationBusy=()=>false,sessionId,sessionsApiPath}={}){const tasks=ref([]);const activeTaskId=ref(``);const open=ref(false);const restorations=new Map;const saveTimers=new Map;const pendingSaveFields=new Map;const saveVersions=new Map;const creations=new Map;const saves=new Map;const closedConversationIds=new Set;const projectSlug=useVibe64ProjectSlug();const viewer=hasInjectionContext()?inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`}):{actorKey:`local`};const actorKey=computed(()=>readRefOrGetterValue(viewer)?.actorKey||``);const acquireConversation=useAssistantConversationFactory({actorKey:()=>actorKey.value,endpoint:`/api/assistant/app`,surfaceId:`app`,hostSurfaceId:`app`,workspaceSlug:``,queueWhileSending:true,clearDraftOn:`dispatch`,presentation:{assistantLabel:`Temporary AI`,variant:`task`,visible:true,userMessageFormat:`plain`,systemLabel:`System`}});const restoreError=ref(``);let restoreGeneration=0;let restoreRetryTimer;const closingTaskIds=new Set;const stoppingTaskIds=new Set;let disposed=false;let nextTaskNumber=1;const activeTask=computed(()=>tasks.value.find(task=>task.id===activeTaskId.value)||tasks.value[0]||null);const visibleTaskId=computed(()=>readRefOrGetterValue(active)&&open.value?activeTask.value?.id||``:``);const hasUnreadMessages=computed(()=>tasks.value.some(task=>task.unread));watch(visibleTaskId,taskId=>{if(taskId)updateTask(taskId,{unread:false})},{immediate:true});const updateRepairTask=computed(()=>[...tasks.value].reverse().find(task=>task.sessionId===currentSessionId()&&task.recoveryOperation===`update`&&task.recoveryOutcome!==`succeeded`)||null);function currentSessionId(){return temporaryAiText(readRefOrGetterValue(sessionId))}function currentSessionsApiPath(){return temporaryAiText(readRefOrGetterValue(sessionsApiPath))}function canApplyTaskResponse(task){return!disposed&&tasks.value.some(current=>current.id===task.id&¤t.binding===task.binding)}function taskView(value){const task={...value};const runtime=task.binding.runtime.value;Object.defineProperties(task,{draft:{enumerable:true,configurable:true,get:()=>runtime.draft.value,set:value=>{runtime.draft.value=value}},attachments:{enumerable:true,configurable:true,get:()=>runtime.draftAttachments.value,set:value=>{runtime.draftAttachments.value=value}},delivery:{enumerable:true,configurable:true,get:()=>runtime.delivery},messages:{enumerable:true,configurable:true,get(){const messages=temporaryAiMessages(runtime.turns.value);return task.recoveryMessage&&!messages.some(message=>message.id===task.recoveryMessage.id)?[...messages,task.recoveryMessage]:messages}},adapter:{enumerable:true,configurable:true,get:()=>task.binding.adapter.value}});return task}function bindTask(value){const taskId=value.id;let binding;binding=markRaw(acquireConversation({conversationId:temporaryConversationId({projectSlug:projectSlug.value,sessionId:value.sessionId,conversationId:taskId}),active:()=>!disposed&&Boolean(tasks.value.find(task=>task.id===taskId&&task.binding===binding)?.conversationId)}));const runtime=binding.runtime.value;runtime.draft.value=value.draft||``;runtime.draftAttachments.value=value.attachments||[];let observedSnapshot=false;const stop=watch([runtime.snapshot,runtime.turns,runtime.error,()=>runtime.delivery.state.sending],([snapshot,turns,error,sending],[,previousTurns=[]]=[])=>{const task=tasks.value.find(task=>task.id===taskId&&task.binding===binding);if(!task||disposed)return;const previous=observedSnapshot?temporaryAiMessages(previousTurns):value.messages||[];if(snapshot)observedSnapshot=true;const newReply=temporaryAiMessages(turns).some(message=>message.role===`assistant`&&temporaryAiText(message.text)&&!previous.some(old=>old.id===message.id&&old.text===message.text));const observed=snapshot?.presentation;const canApplyProgress=!closingTaskIds.has(taskId)&&!stoppingTaskIds.has(taskId)&&!(task.status===`interrupted`&&!task.busy);const update={unread:visibleTaskId.value!==taskId&&(task.unread===true||newReply)};if(observed){for(const field of[`routingMetadata`,`purposes`,`canSteer`,`assistantSelection`,`goal`])if(Object.hasOwn(observed,field))update[field]=observed[field];if(!observed.readError&&!observed.deferredReconciliation)update.nativeWorking=temporaryAiTurnIsActive(temporaryAiText(observed.status));const route=JSON.parse(observed.routingMetadata?.assistant_routing_request||`null`);const sameRequest=!task.messageId||observed.messageId===task.messageId||route?.messageId===task.messageId;if(canApplyProgress&&!sending&&(!task.busy||sameRequest)){if(!observed.readError&&!observed.deferredReconciliation){update.status=temporaryAiText(observed.status)||task.status;update.busy=temporaryAiTurnIsActive(update.status);update.phase=update.busy?temporaryAiText(snapshot.phase):``;update.runId=observed.runId||task.runId;update.outcomeKind=temporaryAiText(observed.outcome?.kind)}if(!observed.deferredReconciliation)update.error=temporaryAiText(observed.error||error)}if(snapshot.pendingRequest&&!task.pendingMessageId)update.pendingMessageId=snapshot.pendingRequest.messageId}else if(error&&canApplyProgress)update.error=error;const finished=task.busy&&update.busy===false&&update.status!==`interrupted`;updateTask(taskId,update);if(finished)reportTaskFinished(taskId)},{flush:`sync`});return taskView({...value,binding,releaseBinding:markRaw(()=>{stop();binding.release()})})}function updateTask(taskId=``,update={}){if(Object.hasOwn(update,`draft`)&&!Object.hasOwn(update,`status`))update={...update,draftSaveState:`saving`};tasks.value=tasks.value.map(task=>{if(task.id!==taskId)return task;if(Object.hasOwn(update,`draft`))task.draft=update.draft;if(Object.hasOwn(update,`attachments`))task.attachments=update.attachments;return taskView({...task,...update})});const task=tasks.value.find(task=>task.id===taskId)||null;const changed=[`draft`,`agentSettings`,`attachments`,`recoveryOutcome`,`recoveryRetryKeys`,`recoveryOutcomeMessage`,`recoveryContext`,`recoveryConflictId`,`recoveryRequestId`,`recoveryAutoPaused`].filter(key=>Object.hasOwn(update,key));if(task&&!Object.hasOwn(update,`status`)&&changed.length){saveVersions.set(taskId,{draft:(saveVersions.get(taskId)?.draft||0)+(changed.includes(`draft`)?1:0)});const pending=pendingSaveFields.get(taskId)||new Set;for(const key of changed)pending.add(key);pendingSaveFields.set(taskId,pending);scheduleSave(taskId)}return task}function taskPresentation(task,selected){return Object.fromEntries([`title`,`draft`,`displayMessage`,`completionMessage`,`dedupeKey`,`failureMessage`,`nextStepMessage`,`recoveryNotice`,`recoveryOperation`,`recoveryConflictId`,`recoveryContext`,`recoveryOutcome`,`recoveryOutcomeMessage`,`recoveryRequestId`,`recoveryAutoPaused`,`recoveryRetryKeys`,`runConflictId`].filter(key=>!selected||selected.has(key)).map(key=>[key,task[key]]))}async function ensureConversation(task){const current=tasks.value.find(candidate=>candidate.id===task.id);if(!current)throw temporaryAiRequestError({code:`vibe64_conversation_closed`});if(current.conversationId)return current.conversationId;if(creations.has(task.id))return creations.get(task.id);const creation=request(vibe64TemporaryConversationsPath(task.apiPath,task.sessionId),{method:`POST`,body:{conversationId:task.id,...task.includeRecentChatContext?{includeRecentChatContext:true}:{},...task.initialRouting?{assistantRouting:task.initialRouting}:{},agentSettings:current.agentSettings,presentation:taskPresentation(current)}}).then(created=>{if(canApplyTaskResponse(task))updateTask(task.id,{conversationId:created.conversationId,assistantSelection:created.assistantSelection,routingMetadata:created.routingMetadata,recentChatContext:created.recentChatContext,purposes:created.purposes,goal:created.goal||null});return created.conversationId});creations.set(task.id,creation);try{return await creation}finally{creations.delete(task.id)}}function scheduleSave(taskId,delayMs=250){clearTimeout(saveTimers.get(taskId));saveTimers.set(taskId,setTimeout(()=>{saveTimers.delete(taskId);saveTask(taskId)},delayMs))}async function saveTask(taskId){const currentTask=tasks.value.find(candidate=>candidate.id===taskId);const task=currentTask&&{...currentTask};if(!task||disposed||closingTaskIds.has(taskId)||task.state===`closing`)return;const fields=pendingSaveFields.get(taskId);if(!fields?.size)return;const version=saveVersions.get(taskId);pendingSaveFields.delete(taskId);const previous=saves.get(taskId);const operation=(async()=>{await previous;if(!canApplyTaskResponse(task)||tasks.value.find(candidate=>candidate.id===taskId)?.state===`closing`)return false;const conversationId=await ensureConversation(task);if(!canApplyTaskResponse(task))return;const savedPresentation=taskPresentation(task,fields);const savedSettings=fields.has(`agentSettings`)&&task.settingsToSave;const saved=await request(vibe64TemporaryConversationPath(task.apiPath,task.sessionId,conversationId),{method:`PATCH`,body:{...Object.keys(savedPresentation).length?{presentation:savedPresentation}:{},...savedSettings?{agentSettings:savedSettings}:{},...fields.has(`attachments`)?{attachmentIds:task.attachments.map(attachment=>attachment.attachmentId)}:{}}});if(saved?.routingMetadata&&canApplyTaskResponse(task))updateTask(taskId,{routingMetadata:saved.routingMetadata,purposes:saved.purposes});if(canApplyTaskResponse(task)&&savedSettings)task.binding.runtime.value.reload();const current=tasks.value.find(candidate=>candidate.id===taskId);if(canApplyTaskResponse(task)&&savedSettings&¤t.settingsToSave===savedSettings)updateTask(taskId,{settingsToSave:null});if(canApplyTaskResponse(task)&&fields.has(`draft`)&&version?.draft===saveVersions.get(taskId)?.draft)updateTask(taskId,{draftSaveState:`saved`,...current?.error?.startsWith(`Draft could not be saved:`)?{error:``}:{}});if(canApplyTaskResponse(task)&&version===saveVersions.get(taskId)&&!pendingSaveFields.get(taskId)?.size&¤t?.error?.startsWith(`Conversation state could not be saved:`))updateTask(taskId,{error:``});return true})().catch(error=>{if(!canApplyTaskResponse(task))return;const pending=pendingSaveFields.get(taskId)||new Set;for(const key of fields)pending.add(key);pendingSaveFields.set(taskId,pending);if(error.code===`vibe64_conversation_closed`){removeTask(taskId);return}if(error.code===`vibe64_conversation_closing`){pendingSaveFields.delete(taskId);updateTask(taskId,{state:`closing`,draftSaveState:`failed`,error:`This conversation is closing; retry Close after cleanup.`});return false}if(fields.has(`draft`)&&version?.draft===saveVersions.get(taskId)?.draft||version===saveVersions.get(taskId))updateTask(taskId,{...fields.has(`draft`)?{draftSaveState:`failed`}:{},error:`${fields.has(`draft`)?`Draft`:`Conversation state`} could not be saved: ${error.message}`});if(error.code===`vibe64_agent_write_mode_busy`&&!closingTaskIds.has(taskId))scheduleSave(taskId,1e3);return false});saves.set(taskId,operation);try{return await operation}finally{if(saves.get(taskId)===operation)saves.delete(taskId)}}async function restoreTasks(){clearTimeout(restoreRetryTimer);const generation=++restoreGeneration;if(disposed||!actorKey.value||!readRefOrGetterValue(assistantReady))return;const ownerSessionId=currentSessionId();const apiPath=currentSessionsApiPath();if(!ownerSessionId||!apiPath)return;const persistedTasks=tasks.value.filter(task=>task.conversationId);try{const key=JSON.stringify([apiPath,ownerSessionId,actorKey.value]);let restoring=restorations.get(key);if(restoring){await restoring.catch(()=>{});if(!disposed&&generation===restoreGeneration)return restoreTasks();return}restoring=request(vibe64TemporaryConversationsPath(apiPath,ownerSessionId),{method:`GET`}).finally(()=>restorations.delete(key));restorations.set(key,restoring);const response=await restoring;if(disposed||generation!==restoreGeneration)return;restoreError.value=``;const records=response.conversations||[];for(const task of persistedTasks)if(!records.some(record=>record.conversationId===task.conversationId))removeTask(task.id);for(const record of records){if(closedConversationIds.has(record.conversationId))continue;const existing=tasks.value.find(task=>task.conversationId===record.conversationId||task.id===record.conversationId);if(existing){updateTask(existing.id,{purposes:record.purposes,canSteer:record.canSteer});continue}const task=bindTask({...record,id:record.conversationId,sessionId:ownerSessionId,apiPath,agentSettings:normalizeVibe64AgentSettings(record.agentSettings),attachments:record.attachments||[],pendingMessageId:``,draft:record.draft||``,draftSaveState:record.draft?`saved`:``,messages:record.messages||[],unread:false,busy:temporaryAiTurnIsActive(record.status),nativeWorking:false,recoveryRetryKeys:record.recoveryRetryKeys||[],recoveryOutcome:record.recoveryOutcome===`checking`?`unconfirmed`:record.recoveryOutcome,recoveryOutcomeMessage:record.recoveryOutcome===`checking`?`The Update request was interrupted. Vibe64 is checking its saved result; do not start a second Update yet.`:record.recoveryOutcomeMessage});tasks.value.push(task);if(!activeTaskId.value)activeTaskId.value=task.id}}catch(error){if(disposed||generation!==restoreGeneration)return;if(error.code===`vibe64_agent_write_mode_busy`){restoreError.value=``;restoreRetryTimer=setTimeout(()=>void restoreTasks(),1e3);return}restoreError.value=`Temporary chats could not be restored: ${error.message}`;open.value=true}}function reportTaskFinished(taskId=``){if(typeof onTaskFinished!==`function`)return;const task=tasks.value.find(candidate=>candidate.id===taskId);if(!task)return;try{onTaskFinished(Object.freeze({completionMessage:temporaryAiText(task.completionMessage),dedupeKey:temporaryAiText(task.dedupeKey),error:temporaryAiText(task.error),failureMessage:temporaryAiText(task.failureMessage),id:task.id,outcomeKind:temporaryAiText(task.outcomeKind),recoveryOperation:temporaryAiText(task.recoveryOperation),runConflictId:temporaryAiText(task.runConflictId),runId:task.runId,sessionId:task.sessionId,status:temporaryAiText(task.status),title:temporaryAiText(task.title)||`Temporary AI`}))}catch{}}function openTask({completionMessage=``,dedupeKey=``,displayMessage=``,draft=``,failureMessage=``,nextStepMessage=``,recoveryNotice=``,recoveryOperation=``,recoveryConflictId=``,recoveryContext=``,initialRouting=null,includeRecentChatContext=false,title=``}={}){const number=nextTaskNumber;nextTaskNumber+=1;const task=bindTask({initialRouting,includeRecentChatContext,agentSettings:normalizeVibe64AgentSettings(readRefOrGetterValue(agentSettings)),apiPath:currentSessionsApiPath(),attachments:[],busy:false,nativeWorking:false,completionMessage:temporaryAiText(completionMessage),conversationId:``,dedupeKey:temporaryAiText(dedupeKey),displayMessage:temporaryAiText(displayMessage),draft:temporaryAiText(draft),error:``,failureMessage:temporaryAiText(failureMessage),id:temporaryAiId(`temporary-ai`),messages:[],unread:false,nextStepMessage:temporaryAiText(nextStepMessage),pendingMessageId:``,recoveryOutcome:``,recoveryOutcomeMessage:``,recoveryNotice:temporaryAiText(recoveryNotice),recoveryOperation:recoveryOperation===`update`?`update`:``,recoveryConflictId:temporaryAiText(recoveryConflictId),recoveryContext:temporaryAiText(recoveryContext),recoveryRetryKeys:[],recoveryAutoPaused:false,runId:``,runConflictId:``,sessionId:currentSessionId(),status:`ready`,title:temporaryAiText(title)||`Temporary ${number}`});tasks.value=[...tasks.value,task];activeTaskId.value=task.id;open.value=true;if(task.draft)updateTask(task.id,{draft:task.draft});return task}async function createTask(options={}){const task=tasks.value.find(value=>value.id===options.taskId)||openTask(options);try{await ensureConversation(task);if(canApplyTaskResponse(task))updateTask(task.id,{error:``});return task}catch(error){if(canApplyTaskResponse(task))updateTask(task.id,{error:error.message});error.taskId=task.id;throw error}}async function startTask(options={}){const input=options&&typeof options===`object`&&!Array.isArray(options)?options:{};const message=temporaryAiText(input.message||input.draft);if(!message||!currentSessionId()||!currentSessionsApiPath())return Object.freeze({ok:false,reused:false,started:false,taskId:``});const dedupeKey=temporaryAiText(input.dedupeKey);const repair=input.recoveryOperation===`update`?updateRepairTask.value:null;if(repair){selectTask(repair.id);if(repair.busy||repair.recoveryOutcome===`checking`||closingTaskIds.has(repair.id))return{ok:true,reused:true,started:false,taskId:repair.id};if((repair.draft.trim()||repair.attachments.length)&&!repair.pendingMessageId)return{ok:true,reused:true,started:false,taskId:repair.id};if(!repair.pendingMessageId)updateTask(repair.id,{recoveryContext:message,recoveryConflictId:temporaryAiText(input.recoveryConflictId),recoveryRetryKeys:[]});const started=await send(repair.id,repair.pendingMessageId?{retryMessageId:repair.pendingMessageId}:{generatedMessage:{message,displayMessage:`Continue repairing this Update.`}});return{ok:started,reused:true,started,taskId:repair.id}}const existingTask=dedupeKey?[...tasks.value].reverse().find(task=>task.dedupeKey===dedupeKey&&(task.busy||task.status===`failed`&&temporaryAiText(task.pendingMessageId))):null;if(existingTask){selectTask(existingTask.id);const started=existingTask.busy?false:await send(existingTask.id,{retryMessageId:existingTask.pendingMessageId});return Object.freeze({ok:existingTask.busy||started,reused:true,started,taskId:existingTask.id})}const task=openTask({...input,initialRouting:{mode:input.recoveryOperation===`update`||input.initialRouting?.mode===`senior`?`senior`:`junior`,review:false},dedupeKey,draft:``,displayMessage:``,recoveryContext:message});const started=await send(task.id,{generatedMessage:{message,displayMessage:input.displayMessage||message}});return Object.freeze({ok:started,reused:false,started,taskId:task.id})}function selectTask(taskId=``){if(tasks.value.some(task=>task.id===taskId)){activeTaskId.value=taskId;open.value=true}}function showWorkspace(){if(tasks.value.length===0)return openTask();if(!tasks.value.some(task=>task.id===activeTaskId.value))activeTaskId.value=tasks.value[0].id;open.value=true;return activeTask.value}function updateDraft(taskId=``,draft=``){updateTask(taskId,{displayMessage:``,draft:String(draft||``)})}async function updateRouting(taskId,preferences){const task=tasks.value.find(candidate=>candidate.id===taskId);const conversationId=await ensureConversation(task);const result=await request(vibe64TemporaryConversationPath(task.apiPath,task.sessionId,conversationId),{method:`PATCH`,body:{assistantRouting:preferences}});if(canApplyTaskResponse(task)){updateTask(taskId,{routingMetadata:result.routingMetadata,purposes:result.purposes});task.binding.runtime.value.reload()}return result}function updateAgentSetting(taskId=``,parameterId=``,value=``){const task=tasks.value.find(candidate=>candidate.id===taskId);if(!task)return;const settings=normalizeVibe64AgentSettings({...task.agentSettings,[parameterId]:value});updateTask(taskId,{agentSettings:settings,settingsToSave:settings})}function reportRecoveryOutcome(taskId=``,{message=``,status=``,retryMessage=``,retryKey=``,recoveryConflictId=``,recoveryRequestId=``}={}){const outcome=temporaryAiText(status);const task=tasks.value.find(task=>task.id===taskId);if(disposed||!task||closingTaskIds.has(taskId)||![`checking`,`failed`,`succeeded`,`unconfirmed`].includes(outcome))return false;const messageId=`recovery_${task.runId||task.id}`;updateTask(taskId,{...outcome===`succeeded`&&!task.messages.some(({id})=>id===messageId)?{recoveryMessage:{id:messageId,role:`system`,text:temporaryAiText(message)||`Repair verified.`}}:{},recoveryOutcome:outcome,...recoveryRequestId?{recoveryRequestId}:{},recoveryAutoPaused:false,recoveryOutcomeMessage:temporaryAiText(message),...outcome!==`checking`?{recoveryContext:outcome===`failed`?retryMessage||message:message,recoveryConflictId:temporaryAiText(recoveryConflictId)}:{}});if(outcome===`failed`&&task.recoveryOperation===`update`&&retryMessage&&retryKey&&!readRefOrGetterValue(operationBusy)&&!stoppingTaskIds.has(taskId)&&!task.busy&&task.status!==`interrupted`){const retries=task.recoveryRetryKeys||[];if(retries.includes(retryKey)||retries.length>=3)updateTask(taskId,{recoveryAutoPaused:true,recoveryOutcomeMessage:`${message}\nAutomatic repair paused after repeated conflicts. Review the result, then continue here or check Update again.`});else if(!task.draft.trim()&&!task.attachments.length){updateTask(taskId,{recoveryRetryKeys:[...retries,retryKey]});send(taskId,{generatedMessage:{message:retryMessage,displayMessage:`Continue repairing the remaining conflicts.`}})}}return true}function updateAttachments(taskId=``,attachments=[]){if(!tasks.value.find(candidate=>candidate.id===taskId))return;updateTask(taskId,{attachments:Array.isArray(attachments)?attachments:[]})}async function request(path=``,options={}){const response=await getHttpWebClient().request(path,options);if(response?.ok===false)throw temporaryAiRequestError(response);return response}function pendingMessage(task,messageId){const local=task?.delivery.find(messageId);const route=JSON.parse(task?.routingMetadata?.assistant_routing_request||`null`);return route?.messageId===messageId&&routedChatMessage(route,local)||local}async function send(taskId=``,{retryMessageId=``,generatedMessage=null,attachmentOwner=null}={}){const task=tasks.value.find(candidate=>candidate.id===taskId);if(disposed||!task||closingTaskIds.has(taskId)||stoppingTaskIds.has(taskId)||readRefOrGetterValue(operationBusy)||task.recoveryOutcome===`checking`)return false;const retry=retryMessageId?pendingMessage(task,retryMessageId):null;const draftPayload=generatedMessage||chatMessagePayload(task.draft,task.attachments);const payload=retry?.payload||draftPayload&&{...draftPayload,agentSettings:task.agentSettings,displayMessage:draftPayload.displayMessage,presentation:taskPresentation(task),message:!generatedMessage&&task.recoveryContext?`${task.recoveryContext}\n\nUser message:\n${draftPayload.message}`:draftPayload.message,...task.recoveryOperation===`update`?{outputSchema:VIBE64_AGENT_TASK_RESULT_SCHEMA}:{},promptLabel:task.title};if(!payload?.message)return false;const authored=payload.request?payload:{...payload,data:{agentSettings:payload.agentSettings,displayMessage:payload.displayMessage,presentation:payload.presentation,...payload.outputSchema?{outputSchema:payload.outputSchema}:{},promptLabel:payload.promptLabel}};const messageId=retryMessageId||temporaryAiId(`message`);const working=[`starting`,`inProgress`].includes(task.status);function accepted(){if(!canApplyTaskResponse(task)||closingTaskIds.has(taskId))return;const current=tasks.value.find(candidate=>candidate.id===taskId);if(current.pendingMessageId!==messageId)return;updateTask(taskId,{displayMessage:``,pendingMessageId:``,error:``,errorCode:``,status:current.status});if(retry||current.draft||current.attachments.length)updateTask(taskId,{draft:current.draft})}try{const submission=task.binding.submitPrepared(authored,{messageId,retryMessageId,retry,working,clearDraft:!generatedMessage,attachments:attachmentOwner,isCurrent:()=>canApplyTaskResponse(task)&&!closingTaskIds.has(taskId),onAccepted:accepted,onSubmit(){updateTask(taskId,{sendVersion:(task.sendVersion||0)+1,messageId,busy:true,error:``,errorCode:``,pendingMessageId:messageId,outcomeKind:``,runConflictId:task.recoveryConflictId,recoveryOutcome:task.recoveryOutcome===`failed`?`failed`:``,recoveryOutcomeMessage:task.recoveryOutcome===`failed`?task.recoveryOutcomeMessage:``,status:`starting`});clearTimeout(saveTimers.get(taskId));saveTimers.delete(taskId)},async prepare(submission){if(saves.has(taskId))await saves.get(taskId);if(!canApplyTaskResponse(task)||closingTaskIds.has(taskId))return false;await ensureConversation(task);if(!canApplyTaskResponse(task)||closingTaskIds.has(taskId))return false;return{...submission.request,data:{...submission.request.data,presentation:{...submission.request.data.presentation,draft:tasks.value.find(candidate=>candidate.id===taskId).draft}}}}});if(submission===false)return false;const response=await submission;if(!canApplyTaskResponse(task)||closingTaskIds.has(taskId))return false;if(response===false||response?.ok===false)throw temporaryAiRequestError(response||{error:task.delivery.find(messageId)?.error||`Message could not be sent.`});const current=tasks.value.find(candidate=>candidate.id===taskId);if(response?.assistantRoutingRequest)updateTask(taskId,{routingMetadata:{...current.routingMetadata,assistant_routing_request:JSON.stringify(response.assistantRoutingRequest)}});return true}catch(error){if(!canApplyTaskResponse(task))return false;if(error.code===`vibe64_conversation_closed`){removeTask(taskId);return false}if(error.code===`vibe64_assistant_routing_cancelled`){const current=tasks.value.find(candidate=>candidate.id===taskId);const text=payload.displayMessage||payload.message;task.delivery.remove(messageId);updateTask(taskId,{busy:false,pendingMessageId:``,error:``,errorCode:``,status:`interrupted`,draft:current.draft?`${text}\n\n${current.draft}`:text});updateTask(taskId,{draft:tasks.value.find(candidate=>candidate.id===taskId).draft});return false}const current=tasks.value.find(candidate=>candidate.id===taskId);const retained=task.delivery.find(messageId);if(retained?.status===`accepted`||!retained&¤t.pendingMessageId!==messageId)return true;const stillWorking=task.busy&&error?.conversationExpired!==true;updateTask(taskId,{busy:stillWorking,conversationId:error?.conversationExpired===true?``:current.conversationId,error:temporaryAiText(error?.message||error)||`Temporary AI message could not be sent.`,errorCode:temporaryAiText(error?.code),pendingMessageId:messageId,runId:error?.conversationExpired===true?``:task.runId,status:stillWorking?task.status:`failed`});updateTask(taskId,{draft:current.draft});if(!stillWorking)reportTaskFinished(taskId);return false}}async function cancelMessage(taskId,messageId){const task=tasks.value.find(candidate=>candidate.id===taskId);const message=pendingMessage(task,messageId);if(disposed||!message||message.status!==`failed`||readRefOrGetterValue(operationBusy)||closingTaskIds.has(taskId)||task.recoveryOutcome===`checking`)return false;const route=JSON.parse(task.routingMetadata?.assistant_routing_request||`null`);if(route?.messageId===messageId){if(route.delivery===`uncertain`){updateTask(taskId,{error:`Check delivery before editing or cancelling this message.`});return false}await stopTask(taskId)}else if(task.busy)return false;task.delivery.remove(messageId);updateTask(taskId,{...task.pendingMessageId===messageId?{pendingMessageId:``}:{},...task.error===message.error?{error:``,errorCode:``}:{}});return true}async function editMessage(taskId,messageId){const task=tasks.value.find(candidate=>candidate.id===taskId);const message=pendingMessage(task,messageId);if(!message||!await cancelMessage(taskId,messageId))return false;const draft=task.draft;updateDraft(taskId,draft?`${message.text}\n\n${draft}`:message.text);return true}async function stopTask(taskId=``){const task=tasks.value.find(candidate=>candidate.id===taskId);if(disposed||!task||!task.busy&&!task.routingMetadata?.assistant_routing_request||stoppingTaskIds.has(taskId))return false;if(!task.conversationId)throw new Error(`Temporary AI is still starting. Wait for it to start, then stop it.`);stoppingTaskIds.add(taskId);try{const runtime=task.binding.runtime.value;const response=await runtime.cancel();if(!canApplyTaskResponse(task))return false;if(response===false||response?.ok===false)throw temporaryAiRequestError(response||{error:runtime.error.value});updateTask(taskId,{busy:false,...response.routingMetadata?{routingMetadata:response.routingMetadata}:{},error:``,status:`interrupted`});return true}catch(error){if(!canApplyTaskResponse(task))return false;if(error.code===`vibe64_conversation_closed`){removeTask(taskId);return false}throw error}finally{stoppingTaskIds.delete(taskId)}}async function closeTask(taskId=``){const task=tasks.value.find(candidate=>candidate.id===taskId);if(disposed||!task||closingTaskIds.has(taskId)||stoppingTaskIds.has(taskId))return;if(readRefOrGetterValue(operationBusy)||task.recoveryOutcome===`checking`)throw new Error(`Wait for Update to finish before closing this repair.`);closingTaskIds.add(taskId);try{clearTimeout(saveTimers.get(taskId));saveTimers.delete(taskId);if(saves.has(taskId))await saves.get(taskId);const conversationId=task.conversationId||(creations.has(taskId)?await creations.get(taskId):``);if(conversationId)await request(vibe64TemporaryConversationPath(task.apiPath,task.sessionId,conversationId),{method:`DELETE`});if(disposed)return;removeTask(taskId)}catch(error){if(!canApplyTaskResponse(task))return;updateTask(taskId,{error:error.message});throw error}finally{closingTaskIds.delete(taskId)}}function closeWorkspace(){open.value=false}function removeTask(taskId){const task=tasks.value.find(candidate=>candidate.id===taskId);closedConversationIds.add(task?.conversationId||taskId);clearTimeout(saveTimers.get(taskId));saveTimers.delete(taskId);pendingSaveFields.delete(taskId);saveVersions.delete(taskId);task?.releaseBinding();tasks.value=tasks.value.filter(candidate=>candidate.id!==taskId);if(activeTaskId.value===taskId)activeTaskId.value=tasks.value[0]?.id||``;if(!tasks.value.length)open.value=false}for(const event of[VIBE64_ACCOUNTS_CHANGED_EVENT,VIBE64_CONNECTIONS_CHANGED_EVENT])useRealtimeEvent({event,onEvent:()=>void restoreTasks()});const realtimeSocket=useRealtimeSocket({required:false});const restoreAfterReconnect=()=>void restoreTasks();realtimeSocket?.on?.(`connect`,restoreAfterReconnect);onBeforeUnmount(()=>realtimeSocket?.off?.(`connect`,restoreAfterReconnect));useRealtimeEvent({event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}})=>!disposed&&payload.projectSlug===projectSlug.value&&payload.sessionId===currentSessionId()&&payload.reason===`temporary-conversation-created`&&Boolean(payload.conversationId)&&!closedConversationIds.has(payload.conversationId)&&!tasks.value.some(task=>task.conversationId===payload.conversationId||task.id===payload.conversationId),onEvent:()=>void restoreTasks()});useRealtimeEvent({event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}})=>!disposed&&payload.projectSlug===projectSlug.value&&payload.sessionId===currentSessionId()&&[`temporary-conversation-closed`,`assistant-routing-changed`].includes(payload.reason)&&Boolean(payload.conversationId),onEvent:({payload})=>{const task=tasks.value.find(candidate=>candidate.conversationId===payload.conversationId||candidate.id===payload.conversationId);if(payload.reason===`temporary-conversation-closed`)removeTask(task?.id||payload.conversationId);else if(task&&payload.assistantRoutingRequest){updateTask(task.id,{routingMetadata:{...task.routingMetadata,assistant_routing_request:JSON.stringify(payload.assistantRoutingRequest)},busy:true});task.binding.runtime.value.reload()}}});watch([currentSessionId,currentSessionsApiPath,actorKey],([ownerSessionId,apiPath,actor],[previousSessionId,previousApiPath,previousActor])=>{if(ownerSessionId!==previousSessionId||apiPath!==previousApiPath||actor!==previousActor){restoreGeneration+=1;restoreError.value=``;for(const timer of saveTimers.values())clearTimeout(timer);saveTimers.clear();pendingSaveFields.clear();saveVersions.clear();closedConversationIds.clear();for(const task of tasks.value)task.releaseBinding();tasks.value=[];activeTaskId.value=``;open.value=false}},{flush:`sync`});watch([currentSessionId,currentSessionsApiPath,actorKey,()=>readRefOrGetterValue(assistantReady)],()=>void restoreTasks(),{immediate:true});onBeforeUnmount(()=>{for(const taskId of saveTimers.keys())saveTask(taskId);disposed=true;clearTimeout(restoreRetryTimer);restoreGeneration+=1;for(const timer of saveTimers.values())clearTimeout(timer);saveTimers.clear();pendingSaveFields.clear();saveVersions.clear();for(const task of tasks.value)task.releaseBinding()});return{activeTask,activeTaskId,closeTask,closeWorkspace,createTask,cancelMessage,editMessage,hasUnreadMessages,open,openTask,reportRecoveryOutcome,saveTask,restoreError,restoreTasks,selectTask,send,showWorkspace,startTask,stopTask,tasks,updateAgentSetting,updateAttachments,updateDraft,updateRouting,updateRepairTask}}function presenceText(value=``){return String(value??``).trim()}function presenceTimestamp(value=``){const timestamp=Date.parse(String(value||``));return Number.isFinite(timestamp)?timestamp:0}function sessionPresencePath(sessionsApiPath=``,sessionId=``){return vibe64SessionPath(sessionsApiPath,sessionId,`/presence`)}function normalizedRemotePresence(payload={},now=Date.now()){const actorId=presenceText(payload.actorId);const displayName=presenceText(payload.displayName)||`Another user`;const originId=presenceText(payload.originId);const projectSlug=presenceText(payload.projectSlug);const sessionId=presenceText(payload.sessionId);const conversationId=presenceText(payload.conversationId);const sequence=Number(payload.sequence);const updatedAt=presenceTimestamp(payload.updatedAt);const expiresAt=presenceTimestamp(payload.expiresAt);if(!actorId||!originId||!projectSlug||!sessionId||!Number.isSafeInteger(sequence)||sequence<1||!updatedAt||!expiresAt)return null;const typing=payload.typing===true&&expiresAt>now;return Object.freeze({actorId,conversationId,displayName:Array.from(displayName).slice(0,80).join(``)||`Another user`,expiresAt,originId,projectSlug,sequence,sessionId,typing,updatedAt})}function typingPresenceLabel(people=[]){const visible=Array.isArray(people)?people:[];if(visible.length===1)return`${presenceText(visible[0]?.displayName)||`Another user`} is typing…`;return visible.length>1?`${visible.length} people are typing…`:``}function useVibe64SessionTypingPresence({active=true,conversationId=``,projectSlug=``,sessionId=``,sessionsApiPath=``}={},{clearTimer=clearTimeout,debounceMs=VIBE64_SESSION_PRESENCE_DEBOUNCE_MS,idleMs=VIBE64_SESSION_PRESENCE_IDLE_MS,now=()=>Date.now(),request=(path,options)=>getHttpWebClient().request(path,options),setTimer=setTimeout}={}){const originId=vibe64BrowserTabOriginId();const remoteEntries=shallowRef(new Map);const realtimeSocket=useRealtimeSocket({required:false});let debounceTimer=null;let publishing=false;let localSequence=Math.max(0,Math.floor(Number(now())||0));const currentContext=computed(()=>Object.freeze({active:readRefOrGetterValue(active)!==false,conversationId:presenceText(readRefOrGetterValue(conversationId)),projectSlug:presenceText(readRefOrGetterValue(projectSlug)),sessionId:presenceText(readRefOrGetterValue(sessionId)),sessionsApiPath:presenceText(readRefOrGetterValue(sessionsApiPath))}));const eligible=computed(()=>Boolean(currentContext.value.active&¤tContext.value.projectSlug&¤tContext.value.sessionId&¤tContext.value.sessionsApiPath));const typingPeople=computed(()=>{const byActor=new Map;for(const entry of remoteEntries.value.values()){if(!entry.typing||entry.expiresAt<=now())continue;byActor.set(entry.actorId,{actorId:entry.actorId,displayName:entry.displayName})}return[...byActor.values()].sort((left,right)=>left.displayName.localeCompare(right.displayName))});const typingLabel=computed(()=>typingPresenceLabel(typingPeople.value));function requestPresence(){debounceTimer=null;if(!eligible.value||publishing)return;const context=currentContext.value;localSequence+=1;publishing=true;request(sessionPresencePath(context.sessionsApiPath,context.sessionId),{body:{...context.conversationId?{conversationId:context.conversationId}:{},originId,sequence:localSequence,typing:true},method:`POST`,timeoutMs:5e3}).catch(()=>null).finally(()=>{publishing=false})}function stopTyping(){clearTimer(debounceTimer);debounceTimer=null}function noteInputActivity(){if(!eligible.value||debounceTimer||publishing)return;debounceTimer=setTimer(requestPresence,Math.max(0,Number(debounceMs)||0))}function clearRemotePresence(){for(const entry of remoteEntries.value.values())if(entry.timer)clearTimer(entry.timer);remoteEntries.value=new Map}function removeRemotePresence(key,expected=null){const current=remoteEntries.value.get(key);if(!current||expected&¤t!==expected)return;if(current.timer)clearTimer(current.timer);const next=new Map(remoteEntries.value);next.delete(key);remoteEntries.value=next}function applyRemotePresence(payload={}){const entry=normalizedRemotePresence(payload,now());const context=currentContext.value;if(!entry||entry.originId===originId||entry.projectSlug!==context.projectSlug||entry.sessionId!==context.sessionId||entry.conversationId!==context.conversationId)return;const key=`${entry.actorId}\0${entry.originId}`;const current=remoteEntries.value.get(key);if(current&&(entry.sequence<current.sequence||entry.sequence===current.sequence&&entry.updatedAt<current.updatedAt))return;if(current?.timer)clearTimer(current.timer);const stored={...entry,timer:null};stored.timer=setTimer(()=>{removeRemotePresence(key,stored)},entry.typing?Math.max(1,entry.expiresAt-now()):Math.max(1,Number(idleMs)||1e4));const next=new Map(remoteEntries.value);next.set(key,stored);remoteEntries.value=next}function handleRealtimeDisconnect(){clearRemotePresence()}useRealtimeEvent({enabled:eligible,event:VIBE64_SESSION_PRESENCE_CHANGED_EVENT,onEvent:({payload})=>applyRemotePresence(payload)});realtimeSocket.on(`disconnect`,handleRealtimeDisconnect);watch(()=>[currentContext.value.active,currentContext.value.conversationId,currentContext.value.projectSlug,currentContext.value.sessionId,currentContext.value.sessionsApiPath].join(`\0`),()=>{stopTyping();clearRemotePresence()},{flush:`sync`});onScopeDispose(()=>{stopTyping();clearRemotePresence();realtimeSocket.off(`disconnect`,handleRealtimeDisconnect)});return Object.freeze({applyRemotePresence,blur:stopTyping,noteInputActivity,stop:stopTyping,submit:stopTyping,typingLabel,typingPeople})}var _hoisted_1$25=[`aria-label`];var _hoisted_2$22={class:`vibe64-temporary-ai__tabs`,"aria-label":`Main and temporary conversations`};var _hoisted_3$20={class:`vibe64-temporary-ai__task-tabs`};var _hoisted_4$18=[`aria-current`,`data-temporary-ai-task-id`,`aria-label`,`title`,`onClick`];var _hoisted_5$17={key:0,class:`vibe64-temporary-ai__unread`,"aria-hidden":`true`};var _hoisted_6$16={key:1,class:`vibe64-temporary-ai__busy`,"aria-label":`Assistant working`};var _hoisted_7$16={class:`vibe64-temporary-ai__recovery-row`};var _hoisted_8$16={key:1,"aria-live":`polite`,class:`vibe64-temporary-ai__recovery`,"data-temporary-ai-recovery":``,role:`status`};var _hoisted_9$13={class:`vibe64-temporary-ai__recovery-summary`};var _hoisted_10$11={key:0};var _hoisted_11$11={key:1};var _hoisted_12$11={key:0};var _hoisted_13$11={key:0};var _hoisted_14$11={key:1,class:`vibe64-temporary-ai__feedback`};var _hoisted_15$11={key:0,class:`vibe64-temporary-ai__error`,role:`alert`};var _hoisted_16$10=[`role`];var _hoisted_17$10={key:0,class:`text-caption`,role:`status`,"aria-live":`polite`};var _hoisted_18$8={class:`vibe64-temporary-ai__composer-actions`};var _hoisted_19$7={key:0,class:`vibe64-temporary-ai__error`,role:`alert`};var _sfc_main$29={__name:`Vibe64TemporaryAiWorkspace`,props:{active:Boolean,sessionSelected:Boolean,assistantReady:Boolean,canConfigureRouting:Boolean,connectionUnavailable:Boolean,projectSlug:{type:String,default:``},previewAttachmentState:{type:Object,default:()=>({})},repositoryBusy:Boolean,updateDisabled:Boolean,canReviewUpdate:Boolean,updateDisabledReason:{type:String,default:``},workspaceSetupStatus:{type:String,default:``},assistantSelection:{default:()=>({}),type:Object},sessionId:{default:``,type:String},mainHasMessages:{default:false,type:Boolean},sessionsApiPath:{default:``,type:[String,Object,Function]}},emits:[`select-main-chat`,`task-finished`,`check-update`,`review-update`],setup(__props,{expose:__expose,emit:__emit}){const emit=__emit;const props=__props;const hostConversation=inject(VIBE64_HOST_CONVERSATION_KEY,null);const hostComposer=ref(null);const selectionRevision=ref(0);function selectMainChat(){selectionRevision.value+=1;hostConversation?.value?.close();emit(`select-main-chat`)}function selectTask(id){selectionRevision.value+=1;hostConversation?.value?.close();return temporary.selectTask(id)}const newTaskOpen=ref(false);const newTaskReturnsToMain=ref(false);const includeRecentChatContext=ref(false);const creatingTask=ref(false);const creatingTaskId=ref(``);const createTaskError=ref(``);watch(()=>[props.projectSlug,props.sessionId],()=>{selectionRevision.value+=1;newTaskOpen.value=false;newTaskReturnsToMain.value=false;creatingTask.value=false;creatingTaskId.value=``});watch(newTaskOpen,value=>{if(value){includeRecentChatContext.value=false;createTaskError.value=``;creatingTaskId.value=``}});async function openNewTask(){newTaskReturnsToMain.value=!activeTask.value&&!hostConversation?.value?.selected;if(props.mainHasMessages){newTaskOpen.value=true;return}includeRecentChatContext.value=false;createTaskError.value=``;creatingTaskId.value=``;await createTask();if(!createTaskError.value)return;const failure={message:createTaskError.value,taskId:creatingTaskId.value};newTaskOpen.value=true;await nextTick();createTaskError.value=failure.message;creatingTaskId.value=failure.taskId}function cancelNewTask(){if(creatingTask.value)return;newTaskOpen.value=false;if(newTaskReturnsToMain.value)selectMainChat()}async function createTask(){const revision=++selectionRevision.value;creatingTask.value=true;createTaskError.value=``;hostConversation?.value?.close();try{await temporary.createTask({includeRecentChatContext:includeRecentChatContext.value,taskId:creatingTaskId.value});if(revision===selectionRevision.value)newTaskOpen.value=false}catch(error){if(revision===selectionRevision.value){creatingTaskId.value=error.taskId||``;createTaskError.value=error.message||`Temporary chat could not be created.`}}finally{if(revision===selectionRevision.value)creatingTask.value=false}}function openTask(options){selectionRevision.value+=1;hostConversation?.value?.close();return temporary.openTask(options)}function closeWorkspace(){selectionRevision.value+=1;hostConversation?.value?.close();temporary.closeWorkspace()}const workspace=ref(null);const completionMessage=ref(null);const returnToMainButton=ref(null);const taskTabButtons=new Map;const taskPrompts=new Map;const taskSendButtons=new Map;const resolvedSessionsApiPath=computed(()=>readRefOrGetterValue(props.sessionsApiPath));const temporaryAiFeedback=useUiFeedback({source:`vibe64.temporary-ai.feedback`});const temporary=useVibe64TemporaryAi({active:()=>props.active&&!hostConversation?.value?.selected,agentSettings:computed(()=>({providerId:props.assistantSelection.engineId,model:props.assistantSelection.modelId,thinking:props.assistantSelection.variantId})),assistantReady:()=>props.assistantReady,operationBusy:()=>props.repositoryBusy,onTaskFinished(task={}){emit(`task-finished`,task);if(props.active&&temporary.open.value&&temporary.activeTaskId.value===task.id)return;if(task.status===`completed`){if(task.outcomeKind===`continue`||task.recoveryOperation===`update`)return;temporaryAiFeedback.success(task.completionMessage||`${task.title} finished. Review the result before continuing.`);return}if(task.status===`failed`&&task.failureMessage){temporaryAiFeedback.error(task.failureMessage);return}temporaryAiFeedback.error(task.error,`${task.title} stopped with an error.`)},sessionId:computed(()=>props.sessionId),sessionsApiPath:resolvedSessionsApiPath});const customOpen=ref(false);const customTarget=ref(null);const activeTask=temporary.activeTask;watch(()=>activeTask.value?.id,()=>{customOpen.value=false});const routingRequest=computed(()=>JSON.parse(activeTask.value?.routingMetadata?.assistant_routing_request||`null`));const modeSession=computed(()=>({sessionId:props.sessionId,assistantSelection:activeTask.value?.assistantSelection||props.assistantSelection,agentSession:{goal:activeTask.value?.goal||null},metadata:activeTask.value?.routingMetadata||{}}));const activeTaskError=computed(()=>{if([`failed`,`uncertain`].includes(routingRequest.value?.status)&&routingRequest.value.error===activeTask.value?.error)return``;if(activeTask.value?.delivery.state.messages.some(message=>message.status===`failed`&&message.error===activeTask.value.error))return``;if(props.connectionUnavailable&&activeTask.value?.errorCode===`vibe64_agent_write_mode_busy`)return``;return activeTask.value?.error||taskAccessReason(activeTask.value)});const updateRepairVisible=computed(()=>temporary.open.value&&activeTask.value?.recoveryOperation===`update`&&activeTask.value.recoveryOutcome!==`succeeded`);const closeTitleId=useId();const closeTaskId=ref(``);const closingTask=ref(false);const stoppingTaskId=ref(``);const actionErrors=ref({});const taskToClose=computed(()=>temporary.tasks.value.find(task=>task.id===closeTaskId.value));const activeTaskRecoveryChecking=computed(()=>activeTask.value?.recoveryOutcome===`checking`);const typingPresence=useVibe64SessionTypingPresence({active:computed(()=>props.active&&temporary.open.value&&Boolean(activeTask.value?.conversationId)&&!hostConversation?.value?.selected&&!taskInputDisabled(activeTask.value)&&!closingTask.value),conversationId:computed(()=>activeTask.value?.conversationId||``),projectSlug:computed(()=>props.projectSlug),sessionId:computed(()=>props.sessionId),sessionsApiPath:resolvedSessionsApiPath});const activityLabel=computed(()=>{if(activeTaskRecoveryChecking.value)return`Checking Update…`;if(activeTask.value?.delivery.state.sending)return`Sending to assistant…`;if(activeTask.value?.busy&&activeTask.value.phase===`background`)return`Reply ready · background task still running…`;if(activeTask.value?.busy)return`AI is working…`;return typingPresence.typingLabel.value});const activeTaskRecoveryVerified=computed(()=>activeTask.value?.recoveryOutcome===`succeeded`);const recoveryMessageId=computed(()=>activeTaskRecoveryVerified.value?`recovery_${activeTask.value.runId||activeTask.value.id}`:``);const updateCompletionText=computed(()=>{if(activeTask.value?.recoveryOperation!==`update`)return``;return`${{running:`Session updated. Preparing workspace…`,succeeded:`Session updated and workspace ready.`,failed:`Session updated. Workspace preparation failed; review the setup issue above.`,ambiguous:`Session updated. Workspace preparation needs a choice; review the setup issue above.`,required:`Session updated. Workspace preparation is still required.`}[props.workspaceSetupStatus]||`Session updated.`} Your changes were preserved. Nothing was published.`});const canReturnToMainChat=computed(()=>activeTaskRecoveryVerified.value&&!activeTask.value.busy&&(activeTask.value.recoveryOperation!==`update`||[`succeeded`,`unconfigured`].includes(props.workspaceSetupStatus)));const activeTaskRecoveryTitle=computed(()=>{if(activeTaskRecoveryChecking.value)return`Checking Update…`;const status=String(activeTask.value?.status||``).trim();if([`starting`,`inProgress`].includes(status))return`AI repair in progress`;if(activeTask.value?.recoveryOutcome===`failed`)return`Update needs attention`;if(activeTask.value?.recoveryOutcome===`unconfirmed`)return`Update result not confirmed`;if(activeTask.value?.recoveryOperation===`update`)return`Update not yet verified`;if(activeTask.value?.outcomeKind===`continue`)return`Waiting for your reply`;if(status===`completed`)return`AI repair finished`;if(status===`failed`)return`AI repair needs attention`;if(status===`interrupted`)return`AI repair stopped`;return`AI repair`});const activeTaskRecoveryStatus=computed(()=>{const task=activeTask.value||{};if(task.recoveryOutcome===`checking`)return``;if(task.recoveryOperation===`update`&&props.updateDisabled&&props.updateDisabledReason)return props.updateDisabledReason;if(task.recoveryOutcome===`failed`)return task.recoveryAutoPaused?`Automatic repair paused after repeated conflicts. Continue here or check Update again. Main chat has the latest Update diagnostic.`:`The Update check did not succeed. Continue this repair or check Update again. Main chat has the latest Update diagnostic.`;if(task.recoveryOutcome===`unconfirmed`)return task.recoveryOutcomeMessage||`Vibe64 could not confirm this Update result. Check the current session before trying again.`;if(task.recoveryOperation===`update`&&task.outcomeKind===`continue`)return`Reply if a decision is needed, or use Check Update to verify the prepared edits.`;if(task.outcomeKind===`continue`)return``;const status=String(task.status||``).trim();if(status===`completed`)return task.completionMessage||`Temporary AI finished. Review its result below.`;if(status===`failed`)return task.failureMessage||`Temporary AI stopped before it could confirm the repair. Review the error and progress below.`;if(status===`interrupted`)return task.recoveryOperation===`update`?`You stopped this repair. Partial edits remain and Update still needs to succeed. You can continue the repair here.`:`You stopped this repair. You can continue in this temporary chat or return to Main chat.`;return task.nextStepMessage||`Follow progress here and reply below if Temporary AI needs a decision.`});function requestCloseTask(task){if(task.recoveryOperation===`update`&&task.recoveryOutcome!==`succeeded`&&(task.busy||task.messages.length)){closeTaskId.value=task.id;return}closeTask(task.id)}async function closeTask(taskId,{returnToMainChat=false}={}){selectionRevision.value+=1;closingTask.value=true;delete actionErrors.value[taskId];try{await temporary.closeTask(taskId);closeTaskId.value=``;if(returnToMainChat&&!temporary.tasks.value.some(task=>task.id===taskId))emit(`select-main-chat`)}catch(error){actionErrors.value[taskId]=error?.message||`Temporary AI could not be closed. The chat is still open; try again.`}finally{closingTask.value=false}}async function stopTask(taskId){stoppingTaskId.value=taskId;delete actionErrors.value[taskId];try{await temporary.stopTask(taskId)}catch(error){actionErrors.value[taskId]=error?.message||`Temporary AI could not be stopped. Try again.`}finally{stoppingTaskId.value=``}}function taskAccessReason(task){if(!task)return``;if(task.busy)return task.canSteer===false?`You cannot steer this turn's AI connection. You can send a new request when it finishes.`:``;const mode=JSON.parse(task.routingMetadata?.assistant_routing||`null`)?.mode;const decision=task.purposes?.[mode];return decision?.available===false?decision.message||`This mode is unavailable. Choose another chat mode.`:``}function taskInputDisabled(task){return props.repositoryBusy||task.state===`closing`||task.status===`closing`||task.recoveryOutcome===`checking`||Boolean(taskAccessReason(task))}function taskPrompt(taskId=``){return taskPrompts.get(String(taskId||``))||null}function setTaskPrompt(taskId=``,element=null){const normalizedTaskId=String(taskId||``);if(!normalizedTaskId)return;if(element){taskPrompts.set(normalizedTaskId,element);return}taskPrompts.delete(normalizedTaskId)}function setTaskSendButton(taskId=``,element=null){const normalizedTaskId=String(taskId||``);if(!normalizedTaskId)return;if(element){taskSendButtons.set(normalizedTaskId,element);return}taskSendButtons.delete(normalizedTaskId)}async function sendTask(taskId=``,options={}){const currentPrompt=taskPrompt(taskId);if(props.connectionUnavailable||!taskId||currentPrompt?.attachmentsCanSubmit?.()===false)return;const task=temporary.tasks.value.find(task=>task.id===taskId);if(!task||taskInputDisabled(task))return;typingPresence.submit();return temporary.send(taskId,{...options,attachmentOwner:currentPrompt})}async function startTask(options={}){selectionRevision.value+=1;hostConversation?.value?.close();const started=temporary.startTask(options);const taskId=temporary.activeTaskId.value;await revealTaskTab(taskId,{focus:true});const result=await started;if(result?.started)taskPrompt(taskId)?.clearAttachments?.();return result}function reportTaskRecovery(taskId=``,outcome={}){const reported=temporary.reportRecoveryOutcome(taskId,outcome);if(reported&&outcome.status===`succeeded`&&!(props.active&&temporary.open.value&&temporary.activeTaskId.value===taskId))temporaryAiFeedback.success(outcome.message||`Vibe64 independently verified that the repair succeeded.`);return reported}async function persistTaskRecovery(taskId=``,outcome={}){return reportTaskRecovery(taskId,outcome)&&await temporary.saveTask(taskId)===true}function showWorkspace(){selectionRevision.value+=1;hostConversation?.value?.close();if(!temporary.tasks.value.length){temporary.open.value=true;openNewTask();return null}const task=temporary.showWorkspace();revealTaskTab(temporary.activeTaskId.value);return task}function setTaskTabButton(taskId=``,element=null){const normalizedTaskId=String(taskId||``);if(!normalizedTaskId)return;if(element){taskTabButtons.set(normalizedTaskId,element);return}taskTabButtons.delete(normalizedTaskId)}function afterBrowserPaint(){if(typeof globalThis.requestAnimationFrame!==`function`)return Promise.resolve();return new Promise(resolve=>{globalThis.requestAnimationFrame(()=>resolve())})}async function revealTaskTab(taskId=``,{focus=false}={}){const normalizedTaskId=String(taskId||``);if(!normalizedTaskId)return false;await nextTick();await afterBrowserPaint();const button=taskTabButtons.get(normalizedTaskId);button?.scrollIntoView?.({block:`nearest`,inline:`nearest`});if(focus)(button||workspace.value)?.focus?.({preventScroll:true});return Boolean(button)}function focusSendButton(){taskSendButtons.get(activeTask.value?.id)?.focus?.()}function updateActiveAgentSetting(parameterId=``,value=``){if(activeTask.value?.id)temporary.updateAgentSetting(activeTask.value.id,parameterId,value)}watch(()=>temporary.activeTaskId.value,taskId=>{revealTaskTab(taskId)},{flush:`post`});watch([recoveryMessageId,canReturnToMainChat,()=>props.active],async()=>{if(!props.active||!recoveryMessageId.value)return;await nextTick();(returnToMainButton.value?.$el||completionMessage.value)?.scrollIntoView?.({block:`nearest`})},{flush:`post`});const colleagueView=inject(VIBE64_COLLEAGUE_VIEW_KEY,null);const selectedView={get projectSlug(){return props.projectSlug},get sessionId(){return props.sessionId},get ready(){return props.assistantReady},get selectionRevision(){return selectionRevision.value},get hostConversationSelected(){return Boolean(hostConversation?.value?.selected)},get temporarySelected(){return temporary.open.value&&!hostConversation?.value?.selected},get conversationId(){return this.temporarySelected?activeTask.value?.conversationId||``:``},async openConversation(conversationId,isCurrent=()=>true){if(!props.sessionSelected||!props.assistantReady||!isCurrent())throw new Error(`This session is no longer available.`);if(!conversationId){hostConversation?.value?.close();temporary.closeWorkspace();emit(`select-main-chat`);return}const projectSlug=props.projectSlug;const sessionId=props.sessionId;const revision=selectionRevision.value;const hostSelected=hostConversation?.value?.selected;await temporary.restoreTasks();if(!isCurrent()||!props.sessionSelected||!props.assistantReady||props.projectSlug!==projectSlug||props.sessionId!==sessionId||selectionRevision.value!==revision||hostConversation?.value?.selected!==hostSelected)throw new Error(`The selected conversation changed before it opened.`);const task=temporary.tasks.value.find(entry=>entry.conversationId===conversationId);if(!task)throw new Error(temporary.restoreError.value||`The temporary conversation could not be opened.`);hostConversation?.value?.close();temporary.selectTask(task.id);await nextTick();if(!isCurrent()||!props.sessionSelected||props.sessionId!==sessionId||selectionRevision.value!==revision||temporary.activeTaskId.value!==task.id||!temporary.open.value)throw new Error(`The selected conversation changed before it opened.`)}};watchEffect(()=>{if(!colleagueView)return;if(props.sessionSelected)colleagueView.value=selectedView;else if(colleagueView.value===selectedView)colleagueView.value=null});onBeforeUnmount(()=>{selectionRevision.value+=1;if(colleagueView?.value===selectedView)colleagueView.value=null});__expose({get visible(){return temporary.open.value||Boolean(hostConversation?.value?.selected)},get composer(){if(hostConversation?.value?.selected)return hostComposer.value;return temporary.open.value?taskPrompt(temporary.activeTaskId.value):null},closeWorkspace,hasUnreadMessages:temporary.hasUnreadMessages,openTask,reportTaskRecovery,persistTaskRecovery,selectTask,startTask,showWorkspace,updateRepairVisible,updateRepairTask:temporary.updateRepairTask});return(_ctx,_cache)=>{return unref(temporary).open.value||unref(hostConversation)?.selected?(openBlock(),createElementBlock(`section`,{key:0,ref_key:`workspace`,ref:workspace,class:normalizeClass([`vibe64-temporary-ai`,{"vibe64-temporary-ai--host":unref(hostConversation)?.selected}]),"aria-label":unref(hostConversation)?.selected?unref(hostConversation).label:`Temporary AI workspace`,tabindex:`-1`},[createBaseVNode(`nav`,_hoisted_2$22,[createBaseVNode(`div`,{class:`vibe64-temporary-ai__tab vibe64-temporary-ai__tab--main`},[createBaseVNode(`button`,{class:`vibe64-temporary-ai__tab-select`,"data-temporary-ai-main-chat":``,type:`button`,onClick:selectMainChat},` Main chat `)]),createBaseVNode(`div`,_hoisted_3$20,[unref(hostConversation)?.selected?(openBlock(),createBlock(VBtn,{key:0,class:`vibe64-temporary-ai__host-tab`,color:unref(hostConversation).color,variant:`flat`,"aria-current":`page`,"prepend-icon":unref(hostConversation).icon,rounded:`pill`,height:`32`,size:`small`,onClick:_cache[0]||(_cache[0]=$event=>unref(hostConversation).open())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(hostConversation).label),1)]),_:1},8,[`color`,`prepend-icon`])):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(temporary).tasks.value,task=>{return openBlock(),createElementBlock(`div`,{key:task.id,class:normalizeClass([`vibe64-temporary-ai__tab`,{"vibe64-temporary-ai__tab--active":!unref(hostConversation)?.selected&&task.id===unref(temporary).activeTaskId.value}])},[createBaseVNode(`button`,{ref_for:true,ref:element=>setTaskTabButton(task.id,element),"aria-current":!unref(hostConversation)?.selected&&task.id===unref(temporary).activeTaskId.value?`page`:void 0,class:`vibe64-temporary-ai__tab-select`,"data-temporary-ai-task-id":task.id,"aria-label":task.unread?`${task.title}: unread messages`:task.title,title:task.unread?`${task.title}: unread messages`:task.title,type:`button`,onClick:$event=>selectTask(task.id)},[createBaseVNode(`span`,null,toDisplayString(task.title),1),task.unread?(openBlock(),createElementBlock(`span`,_hoisted_5$17)):createCommentVNode(``,true),task.nativeWorking?(openBlock(),createElementBlock(`span`,_hoisted_6$16)):createCommentVNode(``,true)],8,_hoisted_4$18),createVNode(VBtn,{"aria-label":`Close ${task.title}`,class:`vibe64-temporary-ai__tab-close`,disabled:props.repositoryBusy||task.recoveryOutcome===`checking`||closingTask.value||stoppingTaskId.value===task.id,height:`32`,icon:unref(mdiClose),"min-width":`32`,size:`x-small`,title:`Close ${task.title}`,type:`button`,variant:`text`,onClick:$event=>requestCloseTask(task)},null,8,[`aria-label`,`disabled`,`icon`,`title`,`onClick`])],2)}),128)),createVNode(VBtn,{disabled:!props.sessionId,"aria-label":`New temporary AI task`,class:`vibe64-temporary-ai__new-task`,height:`32`,icon:unref(mdiPlus),"min-width":`32`,size:`x-small`,title:`New temporary AI task`,type:`button`,variant:`text`,onClick:openNewTask},null,8,[`disabled`,`icon`])]),_cache[18]||(_cache[18]=createBaseVNode(`span`,{class:`vibe64-temporary-ai__tabs-spacer`},null,-1))]),newTaskOpen.value?(openBlock(),createBlock(VDialog,{key:0,"model-value":newTaskOpen.value,"aria-label":`New temporary chat`,"max-width":`480`,persistent:creatingTask.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=value=>{if(!value)cancelNewTask()})},{default:withCtx(()=>[createVNode(VCard,{title:`New temporary chat`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[createVNode(VCheckbox,{modelValue:includeRecentChatContext.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>includeRecentChatContext.value=$event),disabled:creatingTask.value||Boolean(creatingTaskId.value),label:`Include recent chat context`,"hide-details":``},null,8,[`modelValue`,`disabled`]),_cache[19]||(_cache[19]=createBaseVNode(`p`,null,`Copy up to 40 recent visible messages from Main, including progress. Text only, limited to 64 KiB. Later messages stay separate.`,-1)),createTaskError.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(createTaskError.value),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VBtn,{disabled:creatingTask.value,onClick:cancelNewTask},{default:withCtx(()=>[..._cache[20]||(_cache[20]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{loading:creatingTask.value,disabled:creatingTask.value,onClick:createTask},{default:withCtx(()=>[..._cache[21]||(_cache[21]=[createTextVNode(`Create chat`,-1)])]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])):createCommentVNode(``,true),unref(hostConversation)?.selected&&props.active?(openBlock(),createBlock(resolveDynamicComponent(unref(hostConversation).component),{key:1,ref_key:`hostComposer`,ref:hostComposer,class:`vibe64-temporary-ai__host-content`},null,512)):createCommentVNode(``,true),!unref(hostConversation)?.selected?(openBlock(),createElementBlock(Fragment,{key:2},[createBaseVNode(`div`,_hoisted_7$16,[unref(temporary).restoreError.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,density:`compact`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(temporary).restoreError.value)+` `,1),createVNode(VBtn,{color:`error`,variant:`text`,height:`48`,onClick:_cache[3]||(_cache[3]=$event=>unref(temporary).restoreTasks())},{default:withCtx(()=>[..._cache[22]||(_cache[22]=[createTextVNode(`Try again`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),unref(activeTask)?.recoveryNotice&&!activeTaskRecoveryVerified.value&&!props.connectionUnavailable?(openBlock(),createElementBlock(`div`,_hoisted_8$16,[createBaseVNode(`div`,_hoisted_9$13,[createBaseVNode(`strong`,null,toDisplayString(activeTaskRecoveryTitle.value),1),activeTaskRecoveryStatus.value&&!unref(activeTask).busy?(openBlock(),createElementBlock(`details`,_hoisted_10$11,[_cache[23]||(_cache[23]=createBaseVNode(`summary`,null,`Details`,-1)),createBaseVNode(`p`,null,toDisplayString(activeTaskRecoveryStatus.value),1)])):createCommentVNode(``,true)]),unref(activeTask).recoveryOperation===`update`&&!activeTaskRecoveryVerified.value?(openBlock(),createBlock(VBtn,{key:0,class:`vibe64-temporary-ai__check-update`,"data-temporary-ai-check-update":``,disabled:props.updateDisabled||taskInputDisabled(unref(activeTask))||unref(activeTask).busy||unref(activeTask).recoveryOutcome===`unconfirmed`,loading:activeTaskRecoveryChecking.value,title:props.updateDisabled?props.updateDisabledReason:`Check whether the repaired session can update`,size:`small`,variant:`tonal`,onClick:_cache[4]||(_cache[4]=$event=>emit(`check-update`,unref(activeTask)))},{default:withCtx(()=>[..._cache[24]||(_cache[24]=[createTextVNode(` Check Update `,-1)])]),_:1},8,[`disabled`,`loading`,`title`])):createCommentVNode(``,true),unref(activeTask).recoveryOperation===`update`&&!activeTaskRecoveryVerified.value&&props.canReviewUpdate?(openBlock(),createBlock(VBtn,{key:1,class:`vibe64-temporary-ai__check-update`,"data-temporary-ai-review-update":``,disabled:props.updateDisabled||taskInputDisabled(unref(activeTask))||unref(activeTask).busy||unref(activeTask).recoveryOutcome===`unconfirmed`,size:`small`,variant:`tonal`,onClick:_cache[5]||(_cache[5]=$event=>emit(`review-update`))},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(` Review resolved conflicts `,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true)])):createCommentVNode(``,true)]),unref(activeTask)?(openBlock(),createBlock(_sfc_main$30,{key:0,"session-id":props.sessionId,adapter:unref(activeTask).adapter,"recovery-message":unref(activeTask).recoveryMessage,"routing-request":routingRequest.value,working:unref(activeTask).nativeWorking,"scroll-key":unref(activeTask).id,"empty-message":unref(activeTask).recoveryNotice?``:`Ask a focused question or investigate a problem without adding it to the main conversation.`,onResend:_cache[12]||(_cache[12]=$event=>sendTask(unref(activeTask).id,{retryMessageId:$event})),onCancel:_cache[13]||(_cache[13]=$event=>unref(temporary).cancelMessage(unref(activeTask).id,$event)),onEdit:_cache[14]||(_cache[14]=$event=>unref(temporary).editMessage(unref(activeTask).id,$event))},{"message-text":withCtx(({message})=>[message.id===recoveryMessageId.value?(openBlock(),createElementBlock(`p`,{key:0,ref_key:`completionMessage`,ref:completionMessage},toDisplayString(updateCompletionText.value||message.text),513)):(openBlock(),createElementBlock(`p`,_hoisted_11$11,toDisplayString(message.text),1)),message.id===recoveryMessageId.value&&canReturnToMainChat.value?(openBlock(),createBlock(VBtn,{key:2,ref_key:`returnToMainButton`,ref:returnToMainButton,"aria-busy":closingTask.value,class:`vibe64-temporary-ai__return`,color:`primary`,disabled:props.repositoryBusy||closingTask.value,size:`small`,variant:`tonal`,onClick:_cache[6]||(_cache[6]=$event=>closeTask(unref(activeTask).id,{returnToMainChat:true}))},{default:withCtx(()=>[..._cache[26]||(_cache[26]=[createTextVNode(` Return to main chat `,-1)])]),_:1},8,[`aria-busy`,`disabled`])):createCommentVNode(``,true)]),hints:withCtx(()=>[unref(activeTask).recentChatContext&&!unref(activeTask).messages.length?(openBlock(),createElementBlock(`p`,_hoisted_12$11,[createTextVNode(` Copied `+toDisplayString(unref(activeTask).recentChatContext.messages.length)+` messages from Main when this chat was created. `,1),unref(activeTask).recentChatContext.truncated?(openBlock(),createElementBlock(`span`,_hoisted_13$11,`Some text was omitted to fit the 64 KiB context limit.`)):createCommentVNode(``,true)])):createCommentVNode(``,true),activeTaskError.value||actionErrors.value[unref(activeTask).id]||activityLabel.value?(openBlock(),createElementBlock(`div`,_hoisted_14$11,[actionErrors.value[unref(activeTask).id]&&!taskToClose.value?(openBlock(),createElementBlock(`div`,_hoisted_15$11,toDisplayString(actionErrors.value[unref(activeTask).id]),1)):createCommentVNode(``,true),activeTaskError.value?(openBlock(),createElementBlock(`div`,{key:1,class:normalizeClass([`vibe64-temporary-ai__error`,{"vibe64-temporary-ai__error--recovered":activeTaskRecoveryVerified.value}]),role:activeTaskRecoveryVerified.value?`status`:`alert`},[activeTaskRecoveryVerified.value?(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(` Temporary AI did not report a clean finish: `+toDisplayString(activeTaskError.value)+` The repair was independently verified. `,1)],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(toDisplayString(activeTaskError.value),1)],64))],10,_hoisted_16$10)):createCommentVNode(``,true),activityLabel.value?(openBlock(),createBlock(unref(AssistantComposerSupport_default),{key:2,class:`vibe64-temporary-ai__activity`,activity:{label:activityLabel.value}},null,8,[`activity`])):createCommentVNode(``,true)])):createCommentVNode(``,true)]),composer:withCtx(()=>[unref(activeTask).draftSaveState===`failed`?(openBlock(),createElementBlock(`p`,_hoisted_17$10,` Draft not saved; check the error and retry. `)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(temporary).tasks.value,task=>{return withDirectives((openBlock(),createBlock(_sfc_main$40,{key:task.id,"saved-attachments":task.attachments,"attachments-owned-by-conversation":``,ref_for:true,ref:element=>setTaskPrompt(task.id,element),class:`vibe64-temporary-ai__composer`,"model-value":task.draft&&(task.displayMessage||task.draft),"aria-label":`Message temporary AI`,density:`compact`,"attachments-enabled":Boolean(props.sessionId)&&!taskInputDisabled(task),disabled:task.state===`closing`||task.status===`closing`||Boolean(taskAccessReason(task)),placeholder:`Ask temporary AI…`,rows:2,"session-id":props.sessionId,"tab-to-submit":``,onAttachmentsChange:$event=>unref(temporary).updateAttachments(task.id,$event),onBlur:_cache[10]||(_cache[10]=$event=>unref(typingPresence).blur()),onInputActivity:_cache[11]||(_cache[11]=$event=>unref(typingPresence).noteInputActivity()),onSubmit:$event=>sendTask(task.id),onTabToSubmit:focusSendButton,"onUpdate:modelValue":$event=>unref(temporary).updateDraft(task.id,$event)},{footer:withCtx(({attachmentState})=>[createBaseVNode(`div`,_hoisted_18$8,[task.id===unref(activeTask).id?(openBlock(),createBlock(Vibe64ChatModeControls_default,{key:0,session:modeSession.value,goal:task.goal,temporary:``,"required-mode":task.recoveryOperation===`update`?`senior`:``,"save-preferences":preferences=>unref(temporary).updateRouting(task.id,preferences),active:task.busy,disabled:props.repositoryBusy||task.status===`closing`,"can-configure":props.canConfigureRouting,purposes:task.purposes,loading:!task.purposes,onCustom:_cache[7]||(_cache[7]=$event=>{customTarget.value=$event;customOpen.value=true})},null,8,[`session`,`goal`,`required-mode`,`save-preferences`,`active`,`disabled`,`can-configure`,`purposes`,`loading`])):createCommentVNode(``,true),createVNode(VBtn,{"aria-label":`Attach files`,disabled:taskInputDisabled(task)||!attachmentState.canAddFiles,icon:unref(mdiPaperclip),size:`small`,title:`Attach files`,type:`button`,variant:`text`,onClick:$event=>taskPrompt(task.id)?.openFilePicker?.()},null,8,[`disabled`,`icon`,`onClick`]),__props.previewAttachmentState.captureAvailable?(openBlock(),createBlock(VBtn,{key:1,"aria-label":`Attach preview screenshot`,disabled:taskInputDisabled(task)||!attachmentState.canAddFiles||__props.previewAttachmentState.captureBusy,"aria-busy":__props.previewAttachmentState.captureBusy?`true`:void 0,icon:unref(mdiCameraOutline),size:`small`,title:`Attach preview screenshot`,variant:`text`,onClick:_cache[8]||(_cache[8]=$event=>__props.previewAttachmentState.capture?.())},null,8,[`disabled`,`aria-busy`,`icon`])):createCommentVNode(``,true),__props.previewAttachmentState.diagnosticsAvailable?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Attach console and network diagnostics`,disabled:taskInputDisabled(task)||!attachmentState.canAddFiles||__props.previewAttachmentState.diagnosticsBusy,"aria-busy":__props.previewAttachmentState.diagnosticsBusy?`true`:void 0,icon:unref(mdiConsoleNetworkOutline),size:`small`,title:`Attach console and network diagnostics`,variant:`text`,onClick:_cache[9]||(_cache[9]=$event=>__props.previewAttachmentState.attachDiagnostics?.())},null,8,[`disabled`,`aria-busy`,`icon`])):createCommentVNode(``,true),!task.routingMetadata?.assistant_routing?(openBlock(),createBlock(_sfc_main$31,{key:3,"agent-settings":task.agentSettings,"assistant-selection":task.assistantSelection||props.assistantSelection,disabled:props.repositoryBusy||task.status===`closing`,onUpdateSetting:updateActiveAgentSetting},null,8,[`agent-settings`,`assistant-selection`,`disabled`])):createCommentVNode(``,true),createVNode(Vibe64ComposerDelivery_default,{ref_for:true,ref:element=>setTaskSendButton(task.id,element),"stop-visible":task.busy,"stop-enabled":Boolean(task.conversationId)&&stoppingTaskId.value!==task.id,stopping:stoppingTaskId.value===task.id,sending:task.delivery.state.sending,"can-submit":!props.connectionUnavailable&&stoppingTaskId.value!==task.id&&!taskInputDisabled(task)&&Boolean(task.draft.trim())&&attachmentState.canSubmit,"submit-mode":task.busy?`steer`:`send`,"submit-aria-label":task.busy?`Steer assistant`:`Send message`,"submit-title":task.busy?`Send this guidance to the active assistant turn`:`Send message`,onSubmit:$event=>sendTask(task.id),onStop:$event=>stopTask(task.id)},null,8,[`stop-visible`,`stop-enabled`,`stopping`,`sending`,`can-submit`,`submit-mode`,`submit-aria-label`,`submit-title`,`onSubmit`,`onStop`])])]),_:2},1032,[`saved-attachments`,`model-value`,`attachments-enabled`,`disabled`,`session-id`,`onAttachmentsChange`,`onSubmit`,`onUpdate:modelValue`])),[[vShow,task.id===unref(activeTask).id]])}),128))]),_:1},8,[`session-id`,`adapter`,`recovery-message`,`routing-request`,`working`,`scroll-key`,`empty-message`])):createCommentVNode(``,true),createVNode(Vibe64SessionAssistantMenu_default,{modelValue:customOpen.value,"onUpdate:modelValue":_cache[15]||(_cache[15]=$event=>customOpen.value=$event),target:customTarget.value,session:modeSession.value,"can-configure":props.canConfigureRouting,"changes-disabled":props.repositoryBusy||unref(activeTask)?.status===`closing`,"save-selection":selection=>unref(temporary).updateRouting(unref(activeTask).id,{mode:`custom`,review:false,override:selection})},null,8,[`modelValue`,`target`,`session`,`can-configure`,`changes-disabled`,`save-selection`]),taskToClose.value?(openBlock(),createBlock(VDialog,{key:1,"model-value":true,"aria-labelledby":unref(closeTitleId),"max-width":`480`,persistent:``},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,{id:unref(closeTitleId),class:`text-wrap`},{default:withCtx(()=>[createTextVNode(toDisplayString(taskToClose.value.busy?`Stop and close repair?`:`Close incomplete repair?`),1)]),_:1},8,[`id`]),createVNode(VCardText,null,{default:withCtx(()=>[_cache[27]||(_cache[27]=createTextVNode(` Partial edits will stay in this session and may still need repair. Closing does not undo those edits or complete Update. `,-1)),actionErrors.value[taskToClose.value.id]?(openBlock(),createElementBlock(`p`,_hoisted_19$7,toDisplayString(actionErrors.value[taskToClose.value.id]),1)):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`flex-wrap`},{default:withCtx(()=>[createVNode(VBtn,{disabled:closingTask.value,onClick:_cache[16]||(_cache[16]=$event=>closeTaskId.value=``)},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`Keep chat open`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`error`,loading:closingTask.value,onClick:_cache[17]||(_cache[17]=$event=>closeTask(taskToClose.value.id))},{default:withCtx(()=>[createTextVNode(toDisplayString(taskToClose.value.busy?`Stop and close`:`Close repair`),1)]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`aria-labelledby`])):createCommentVNode(``,true)],64)):createCommentVNode(``,true)],10,_hoisted_1$25)):createCommentVNode(``,true)}}};var Vibe64TemporaryAiWorkspace_default=_plugin_vue_export_helper_default(_sfc_main$29,[[`__scopeId`,`data-v-836e73a7`]]);var _hoisted_1$24={class:`text-body-2 text-medium-emphasis mb-0`};var _sfc_main$28={__name:`Vibe64SessionArchiveDialog`,props:{archive:{default:()=>({}),type:Object},shortSessionId:{default:sessionId=>String(sessionId||``),type:Function}},setup(__props){const props=__props;function updateOpen(open){if(open!==true)props.archive.cancel()}const titleId=`vibe64-session-archive-dialog-${useId()}`;return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"aria-labelledby":titleId,"model-value":__props.archive.open,"max-width":`620`,persistent:``,"onUpdate:modelValue":updateOpen},{default:withCtx(()=>[createVNode(VCard,{class:`studio-ai-session-archive-dialog`},{default:withCtx(()=>[createVNode(VCardTitle,{id:titleId,class:`studio-ai-session-archive-dialog__title`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiArchiveOutline),color:`primary`},null,8,[`icon`]),_cache[0]||(_cache[0]=createTextVNode(` Archive session? `,-1))]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[_cache[2]||(_cache[2]=createBaseVNode(`p`,{class:`text-body-2 mb-2`},` This stops the assistant and terminals, preserves the session, and removes its active workspace. `,-1)),createBaseVNode(`p`,_hoisted_1$24,[_cache[1]||(_cache[1]=createTextVNode(` Session: `,-1)),createBaseVNode(`strong`,null,toDisplayString(__props.archive.sessionTitle||__props.shortSessionId(__props.archive.sessionId)),1)])]),_:1}),createVNode(VCardActions,{class:`studio-ai-session-archive-dialog__actions`},{default:withCtx(()=>[createVNode(VBtn,{variant:`text`,disabled:__props.archive.command.isRunning,onClick:__props.archive.cancel},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Cancel `,-1)])]),_:1},8,[`disabled`,`onClick`]),createVNode(VBtn,{color:`primary`,variant:`flat`,disabled:__props.archive.command.isRunning,onClick:__props.archive.confirm},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.archive.command.isRunning?`Archiving…`:`Archive session`),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`model-value`])}}};var Vibe64SessionArchiveDialog_default=_plugin_vue_export_helper_default(_sfc_main$28,[[`__scopeId`,`data-v-6853144f`]]);function projectOnboardingRequest(kind,{purpose=``,diagnostic=``,nextAction=``}={}){const description=String(purpose).trim();const request={create:{title:`Start this project`,message:`Help me start this project through conversation. Ask what I want to build, use answers I have already given, and help me choose a suitable Stack. I have not selected a starter.`+(description?`\n\nAgreed project description: ${description}`:``)},adopt:{title:`Set up this project`,message:`Set up this existing project for guided editing. What this project is and what I want to run: ${description}. Inspect its current implementation and work backwards into Genesis Blueprint, Stack, and Program, including its actual setup and run outputs. Preserve its source and Git history. If this application has authenticated web pages, inspect its existing authentication and Preview identity support, then start a conversation about managed preview access. Ask which existing development users should represent administrator and other relevant roles, using their email, login or user ID, and which should be the default. Reuse answers already supplied; do not ask for passwords or infer privileges from an account name. Offer to configure the existing Vibe64 Preview identity protocol and named identities, and wait for the user's choices before doing so. Do not create users, change roles or weaken production authentication as part of import. If the user defers, leave this explicitly pending; public or non-web projects do not need identity setup.`},inspect:{title:`Inspect project setup`,message:`Set up this existing project for guided editing. Inspect it for me to identify what it does and its run targets. Ask me only where the evidence is ambiguous. Work backwards into Genesis Blueprint, Stack, and Program while preserving the implementation and Git history. If this application has authenticated web pages, inspect its existing authentication and Preview identity support, then start a conversation about managed preview access. Ask which existing development users should represent administrator and other relevant roles, using their email, login or user ID, and which should be the default. Reuse answers already supplied; do not ask for passwords or infer privileges from an account name. Offer to configure the existing Vibe64 Preview identity protocol and named identities, and wait for the user's choices before doing so. Do not create users, change roles or weaken production authentication as part of import. If the user defers, leave this explicitly pending; public or non-web projects do not need identity setup.`},repair:{title:`Fix project setup`,message:`Inspect and update this project's Genesis setup. The opening inspection reports: ${diagnostic}. `+(nextAction===`update-genesis`?`The project requires a newer Genesis installation; do not downgrade its source format. `:``)+`Use the appropriate migration or repair, preserve source and Git history, and explain the specific change.`}}[kind];if(!request||kind===`adopt`&&!description)throw new Error(`Choose a setup request and describe the existing project before adopting it.`);return{...request,displayMessage:kind===`adopt`?`${request.title}: ${description}`:`${request.title}.`,nextStepMessage:`Recheck setup after the AI finishes. Project edits remain in this session for review and Save.`}}function useTrainingPreviewRegistration(displayedPreview,enabled){const colleaguePreview=inject(VIBE64_COLLEAGUE_PREVIEW_KEY,null);watchEffect(()=>{if(!colleaguePreview)return;if(toValue(enabled))colleaguePreview.value=displayedPreview;else if(colleaguePreview.value===displayedPreview)colleaguePreview.value=null});onBeforeUnmount(()=>{if(colleaguePreview?.value===displayedPreview)colleaguePreview.value=null})}var _hoisted_1$23={class:`project-preview`};var _hoisted_2$21={key:0};var _hoisted_3$19={key:0};var _hoisted_4$17={class:`project-preview__warning-actions`};var _hoisted_5$16={key:0};var _hoisted_6$15={key:0};var _hoisted_7$15={key:1};var _hoisted_8$15={class:`project-preview__warning-actions`};var _hoisted_9$12={key:2,class:`project-preview__output`};var _hoisted_10$10=[`aria-busy`];var _hoisted_11$10={class:`project-onboarding__choices`};var _hoisted_12$10=[`disabled`,`onClick`];var _hoisted_13$10={key:0};var _hoisted_14$10={class:`project-onboarding__choose`};var _hoisted_15$10={key:0};var _hoisted_16$9={class:`project-onboarding__actions`};var _hoisted_17$9={key:4,role:`status`};var _sfc_main$27={__name:`Vibe64ProjectOnboarding`,props:{active:Boolean,learningBinding:{type:Object,default:null},presentationActive:Boolean,presentation:{type:Object,default:null},archived:Boolean,busy:Boolean,canAsk:Boolean,requestTemporaryAi:{type:Function,required:true},sessionId:{type:String,required:true}},setup(__props){const props=__props;const workingProjectSlug=useVibe64ProjectSlug();const capturedLearning=props.learningBinding?Object.freeze(Object.fromEntries([`actorKey`,`viewerActorKey`,`learnerId`,`learningAttemptId`,`sessionId`,`sessionsApiPath`,`noExercise`,`sourceProjectSlug`,`projectSlug`].map(key=>[key,props.learningBinding[key]]))):null;const learning=computed(()=>Boolean(capturedLearning||props.learningBinding));const projectSlug=computed(()=>capturedLearning?capturedLearning.sourceProjectSlug:workingProjectSlug.value);const purpose=ref(``);const applying=ref(``);const asking=ref(false);let disposed=false;onBeforeUnmount(()=>{disposed=true});const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,null);const learningBindingCurrent=computed(()=>!learning.value||capturedLearning&&props.learningBinding&&Object.keys(capturedLearning).every(key=>capturedLearning[key]===props.learningBinding[key])&&capturedLearning.noExercise===false&&!capturedLearning.projectSlug&&capturedLearning.learnerId&&capturedLearning.viewerActorKey===(viewer?.value||viewer)?.actorKey&&capturedLearning.sessionId===props.sessionId&&capturedLearning.sessionsApiPath===`/api/learning/${capturedLearning.learningAttemptId}/vibe64/sessions`);const enabled=computed(()=>props.active&&!props.archived&&Boolean(props.sessionId)&&learningBindingCurrent.value);const resource=useEndpointResource({enabled,path:computed(()=>learning.value?`${capturedLearning?.sessionsApiPath||``}/${encodeURIComponent(capturedLearning?.sessionId||``)}/onboarding`:resolveStudioRequestUrl(`/api/vibe64/onboarding`)),readQuery:computed(()=>learning.value?{}:{sessionId:props.sessionId}),queryKey:computed(()=>[`vibe64`,`project-onboarding`,learning.value?[capturedLearning?.learnerId,capturedLearning?.learningAttemptId]:projectSlug.value,capturedLearning?capturedLearning.sessionId:props.sessionId]),queryOptions:{refetchOnMount:`always`,refetchOnWindowFocus:true},realtime:{events:[`vibe64.project.changed`,`vibe64.session.changed`],matches:({event,payload={}}={})=>{if(event===`vibe64.project.changed`)return!payload.projectSlug||payload.projectSlug===projectSlug.value;return payload.projectSlug===projectSlug.value&&payload.sessionId===props.sessionId&&payload.reason===`temporary-agent-turn-idle`}},refreshOnPull:true,fallbackLoadError:`Project setup could not be read.`});const command=useCommand({access:`never`,apiSuffix:`vibe64`,buildCommandOptions:()=>({method:`POST`,path:resolveStudioRequestUrl(`/api/vibe64/templates/apply`)}),buildRawPayload:(_model,{context})=>({sessionId:context.sessionId,templateId:context.templateId}),fallbackRunError:`The starter could not be applied. Your existing work was preserved.`,messages:{success:`Starter added to this session. Use Save to keep it in the project.`,error:`The starter could not be applied.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.project.templates.apply`,surfaceId:`app`,writeMethod:`POST`});const onboarding=computed(()=>resource.data.value?.ok===true?resource.data.value:null);const state=computed(()=>onboarding.value?.inspection?.state||``);const environmentSetup=computed(()=>onboarding.value?.environmentSetup);const loadError=computed(()=>vibe64ResourceResponseError(resource.data.value)||resource.loadError.value);const showPreview=computed(()=>{if(props.archived||onboarding.value?.available===false||loadError.value)return true;return onboarding.value!==null&&state.value!==`new`&&state.value!==`adoption`});const displayedPreview={...capturedLearning?{get learningAttemptId(){return capturedLearning.learningAttemptId},get learnerId(){return capturedLearning.learnerId},get noExercise(){return capturedLearning.noExercise}}:{},get presentation(){return props.presentation},get projectSlug(){return projectSlug.value},get sessionId(){return props.sessionId},get screen(){if(props.presentationActive&&!props.active)return void 0;if(showPreview.value)return!props.archived&&(loadError.value||state.value===`attention`)?`outputs-with-setup-warning`:`outputs`;if(state.value===`adoption`)return`existing-project-setup`;if(state.value===`new`)return`new-project-setup`;return`checking-project-setup`}};if(capturedLearning)Object.defineProperty(displayedPreview,"appVisible",{enumerable:true,get:()=>props.active});useTrainingPreviewRegistration(displayedPreview,()=>(props.active||props.presentationActive)&&learningBindingCurrent.value);const pending=computed(()=>Boolean(applying.value||asking.value));const starterDisabled=computed(()=>learning.value||pending.value||props.busy||!enabled.value);const askDisabled=computed(()=>learning.value||pending.value||!enabled.value||!props.canAsk);const groups=computed(()=>{const grouped=new Map;for(const template of onboarding.value?.templates||[]){if(!grouped.has(template.technology))grouped.set(template.technology,[]);grouped.get(template.technology).push(template)}return[...grouped].map(([technology,templates])=>({technology,templates}))});const groupsHaveMultipleSources=computed(()=>new Set((onboarding.value?.templates||[]).map(({namespace})=>namespace)).size>1);function technologyLabel(technology){return technology===`jskit`?`JSKIT`:technology}async function apply(template){if(starterDisabled.value)return;const sessionId=props.sessionId;applying.value=template.id;try{try{await command.run({sessionId,templateId:template.id})}catch{return}if(disposed||props.sessionId!==sessionId||!enabled.value)return;await resource.reload()}finally{applying.value=``}}async function ask(kind){if(askDisabled.value)return;const inspection=onboarding.value?.inspection;const diagnostic=loadError.value||inspection?.diagnostics.map(({message})=>message).join(` `);const request=projectOnboardingRequest(kind,{purpose:purpose.value,diagnostic,nextAction:inspection?.nextAction});asking.value=true;try{await props.requestTemporaryAi(request)}finally{asking.value=false}}watch(()=>props.sessionId,()=>{purpose.value=``});watch(()=>props.busy,(busy,previous)=>{if(previous&&!busy&&enabled.value)resource.reload()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$23,[!props.archived&&(loadError.value||state.value===`attention`)?(openBlock(),createBlock(VAlert,{key:0,class:`project-preview__warning`,color:`warning-container`,density:`compact`,role:`status`,type:`warning`,variant:`flat`},{default:withCtx(()=>[createBaseVNode(`strong`,null,toDisplayString(loadError.value?`Project setup could not be read`:`Project setup needs attention`),1),loadError.value?(openBlock(),createElementBlock(`p`,_hoisted_2$21,toDisplayString(loadError.value),1)):(openBlock(),createElementBlock(Fragment,{key:1},[(openBlock(true),createElementBlock(Fragment,null,renderList(onboarding.value.inspection.diagnostics,(diagnostic,index)=>{return openBlock(),createElementBlock(`p`,{key:index},toDisplayString(diagnostic.message),1)}),128)),onboarding.value.inspection.nextAction===`update-genesis`?(openBlock(),createElementBlock(`p`,_hoisted_3$19,`Use an installation with a newer Genesis version to update setup.`)):createCommentVNode(``,true)],64)),createBaseVNode(`div`,_hoisted_4$17,[createVNode(VBtn,{disabled:!enabled.value||unref(resource).isFetching.value,size:`small`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>unref(resource).reload())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(resource).isFetching.value?`Checking setup…`:`Recheck setup`),1)]),_:1},8,[`disabled`]),!learning.value?(openBlock(),createBlock(Vibe64TemporaryAiFixAction_default,{key:0,disabled:askDisabled.value,pending:asking.value,title:`Open Temporary AI to resolve project setup`,onClick:_cache[1]||(_cache[1]=$event=>ask(`repair`))},null,8,[`disabled`,`pending`])):createCommentVNode(``,true)])]),_:1})):createCommentVNode(``,true),!props.archived&&(environmentSetup.value?.missingKeys.length||environmentSetup.value?.warning)?(openBlock(),createBlock(VAlert,{key:1,class:`project-preview__warning`,color:`warning-container`,density:`compact`,role:`status`,type:`warning`,variant:`flat`},{default:withCtx(()=>[_cache[9]||(_cache[9]=createBaseVNode(`h2`,{class:`text-title-medium`},`Set up your project's environment`,-1)),environmentSetup.value.warning?(openBlock(),createElementBlock(`p`,_hoisted_5$16,toDisplayString(environmentSetup.value.warning),1)):createCommentVNode(``,true),environmentSetup.value.missingKeys.length?(openBlock(),createElementBlock(Fragment,{key:1},[learning.value?(openBlock(),createElementBlock(`p`,_hoisted_6$15,`Ask the installation owner to supply these practice environment values, then recheck setup.`)):(openBlock(),createElementBlock(`p`,_hoisted_7$15,`This project requires environment values. Add them in Env, then recheck setup.`)),createBaseVNode(`details`,null,[_cache[7]||(_cache[7]=createBaseVNode(`summary`,null,`Required configuration`,-1)),createBaseVNode(`ul`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(environmentSetup.value.missingKeys,key=>{return openBlock(),createElementBlock(`li`,{key},[createBaseVNode(`code`,null,toDisplayString(key),1)])}),128))])])],64)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_8$15,[!learning.value?(openBlock(),createBlock(VBtn,{key:0,to:unref(projectAppPath)(projectSlug.value,`/dashboard/env`),size:`small`,variant:`flat`,color:`primary`},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Open Env`,-1)])]),_:1},8,[`to`])):createCommentVNode(``,true),createVNode(VBtn,{disabled:!enabled.value||unref(resource).isFetching.value,size:`small`,variant:`text`,onClick:_cache[2]||(_cache[2]=$event=>unref(resource).reload())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(resource).isFetching.value?`Checking setup…`:`Recheck setup`),1)]),_:1},8,[`disabled`])])]),_:1})):createCommentVNode(``,true),showPreview.value?(openBlock(),createElementBlock(`div`,_hoisted_9$12,[renderSlot(_ctx.$slots,`default`,{},void 0,true)])):(openBlock(),createElementBlock(`section`,{key:3,class:`project-onboarding`,"aria-label":`Project setup`,"aria-busy":pending.value},[!onboarding.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`heading, paragraph, card`})):learning.value?(openBlock(),createElementBlock(Fragment,{key:1},[_cache[10]||(_cache[10]=createBaseVNode(`h2`,null,`Practice setup needs attention`,-1)),_cache[11]||(_cache[11]=createBaseVNode(`p`,null,`This lesson needs its prepared practice app. Recheck setup; if it still cannot run, ask the installation owner to restore the lesson workspace.`,-1))],64)):state.value===`new`?(openBlock(),createElementBlock(Fragment,{key:2},[_cache[13]||(_cache[13]=createBaseVNode(`p`,{class:`project-onboarding__eyebrow`},`Your starting point`,-1)),_cache[14]||(_cache[14]=createBaseVNode(`h2`,null,`What would you like to build with?`,-1)),_cache[15]||(_cache[15]=createBaseVNode(`p`,null,`Choose a ready-made app, or describe your idea in the conversation.`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(groups.value,group=>{return openBlock(),createElementBlock(`div`,{key:group.technology,class:`project-onboarding__group`},[createBaseVNode(`h3`,null,toDisplayString(technologyLabel(group.technology)),1),createBaseVNode(`div`,_hoisted_11$10,[(openBlock(true),createElementBlock(Fragment,null,renderList(group.templates,template=>{return openBlock(),createElementBlock(`button`,{key:template.id,type:`button`,class:`project-onboarding__choice`,disabled:starterDisabled.value,onClick:$event=>apply(template)},[createBaseVNode(`strong`,null,toDisplayString(template.name),1),createBaseVNode(`span`,null,toDisplayString(template.description),1),groupsHaveMultipleSources.value?(openBlock(),createElementBlock(`small`,_hoisted_13$10,`Source: `+toDisplayString(template.namespace),1)):createCommentVNode(``,true),createBaseVNode(`span`,_hoisted_14$10,toDisplayString(applying.value===template.id?`Preparing your starter…`:`Use this starter →`),1)],8,_hoisted_12$10)}),128))])])}),128)),!groups.value.length?(openBlock(),createElementBlock(`p`,_hoisted_15$10,`No starters are configured for this installation yet.`)):createCommentVNode(``,true),createVNode(VBtn,{disabled:askDisabled.value,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>ask(`create`))},{default:withCtx(()=>[..._cache[12]||(_cache[12]=[createTextVNode(`Start through conversation`,-1)])]),_:1},8,[`disabled`])],64)):state.value===`adoption`?(openBlock(),createElementBlock(Fragment,{key:3},[_cache[18]||(_cache[18]=createBaseVNode(`p`,{class:`project-onboarding__eyebrow`},`Bring your project`,-1)),_cache[19]||(_cache[19]=createBaseVNode(`h2`,null,`Set up this existing project`,-1)),_cache[20]||(_cache[20]=createBaseVNode(`p`,null,`Tell the AI what this project does and what you want to run. It will work out the setup from your code and preserve your source and Git history.`,-1)),createVNode(VTextarea,{modelValue:purpose.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>purpose.value=$event),label:`What is this project?`,placeholder:`For example: a Python tool that processes invoices. I want to run its command line.`,rows:`3`,"auto-grow":``,disabled:askDisabled.value},null,8,[`modelValue`,`disabled`]),createBaseVNode(`div`,_hoisted_16$9,[createVNode(VBtn,{disabled:askDisabled.value||!purpose.value.trim(),color:`primary`,onClick:_cache[5]||(_cache[5]=$event=>ask(`adopt`))},{default:withCtx(()=>[..._cache[16]||(_cache[16]=[createTextVNode(`Set up project`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:askDisabled.value,variant:`text`,onClick:_cache[6]||(_cache[6]=$event=>ask(`inspect`))},{default:withCtx(()=>[..._cache[17]||(_cache[17]=[createTextVNode(`Inspect it for me`,-1)])]),_:1},8,[`disabled`])])],64)):createCommentVNode(``,true),pending.value?(openBlock(),createElementBlock(`p`,_hoisted_17$9,toDisplayString(applying.value?`Adding the starter to this session…`:`Opening Temporary AI…`),1)):createCommentVNode(``,true)],8,_hoisted_10$10))])}}};var Vibe64ProjectOnboarding_default=_plugin_vue_export_helper_default(_sfc_main$27,[[`__scopeId`,`data-v-9cab79de`]]);var MAX_FILE_BYTES=1048576;var MAX_COMMAND_IDS=64;var MAX_PENDING_REQUESTS=64;var PROTOCOL_VERSION=1;var identityPattern=/^[a-zA-Z0-9-]{1,64}$/u;function object(value){return value!==null&&typeof value===`object`&&!Array.isArray(value)&&[Object.prototype,null].includes(Object.getPrototypeOf(value))}function exactKeys(value,names){return object(value)&&Object.keys(value).length===names.length&&names.every(name=>Object.hasOwn(value,name))}function text(value,maximum,multiline=false){return typeof value===`string`&&Boolean(value.trim())&&value.length<=maximum&&!(multiline?/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u:/[\u0000-\u001f\u007f]/u).test(value)}function identity(value){return typeof value===`string`&&identityPattern.test(value)}function semanticSnapshot(value,states){if(!exactKeys(value,[`state`,`paused`,`labels`])||!states.has(value.state)||typeof value.paused!==`boolean`||!object(value.labels)||Object.keys(value.labels).length>32||Object.entries(value.labels).some(([name,label])=>!identity(name)||!text(label,256))||JSON.stringify(value).length>4096)throw new Error(`The diagram's saved semantic state is invalid. Reload its declared initial state.`);return structuredClone(value)}function validateResource(resource,view){const visual=resource?.visual;if(!object(visual)||visual.schemaVersion!==1||!identity(visual.id)||resource.id!==visual.id||!text(visual.title,256)||!text(visual.description,2e3,true)||!Array.isArray(visual.states)||!visual.states.length||visual.states.length>32||visual.states.some(state=>!identity(state))||new Set(visual.states).size!==visual.states.length||!visual.states.includes(visual.initialState)||!Array.isArray(visual.commands)||!visual.commands.length||visual.commands.length>32)throw new Error(`The verified diagram descriptor is missing or invalid.`);const states=new Set(visual.states);const commands=new Map;for(const command of visual.commands){if(!object(command)||!identity(command.name)||commands.has(command.name)||command.completionState!==`unchanged`&&!states.has(command.completionState)||!Array.isArray(command.parameters)||command.parameters.length>8)throw new Error(`The diagram declares an invalid command.`);const parameters=new Map;for(const parameter of command.parameters){if(!object(parameter)||!identity(parameter.name)||parameters.has(parameter.name)||typeof parameter.required!==`boolean`||!Number.isInteger(parameter.maxLength)||parameter.maxLength<1||parameter.maxLength>256)throw new Error(`The diagram declares an invalid command parameter.`);parameters.set(parameter.name,{required:parameter.required,maxLength:parameter.maxLength})}commands.set(command.name,{completionState:command.completionState,parameters})}function encodedFile(file){if(!object(file)||!text(file.path,1024)||file.encoding!==`base64`||typeof file.bytes!==`string`||file.bytes.length>Math.ceil(MAX_FILE_BYTES/3)*4)throw new Error(`Diagram files require bounded base64 bytes from the verified lesson reader.`);let bytes;try{bytes=view.atob(file.bytes)}catch{throw new Error(`Diagram file bytes are not valid base64.`)}if(!bytes.length||bytes.length>MAX_FILE_BYTES||view.btoa(bytes)!==file.bytes)throw new Error(`Diagram file bytes are empty, oversized or noncanonical.`);return file.bytes}return{visual:structuredClone(visual),states,commands,svg:encodedFile(resource.svg),controller:encodedFile(resource.controller)}}async function bootstrap(payload,loadController){let dispose;let claimed=false;window.addEventListener(`pagehide`,()=>dispose?.(),{once:true});window.addEventListener(`message`,async event=>{if(claimed||event.source!==parent||!event.data||Object.keys(event.data).sort().join(`,`)!==`init,playerInstanceId,protocolVersion,token,type`||event.data.type!==`vibe64-visual-init`||event.data.protocolVersion!==1||event.data.playerInstanceId!==payload.playerInstanceId||event.data.token!==payload.token||event.ports.length!==1)return;claimed=true;const port=event.ports[0];let moduleUrl;try{const decode=value=>new TextDecoder(`utf-8`,{fatal:true}).decode(Uint8Array.from(atob(value),character=>character.charCodeAt(0)));const documentSvg=new DOMParser().parseFromString(decode(payload.svg),`image/svg+xml`);const svg=documentSvg.documentElement;if(svg.localName!==`svg`||svg.namespaceURI!==`http://www.w3.org/2000/svg`||documentSvg.querySelector(`parsererror`))throw new Error(`The diagram SVG cannot be read.`);document.body.append(document.importNode(svg,true));moduleUrl=URL.createObjectURL(new Blob([decode(payload.controller)],{type:`text/javascript`}));const controller=await loadController(moduleUrl);if(typeof controller.mountVisual!==`function`)throw new Error(`The diagram controller has no mountVisual operation.`);dispose=controller.mountVisual(document.body.querySelector(`svg`),port,event.data.init)}catch(cause){port.postMessage({protocolVersion:1,playerInstanceId:payload.playerInstanceId,type:`bootstrap-failed`,description:String(cause.message||`Diagram initialization failed.`).slice(0,2e3)})}finally{if(moduleUrl)URL.revokeObjectURL(moduleUrl)}});parent.postMessage({type:`vibe64-visual-handshake`,protocolVersion:1,playerInstanceId:payload.playerInstanceId,token:payload.token},`*`)}function frameDocument(payload){const nonce=payload.token;return[`<!doctype html><html><head><meta charset="utf-8">`,`<meta http-equiv="Content-Security-Policy" content="${[`default-src 'none'`,`script-src 'nonce-${nonce}' blob:`,`style-src 'unsafe-inline'`,`connect-src 'none'`,`img-src 'none'`,`media-src 'none'`,`frame-src 'none'`,`object-src 'none'`,`base-uri 'none'`,`form-action 'none'`].join(`; `)}">`,`<meta name="referrer" content="no-referrer">`,`<style>html,body{margin:0;height:100%;overflow:hidden}svg{display:block;width:100%;height:100%}</style></head><body>`,`<script nonce="${nonce}">(${bootstrap.toString()})(${JSON.stringify(payload)}, url => import(url));<\/script>`,`</body></html>`].join(``)}function createTrainingVisualPlayer({iframe,resource,attemptId,reducedMotion=false,snapshot:initialSnapshot,onState,timeoutMs=5e3}={}){const view=iframe?.ownerDocument?.defaultView;if(!view||!identity(attemptId)||typeof reducedMotion!==`boolean`||!Number.isInteger(timeoutMs)||timeoutMs<1||timeoutMs>3e4)throw new Error(`Mount a diagram in its iframe for an admitted attempt with a bounded timeout.`);const{visual,states,commands,svg,controller}=validateResource(resource,view);const pending=new Map;const commandInputs=new Map;let current;let closed=false;let savedSnapshot=initialSnapshot===void 0?void 0:semanticSnapshot(initialSnapshot,states);let display={state:savedSnapshot?.state??visual.initialState,description:visual.description};let status={attemptId,playerInstanceId:``,phase:`loading`,...display,error:``};function publish(patch){status={...status,...patch};try{(onState?.(structuredClone(status)))?.catch?.(()=>{})}catch{}}function settle(id,error,result){const request=pending.get(id);if(!request)return;pending.delete(id);clearTimeout(request.timer);if(error)request.reject(error);else request.resolve(result)}function retire(cause){const previous=current;current=void 0;if(!previous)return;clearTimeout(previous.timer);view.removeEventListener(`message`,previous.handshake);if(previous.port){previous.port.onmessage=null;previous.port.close()}previous.rejectReady(cause);for(const id of[...pending.keys()])settle(id,cause);iframe.srcdoc=``}function fail(message){retire(new Error(message));publish({phase:`failed`,error:message})}function request(kind,id,body,command){if(!current?.ready||closed)return Promise.reject(new Error(`The diagram is not ready. Reload it before sending a command.`));if(pending.size>=MAX_PENDING_REQUESTS)return Promise.reject(new Error(`The diagram has too many pending requests.`));const instance=current;let resolve;let reject;const promise=new Promise((yes,no)=>{resolve=yes;reject=no});const timer=setTimeout(()=>{if(current===instance&&pending.has(id))fail(`The diagram did not confirm its result in time. Reload its saved state; the command will not be replayed.`)},timeoutMs);pending.set(id,{kind,promise,resolve,reject,timer,command,accepted:false});try{instance.port.postMessage({protocolVersion:PROTOCOL_VERSION,playerInstanceId:instance.id,...body})}catch{fail(`The diagram channel is unavailable. Reload its saved state.`)}return promise}function snapshot(){const requestId=view.crypto.randomUUID();return request(`snapshot`,requestId,{type:`snapshot`,requestId})}function receive(instance,value){if(closed||current!==instance||!object(value)||value.protocolVersion!==PROTOCOL_VERSION||value.playerInstanceId!==instance.id)return;if(value.type===`bootstrap-failed`){if(!instance.ready&&exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`description`])&&text(value.description,2e3,true))fail(value.description);return}if(value.type===`ready`){if(instance.ready||!exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`commands`,`state`,`description`])||value.state!==instance.initialState||!text(value.description,2e3,true)||!Array.isArray(value.commands)||value.commands.length!==commands.size||new Set(value.commands).size!==commands.size||value.commands.some(name=>!commands.has(name)))return;instance.ready=true;clearTimeout(instance.timer);display={state:value.state,description:value.description};publish({phase:`ready`,...display,error:``});instance.resolveReady(structuredClone(status));return}if(!instance.ready||!states.has(value.state)||!identity(value.commandId??value.requestId))return;const id=value.commandId??value.requestId;const operation=pending.get(id);if(!operation)return;if(operation.kind===`snapshot`){if(value.type!==`snapshot`||!exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`requestId`,`state`,`description`,`paused`,`labels`])||!text(value.description,2e3,true))return;let semantic;try{semantic=semanticSnapshot({state:value.state,paused:value.paused,labels:value.labels},states)}catch{return}savedSnapshot=semantic;display={state:value.state,description:value.description};publish(display);settle(id,null,structuredClone(semantic));return}if(value.type===`accepted`){if(!exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`commandId`,`state`]))return;operation.accepted=true;operation.acceptedState=value.state;publish({phase:`accepted`,error:``});return}if(value.type===`completed`){if(!exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`commandId`,`state`,`description`])||!text(value.description,2e3,true)||!operation.accepted&&!operation.command.retry||operation.command.completionState!==`unchanged`&&value.state!==operation.command.completionState||operation.command.completionState===`unchanged`&&operation.accepted&&value.state!==operation.acceptedState)return;publish({phase:`ready`,error:``});settle(id,null,structuredClone(value))}else if(value.type===`failed`){if(!exactKeys(value,[`protocolVersion`,`playerInstanceId`,`type`,`commandId`,`state`,`code`,`description`])||!identity(value.code)||!text(value.description,2e3,true))return;publish({phase:`ready`,error:value.description});settle(id,Object.assign(new Error(value.description),{code:value.code}))}else return;snapshot().catch(()=>{})}function command({commandId,name,parameters={}}={}){const declared=commands.get(name);if(!identity(commandId)||!declared||!object(parameters)||Object.keys(parameters).some(key=>!declared.parameters.has(key)))return Promise.reject(new Error(`Choose a declared diagram command and bounded parameters.`));for(const[key,parameter]of declared.parameters){if(parameters[key]===void 0&&!parameter.required)continue;if(!text(parameters[key],parameter.maxLength))return Promise.reject(new Error(`Diagram parameter ${key} is missing or invalid.`))}const input=JSON.stringify([name,Object.keys(parameters).sort().map(key=>[key,parameters[key]])]);const previous=commandInputs.get(commandId);if(previous&&previous.input!==input)return Promise.reject(new Error(`This diagram command ID already names different input.`));if(pending.has(commandId))return pending.get(commandId).promise;if(!current?.ready||closed)return Promise.reject(new Error(`The diagram is not ready. Reload it before sending a command.`));if(previous&&previous.instanceId!==current.id)return Promise.reject(new Error(`The original diagram instance and retry receipt are gone. Use a new ID only for an intentional new command.`));if(!previous&&commandInputs.size>=MAX_COMMAND_IDS)return Promise.reject(new Error(`This diagram reached its 64 command-ID limit. Reopen it explicitly; no retry identity was discarded.`));if(!previous)commandInputs.set(commandId,{input,instanceId:current.id});return request(`command`,commandId,{type:`command`,commandId,name,parameters:structuredClone(parameters)},{retry:Boolean(previous),completionState:declared.completionState})}function restore(value=savedSnapshot,motion=reducedMotion){if(closed)return Promise.reject(new Error(`The diagram player is closed.`));if(typeof motion!==`boolean`)throw new Error(`Choose a boolean reduced-motion preference for the diagram.`);const semantic=value===void 0?void 0:semanticSnapshot(value,states);reducedMotion=motion;retire(new Error(`The diagram instance changed; unfinished commands were not replayed.`));const instance={id:view.crypto.randomUUID(),token:view.crypto.randomUUID(),ready:false,initialState:semantic?.state??visual.initialState};const ready=new Promise((resolve,reject)=>{instance.resolveReady=resolve;instance.rejectReady=reject});ready.catch(()=>{});instance.handshake=event=>{const value=event.data;if(current!==instance||event.source!==iframe.contentWindow||instance.port||!exactKeys(value,[`type`,`protocolVersion`,`playerInstanceId`,`token`])||value.type!==`vibe64-visual-handshake`||value.protocolVersion!==PROTOCOL_VERSION||value.playerInstanceId!==instance.id||value.token!==instance.token)return;const channel=new view.MessageChannel;instance.port=channel.port1;instance.port.onmessage=event=>receive(instance,event.data);instance.port.start();try{iframe.contentWindow.postMessage({type:`vibe64-visual-init`,protocolVersion:PROTOCOL_VERSION,playerInstanceId:instance.id,token:instance.token,init:{protocolVersion:PROTOCOL_VERSION,playerInstanceId:instance.id,initialState:instance.initialState,reducedMotion,...semantic?{snapshot:semantic}:{}}},`*`,[channel.port2])}catch{channel.port2.close();fail(`The diagram channel could not be transferred. Reload its saved state.`)}view.removeEventListener(`message`,instance.handshake)};current=instance;savedSnapshot=semantic;display={state:instance.initialState,description:visual.description};publish({playerInstanceId:instance.id,phase:`loading`,...display,error:``});instance.timer=setTimeout(()=>{if(current===instance)fail(`The diagram did not become ready. Reload it or ask the owner to check its verified controller.`)},timeoutMs);view.addEventListener(`message`,instance.handshake);iframe.setAttribute(`sandbox`,`allow-scripts`);iframe.setAttribute(`referrerpolicy`,`no-referrer`);iframe.removeAttribute(`allow`);iframe.removeAttribute(`src`);iframe.srcdoc=frameDocument({playerInstanceId:instance.id,token:instance.token,svg,controller});return ready}function dispose(){if(closed)return;closed=true;retire(new Error(`The diagram player closed; unfinished commands were not replayed.`));publish({phase:`disposed`})}return{ready:restore(savedSnapshot),command,snapshot,restore,dispose,get state(){return structuredClone(status)}}}var _hoisted_1$22=[`aria-label`];var _hoisted_2$20={class:`vibe64-training-visual__frame`};var _hoisted_3$18={class:`vibe64-training-visual__bar`};var _hoisted_4$16={class:`vibe64-training-visual__bar-title`};var _hoisted_5$15={class:`vibe64-training-visual__canvas`};var _hoisted_6$14=[`title`];var _hoisted_7$14={key:0,class:`vibe64-training-visual__error`,role:`alert`};var _hoisted_8$14={class:`text-body-medium`};var _sfc_main$26={__name:`TrainingVisualPlayer`,props:{resource:{type:Object,required:true},attemptId:{type:String,required:true},snapshot:{type:Object,default:void 0},reducedMotion:{type:Boolean,default:void 0}},emits:[`state`,`error`],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;const frame=ref(null);const state=ref({phase:`loading`,description:props.resource.visual?.description||``,error:``});const title=computed(()=>props.resource.visual?.title||`Lesson diagram`);let player;function mount(iframe){player?.dispose();player=void 0;if(!iframe)return;try{player=createTrainingVisualPlayer({iframe,resource:toRaw(props.resource),attemptId:props.attemptId,snapshot:toRaw(props.snapshot),reducedMotion:motionPreference(),onState(value){state.value=value;emit(`state`,value);if(value.error)emit(`error`,value.error)}})}catch(cause){state.value={phase:`failed`,description:props.resource.visual?.description||``,error:cause.message};emit(`error`,cause.message)}}watch([frame,()=>props.resource,()=>props.attemptId],([iframe])=>mount(iframe),{immediate:true,flush:`post`});function motionPreference(){return props.reducedMotion??frame.value.ownerDocument.defaultView.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function requirePlayer(){if(!player)throw new Error(`The diagram has not mounted.`);return player}function reload(){if(!player)return mount(frame.value);return player.restore(void 0,motionPreference()).catch(()=>{})}onBeforeUnmount(()=>player?.dispose());__expose({command:value=>requirePlayer().command(toRaw(value)),snapshot:()=>requirePlayer().snapshot(),restore:value=>requirePlayer().restore(toRaw(value),motionPreference()),dispose:()=>player?.dispose()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:normalizeClass([`vibe64-training-visual`,`is-${state.value.phase}`]),"aria-label":title.value},[createBaseVNode(`div`,_hoisted_2$20,[createBaseVNode(`div`,_hoisted_3$18,[_cache[0]||(_cache[0]=createBaseVNode(`svg`,{class:`vibe64-training-visual__bar-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 16H5V5h14v14M7 15l3-4 2 3 3-4 2 5H7Z`})],-1)),createBaseVNode(`span`,_hoisted_4$16,toDisplayString(title.value),1)]),createBaseVNode(`div`,_hoisted_5$15,[createBaseVNode(`iframe`,{ref_key:`frame`,ref:frame,title:title.value,sandbox:`allow-scripts`,referrerpolicy:`no-referrer`},null,8,_hoisted_6$14),state.value.phase===`loading`?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`image`,class:`vibe64-training-visual__loading`})):createCommentVNode(``,true)])]),withDirectives(createBaseVNode(`p`,{class:`vibe64-training-visual__caption text-body-medium`,role:`status`},toDisplayString(state.value.description),513),[[vShow,state.value.description]]),state.value.error?(openBlock(),createElementBlock(`div`,_hoisted_7$14,[_cache[2]||(_cache[2]=createBaseVNode(`svg`,{class:`vibe64-training-visual__error-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M13 13h-2V7h2m0 10h-2v-2h2M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z`})],-1)),createBaseVNode(`p`,_hoisted_8$14,toDisplayString(state.value.error),1),createVNode(VBtn,{"min-height":`48`,rounded:`pill`,variant:`tonal`,onClick:reload},{default:withCtx(()=>[..._cache[1]||(_cache[1]=[createTextVNode(`Reload diagram`,-1)])]),_:1})])):createCommentVNode(``,true)],10,_hoisted_1$22)}}};var TrainingVisualPlayer_default=_plugin_vue_export_helper_default(_sfc_main$26,[[`__scopeId`,`data-v-f3080af2`]]);var _hoisted_1$21={class:`training-preview`};var _hoisted_2$19={key:0,class:`training-preview__choices`,"aria-label":`Learning content`};var _hoisted_3$17={class:`training-preview__segmented`,role:`group`,"aria-label":`Learning view`};var _hoisted_4$15={key:0,class:`training-preview__segment-check`,viewBox:`0 0 24 24`,"aria-hidden":`true`};var _hoisted_5$14={key:0,class:`training-preview__segment-check`,viewBox:`0 0 24 24`,"aria-hidden":`true`};var _hoisted_6$13={key:0,class:`training-preview__segment-check`,viewBox:`0 0 24 24`,"aria-hidden":`true`};var _hoisted_7$13={class:`training-preview__collapse-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`};var _hoisted_8$13=[`d`];var _hoisted_9$11={key:1,class:`training-preview__notice is-error`,role:`alert`};var _hoisted_10$9={key:2,class:`training-preview__note`,role:`status`};var _hoisted_11$9={key:3,class:`training-preview__note`,role:`status`};var _hoisted_12$9={class:`training-preview__cue-icon`,"aria-hidden":`true`};var _hoisted_13$9={viewBox:`0 0 24 24`};var _hoisted_14$9=[`d`];var _hoisted_15$9={role:`status`};var _hoisted_16$8={key:5,class:`training-preview__notice is-error`,role:`alert`};var _hoisted_17$8={key:6,class:`training-preview__app`};var _hoisted_18$7={key:7,class:`training-preview__lessons`,"aria-label":`Courses`};var _hoisted_19$6={key:0,class:`training-preview__empty`};var _hoisted_20$6={class:`training-preview__presentation`};var _hoisted_21$6={key:2,class:`training-preview__notice is-error`};var _hoisted_22$6={role:`alert`};var _sfc_main$25={__name:`TrainingPreviewPresentation`,props:{active:Boolean,agentConnectionStatus:{type:String,default:``},lessonsAvailable:Boolean,appAvailable:{type:Boolean,default:true},attemptId:{type:String,default:``},learningBinding:{type:Object,default:null},learningPaneActive:{type:Boolean,default:null},projectSlug:{type:String,required:true},sessionId:{type:String,required:true},workspaceActive:{type:Boolean,default:null}},setup(__props,{expose:__expose}){const props=__props;const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const learnerGestures=inject(VIBE64_TRAINING_LEARNER_GESTURE_KEY,null);async function showApp(event){if(appOpening.value||!props.active||!props.appAvailable)return;const practice=props.learningBinding?.noExercise===false;if(practice&&!learningAvailable.value)return;const expected=practice?Object.freeze({...props.learningBinding}):null;const generation=appOpenGeneration;const owner=learnerGestures?.value;const ticket=props.active&&props.appAvailable?owner?.begin(event,`preview-select`,{projectSlug:props.projectSlug,sessionId:props.sessionId}):null;appError.value=``;try{if(practice){appOpening.value=true;const result=await openAppCommand.run({path:expected.sessionsApiPath});if(!mounted||generation!==appOpenGeneration||!props.active||!sameLearningBinding(expected)){if(ticket)owner.discard(ticket);return}if(result?.ok!==true||result.sessionId!==expected.sessionId)throw new Error(`The saved practice conversation did not confirm opening. Keep this lesson and choose App again.`);appOpened.value=true}if(!splitPaneMode.value)mode.value=`app`;collapsed.value=false;if(ticket)owner.finish(ticket)}catch(error){if(ticket)owner.discard(ticket);if(mounted&&generation===appOpenGeneration&&(!expected||sameLearningBinding(expected)))appError.value=String(error?.message||`The practice App could not open. Keep this lesson and choose App again.`)}finally{if(generation===appOpenGeneration)appOpening.value=false}}const actorKey=computed(()=>unref(viewer)?.actorKey||``);const learningAvailable=computed(()=>{const binding=props.learningBinding;return(!props.appAvailable||binding?.noExercise===false)&&props.lessonsAvailable&&binding&&(binding.noExercise===false?/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/u.test(binding.sourceProjectSlug||``)&&props.projectSlug===binding.sourceProjectSlug:!props.projectSlug)&&actorKey.value&&binding.viewerActorKey===actorKey.value&&typeof binding.actorKey===`string`&&binding.actorKey&&binding.learnerId&&!binding.projectSlug&&binding.learningAttemptId===props.attemptId&&binding.sessionId===props.sessionId&&/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u.test(props.attemptId)&&binding.sessionsApiPath===`/api/learning/${props.attemptId}/vibe64/sessions`});function sameLearningBinding(expected){return learningAvailable.value&&[`actorKey`,`viewerActorKey`,`learnerId`,`learningAttemptId`,`sessionId`,`sessionsApiPath`,`noExercise`,`sourceProjectSlug`].every(key=>expected[key]===props.learningBinding[key])}const selection=shallowRef(null);const resource=shallowRef(null);const player=ref(null);const display=ref({phase:`closed`,state:``,description:``,error:``});const revision=ref(0);const mode=ref(props.appAvailable&&!props.lessonsAvailable?`app`:`lessons`);const collapsed=ref(false);const cue=ref(null);const appOpened=ref(false);const appOpening=ref(false);const appError=ref(``);let appOpenGeneration=0;let mounted=true;const openAppCommand=useCommand({ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,access:`never`,apiSuffix:`/vibe64/sessions`,placementSource:`vibe64.sessions.create`,suppressSuccessMessage:true,buildRawPayload:()=>({}),buildCommandOptions:(_model,{context})=>({method:`POST`,path:context.path}),fallbackRunError:`The saved practice App could not open. Keep this lesson and choose App again.`});const splitPaneMode=computed(()=>props.learningPaneActive!==null||props.workspaceActive!==null);const visible=computed(()=>props.active&&(!splitPaneMode.value||props.learningPaneActive)&&mode.value===`presentation`&&!collapsed.value);const appVisible=computed(()=>props.active&&props.appAvailable&&(props.learningBinding?.noExercise!==false||appOpened.value)&&(splitPaneMode.value?props.workspaceActive:mode.value===`app`||collapsed.value));const lessonsVisible=computed(()=>props.active&&props.lessonsAvailable&&(!splitPaneMode.value||props.learningPaneActive)&&(mode.value===`lessons`||!props.appAvailable&&collapsed.value));watch(()=>[actorKey.value,props.projectSlug,props.attemptId,props.sessionId,...[`actorKey`,`viewerActorKey`,`learnerId`,`projectSlug`,`learningAttemptId`,`sessionId`,`sessionsApiPath`,`noExercise`,`sourceProjectSlug`].map(key=>props.learningBinding?.[key])],()=>{appOpenGeneration++;appOpened.value=false;appOpening.value=false;appError.value=``},{flush:`sync`});watch(()=>props.active,()=>{appOpenGeneration++;appOpening.value=false},{flush:`sync`});watch(()=>props.lessonsAvailable,enabled=>{if(!enabled&&mode.value===`lessons`&&props.appAvailable)mode.value=`app`});watch(()=>[splitPaneMode.value,props.workspaceActive,props.active,props.sessionId,props.learningBinding?.sessionId,props.agentConnectionStatus],([split,workspace,active])=>{if(split&&workspace&&active&&props.appAvailable&&props.learningBinding?.noExercise===false&&![`initializing`,`reconciling`].includes(props.agentConnectionStatus)&&!appOpened.value&&!appOpening.value)showApp(null)},{immediate:true});let pausing=null;let hiddenRevision=0;watch(visible,(shown,wasShown)=>{if(wasShown&&!shown)hiddenRevision+=1},{flush:`sync`});let transitionRevision=0;const checkpointError=ref(``);let checkpointOperation=null;function ensureSelection(expected){if(!mounted||!actorKey.value||!expected||selection.value!==expected||expected.learningBinding&&!sameLearningBinding(expected.learningBinding))throw new Error(`This lesson presentation is no longer selected. Open its current attempt again.`)}function exactSelection(input){const expected=selection.value;ensureSelection(expected);if(props.attemptId&&expected.attemptId!==props.attemptId||input?.attemptId!==expected.attemptId||input?.visualId!==expected.visualId)throw new Error(`Use the exact displayed attempt and visual identity.`);if(!player.value)throw new Error(`The lesson presentation is not ready. Wait for it to open before sending a command.`);return expected}function observedState(value){if(!mounted||value.attemptId!==selection.value?.attemptId)return;if(cue.value&&value.playerInstanceId&&value.playerInstanceId!==cue.value.playerInstanceId)retireCue(`The diagram player changed.`,false);if(cue.value?.phase===`playing`&&value.phase===`accepted`)cue.value.visualPhase=`accepted`;display.value=value}function observedError(error){if(!mounted||!selection.value||display.value.phase!==`loading`)return;display.value={...display.value,phase:`failed`,error}}function state(){return{...selection.value?{attemptId:selection.value.attemptId,visualId:selection.value.visualId}:{},playerInstanceId:display.value.playerInstanceId||``,phase:mounted?display.value.phase:`closed`,state:display.value.state,description:display.value.description,visible:mounted&&visible.value,error:display.value.error||``,...cue.value?{cue:cueReceipt()}:{}}}async function ready(expected){await nextTick();ensureSelection(expected);if(display.value.phase===`failed`)throw new Error(display.value.error);if(display.value.phase!==`ready`)await new Promise((resolve,reject)=>{const stop=watch([()=>display.value.phase,revision],([phase])=>{if(selection.value!==expected||!mounted||phase===`failed`||phase===`ready`){stop();if(selection.value!==expected||!mounted)reject(new Error(`The selected lesson presentation changed before it was ready.`));else if(phase===`failed`)reject(new Error(display.value.error));else resolve()}},{flush:`sync`})});ensureSelection(expected);if(!visible.value)throw new Error(`The lesson presentation is hidden. Show it before claiming it opened.`)}async function open({attemptId,visualId}={}){if(!actorKey.value||!props.active||props.learningBinding&&!learningAvailable.value||!learningAvailable.value&&(!props.appAvailable||!props.projectSlug)||!props.sessionId||props.attemptId&&props.attemptId!==attemptId||!/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u.test(attemptId||``)||!/^[a-zA-Z][a-zA-Z0-9-]{0,63}$/u.test(visualId||``))throw new Error(`Open a declared visual for the signed-in learner's exact attempt in its active Preview.`);mode.value=`presentation`;collapsed.value=false;let expected=selection.value;if(expected?.attemptId!==attemptId||expected.visualId!==visualId||!resource.value){expected={attemptId,visualId,...learningAvailable.value?{learningBinding:Object.freeze(Object.fromEntries([`actorKey`,`viewerActorKey`,`learnerId`,`learningAttemptId`,`sessionId`,`sessionsApiPath`,...props.learningBinding.noExercise===false?[`noExercise`,`sourceProjectSlug`]:[]].map(key=>[key,props.learningBinding[key]])))}:{}};selection.value=expected;resource.value=null;revision.value++;display.value={phase:`loading`,state:``,description:`Loading lesson presentation.`,error:``};try{const result=await getHttpWebClient().request(resourceUrl(expected),{method:`GET`});ensureSelection(expected);if(result?.id!==visualId||result.visual?.id!==visualId)throw new Error(`The verified lesson visual did not match this request.`);resource.value=result}catch(error){if(mounted&&selection.value===expected)display.value={...display.value,phase:`failed`,error:error.message};throw error}}await ready(expected);return{ok:true,...state()}}function resourceUrl(expected){if(expected.learningBinding)return`${expected.learningBinding.sessionsApiPath}/${encodeURIComponent(expected.learningBinding.sessionId)}/training/visuals/${encodeURIComponent(expected.visualId)}`;return resolveStudioRequestUrl(`/api/vibe64/training/attempts/${expected.attemptId}/visuals/${expected.visualId}`)}async function saveCheckpoint(expected,transition){ensureSelection(expected);if(checkpointOperation)throw new Error(`Retry the unconfirmed diagram checkpoint before saving another.`);const instance=display.value.playerInstanceId;const fresh=await getHttpWebClient().request(resourceUrl(expected),{method:`GET`});ensureSelection(expected);if(transition!==transitionRevision||instance!==display.value.playerInstanceId)return;if(fresh.id!==expected.visualId||fresh.lessonHash!==resource.value.lessonHash||JSON.stringify(fresh.pin)!==JSON.stringify(resource.value.pin)||!Number.isSafeInteger(fresh.revision))throw new Error(`The saved diagram pin changed. Reopen this exact lesson before saving.`);const value=await snapshot(expected);ensureSelection(expected);if(transition!==transitionRevision||instance!==value.playerInstanceId)return;checkpointOperation={expected,instance,transition,actor:actorKey.value,projectSlug:props.projectSlug,body:{requestId:crypto.randomUUID(),expectedRevision:fresh.revision,...!expected.learningBinding?{projectSlug:props.projectSlug}:{},sessionId:props.sessionId,snapshot:value.snapshot}};await retryCheckpoint()}async function retryCheckpoint(){const operation=checkpointOperation;if(!operation){try{await saveCheckpoint(selection.value,transitionRevision)}catch(error){checkpointError.value=error.message}return}try{ensureSelection(operation.expected);if(operation.actor!==actorKey.value||operation.instance!==display.value.playerInstanceId||operation.projectSlug!==props.projectSlug||operation.body.sessionId!==props.sessionId)throw new Error(`This captured diagram checkpoint belongs to its original player and exercise.`);const result=await getHttpWebClient().request(resourceUrl(operation.expected),{method:`POST`,body:operation.body});ensureSelection(operation.expected);if(checkpointOperation!==operation||operation.actor!==actorKey.value||operation.instance!==display.value.playerInstanceId)return;if(!Number.isSafeInteger(result?.revision))throw new Error(`The diagram save was not confirmed. Retry this exact checkpoint.`);checkpointOperation=null;checkpointError.value=operation.transition===transitionRevision?``:`The earlier checkpoint is confirmed. Save the current diagram to retain its newer state.`}catch(error){if(checkpointOperation!==operation||!mounted||selection.value!==operation.expected||actorKey.value!==operation.actor)return;if(error.code===`VIBE64_TRAINING_STATE_REVISION_CONFLICT`)checkpointOperation=null;checkpointError.value=error.code===`VIBE64_TRAINING_STATE_REVISION_CONFLICT`?`Learning changed before this diagram was saved. Save its current state with a fresh revision.`:`The diagram checkpoint was not confirmed. Retry this exact save before claiming it can resume.`;throw error}}async function command(input){const expected=exactSelection(input);if(!visible.value&&input.name!==`pause`)throw new Error(`Show the lesson presentation before playing a transition.`);const transition=++transitionRevision;const result=await player.value.command({commandId:input.commandId,name:input.name,parameters:{...input.parameters||{}}});ensureSelection(expected);try{await saveCheckpoint(expected,transition)}catch(error){if(mounted&&selection.value===expected)checkpointError.value||=error.message}return{ok:true,attemptId:expected.attemptId,visualId:expected.visualId,playerInstanceId:result.playerInstanceId,phase:`completed`,commandId:result.commandId,state:result.state,description:result.description}}async function snapshot(input){const expected=exactSelection(input);const value=await player.value.snapshot();ensureSelection(expected);return{ok:true,attemptId:expected.attemptId,visualId:expected.visualId,playerInstanceId:display.value.playerInstanceId,snapshot:value,description:display.value.description}}function cueReceipt(){const{name,parameters,...receipt}=cue.value;return{...receipt}}async function armCue(input){const expected=exactSelection(input);await ready(expected);for(const key of[`cueId`,`commandId`,`navigationId`,`conversationId`,`turnId`,`clientId`])if(!(key===`conversationId`&&expected.learningBinding&&sameLearningBinding(expected.learningBinding)&&typeof input[key]===`string`&&new TextEncoder().encode(input[key]).byteLength<=256&&input[key]===mainConversationId({learningAttemptId:expected.attemptId,sessionId:expected.learningBinding.sessionId}))&&(typeof input[key]!==`string`||!/^[a-zA-Z0-9:_-]{1,128}$/u.test(input[key])))throw new Error(`A lesson cue requires its exact admitted conversation and command identities.`);if(cue.value?.cueId===input.cueId){const current=cue.value;if([`attemptId`,`visualId`,`commandId`,`conversationId`,`turnId`,`clientId`,`name`].some(key=>current[key]!==input[key])||Object.keys(current.parameters).length!==Object.keys(input.parameters||{}).length||Object.keys(current.parameters).some(key=>current.parameters[key]!==input.parameters?.[key])||current.canonicalFinal)throw new Error(`This cue identity belongs to its exact original explanation.`);current.navigationId=input.navigationId;return{ok:true,...cueReceipt()}}if(cue.value&&![`completed`,`interrupted`,`failed`].includes(cue.value.phase))throw new Error(`Finish or explicitly interrupt the current lesson cue before arming another.`);cue.value={attemptId:expected.attemptId,visualId:expected.visualId,playerInstanceId:display.value.playerInstanceId,cueId:input.cueId,commandId:input.commandId,navigationId:input.navigationId,conversationId:input.conversationId,turnId:input.turnId,clientId:input.clientId,name:input.name,parameters:input.parameters||{},outputId:``,canonicalFinal:false,phase:`armed`,audioPhase:`waiting`,visualPhase:`ready`,state:display.value.state,description:display.value.description,error:``};return{ok:true,...cueReceipt()}}function observeCue(value,{readAloud=false}={}){const current=cue.value;if(!current||[`attemptId`,`visualId`,`playerInstanceId`,`cueId`,`commandId`,`navigationId`,`conversationId`,`turnId`,`clientId`].some(key=>value?.[key]!==current[key]))return false;if([`interrupted`,`failed`].includes(value.phase)){retireCue(value.error||`The lesson explanation stopped.`,true,value.phase);return true}if([`completed`,`interrupted`,`failed`].includes(current.phase))return false;if(!value.canonicalFinal||typeof value.outputId!==`string`||!value.outputId||value.outputId.length>256||current.outputId&¤t.outputId!==value.outputId)return false;if(current.outputId)return true;current.outputId=value.outputId;current.canonicalFinal=true;current.audioPhase=readAloud?`waiting`:`off`;current.phase=readAloud?`awaiting-audio`:`awaiting-continue`;return true}function finishCue(current){if(cue.value!==current||current.phase!==`playing`)return;if(current.visualPhase===`completed`&&[`completed`,`off`].includes(current.audioPhase))current.phase=`completed`}async function playCue(current){if(cue.value!==current||!current.canonicalFinal||!visible.value||current.visualPhase!==`ready`)return false;current.phase=`playing`;current.visualPhase=`pending`;try{const result=await command(current);if(cue.value!==current||current.phase!==`playing`)return false;current.visualPhase=`completed`;current.state=result.state;current.description=result.description;finishCue(current);return true}catch(error){if(cue.value===current&¤t.phase===`playing`){current.phase=`failed`;current.visualPhase=`failed`;current.error=error.message}return false}}function continueCue(){const current=cue.value;if(!current||![`awaiting-audio`,`awaiting-continue`].includes(current.phase))return;current.audioPhase=`off`;playCue(current)}function playback(event){const current=cue.value;if(!current||!current.outputId||event.conversationId!==current.conversationId||event.outputId!==current.outputId||[`completed`,`interrupted`,`failed`].includes(current.phase))return false;if(event.phase===`started`&¤t.audioPhase===`waiting`){current.audioPhase=`started`;playCue(current)}else if(event.phase===`completed`&¤t.audioPhase===`started`){current.audioPhase=`completed`;finishCue(current)}else if([`interrupted`,`failed`].includes(event.phase)){current.audioPhase=event.phase;if(current.visualPhase===`ready`){current.phase=`awaiting-continue`;current.error=`Sound did not finish. Continue explicitly without sound, or repeat the explanation.`}else retireCue(`The spoken explanation was interrupted.`)}return true}function retireCue(reason=`The lesson presentation stopped.`,pause=true,phase=`interrupted`){const current=cue.value;if(!current||[`completed`,`interrupted`,`failed`].includes(current.phase))return;current.phase=phase;current.error=reason;if(pause)pauseHidden(true)}async function pauseHidden(force=false){if(visible.value&&!force||pausing===selection.value||!player.value||!selection.value||![`ready`,`accepted`].includes(display.value.phase)||!resource.value?.visual.commands.some(value=>value.name===`pause`))return;const expected=selection.value;pausing=expected;const hiddenAtStart=hiddenRevision;try{await command({...expected,commandId:crypto.randomUUID(),name:`pause`});await snapshot(expected)}catch(error){if(mounted&&selection.value===expected)display.value={...display.value,error:error.message}}finally{if(pausing===expected){pausing=null;if(mounted&&selection.value===expected&&!visible.value&&hiddenRevision!==hiddenAtStart)pauseHidden()}}}watch([visible,()=>display.value.phase],()=>{if(!visible.value)retireCue(`The lesson presentation is hidden.`,false);pauseHidden()},{flush:`post`});watch([actorKey,()=>props.projectSlug,()=>props.sessionId,()=>props.attemptId,()=>props.learningBinding?.actorKey,()=>props.learningBinding?.viewerActorKey,()=>props.learningBinding?.learnerId,()=>props.learningBinding?.projectSlug,()=>props.learningBinding?.noExercise,()=>props.learningBinding?.sourceProjectSlug,()=>props.learningBinding?.learningAttemptId,()=>props.learningBinding?.sessionId,()=>props.learningBinding?.sessionsApiPath],()=>{retireCue(`The learner or exercise changed.`,false);cue.value=null;checkpointOperation=null;checkpointError.value=``;transitionRevision++;selection.value=null;resource.value=null;display.value={phase:`closed`,state:``,description:``,error:``};mode.value=props.appAvailable?`app`:`lessons`;collapsed.value=false;revision.value++},{flush:`sync`});onBeforeUnmount(()=>{retireCue(`The lesson presentation closed.`,false);mounted=false;revision.value++});const presentation=Object.freeze({open,command,snapshot,armCue,observeCue,playback,retireCue,get state(){return state()}});useTrainingPreviewRegistration({get presentation(){return presentation},get projectSlug(){return props.projectSlug},get sessionId(){return props.sessionId},get learningAttemptId(){return props.attemptId},get learnerId(){return props.learningBinding?.learnerId},get noExercise(){return props.learningBinding?.noExercise},get appVisible(){return props.active&&appVisible.value},get screen(){}},()=>props.active&&learningAvailable.value);__expose({presentation});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$21,[(selection.value||__props.lessonsAvailable)&&(!splitPaneMode.value||__props.learningPaneActive)?(openBlock(),createElementBlock(`div`,_hoisted_2$19,[createBaseVNode(`div`,_hoisted_3$17,[__props.appAvailable&&!splitPaneMode.value?(openBlock(),createBlock(VBtn,{key:0,class:normalizeClass([`training-preview__segment`,{"is-selected":appVisible.value}]),"min-height":`40`,disabled:appOpening.value,variant:`text`,"aria-pressed":appVisible.value,onClick:_cache[0]||(_cache[0]=$event=>showApp($event))},{default:withCtx(()=>[appVisible.value?(openBlock(),createElementBlock(`svg`,_hoisted_4$15,[..._cache[7]||(_cache[7]=[createBaseVNode(`path`,{d:`M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z`},null,-1)])])):createCommentVNode(``,true),createTextVNode(toDisplayString(__props.lessonsAvailable?`App`:`App preview`),1)]),_:1},8,[`class`,`disabled`,`aria-pressed`])):createCommentVNode(``,true),__props.lessonsAvailable?(openBlock(),createBlock(VBtn,{key:1,class:normalizeClass([`training-preview__segment`,{"is-selected":lessonsVisible.value}]),"min-height":`40`,variant:`text`,"aria-pressed":lessonsVisible.value,onClick:_cache[1]||(_cache[1]=$event=>{mode.value=`lessons`;collapsed.value=false})},{default:withCtx(()=>[lessonsVisible.value?(openBlock(),createElementBlock(`svg`,_hoisted_5$14,[..._cache[8]||(_cache[8]=[createBaseVNode(`path`,{d:`M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z`},null,-1)])])):createCommentVNode(``,true),_cache[9]||(_cache[9]=createTextVNode(`Courses `,-1))]),_:1},8,[`class`,`aria-pressed`])):createCommentVNode(``,true),createVNode(VBtn,{class:normalizeClass([`training-preview__segment`,{"is-selected":visible.value}]),"min-height":`40`,disabled:!selection.value,variant:`text`,"aria-pressed":visible.value,onClick:_cache[2]||(_cache[2]=$event=>{mode.value=`presentation`;collapsed.value=false})},{default:withCtx(()=>[visible.value?(openBlock(),createElementBlock(`svg`,_hoisted_6$13,[..._cache[10]||(_cache[10]=[createBaseVNode(`path`,{d:`M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z`},null,-1)])])):createCommentVNode(``,true),createTextVNode(toDisplayString(__props.lessonsAvailable?`Presentation`:`Colleague presentation`),1)]),_:1},8,[`class`,`disabled`,`aria-pressed`])]),mode.value===`presentation`?(openBlock(),createBlock(VBtn,{key:0,class:`training-preview__collapse`,"min-height":`40`,rounded:`pill`,variant:`tonal`,onClick:_cache[3]||(_cache[3]=$event=>collapsed.value=!collapsed.value)},{default:withCtx(()=>[(openBlock(),createElementBlock(`svg`,_hoisted_7$13,[createBaseVNode(`path`,{d:collapsed.value?`M7.41 15.41 12 10.83l4.59 4.58L18 14l-6-6-6 6z`:`M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6z`},null,8,_hoisted_8$13)])),createTextVNode(toDisplayString(collapsed.value?`Restore presentation`:`Minimise presentation`),1)]),_:1})):createCommentVNode(``,true)])):createCommentVNode(``,true),appError.value?(openBlock(),createElementBlock(`div`,_hoisted_9$11,[_cache[12]||(_cache[12]=createBaseVNode(`svg`,{class:`training-preview__notice-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M13 13h-2V7h2m0 10h-2v-2h2M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z`})],-1)),createBaseVNode(`p`,null,toDisplayString(appError.value),1),splitPaneMode.value&&__props.workspaceActive?(openBlock(),createBlock(VBtn,{key:0,"min-height":`48`,rounded:`pill`,variant:`tonal`,onClick:_cache[4]||(_cache[4]=$event=>showApp($event))},{default:withCtx(()=>[..._cache[11]||(_cache[11]=[createTextVNode(`Retry workspace`,-1)])]),_:1})):createCommentVNode(``,true)])):createCommentVNode(``,true),!__props.appAvailable&&__props.learningBinding?.noExercise===false?(openBlock(),createElementBlock(`p`,_hoisted_10$9,` The practice App controls are unavailable in this installation. Keep this lesson and its saved workspace; lesson diagrams use Presentation. `)):!__props.appAvailable&&__props.lessonsAvailable?(openBlock(),createElementBlock(`p`,_hoisted_11$9,` This lesson has no project workspace. Use Learning for its lesson content and presentation. `)):createCommentVNode(``,true),cue.value&&[`awaiting-audio`,`awaiting-continue`].includes(cue.value.phase)?(openBlock(),createElementBlock(`div`,{key:4,class:normalizeClass([`training-preview__choices training-preview__cue`,{"is-error":cue.value.error}])},[createBaseVNode(`span`,_hoisted_12$9,[(openBlock(),createElementBlock(`svg`,_hoisted_13$9,[createBaseVNode(`path`,{d:cue.value.phase===`awaiting-audio`?`M3 9v6h4l5 5V4L7 9H3m13.5 3A4.5 4.5 0 0 0 14 8v8a4.5 4.5 0 0 0 2.5-4Z`:`M8 5.14v14l11-7-11-7Z`},null,8,_hoisted_14$9)]))]),createBaseVNode(`p`,_hoisted_15$9,toDisplayString(cue.value.error||`The explanation is ready. Continue when you are ready to watch.`),1),createVNode(VBtn,{"min-height":`48`,rounded:`pill`,color:`primary`,variant:`flat`,onClick:continueCue},{default:withCtx(()=>[createTextVNode(toDisplayString(cue.value.phase===`awaiting-audio`?`Play diagram without sound`:`Continue`),1)]),_:1})],2)):createCommentVNode(``,true),checkpointError.value?(openBlock(),createElementBlock(`div`,_hoisted_16$8,[_cache[13]||(_cache[13]=createBaseVNode(`svg`,{class:`training-preview__notice-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M13 13h-2V7h2m0 10h-2v-2h2M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z`})],-1)),createBaseVNode(`p`,null,toDisplayString(checkpointError.value),1),createVNode(VBtn,{"min-height":`48`,rounded:`pill`,variant:`tonal`,onClick:_cache[5]||(_cache[5]=$event=>retryCheckpoint().catch(()=>{}))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(checkpointOperation)?`Retry diagram checkpoint`:`Save current diagram`),1)]),_:1})])):createCommentVNode(``,true),__props.appAvailable?withDirectives((openBlock(),createElementBlock(`div`,_hoisted_17$8,[__props.learningBinding?.noExercise!==false||appOpened.value?renderSlot(_ctx.$slots,`default`,{appVisible:appVisible.value,presentation:unref(presentation)},void 0,true,0):createCommentVNode(``,true)],512)),[[vShow,appVisible.value]]):createCommentVNode(``,true),__props.lessonsAvailable?withDirectives((openBlock(),createElementBlock(`div`,_hoisted_18$7,[renderSlot(_ctx.$slots,`lessons`,{},void 0,true),!__props.appAvailable&&!selection.value?(openBlock(),createElementBlock(`div`,_hoisted_19$6,[..._cache[14]||(_cache[14]=[createBaseVNode(`svg`,{class:`training-preview__empty-art`,viewBox:`0 0 120 80`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`rect`,{x:`14`,y:`10`,width:`92`,height:`56`,rx:`10`,class:`frame`}),createBaseVNode(`path`,{d:`M30 50l14-16 12 10 10-8 18 14`,class:`line`}),createBaseVNode(`circle`,{cx:`86`,cy:`26`,r:`6`,class:`sun`})],-1),createBaseVNode(`p`,{role:`status`},`This lesson has no App preview. No lesson presentation is open.`,-1)])])):createCommentVNode(``,true)],512)),[[vShow,lessonsVisible.value]]):createCommentVNode(``,true),withDirectives(createBaseVNode(`div`,_hoisted_20$6,[resource.value?(openBlock(),createBlock(TrainingVisualPlayer_default,{key:0,ref_key:`player`,ref:player,resource:resource.value,"attempt-id":selection.value.attemptId,snapshot:resource.value.snapshot,onState:observedState,onError:observedError},null,8,[`resource`,`attempt-id`,`snapshot`])):display.value.phase===`loading`?(openBlock(),createBlock(VSkeletonLoader,{key:1,class:`training-preview__loading`,type:`image, paragraph`,"aria-label":`Loading lesson presentation`})):createCommentVNode(``,true),!resource.value&&display.value.error?(openBlock(),createElementBlock(`div`,_hoisted_21$6,[_cache[16]||(_cache[16]=createBaseVNode(`svg`,{class:`training-preview__notice-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M13 13h-2V7h2m0 10h-2v-2h2M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z`})],-1)),createBaseVNode(`p`,_hoisted_22$6,toDisplayString(display.value.error),1),createVNode(VBtn,{"min-height":`48`,rounded:`pill`,variant:`tonal`,onClick:_cache[6]||(_cache[6]=$event=>open(selection.value).catch(()=>{}))},{default:withCtx(()=>[..._cache[15]||(_cache[15]=[createTextVNode(`Reload presentation`,-1)])]),_:1})])):createCommentVNode(``,true)],512),[[vShow,__props.lessonsAvailable?visible.value:!appVisible.value]])])}}};var TrainingPreviewPresentation_default=_plugin_vue_export_helper_default(_sfc_main$25,[[`__scopeId`,`data-v-f21d920f`]]);var _hoisted_1$20={key:0,class:`text-body-small mt-2`};var _hoisted_2$18={class:`agent-plan-usage__details text-body-small`};var _sfc_main$24={__name:`Vibe64AgentPlanUsage`,props:{active:Boolean,session:{type:Object,default:null},conversationRuntime:{type:Object,default:null},sessionsApiPath:{type:[Function,Object,String],default:``}},setup(__props){const props=__props;const projectSlug=useVibe64ProjectSlug();const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const actorKey=computed(()=>unref(viewer)?.actorKey||``);const sessionId=computed(()=>props.session?.sessionId||``);const sessionsPath=computed(()=>String(readRefOrGetterValue(props.sessionsApiPath)||``).trim());const engineId=computed(()=>props.session?.assistantSelection?.engineId||``);const modelProviderId=computed(()=>props.session?.assistantSelection?.modelProviderId||``);const keyUsage=computed(()=>[`deepseek`,`zai`,`zai-coding-plan`].includes(modelProviderId.value));const engineLabel=computed(()=>engineId.value===`claude`?`Claude`:`Codex`);const goalEnabled=computed(()=>props.active&&Boolean(sessionId.value&&sessionsPath.value&&actorKey.value));const enabled=computed(()=>goalEnabled.value&&([`codex`,`claude`].includes(engineId.value)||keyUsage.value));const scopeKey=computed(()=>JSON.stringify([projectSlug.value,sessionsPath.value,sessionId.value,actorKey.value]));const connectionsRealtime={events:[VIBE64_ACCOUNTS_CHANGED_EVENT,VIBE64_CONNECTIONS_CHANGED_EVENT],matches:()=>true};const path=computed(()=>vibe64SessionPath(sessionsPath.value,sessionId.value,`/agent-plan-usage`));const usage=useEndpointResource({enabled,path,queryKey:computed(()=>[`vibe64-agent-plan-usage`,engineId.value,modelProviderId.value,projectSlug.value,sessionsPath.value,sessionId.value,actorKey.value]),realtime:connectionsRealtime,fallbackLoadError:`Plan allowance is unavailable.`,queryOptions:{meta:{jskit:{requestRecovery:false}},queryFn:({signal})=>getHttpWebClient().request(path.value,{signal:AbortSignal.any([signal,AbortSignal.timeout(3e4)])}),retry:false,refetchOnMount:`always`,refetchOnWindowFocus:true,refetchInterval:()=>keyUsage.value?false:6e4,refetchIntervalInBackground:false}});useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>payload.projectSlug===projectSlug.value&&payload.sessionId===sessionId.value&&[`agent-plan-usage`,`${engineId.value}-plan-usage`].includes(payload.reason),onEvent:()=>{if(!globalThis.document?.hidden)usage.reload()}});const suppliedGoal=computed(()=>unref(props.conversationRuntime?.goalState));const goalView=computed(()=>unref(props.conversationRuntime?.goalView));const goalAvailable=computed(()=>goalEnabled.value&&!suppliedGoal.value?.loading&&suppliedGoal.value?.available!==false&&!unref(props.conversationRuntime?.goalLoadError)&&goalView.value?.status===`available`);const goal=computed(()=>goalAvailable.value?goalView.value?.goal||null:null);const goalEngineId=computed(()=>goalView.value?.routing?.selection?.engineId||engineId.value);const fullGoalOpen=ref(false);const goalPreview=computed(()=>{const objective=String(goal.value?.objective||``).trim();return objective.length>140?`${objective.slice(0,140).trimEnd()}…`:objective});watch([sessionId,()=>goal.value?.objective],()=>{fullGoalOpen.value=false});const goalExplicitMode=computed(()=>assistantRoutingFromMetadata(props.session?.metadata)?.mode!==`auto`);const changingGoal=computed(()=>suppliedGoal.value?.pending===true);const goalError=computed(()=>suppliedGoal.value?.error||``);async function changeGoal(action,input={}){if(changingGoal.value||!goalAvailable.value)return false;if([`set`,`resume`].includes(action)&&!goalExplicitMode.value)return false;return props.conversationRuntime.changeGoal(action,input)}const currentUsage=computed(()=>{const value=usage.data.value;if(keyUsage.value&&(value?.engineId!==engineId.value||value?.modelProviderId!==modelProviderId.value))return null;return value});const weekly=computed(()=>currentUsage.value?.windows?.find(window=>window.windowDurationMins===10080&&(keyUsage.value||engineId.value!==`claude`||window.id===`seven_day`))||null);const allowance=computed(()=>weekly.value||(keyUsage.value?currentUsage.value?.windows?.[0]:null));const balance=computed(()=>currentUsage.value?.balances?.[0]||null);const available=computed(()=>{if(!enabled.value||usage.loadError.value||currentUsage.value?.status!==`available`)return false;return balance.value||allowance.value&&(!allowance.value.resetsAt||allowance.value.resetsAt*1e3>Date.now())});function formatBalance(value){return new Intl.NumberFormat(`en`,{style:`currency`,currency:value.currency,currencyDisplay:`narrowSymbol`,minimumFractionDigits:2,maximumFractionDigits:2}).format(Number(value.amount))}const summary=computed(()=>{if(!available.value)return``;if(balance.value)return formatBalance(balance.value);return`${Math.floor(allowance.value.remainingPercent)}%`});const usageLabel=computed(()=>currentUsage.value?.providerLabel||engineLabel.value);const usageTitle=computed(()=>`${usageLabel.value} ${balance.value?`balance`:`plan allowance`}`);const summaryLabel=computed(()=>balance.value?`${usageLabel.value} balance remaining: ${summary.value}`:`${weekly.value?`Weekly `:``}${usageLabel.value} allowance remaining: ${summary.value}`);const managementUrl=computed(()=>currentUsage.value?.managementUrl||(engineId.value===`claude`?`https://claude.ai/settings/usage`:`https://chatgpt.com/codex/settings/usage`));const details=computed(()=>{if(!available.value)return``;const snapshot=currentUsage.value;if(balance.value)return[...snapshot.balances.map(value=>`${value.currency} balance remaining: ${formatBalance(value)}.`),`Checked ${new Date(snapshot.checkedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`,`Account balance associated with this key. Shared across sessions. Updates at the start and end of a turn.`].join(`
|
|
7
|
-
`);const lines=[`${summaryLabel.value}.`];if(weekly.value?.resetsAt)lines.push(`Weekly resets ${new Date(weekly.value.resetsAt*1e3).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`);const shortTerm=snapshot.windows.find(window=>window.windowDurationMins===300);if(shortTerm){const expired=shortTerm.resetsAt&&shortTerm.resetsAt*1e3<=Date.now();lines.push(expired?`5h allowance: awaiting update.`:`5h allowance remaining: ${Math.floor(shortTerm.remainingPercent)}%.`);if(shortTerm.resetsAt)lines.push(`5h resets ${new Date(shortTerm.resetsAt*1e3).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`)}for(const window of snapshot.windows.filter(window=>window.id?.startsWith(`seven_day_`)&&(!window.resetsAt||window.resetsAt*1e3>Date.now())))lines.push(`${window.id.slice(10).replaceAll(`_`,` `)}: ${Math.floor(window.remainingPercent)}% weekly remaining.`);lines.push(`Shared across sessions.`);if(keyUsage.value)lines.push(`Checked ${new Date(snapshot.checkedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`,`Updates at the start and end of a turn.`);return lines.join(`
|
|
8
|
-
`)});const goalState=computed(()=>({...suppliedGoal.value,enabled:goalEnabled.value&&Boolean(suppliedGoal.value?.loading||goalAvailable.value||goalError.value),goal:goalAvailable.value&&goal.value?{...goal.value,objective:goalPreview.value,elapsedSeconds:goal.value.timeUsedSeconds,sampledAt:Date.parse(goal.value.updatedAt)}:null,pending:changingGoal.value,error:goalError.value,set:goalExplicitMode.value?input=>changeGoal(`set`,input):null,pauseBlocked:goalEngineId.value===`claude`,pause:()=>changeGoal(`pause`),resume:goalExplicitMode.value?()=>changeGoal(`resume`):null,cancel:()=>changeGoal(`cancel`)}));return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[[`codex`,`claude`].includes(goalEngineId.value)?(openBlock(),createBlock(unref(AssistantGoalControl_default),{key:scopeKey.value,state:goalState.value},{default:withCtx(()=>[!goalExplicitMode.value?(openBlock(),createElementBlock(`p`,_hoisted_1$20,`Choose Senior or Junior before starting or resuming a goal.`)):createCommentVNode(``,true),goal.value?.objective&&goalPreview.value!==goal.value.objective?(openBlock(),createBlock(VBtn,{key:1,class:`mt-2`,size:`small`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>fullGoalOpen.value=true)},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(` View full goal `,-1)])]),_:1})):createCommentVNode(``,true)]),_:1},8,[`state`])):createCommentVNode(``,true),fullGoalOpen.value?(openBlock(),createBlock(VDialog,{key:1,modelValue:fullGoalOpen.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>fullGoalOpen.value=$event),"max-width":`640`,scrollable:``,"aria-label":`Full goal`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Full goal`,-1)])]),_:1}),createVNode(VCardText,{class:`agent-plan-usage__goal-text`},{default:withCtx(()=>[createTextVNode(toDisplayString(goal.value?.objective),1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VBtn,{onClick:_cache[1]||(_cache[1]=$event=>fullGoalOpen.value=false)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Close`,-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])):createCommentVNode(``,true),enabled.value&&available.value?(openBlock(),createBlock(VMenu,{key:2,location:`top`,"close-on-content-click":false},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{class:`agent-plan-usage`,size:`small`,variant:`text`,title:details.value,"aria-label":summaryLabel.value}),{default:withCtx(()=>[createTextVNode(toDisplayString(summary.value),1)]),_:1},16,[`title`,`aria-label`])]),default:withCtx(()=>[createVNode(VCard,{"max-width":`340`,class:`pa-3`},{default:withCtx(()=>[createBaseVNode(`strong`,null,toDisplayString(usageTitle.value),1),createBaseVNode(`p`,_hoisted_2$18,toDisplayString(details.value),1),createVNode(VBtn,{href:managementUrl.value,target:`_blank`,rel:`noopener noreferrer`,size:`small`,variant:`text`},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Usage details`,-1)])]),_:1},8,[`href`]),!keyUsage.value?(openBlock(),createBlock(VBtn,{key:0,size:`small`,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>unref(usage).reload())},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Refresh`,-1)])]),_:1})):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)],64)}}};var Vibe64AgentPlanUsage_default=_plugin_vue_export_helper_default(_sfc_main$24,[[`__scopeId`,`data-v-8fc2288d`]]);var _sfc_main$23={__name:`Vibe64SessionPin`,props:{session:{type:Object,required:true},sessionsApiPath:{type:String,required:true},refresh:Function},setup(__props){const props=__props;const pinned=computed(()=>props.session.pinnedSessionId===props.session.sessionId);const anotherPinned=computed(()=>Boolean(props.session.pinnedSessionId)&&!pinned.value);const pending=ref(false);const label=computed(()=>{if(pending.value)return`Updating session pin…`;if(anotherPinned.value)return`Unpin the project's pinned session first`;return pinned.value?`Unpin session`:`Pin session as project source`});const path=vibe64SessionPath(props.sessionsApiPath,props.session.sessionId,`/pin`);const resource=useEndpointResource({path,queryKey:[`vibe64.sessionPin`,path],enabled:false});const feedback=useUiFeedback({source:`vibe64.sessions.pin`});async function toggle(){if(pending.value||anotherPinned.value)return;pending.value=true;try{await resource.save({pinned:!pinned.value},{method:`PATCH`});await props.refresh?.()}catch(error){feedback.error(error,`The session pin could not be changed.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createBlock(VBtn,{icon:pinned.value?unref(mdiPin):unref(mdiPinOutline),color:pinned.value?`primary`:void 0,"aria-label":label.value,title:label.value,"aria-pressed":pinned.value,"aria-busy":pending.value,disabled:pending.value||anotherPinned.value,variant:`text`,height:`48`,width:`48`,onClick:toggle},null,8,[`icon`,`color`,`aria-label`,`title`,`aria-pressed`,`aria-busy`,`disabled`])}}};var _hoisted_1$19={class:`text-body-small`};var _hoisted_2$17={key:0,class:`text-body-small mb-2`};var _hoisted_3$16={key:1,class:`text-body-small mb-2`};var _hoisted_4$14={key:1,class:`text-body-small`};var _hoisted_5$13={key:2,class:`text-body-small mb-1`,role:`alert`};var _hoisted_6$12={key:3,class:`vibe64-routing-notice__actions d-flex flex-wrap ga-1`};var _hoisted_7$12={key:0,class:`position-absolute`};var _hoisted_8$12={key:0,class:`position-absolute`};var _sfc_main$22={__name:`Vibe64RoutingNotice`,props:{request:{type:Object,default:null},selection:{type:Object,default:null},mode:{type:String,default:``},active:Boolean,pendingAction:{type:String,default:``},actionError:{type:String,default:``},busy:Boolean},emits:[`retry`,`skip`,`implement`,`view-plan`],setup(__props){const props=__props;const feedback=useShellWebErrorRuntime();const previousAttempt=computed(()=>props.request?.stopped&&props.request?.delivery===`uncertain`&&assistantRoutingRequestCanBeReplaced(props.request,props.selection));const label=computed(()=>previousAttempt.value?`Previous assistant delivery unconfirmed`:assistantRoutingStatusLabel(props.request));const followupNeedsAction=computed(()=>Boolean(props.request?.status===`waiting`&&(props.request?.followup||props.request?.delivery===`accepted`&&(props.request?.workflow||props.request?.stage===`planning`)))||Boolean(props.request?.delivery===`uncertain`&&(props.request?.followup||previousAttempt.value)));const canImplement=computed(()=>props.mode===`auto`&&props.request?.stage===`planning`&&props.request.status===`waiting`&&[`pending`,`accepted`].includes(props.request.delivery)&&!props.request.helper&&props.request.workPlan?.status===`active`&&Boolean(props.request.workPlan.revision));const retryLabel=computed(()=>props.request?.delivery===`uncertain`?`Check delivery`:{planning:`Continue planning`,implementation:`Continue implementation`,review:`Continue review`}[props.request?.stage]||`Continue request`);const actionable=computed(()=>{const request=props.request;if(!request||request.stopped&&!request.followup&&!request.attemptedMessageId&&!request.helper&&!followupNeedsAction.value)return false;if(!request.followup&&!request.helper&&!previousAttempt.value&&[`failed`,`uncertain`].includes(request.delivery))return false;return Boolean(label.value&&(request.error||followupNeedsAction.value))});watch(()=>[props.request?.messageId,props.request?.status],([id,status],[previousId,previousStatus])=>{if(!props.active||!id||id!==previousId||status!==`waiting`||previousStatus===`waiting`||!props.request.stopped)return;feedback.report({source:`vibe64.chat.review`,message:label.value,intent:`action-feedback`,severity:`info`,channel:`snackbar`,dedupeKey:`vibe64.chat.review:${id}`})});return(_ctx,_cache)=>{return actionable.value?(openBlock(),createBlock(VAlert,{key:0,variant:`tonal`,density:`compact`,icon:false,type:__props.request.error||__props.actionError?`warning`:`info`,class:`vibe64-routing-notice mb-2 px-2 py-1`,role:`status`},{default:withCtx(()=>[previousAttempt.value||__props.request.error&&__props.request.error!==__props.request.outcome?.explanation?(openBlock(),createElementBlock(`details`,{key:__props.request.messageId},[createBaseVNode(`summary`,_hoisted_1$19,[createTextVNode(toDisplayString(label.value)+` · `,1),_cache[4]||(_cache[4]=createBaseVNode(`span`,{class:`text-decoration-underline`},`Details`,-1))]),previousAttempt.value?(openBlock(),createElementBlock(`p`,_hoisted_2$17,`Send a new message to continue with your selected assistant. Check delivery only checks the previous attempt.`)):createCommentVNode(``,true),__props.request.error?(openBlock(),createElementBlock(`p`,_hoisted_3$16,toDisplayString(__props.request.error),1)):createCommentVNode(``,true)])):!followupNeedsAction.value?(openBlock(),createElementBlock(`div`,_hoisted_4$14,toDisplayString(label.value),1)):createCommentVNode(``,true),__props.actionError?(openBlock(),createElementBlock(`p`,_hoisted_5$13,toDisplayString(__props.actionError),1)):createCommentVNode(``,true),followupNeedsAction.value?(openBlock(),createElementBlock(`div`,_hoisted_6$12,[canImplement.value?(openBlock(),createBlock(VBtn,{key:0,variant:__props.pendingAction===`implement`?`text`:`flat`,color:`primary`,size:`small`,density:`compact`,disabled:Boolean(__props.pendingAction)||__props.busy,"aria-busy":__props.pendingAction===`implement`,onClick:_cache[0]||(_cache[0]=$event=>_ctx.$emit(`implement`))},{default:withCtx(()=>[createBaseVNode(`span`,{class:normalizeClass({"action-label-pending":__props.pendingAction===`implement`})},`Implement plan`,2),__props.pendingAction===`implement`?(openBlock(),createElementBlock(`span`,_hoisted_7$12,`Starting…`)):createCommentVNode(``,true)]),_:1},8,[`variant`,`disabled`,`aria-busy`])):createCommentVNode(``,true),canImplement.value&&!__props.pendingAction?(openBlock(),createBlock(VBtn,{key:1,variant:`text`,size:`small`,density:`compact`,onClick:_cache[1]||(_cache[1]=$event=>_ctx.$emit(`view-plan`))},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`View plan`,-1)])]),_:1})):createCommentVNode(``,true),!canImplement.value?(openBlock(),createBlock(VBtn,{key:2,variant:`text`,size:`small`,density:`compact`,disabled:Boolean(__props.pendingAction)||__props.busy&&__props.request.delivery!==`uncertain`,"aria-busy":__props.pendingAction===`continue`,onClick:_cache[2]||(_cache[2]=$event=>_ctx.$emit(`retry`))},{default:withCtx(()=>[createBaseVNode(`span`,{class:normalizeClass({"action-label-pending":__props.pendingAction===`continue`})},toDisplayString(retryLabel.value),3),__props.pendingAction===`continue`?(openBlock(),createElementBlock(`span`,_hoisted_8$12,toDisplayString(__props.request.delivery===`uncertain`?`Checking…`:`Continuing…`),1)):createCommentVNode(``,true)]),_:1},8,[`disabled`,`aria-busy`])):createCommentVNode(``,true),__props.request.delivery===`pending`&&!__props.pendingAction?(openBlock(),createBlock(VBtn,{key:3,variant:`text`,size:`small`,density:`compact`,onClick:_cache[3]||(_cache[3]=$event=>_ctx.$emit(`skip`))},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(` Stop `,-1)])]),_:1})):createCommentVNode(``,true)])):createCommentVNode(``,true)]),_:1},8,[`type`])):createCommentVNode(``,true)}}};var Vibe64RoutingNotice_default=_plugin_vue_export_helper_default(_sfc_main$22,[[`__scopeId`,`data-v-9ad2c448`]]);function parseWorkPlanLines(text,{markTechnicalDetails=false}={}){let fence=``;return text.split(`
|
|
9
|
-
`).map(line=>{const marker=/^\s*(`{3,}|~{3,})/u.exec(line)?.[1];if(marker){if(!fence)fence=marker;else if(marker[0]===fence[0]&&marker.length>=fence.length)fence=``;return{text:line}}const item=!fence&&/^\s*(?:[-*+]|\d+[.)]) \[([ xX])\] (.+)$/u.exec(line);return item?{text:item[2],checked:item[1]!==` `}:{text:line,...markTechnicalDetails&&!fence&&/^## Technical details\s*$/iu.test(line)?{technicalDetails:true}:{}}})}var _hoisted_1$18={key:0,class:`work-plan-control`};var _hoisted_2$16={key:0,class:`d-sr-only`,role:`status`};var _hoisted_3$15={class:`work-plan-archive-copy`};var _hoisted_4$13={class:`text-body-small text-medium-emphasis`};var _hoisted_5$12={class:`d-flex align-start ga-2`};var _hoisted_6$11={class:`text-body-small text-medium-emphasis mt-1`};var _hoisted_7$11={class:`d-flex align-center flex-wrap ga-2 mt-2`};var _hoisted_8$11={class:`text-high-emphasis`};var _hoisted_9$10={key:0,class:`text-body-small text-medium-emphasis`};var _hoisted_10$8={key:1,class:`work-plan-empty text-center pa-4`};var _hoisted_11$8={class:`d-flex align-center flex-wrap ga-3 mb-5`,role:`status`};var _hoisted_12$8={class:`text-high-emphasis`};var _hoisted_13$8={class:`text-body-small text-medium-emphasis`};var _hoisted_14$8={key:0,class:`text-body-medium mb-4`};var _hoisted_15$8=[`checked`];var _hoisted_16$7=[`checked`];var _hoisted_17$7={key:4,class:`work-plan-empty text-center pa-4`};var _sfc_main$21={__name:`Vibe64WorkPlan`,props:{active:Boolean,busy:Boolean,session:{type:Object,default:null},sessionsApiPath:{type:[Function,Object,String],default:``}},setup(__props,{expose:__expose}){const props=__props;const projectSlug=useVibe64ProjectSlug();const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const actorKey=computed(()=>unref(viewer)?.actorKey||``);const sessionId=computed(()=>props.session?.sessionId||``);const sessionsPath=computed(()=>String(readRefOrGetterValue(props.sessionsApiPath)||``));const enabled=computed(()=>props.active&&Boolean(sessionId.value&&sessionsPath.value&&actorKey.value));const endpoint=computed(()=>vibe64SessionPath(sessionsPath.value,sessionId.value,`/work-plan`));const open=ref(false);const archiveId=ref(``);const notice=ref(``);const view=ref(`current`);const document=ref(`plan`);const showHistory=computed(()=>view.value===`history`&&!archiveId.value);const pendingOperation=ref(``);const feedback=useShellWebErrorRuntime();const resource=useEndpointResource({enabled,path:endpoint,queryKey:computed(()=>[`vibe64-work-plan`,projectSlug.value,sessionsPath.value,sessionId.value,actorKey.value,archiveId.value]),fallbackLoadError:`The plan could not be loaded.`,queryOptions:{meta:{jskit:{requestRecovery:false}},retry:false,refetchOnMount:`always`,refetchOnWindowFocus:true,queryFn:async({signal})=>{const selectedArchive=archiveId.value;const path=endpoint.value;const read=query=>getHttpWebClient().request(path+`?`+new URLSearchParams(query),{signal});const first=await read({limit:`16000`,...selectedArchive?{archiveId:selectedArchive}:{}});let page=first;let text=first.text||``;let progressText=first.progressText||``;while(page.hasMore){page=await read({limit:`16000`,offset:String(page.nextOffset),expectedRevision:first.revision,expectedProgressRevision:first.progressRevision||``,...selectedArchive?{archiveId:selectedArchive}:{}});text+=page.text;progressText+=page.progressText||``}return{...first,text,progressText}}}});useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>payload.projectSlug===projectSlug.value&&payload.sessionId===sessionId.value&&[`work-plan-changed`,`assistant-routing-changed`].includes(payload.reason),onEvent:({payload={}}={})=>{if(payload.planNotice)notice.value=payload.planNotice;resource.reload()}});const plan=computed(()=>resource.data.value||null);const visible=computed(()=>Boolean(plan.value?.available||plan.value?.history?.length||resource.loadError.value));const history=computed(()=>(plan.value?.history||[]).map(item=>({...item,archivedDate:new Date(item.archivedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})})));const selectedArchive=computed(()=>history.value.find(item=>item.id===archiveId.value));const selectedPlanReady=computed(()=>Boolean(plan.value)&&(plan.value.archiveId||``)===archiveId.value);const canChangePlan=computed(()=>!props.busy&&!pendingOperation.value&&selectedPlanReady.value);const currentActive=computed(()=>plan.value?.current?.status===`active`);const label=computed(()=>currentActive.value?`View active plan`:`View plan and history`);function showPlan(requestedView=`default`){archiveId.value=``;view.value=requestedView==="default"?plan.value?.current?`current`:`history`:requestedView;open.value=true}__expose({showPlan});const colleaguePlan=inject(VIBE64_COLLEAGUE_PLAN_KEY,null);const planViewer={get projectSlug(){return projectSlug.value},get sessionId(){return sessionId.value},get ready(){return enabled.value&&Boolean(plan.value)&&!resource.isFetching.value},get error(){return resource.loadError.value},get open(){return enabled.value&&open.value},get view(){return view.value},async openPlan(requestedView=`default`,isCurrent=()=>true){const target=endpoint.value;const actor=actorKey.value;if(!enabled.value||!isCurrent())throw new Error(`This session's plan viewer is no longer available.`);archiveId.value=``;await resource.reload();if(!enabled.value||!isCurrent()||target!==endpoint.value||actor!==actorKey.value)throw new Error(`The selected session changed before its plan opened.`);if(resource.loadError.value)throw new Error(resource.loadError.value);if(!plan.value?.current&&!plan.value?.history?.length)throw new Error(`This session has no current plan or plan history.`);showPlan(requestedView);await nextTick();if(!planViewer.open||!isCurrent()||target!==endpoint.value||actor!==actorKey.value)throw new Error(`The plan viewer closed or its session changed before it opened.`)}};watchEffect(()=>{if(!colleaguePlan)return;if(enabled.value)colleaguePlan.value=planViewer;else if(colleaguePlan.value===planViewer)colleaguePlan.value=null});onBeforeUnmount(()=>{if(colleaguePlan?.value===planViewer)colleaguePlan.value=null});async function changePlan(operation){if(!canChangePlan.value)return;const restoring=operation===`restore`;if(restoring){if(!archiveId.value||plan.value?.current)return}else if(!plan.value?.current||archiveId.value)return;const target=endpoint.value;const actor=actorKey.value;pendingOperation.value=operation;try{const result=await getHttpWebClient().request(target+`/`+operation,{method:`POST`,body:restoring?{archiveId:archiveId.value}:{expectedRevision:plan.value.current.revision,expectedProgressRevision:plan.value.current.progressRevision||``}});if(result?.ok===false)throw new Error(result.error||`The plan could not be updated.`);if(target!==endpoint.value||actor!==actorKey.value)return;notice.value=result.notice||(restoring?`The plan is now current and active.`:`The plan is archived and remains available in History.`);if(restoring)archiveId.value=``;await resource.reload();if(target===endpoint.value&&actor===actorKey.value)view.value=restoring?`current`:`history`}catch(error){if(target===endpoint.value&&actor===actorKey.value)feedback.report({source:`vibe64.work-plan.`+operation,intent:`action-feedback`,severity:`error`,message:error.message})}finally{if(target===endpoint.value&&actor===actorKey.value)pendingOperation.value=``}}const technicalPanel=ref(null);const sections=computed(()=>{const result=[];let prose=[];let technical=false;const flush=()=>{if(prose.length){result.push({technical,blocks:parseLongTextReviewBlocks(prose.join(`
|
|
10
|
-
`))});prose=[]}};for(const line of parseWorkPlanLines((document.value===`progress`?plan.value?.progressText:plan.value?.text)||``,{markTechnicalDetails:document.value===`plan`})){if(line.technicalDetails){flush();technical=true;continue}if(line.checked!==void 0){flush();result.push({technical,checked:line.checked,blocks:parseLongTextReviewBlocks(line.text)})}else if(!/^Status: (active|completed)\s*$/u.test(line.text))prose.push(line.text)}flush();return result});const overviewSections=computed(()=>sections.value.filter(section=>!section.technical));const technicalSections=computed(()=>sections.value.filter(section=>section.technical));watch([document,archiveId,()=>plan.value?.revision],()=>{technicalPanel.value=null});watch([sessionId,sessionsPath,actorKey],()=>{open.value=false;technicalPanel.value=null;archiveId.value=``;notice.value=``;view.value=`current`;document.value=`plan`;pendingOperation.value=``});watch(()=>props.active,active=>{if(!active)open.value=false});return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[visible.value?(openBlock(),createElementBlock(`div`,_hoisted_1$18,[createVNode(VBtn,{icon:unref(mdiFileDocumentOutline),variant:currentActive.value?`tonal`:`text`,color:currentActive.value?`warning`:void 0,"aria-label":label.value,title:label.value,size:`small`,onClick:_cache[0]||(_cache[0]=$event=>showPlan())},null,8,[`icon`,`variant`,`color`,`aria-label`,`title`]),notice.value?(openBlock(),createElementBlock(`span`,_hoisted_2$16,toDisplayString(notice.value),1)):createCommentVNode(``,true)])):createCommentVNode(``,true),createVNode(VDialog,{modelValue:open.value,"onUpdate:modelValue":_cache[9]||(_cache[9]=$event=>open.value=$event),"max-width":`880`,height:`min(760px, calc(100dvh - 48px))`,scrollable:``,"aria-label":`Plan and history`},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`,height:`100%`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`d-flex align-center ga-2 px-4 py-2 flex-shrink-0`},{default:withCtx(()=>[_cache[10]||(_cache[10]=createBaseVNode(`span`,{class:`text-title-large`},`Plan`,-1)),createVNode(VSpacer),view.value===`current`&&plan.value?.current?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiArchiveArrowDownOutline),disabled:!canChangePlan.value,"aria-busy":pendingOperation.value===`archive`,variant:`text`,size:`small`,width:`120`,"min-height":`48`,"aria-label":`Archive plan`,title:`Move this plan to History without marking it completed`,onClick:_cache[1]||(_cache[1]=$event=>changePlan(`archive`))},{default:withCtx(()=>[createTextVNode(toDisplayString(pendingOperation.value===`archive`?`Archiving…`:`Archive`),1)]),_:1},8,[`prepend-icon`,`disabled`,`aria-busy`])):createCommentVNode(``,true),archiveId.value&&!plan.value?.current?(openBlock(),createBlock(VBtn,{key:1,"prepend-icon":unref(mdiRestore),disabled:!canChangePlan.value,"aria-busy":pendingOperation.value===`restore`,variant:`text`,color:`primary`,size:`small`,width:`128`,"min-height":`48`,"aria-label":`Make current`,title:`Move this archived plan back to Current plan and reopen it as Active`,onClick:_cache[2]||(_cache[2]=$event=>changePlan(`restore`))},{default:withCtx(()=>[createTextVNode(toDisplayString(pendingOperation.value===`restore`?`Restoring…`:`Make current`),1)]),_:1},8,[`prepend-icon`,`disabled`,`aria-busy`])):createCommentVNode(``,true),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,"aria-label":`Close plan`,title:`Close plan`,onClick:_cache[3]||(_cache[3]=$event=>open.value=false)},null,8,[`icon`])]),_:1}),createVNode(VTabs,{"model-value":view.value,color:`primary`,grow:``,height:`48`,class:`flex-grow-0 flex-shrink-0`,"aria-label":`Plan views`,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>{view.value=$event;archiveId.value=``})},{default:withCtx(()=>[createVNode(VTab,{value:`current`,"prepend-icon":unref(mdiFileDocumentOutline)},{default:withCtx(()=>[..._cache[11]||(_cache[11]=[createTextVNode(`Current plan`,-1)])]),_:1},8,[`prepend-icon`]),createVNode(VTab,{value:`history`,"prepend-icon":unref(mdiHistory)},{default:withCtx(()=>[..._cache[12]||(_cache[12]=[createTextVNode(`History`,-1)])]),_:1},8,[`prepend-icon`])]),_:1},8,[`model-value`]),createVNode(VDivider),archiveId.value?(openBlock(),createBlock(VSheet,{key:0,color:`surface`,border:`b`,class:`work-plan-archive-context px-4 py-3`},{default:withCtx(()=>[createVNode(VBtn,{icon:unref(mdiArrowLeft),variant:`text`,"aria-label":`Back to plan history`,title:`Back to plan history`,onClick:_cache[5]||(_cache[5]=$event=>archiveId.value=``)},null,8,[`icon`]),createBaseVNode(`div`,_hoisted_3$15,[createVNode(VChip,{color:`primary`,variant:`tonal`,size:`small`,class:`mb-1`},{default:withCtx(()=>[..._cache[13]||(_cache[13]=[createTextVNode(`Archived · read-only`,-1)])]),_:1}),createBaseVNode(`p`,_hoisted_4$13,toDisplayString(selectedArchive.value?`Archived ${selectedArchive.value.archivedDate}`:`Saved snapshot`),1)])]),_:1})):createCommentVNode(``,true),createVNode(VCardText,{class:normalizeClass([`work-plan-content pa-4 pa-sm-6`,{"d-flex flex-column":showHistory.value&&!history.value.length}])},{default:withCtx(()=>[unref(resource).loadError.value?(openBlock(),createBlock(VAlert,{key:0,type:`warning`,variant:`tonal`,class:`mb-4`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(resource).loadError.value)+` `,1),createVNode(VBtn,{variant:`text`,onClick:_cache[6]||(_cache[6]=$event=>unref(resource).reload())},{default:withCtx(()=>[..._cache[14]||(_cache[14]=[createTextVNode(`Retry`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),showHistory.value?(openBlock(),createElementBlock(Fragment,{key:1},[history.value.length?(openBlock(),createBlock(VList,{key:0,"aria-label":`Archived plans`,class:`pa-0 bg-transparent`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(history.value,item=>{return openBlock(),createBlock(VListItem,{key:item.id,"aria-label":`Open archived plan: ${item.title}`,role:`button`,rounded:`lg`,border:``,class:`mb-2 pa-4`,onClick:$event=>archiveId.value=item.id},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_5$12,[createVNode(VListItemTitle,{class:`work-plan-history-title text-title-medium`},{default:withCtx(()=>[createTextVNode(toDisplayString(item.title),1)]),_:2},1024),createVNode(VIcon,{icon:unref(mdiChevronRight),class:`flex-shrink-0`},null,8,[`icon`])]),createBaseVNode(`p`,_hoisted_6$11,`Archived `+toDisplayString(item.archivedDate),1),createBaseVNode(`div`,_hoisted_7$11,[createVNode(VChip,{color:item.status===`completed`?`success`:void 0,size:`small`,variant:`tonal`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_8$11,toDisplayString(item.status===`completed`?`Completed`:`Unfinished`),1)]),_:2},1032,[`color`]),typeof item.total===`number`?(openBlock(),createElementBlock(`span`,_hoisted_9$10,toDisplayString(item.total)+` requirements`,1)):createCommentVNode(``,true)])]),_:2},1032,[`aria-label`,`onClick`])}),128))]),_:1})):(openBlock(),createElementBlock(`div`,_hoisted_10$8,[createVNode(VIcon,{icon:unref(mdiHistory),size:`48`,class:`text-medium-emphasis mb-4`},null,8,[`icon`]),_cache[15]||(_cache[15]=createBaseVNode(`p`,{class:`text-title-medium mb-2`},`No archived plans`,-1)),_cache[16]||(_cache[16]=createBaseVNode(`p`,{class:`text-body-medium text-medium-emphasis`},`Archive a plan to keep it here.`,-1))]))],64)):!selectedPlanReady.value&&!unref(resource).loadError.value?(openBlock(),createBlock(VSkeletonLoader,{key:2,type:`heading, paragraph, paragraph, paragraph`,"aria-label":`Loading plan`,"aria-busy":`true`})):plan.value?.available&&selectedPlanReady.value?(openBlock(),createElementBlock(Fragment,{key:3},[createBaseVNode(`div`,_hoisted_11$8,[createVNode(VChip,{color:plan.value.status===`completed`?`success`:`warning`,variant:`tonal`,size:`small`,"prepend-icon":plan.value.status===`completed`?unref(mdiCheckCircleOutline):void 0},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_12$8,toDisplayString(plan.value.status===`completed`?`Completed`:archiveId.value?`Unfinished`:`Active`),1)]),_:1},8,[`color`,`prepend-icon`]),createBaseVNode(`span`,_hoisted_13$8,toDisplayString(plan.value.total)+` requirements`,1)]),createVNode(VTabs,{modelValue:document.value,"onUpdate:modelValue":_cache[7]||(_cache[7]=$event=>document.value=$event),grow:``,height:`48`,"aria-label":`Plan documents`,class:`mb-4`},{default:withCtx(()=>[createVNode(VTab,{value:`plan`},{default:withCtx(()=>[..._cache[17]||(_cache[17]=[createTextVNode(`Plan`,-1)])]),_:1}),createVNode(VTab,{value:`progress`},{default:withCtx(()=>[..._cache[18]||(_cache[18]=[createTextVNode(`Progress`,-1)])]),_:1})]),_:1},8,[`modelValue`]),document.value===`progress`&&!plan.value.progressAvailable?(openBlock(),createElementBlock(`p`,_hoisted_14$8,`This historical plan has no separate Progress document. Its original evidence remains in Plan.`)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(overviewSections.value,(section,index)=>{return openBlock(),createElementBlock(`div`,{key:index,class:normalizeClass({"work-plan-item":section.checked!==void 0})},[section.checked!==void 0?(openBlock(),createElementBlock(`input`,{key:0,type:`checkbox`,checked:section.checked,disabled:``,"aria-label":`Recorded checklist mark`},null,8,_hoisted_15$8)):createCommentVNode(``,true),createVNode(unref(LongTextPreviewBlocks_default),{blocks:section.blocks},null,8,[`blocks`])],2)}),128)),technicalSections.value.length?(openBlock(),createBlock(VExpansionPanels,{key:1,modelValue:technicalPanel.value,"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>technicalPanel.value=$event),class:`mt-4`,variant:`accordion`},{default:withCtx(()=>[createVNode(VExpansionPanel,{value:`technical`,title:`Technical details`},{default:withCtx(()=>[createVNode(VExpansionPanelText,null,{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(technicalSections.value,(section,index)=>{return openBlock(),createElementBlock(`div`,{key:index,class:normalizeClass({"work-plan-item":section.checked!==void 0})},[section.checked!==void 0?(openBlock(),createElementBlock(`input`,{key:0,type:`checkbox`,checked:section.checked,disabled:``,"aria-label":`Recorded checklist mark`},null,8,_hoisted_16$7)):createCommentVNode(``,true),createVNode(unref(LongTextPreviewBlocks_default),{blocks:section.blocks},null,8,[`blocks`])],2)}),128))]),_:1})]),_:1})]),_:1},8,[`modelValue`])):createCommentVNode(``,true)],64)):!unref(resource).loadError.value?(openBlock(),createElementBlock(`div`,_hoisted_17$7,[createVNode(VIcon,{icon:unref(mdiArchiveOutline),size:`48`,class:`text-medium-emphasis mb-4`},null,8,[`icon`]),_cache[19]||(_cache[19]=createBaseVNode(`p`,{class:`text-title-medium mb-2`},`No current plan`,-1)),_cache[20]||(_cache[20]=createBaseVNode(`p`,{class:`text-body-medium text-medium-emphasis`},`Ask Senior in chat to create a plan or reopen one from History.`,-1))])):createCommentVNode(``,true)]),_:1},8,[`class`])]),_:1})]),_:1},8,[`modelValue`])],64)}}};var Vibe64WorkPlan_default=_plugin_vue_export_helper_default(_sfc_main$21,[[`__scopeId`,`data-v-1813ffe2`]]);var _hoisted_1$17={key:1,class:`text-error text-body-small`,role:`alert`};var _sfc_main$20={__name:`Vibe64SwitchWorkflowButton`,props:{session:{type:Object,default:null},sessionsApiPath:{type:[String,Object,Function],default:``},disabled:Boolean},emits:[`saved`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const preferences=computed(()=>assistantRoutingFromMetadata(props.session?.metadata));const currentEngineId=computed(()=>preferences.value?.workflowEngineId||props.session?.assistantSelection?.engineId||``);const{connectedWorkflows}=useModelRouting({enabled:computed(()=>Boolean(props.session)),workflowsOnly:true});const target=computed(()=>connectedWorkflows.value.find(choice=>choice.available&&choice.engineId!==currentEngineId.value)||null);const saving=ref(false);const error=ref(``);const command=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,placementSource:`vibe64.sessions.assistant-selection.update`,buildCommandOptions:()=>({method:`PATCH`,path:vibe64SessionPath(readRefOrGetterValue(props.sessionsApiPath),props.session.sessionId,`/assistant-selection`)}),buildRawPayload:()=>vibe64RealtimeOriginPayload({assistantRouting:{mode:[`senior`,`junior`,`auto`].includes(preferences.value?.mode)?preferences.value.mode:`senior`,review:false,workflowEngineId:target.value.engineId}}),onRunSuccess:result=>{if(result?.ok===false)throw new Error(result.error||`The chat could not be switched.`)},fallbackRunError:`The chat could not be switched.`,suppressSuccessMessage:true,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,writeMethod:`PATCH`});async function switchWorkflow(){if(!target.value||saving.value||props.disabled)return;saving.value=true;error.value=``;try{await command.run();emit(`saved`)}catch(cause){error.value=cause?.message||`The chat could not be switched.`}finally{saving.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[target.value?(openBlock(),createBlock(VBtn,{key:0,variant:`tonal`,"min-height":`32`,size:`small`,loading:saving.value,disabled:__props.disabled,title:error.value||void 0,onClick:switchWorkflow},{default:withCtx(()=>[createTextVNode(` Switch to `+toDisplayString(target.value.label),1)]),_:1},8,[`loading`,`disabled`,`title`])):createCommentVNode(``,true),error.value?(openBlock(),createElementBlock(`span`,_hoisted_1$17,toDisplayString(error.value),1)):createCommentVNode(``,true)],64)}}};var _hoisted_1$16={class:`starred-files-menu__header`};var _hoisted_2$15={class:`starred-files-menu__list`};var _sfc_main$19={__name:`Vibe64StarredFilesMenu`,props:{bookmarks:{type:Object,required:true}},emits:[`open-file`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const{xs:mobile}=useDisplay();const opened=ref(false);const query=ref(``);const menu=ref(null);const panel=ref(null);const searchField=ref(null);const matchingFiles=computed(()=>{const search=(query.value||``).trim().toLocaleLowerCase();return props.bookmarks.files.value.filter(file=>file.path.toLocaleLowerCase().includes(search))});let returnFocus=false;function focusSearch(){if(opened.value)searchField.value?.focus()}function dismiss(){returnFocus=true;opened.value=false}function restoreTriggerFocus(){if(returnFocus)menu.value?.activatorEl?.focus();returnFocus=false}function onOpenChange(value){if(value){query.value=``;props.bookmarks.refresh()}else if(document.activeElement===menu.value?.activatorEl||panel.value?.$el?.contains(document.activeElement))returnFocus=true}function openFile(filePath){returnFocus=false;opened.value=false;emit(`open-file`,{path:filePath})}function openFirstMatch(){const file=matchingFiles.value.find(entry=>entry.available);if(file)openFile(file.path)}return(_ctx,_cache)=>{return openBlock(),createBlock(resolveDynamicComponent(unref(mobile)?unref(VBottomSheet):unref(VMenu)),{ref_key:`menu`,ref:menu,modelValue:opened.value,"onUpdate:modelValue":[_cache[1]||(_cache[1]=$event=>opened.value=$event),onOpenChange],"close-on-content-click":false,"content-props":{role:`dialog`,"aria-label":`Starred files`},location:`top start`,"max-width":`400`,onAfterEnter:focusSearch,onAfterLeave:restoreTriggerFocus},{activator:withCtx(({props:activatorProps})=>[createVNode(VBtn,mergeProps(activatorProps,{"aria-haspopup":`dialog`,"aria-label":`Starred files (${__props.bookmarks.files.value.length})`,class:`starred-files-menu__trigger`,icon:unref(mdiStarOutline),size:`small`,title:`Your starred files`,variant:`text`}),null,16,[`aria-label`,`icon`])]),default:withCtx(()=>[createVNode(VCard,{ref_key:`panel`,ref:panel,class:`starred-files-menu`,rounded:`lg`,onKeydown:withKeys(withModifiers(dismiss,[`stop`,`prevent`]),[`esc`])},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$16,[createVNode(VTextField,{ref_key:`searchField`,ref:searchField,modelValue:query.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>query.value=$event),"aria-label":`Find a starred file`,autofocus:``,clearable:``,density:`compact`,"hide-details":``,placeholder:`Search`,"prepend-inner-icon":unref(mdiMagnify),variant:`outlined`,onKeydown:withKeys(withModifiers(openFirstMatch,[`prevent`]),[`enter`])},null,8,[`modelValue`,`prepend-inner-icon`,`onKeydown`]),createVNode(VBtn,{"aria-label":`Close starred files`,icon:unref(mdiClose),size:`small`,variant:`text`,onClick:dismiss},null,8,[`icon`])]),createBaseVNode(`div`,_hoisted_2$15,[createVNode(Vibe64StarredFilesList_default,{bookmarks:__props.bookmarks,files:matchingFiles.value,onOpenFile:openFile},null,8,[`bookmarks`,`files`])])]),_:1},8,[`onKeydown`])]),_:1},40,[`modelValue`])}}};var Vibe64StarredFilesMenu_default=_plugin_vue_export_helper_default(_sfc_main$19,[[`__scopeId`,`data-v-b86a8fd5`]]);function useVibe64StarredFiles({projectSlug,sessionId,sessionsApiPath}={}){const files=ref([]);const loading=ref(false);const error=ref(``);const pendingPaths=ref([]);const feedback=useUiFeedback({source:`vibe64.source-editor.stars`});const paths=computed(()=>files.value.map(file=>file.path));const endpoint=computed(()=>{const id=readRefOrGetterValue(sessionId);const base=readRefOrGetterValue(sessionsApiPath);return id&&base?vibe64SourceEditorStarsPath(base,id):``});let generation=0;let readSequence=0;let needsRefresh=false;onScopeDispose(()=>{generation+=1});async function request(url,options){const response=await getHttpWebClient().request(url,options);if(response?.ok===false)throw new Error(vibe64ApiResponseError(response,`Starred files could not load.`));return response}async function refresh(){if(!endpoint.value||pendingPaths.value.length)return;const sequence=++readSequence;const context=generation;loading.value=true;error.value=``;try{const response=await request(endpoint.value);if(context===generation&&sequence===readSequence){files.value=response.files||[];needsRefresh=false}}catch(cause){if(context===generation&&sequence===readSequence)error.value=cause.message||`Starred files could not load.`}finally{if(context===generation&&sequence===readSequence)loading.value=false}}async function toggle(filePath){if(!endpoint.value||!filePath||pendingPaths.value.includes(filePath))return;const context=generation;const previousIndex=files.value.findIndex(file=>file.path===filePath);const previous=files.value[previousIndex];const starred=!previous;readSequence+=1;loading.value=false;pendingPaths.value=[...pendingPaths.value,filePath];files.value=starred?[...files.value,{path:filePath,available:true}]:files.value.filter(file=>file.path!==filePath);try{await request(endpoint.value,{method:`POST`,body:{path:filePath,starred}});if(context===generation)error.value=``}catch(cause){if(context!==generation)return;files.value=files.value.filter(file=>file.path!==filePath);if(previous)files.value.splice(previousIndex,0,previous);needsRefresh=true;feedback.error(cause,`The star could not be saved.`)}finally{if(context===generation){pendingPaths.value=pendingPaths.value.filter(value=>value!==filePath);if(needsRefresh&&pendingPaths.value.length===0)await refresh()}}}watch([endpoint,()=>readRefOrGetterValue(projectSlug)],()=>{generation+=1;needsRefresh=false;files.value=[];pendingPaths.value=[];error.value=``;loading.value=false;refresh()},{immediate:true});return{error,files,loading,paths,pendingPaths,refresh,toggle}}var _hoisted_1$15={class:`vibe64-temporary-action-terminal__summary`};var _hoisted_2$14={class:`vibe64-temporary-action-terminal__title`};var _hoisted_3$14=[`role`,`title`];var _sfc_main$18={__name:`Vibe64TemporaryActionTerminal`,props:{active:{default:false,type:Boolean},dismissed:{default:false,type:Boolean},error:{default:``,type:String},errorTitle:{default:`Action needs attention`,type:String},height:{default:`clamp(8rem, 22vh, 14rem)`,type:String},operationKey:{default:``,type:String},output:{default:``,type:String},retryable:{default:false,type:Boolean},stage:{default:``,type:String},starting:{default:false,type:Boolean},status:{default:``,type:String},subtitle:{default:``,type:String},title:{default:`Action`,type:String}},emits:[`copy`,`dismiss`,`retry`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const detailsOpen=ref(false);const detailsViewed=ref(false);const canDismiss=computed(()=>!props.active);const forwardedSlots=[`actions-after`,`output`,`overlay`];const visible=computed(()=>!props.dismissed&&Boolean(props.active||props.error||props.status===`required`||detailsViewed.value&&Boolean(props.status||props.stage||props.output)));const summaryText=computed(()=>{const outputLine=terminalLastMeaningfulLine(props.output);if(props.error)return props.error;if(props.status!==`required`&&props.stage&&outputLine&&props.stage!==outputLine)return`${props.stage} · ${outputLine}`;return props.stage||outputLine||`Working…`});function toggleDetails(){detailsViewed.value=true;detailsOpen.value=!detailsOpen.value}function dismiss(){detailsOpen.value=false;detailsViewed.value=false;emit(`dismiss`)}watch(()=>props.operationKey,()=>{detailsOpen.value=false;detailsViewed.value=false},{immediate:true});watch(()=>props.active,(active,previousActive)=>{if(active&&!previousActive){detailsOpen.value=false;detailsViewed.value=false}},{immediate:true});return(_ctx,_cache)=>{return visible.value?(openBlock(),createBlock(Vibe64TerminalSurface_default,{key:0,class:normalizeClass([`vibe64-temporary-action-terminal`,{"vibe64-temporary-action-terminal--error":Boolean(__props.error)}]),"body-mode":`log`,"close-label":`Dismiss`,collapsible:``,error:__props.error,expanded:detailsOpen.value,"error-title":__props.errorTitle,height:__props.height,"mobile-takeover":``,"open-error-details":detailsOpen.value&&Boolean(__props.error),output:__props.output,retryable:Boolean(__props.error)&&__props.retryable,"show-close":canDismiss.value,"show-copy":detailsOpen.value&&Boolean(__props.output),"show-interrupt":false,"show-summary":false,starting:__props.starting,title:__props.title,onClose:dismiss,onCopy:_cache[0]||(_cache[0]=$event=>_ctx.$emit(`copy`)),onRetry:_cache[1]||(_cache[1]=$event=>_ctx.$emit(`retry`)),onToggleExpanded:toggleDetails},createSlots({heading:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$15,[createBaseVNode(`strong`,_hoisted_2$14,toDisplayString(__props.title),1),__props.status?(openBlock(),createBlock(VChip,{key:0,class:`vibe64-temporary-action-terminal__status`,size:`x-small`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.status),1)]),_:1})):createCommentVNode(``,true)])]),"actions-before":withCtx(()=>[createBaseVNode(`span`,{class:`vibe64-temporary-action-terminal__line`,role:__props.error?`alert`:`status`,title:__props.subtitle},toDisplayString(summaryText.value),9,_hoisted_3$14),renderSlot(_ctx.$slots,`actions-before`,{},void 0,true),__props.error||__props.status===`required`?renderSlot(_ctx.$slots,`error-actions`,{},void 0,true,0):createCommentVNode(``,true)]),_:2},[renderList(forwardedSlots,slotName=>{return{name:slotName,fn:withCtx(slotProps=>[renderSlot(_ctx.$slots,slotName,normalizeProps(guardReactiveProps(slotProps||{})),void 0,true)])}})]),1032,[`class`,`error`,`expanded`,`error-title`,`height`,`open-error-details`,`output`,`retryable`,`show-close`,`show-copy`,`starting`,`title`])):createCommentVNode(``,true)}}};var Vibe64TemporaryActionTerminal_default=_plugin_vue_export_helper_default(_sfc_main$18,[[`__scopeId`,`data-v-efc31aa6`]]);var _hoisted_1$14={key:0,class:`d-flex flex-column ga-2`,style:{"overflow-wrap":`anywhere`}};var _hoisted_2$13={key:2,class:`ma-0 text-error`,role:`alert`};var _hoisted_3$13={key:0,class:`text-error`,role:`alert`};var _hoisted_4$12={class:`text-wrap`};var _sfc_main$17={__name:`Vibe64ConnectedReplacement`,props:{projectSlug:{type:String,required:true},sessionId:{type:String,required:true},failure:{type:Object,default:null},disabled:{type:Boolean,default:false}},emits:[`replaced`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const pending=ref(false);const review=ref(null);const error=ref(``);const replacement=ref(null);const available=computed(()=>[`vibe64_contribution_discarded`,`vibe64_connected_integration_discarded`].includes(props.failure?.code)&&Boolean(props.failure?.details?.repository));const endpoint=computed(()=>scopedDevelopmentApiUrl(`/api/vibe64/sessions/${encodeURIComponent(props.sessionId)}/connected/replacement`,props.projectSlug));watch(()=>[props.projectSlug,props.sessionId],()=>{review.value=null;error.value=``;replacement.value=null});watch(()=>props.failure?.details?.repository,()=>{review.value=null;error.value=``});async function inspect(){if(pending.value||props.disabled||!available.value)return;const path=endpoint.value;const repository=props.failure.details.repository;pending.value=true;error.value=``;try{const result=await getHttpWebClient().request(`${path}?repository=${encodeURIComponent(repository)}`,{method:`GET`});if(result?.ok!==true)throw vibe64ApiError(result,`The discarded contribution could not be reviewed.`);if(path===endpoint.value&&repository===props.failure?.details?.repository)review.value=result.contributions?.[0]?.review||null}catch(cause){if(path===endpoint.value)error.value=cause.message}finally{pending.value=false}}async function replace(){if(pending.value||props.disabled||!review.value)return;const path=endpoint.value;const reviewed={...review.value};pending.value=true;error.value=``;try{const result=await getHttpWebClient().request(path,{method:`POST`,body:{repository:reviewed.repository,review:reviewed}});if(result?.ok!==true)throw vibe64ApiError(result,`Replacement preparation failed. Retry this same review.`);if(path===endpoint.value){replacement.value=result.prepared?.find(item=>item.repository===reviewed.repository)||null;review.value=null;emit(`replaced`)}}catch(cause){if(path===endpoint.value)error.value=cause.message}finally{pending.value=false}}return(_ctx,_cache)=>{return available.value||replacement.value?(openBlock(),createElementBlock(`div`,_hoisted_1$14,[replacement.value?(openBlock(),createElementBlock(Fragment,{key:0},[_cache[3]||(_cache[3]=createBaseVNode(`p`,{class:`ma-0`,role:`status`},`Replacement prepared. Revise its source, then run Prepare workspace in this project before testing. Save connected first publishes it for review; Main Save still waits for acceptance.`,-1)),createVNode(VBtn,{variant:`tonal`,"min-height":`48`,href:`${unref(projectAppPath)(replacement.value.projectSlug,`/`)}?session=${encodeURIComponent(replacement.value.sessionId)}`},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createTextVNode(` Open replacement session `,-1)])]),_:1},8,[`href`])],64)):(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,"min-height":`48`,height:`auto`,disabled:__props.disabled||pending.value,onClick:inspect},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createBaseVNode(`span`,{class:`text-wrap`},`Review replacement contribution`,-1)])]),_:1},8,[`disabled`])),error.value&&!review.value?(openBlock(),createElementBlock(`p`,_hoisted_2$13,toDisplayString(error.value),1)):createCommentVNode(``,true),createVNode(VDialog,{"model-value":Boolean(review.value),persistent:pending.value,"max-width":`560`,scrollable:``,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>!$event&&!pending.value&&(review.value=null))},{default:withCtx(()=>[review.value?(openBlock(),createBlock(VCard,{key:0},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Create replacement contribution?`,-1)])]),_:1}),createVNode(VCardText,{style:{"overflow-wrap":`anywhere`}},{default:withCtx(()=>[createBaseVNode(`p`,null,toDisplayString(review.value.repository)+` → `+toDisplayString(review.value.targetBranch),1),createBaseVNode(`p`,null,[_cache[6]||(_cache[6]=createTextVNode(`Start a new contribution from discarded commit `,-1)),createBaseVNode(`code`,null,toDisplayString(review.value.discardedHead),1),_cache[7]||(_cache[7]=createTextVNode(`.`,-1))]),_cache[8]||(_cache[8]=createBaseVNode(`p`,null,`The old branch and checkout remain intact. Unsaved edits stay in the old checkout; copy any edits you need into the replacement.`,-1)),_cache[9]||(_cache[9]=createBaseVNode(`p`,null,`This prepares source only. Nothing is pushed, and Main Save still requires the contribution to be accepted.`,-1)),error.value?(openBlock(),createElementBlock(`p`,_hoisted_3$13,toDisplayString(error.value),1)):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`flex-wrap ga-2`},{default:withCtx(()=>[createVNode(VBtn,{variant:`text`,"min-height":`48`,disabled:pending.value,onClick:_cache[0]||(_cache[0]=$event=>review.value=null)},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,disabled:__props.disabled||pending.value,onClick:replace},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_4$12,toDisplayString(pending.value?`Preparing…`:`Create replacement contribution`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`,`persistent`])])):createCommentVNode(``,true)}}};var _sfc_main$16={__name:`Vibe64RenameSessionDialog`,props:{session:{type:Object,required:true},sessionsApiPath:{type:String,required:true}},emits:[`close`,`renamed`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const name=ref(props.session.sessionName||``);const pending=ref(false);const path=vibe64SessionPath(props.sessionsApiPath,props.session.sessionId,`/name`);const resource=useEndpointResource({path,queryKey:[`vibe64.renameSession`,path],enabled:false});const feedback=useUiFeedback({source:`vibe64.sessions.rename`});const normalizedName=computed(()=>name.value.trim());const canSave=computed(()=>Boolean(normalizedName.value)&&normalizedName.value!==props.session.sessionName&&!pending.value);async function submit(){if(!canSave.value)return;pending.value=true;try{await resource.save({name:normalizedName.value},{method:`PATCH`});emit(`renamed`);emit(`close`)}catch(error){feedback.error(error,`The session could not be renamed.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"aria-label":`Rename session`,"model-value":true,"max-width":`28rem`,persistent:pending.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>!$event&&emit(`close`))},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`},{default:withCtx(()=>[createBaseVNode(`form`,{onSubmit:withModifiers(submit,[`prevent`])},[createVNode(VCardTitle,{class:`pa-6 pb-2`},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createBaseVNode(`h2`,{class:`text-title-large`},`Rename session`,-1)])]),_:1}),createVNode(VCardText,{class:`px-6`},{default:withCtx(()=>[createVNode(VTextField,{modelValue:name.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>name.value=$event),label:`Session name`,variant:`outlined`,maxlength:`120`,autofocus:``,disabled:pending.value,"hide-details":``},null,8,[`modelValue`,`disabled`])]),_:1}),createVNode(VCardActions,{class:`pa-6 pt-2`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{height:`48`,variant:`text`,disabled:pending.value,onClick:_cache[1]||(_cache[1]=$event=>emit(`close`))},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{type:`submit`,height:`48`,color:`primary`,variant:`flat`,rounded:`pill`,disabled:!canSave.value,loading:pending.value},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(` Rename `,-1)])]),_:1},8,[`disabled`,`loading`])]),_:1})],32)]),_:1})]),_:1},8,[`persistent`])}}};var _sfc_main$15={__name:`Vibe64CreateSessionButton`,props:{ariaLabel:{default:``,type:String},block:{default:false,type:Boolean},buttonClass:{default:``,type:[Array,Object,String]},iconOnly:{default:true,type:Boolean},label:{default:`New session`,type:String},size:{default:`small`,type:String},toolbar:{default:()=>({}),type:Object},variant:{default:`flat`,type:String}},setup(__props){const props=__props;const button=ref(null);const dialogOpen=ref(false);const createSessionRunning=computed(()=>props.toolbar.createSessionRunning===true);const creationUnavailable=computed(()=>!createSessionRunning.value&&props.toolbar.canCreateSession!==true);const buttonAriaLabel=computed(()=>{if(createSessionRunning.value)return`Creating session…`;const label=String(props.ariaLabel||props.label||`New session`).trim();return creationUnavailable.value&&buttonTitle.value?`${label}. ${buttonTitle.value}`:label});const buttonLabel=computed(()=>createSessionRunning.value?`Creating session…`:props.label);const buttonTitle=computed(()=>createSessionRunning.value?`Creating session…`:String(props.toolbar.createSessionTitle||props.ariaLabel||props.label||`New session`).trim());function requestCreateSession(){if(creationUnavailable.value||createSessionRunning.value)return;dialogOpen.value=true}function handleCreated(response={}){if(response?.sessionId)focusCreatedVibe64SessionTab(response.sessionId)}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VBtn,{ref_key:`button`,ref:button,"aria-busy":createSessionRunning.value?`true`:void 0,"aria-disabled":creationUnavailable.value?`true`:void 0,"aria-label":buttonAriaLabel.value,block:__props.block,class:normalizeClass([__props.buttonClass,{"studio-ai-sessions__create-button--unavailable":creationUnavailable.value}]),disabled:createSessionRunning.value,icon:__props.iconOnly?true:void 0,"prepend-icon":__props.iconOnly?void 0:unref(mdiPlus),size:__props.size,title:buttonTitle.value,variant:__props.variant,onClick:requestCreateSession},{default:withCtx(()=>[__props.iconOnly?(openBlock(),createBlock(VIcon,{key:0,icon:unref(mdiPlus)},null,8,[`icon`])):createCommentVNode(``,true),!__props.iconOnly?(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(toDisplayString(buttonLabel.value),1)],64)):createCommentVNode(``,true)]),_:1},8,[`aria-busy`,`aria-disabled`,`aria-label`,`block`,`class`,`disabled`,`icon`,`prepend-icon`,`size`,`title`,`variant`]),createVNode(Vibe64AssistantSessionDialog_default,{modelValue:dialogOpen.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>dialogOpen.value=$event),toolbar:__props.toolbar,onCreated:handleCreated},null,8,[`modelValue`,`toolbar`])],64)}}};var Vibe64CreateSessionButton_default=_plugin_vue_export_helper_default(_sfc_main$15,[[`__scopeId`,`data-v-63a40b7b`]]);var VIBE64_SESSION_TOOLTIP_KEY=Symbol(`vibe64-session-tooltip`);function createVibe64SessionTooltipState(){const suppressedSessionId=ref(``);function resumeHover(){suppressedSessionId.value=``}function trackPointer(event){if(!suppressedSessionId.value)return;if((event.target.closest?.(`[data-vibe64-session-id]`))?.dataset.vibe64SessionId!==suppressedSessionId.value)resumeHover()}return{suppressedSessionId,resumeHover,trackPointer}}var DEFAULT_VISIBLE_SESSION_LIMIT=3;function visibleVibe64ToolbarSessions({limit=3,selectedSessionId=``,sessions=[]}={}){const items=Array.isArray(sessions)?sessions:[];const boundedLimit=Math.max(0,Number(limit||0));if(boundedLimit<1||items.length<=boundedLimit)return items;const selectedId=String(selectedSessionId||``).trim();const selectedIndex=items.findIndex(session=>session?.sessionId===selectedId);if(selectedIndex<0||selectedIndex<boundedLimit)return items.slice(0,boundedLimit);return[...items.slice(0,Math.max(0,boundedLimit-1)),items[selectedIndex]]}var _hoisted_1$13={class:`studio-ai-sessions__tabs`};var _hoisted_2$12={class:`studio-ai-sessions__tab-main`};var _hoisted_3$12={class:`studio-ai-sessions__tab-label`};var _hoisted_4$11={key:0,class:`studio-ai-sessions__tab-close-slot`};var _hoisted_5$11={class:`studio-ai-sessions__info`};var _hoisted_6$10={class:`studio-ai-sessions__info-facts`};var _hoisted_7$10={role:`status`};var _hoisted_8$10={class:`studio-ai-sessions__archive-detail`};var _hoisted_9$9={key:0};var _sfc_main$14={__name:`Vibe64SessionToolbar`,props:{active:{default:true,type:Boolean},archive:{default:()=>({}),type:Object},selectedSessionId:{default:``,type:String},selectionArchived:{default:false,type:Boolean},toolbar:{default:()=>({}),type:Object},compact:{default:false,type:Boolean},createAttention:{default:false,type:Boolean},createTeleportTarget:{default:``,type:String},createVisible:{default:true,type:Boolean},maxVisibleSessions:{default:3,type:Number}},emits:[`select-session`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const infoSessionId=ref(``);const renamingSession=ref(null);const renamingSessionsApiPath=ref(``);const sessionTooltip=inject(VIBE64_SESSION_TOOLTIP_KEY);const learnerGestures=inject(VIBE64_TRAINING_LEARNER_GESTURE_KEY,null);const infoId=useId();const createdAtFormatter=new Intl.DateTimeFormat(void 0,{dateStyle:`medium`,timeStyle:`short`});function renameSession(session){const sessionsApiPath=session.purpose===`learning`?session.learningAttemptId?`/api/learning/${session.learningAttemptId}/vibe64/sessions`:``:props.toolbar.workingSessionsApiPath||props.toolbar.sessionsApiPath;if(!sessionsApiPath)return;renamingSessionsApiPath.value=sessionsApiPath;infoSessionId.value=``;sessionTooltip.suppressedSessionId.value=session.sessionId;renamingSession.value={...session}}function setSessionInfo(sessionId,visible){if(visible&&!props.active)return;if(visible||infoSessionId.value===sessionId)infoSessionId.value=visible?sessionId:``}watch(()=>props.toolbar.sessionsApiPath,()=>{renamingSession.value=null});watch(()=>props.active,active=>{if(!active)infoSessionId.value=``},{flush:`sync`});function sessionInfoFacts(sessionItem){const selection=sessionItem.assistantSelection||{};const assistant=VIBE64_AGENT_PROVIDERS.find(provider=>provider.id===selection.engineId);const details=vibe64SessionInfoFacts(sessionItem).filter(fact=>[`session`,`branch`,`created-at`].includes(fact.key)&&(sessionItem.purpose!==`learning`||fact.key!==`branch`)).map(fact=>{const createdAt=fact.key===`created-at`?Date.parse(fact.value):NaN;return{...fact,value:Number.isFinite(createdAt)?createdAtFormatter.format(createdAt):fact.copyValue}});return[{key:`status`,label:`Status`,value:sessionItem.agentThinking?`Working`:vibe64SessionStatusLabel(sessionItem.status)},{key:`assistant`,label:`Assistant`,value:assistant?.label||selection.engineId},{key:`model`,label:`Model`,value:selection.modelId},...sessionItem.purpose===`learning`?[]:[{key:`saved-work`,label:`Work`,value:repositoryStateLabel(sessionItem)}],...details].filter(fact=>fact.value)}function selectSession(sessionId=``,event){const owner=learnerGestures?.value;const ticket=props.active?owner?.begin(event,`session-select`,{sessionId}):null;sessionTooltip.suppressedSessionId.value=sessionId;infoSessionId.value=``;emit(`select-session`,sessionId);props.toolbar.selectSession?.(sessionId);if(ticket)owner.finish(ticket)}function sessionTabLabel(sessionItem={}){const sessionName=String(sessionItem.sessionName||sessionItem.metadata?.issue_word||``).trim();if(sessionName)return sessionName;return props.toolbar.shortSessionId?.(sessionItem.sessionId)||String(sessionItem.sessionId||``)}function repositoryState(sessionItem={}){const state=String(sessionItem?.repositoryWorkState?.state||`checking`);return[`needs_help`,`saved`,`saving`,`unavailable`,`unsaved`,`update_available`,`updating`].includes(state)?state:`checking`}function repositoryStateLabel(sessionItem={}){const state=repositoryState(sessionItem);if(state===`unsaved`){const changedCount=Number(sessionItem?.repositoryWorkState?.changedCount||0);const changeLabel=changedCount===1?`1 change`:`${changedCount||`Unsaved`} changes`;return sessionItem?.repositoryWorkState?.updateAvailable?`${changeLabel}; update available`:changeLabel}return{checking:`Checking whether work is saved`,needs_help:`Repository needs help`,saved:`All work is saved`,saving:`Saving work`,unavailable:`Save status is unavailable`,update_available:`Update available`,updating:`Updating session`}[state]}function repositoryStateIcon(sessionItem={}){return{checking:mdiDotsHorizontalCircleOutline,needs_help:mdiAlertCircleOutline,saved:mdiCheckCircleOutline,saving:mdiDotsHorizontalCircleOutline,unavailable:mdiAlertCircleOutline,unsaved:mdiContentSaveAlertOutline,update_available:mdiCloudDownloadOutline,updating:mdiDotsHorizontalCircleOutline}[repositoryState(sessionItem)]}function sessionTabAriaLabel(sessionItem={}){if(sessionItem.archiving)return`${sessionTabLabel(sessionItem)}. Inactive. Archiving session.`;if(sessionItem.purpose===`learning`)return`${sessionTabLabel(sessionItem)}. Learning session.`;return`${sessionTabLabel(sessionItem)}. ${repositoryStateLabel(sessionItem)}.`}const allSessions=computed(()=>Array.isArray(props.toolbar.sessions)?props.toolbar.sessions:[]);const archiveNow=ref(Date.now());const hasClosingSessions=computed(()=>props.active&&allSessions.value.some(session=>session.archiving));onMounted(()=>{watch(hasClosingSessions,(running,_previous,onCleanup)=>{archiveNow.value=Date.now();if(!running)return;const timer=setInterval(()=>{archiveNow.value=Date.now()},1e3);onCleanup(()=>clearInterval(timer))},{immediate:true})});const closingSessions=computed(()=>allSessions.value.filter(session=>session.archiving).map(session=>{const startedAt=Date.parse(session.archiveStartedAt||``);const seconds=Number.isFinite(startedAt)?Math.max(0,Math.floor((archiveNow.value-startedAt)/1e3)):null;return{sessionId:session.sessionId,title:sessionTabLabel(session),stage:{stopping:`Stopping preview, AI and tools (1/3)`,resources:`Archiving resources (2/3)`,source:`Archiving workspace and history (3/3)`}[session.archiveOperation?.phase]||`Waiting for the server to begin`,elapsed:seconds===null?``:`${Math.floor(seconds/60)}m ${seconds%60}s elapsed. `,slow:seconds!==null&&seconds>=60}}));const sessionLimit=computed(()=>Math.max(0,Number(props.maxVisibleSessions||0)));const createSessionButtonClass=computed(()=>[`studio-ai-sessions__create-button`,{"studio-ai-sessions__create-button--attention":props.createAttention}]);const visibleSessions=computed(()=>{return visibleVibe64ToolbarSessions({limit:sessionLimit.value,selectedSessionId:props.selectedSessionId,sessions:allSessions.value})});return(_ctx,_cache)=>{return withDirectives((openBlock(),createElementBlock(`div`,{class:normalizeClass([`studio-ai-sessions__toolbar`,{"studio-ai-sessions__toolbar--compact":__props.compact}])},[createBaseVNode(`div`,_hoisted_1$13,[(openBlock(true),createElementBlock(Fragment,null,renderList(visibleSessions.value,sessionItem=>{return openBlock(),createBlock(VChip,{key:sessionItem.sessionId,class:normalizeClass([`studio-ai-sessions__tab`,{"studio-ai-sessions__tab--active":sessionItem.sessionId===__props.selectedSessionId,"studio-ai-sessions__tab--thinking":!sessionItem.archiving&&sessionItem.agentThinking,"studio-ai-sessions__tab--archiving":sessionItem.archiving}]),size:__props.compact?`small`:`large`,"aria-label":sessionTabAriaLabel(sessionItem),disabled:sessionItem.archiving,"data-vibe64-session-id":sessionItem.sessionId,variant:`flat`,onClick:$event=>selectSession(sessionItem.sessionId,$event),onFocusin:_cache[0]||(_cache[0]=$event=>__props.active&&$event.target.matches(`:focus-visible`)&&unref(sessionTooltip).resumeHover())},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_2$12,[createBaseVNode(`span`,{class:normalizeClass([`studio-ai-sessions__status-dot`,`studio-ai-sessions__status-dot--${sessionItem.status}`])},null,2),createBaseVNode(`span`,_hoisted_3$12,toDisplayString(sessionItem.archiving?`${sessionTabLabel(sessionItem)} · Archiving…`:sessionTabLabel(sessionItem)),1),sessionItem.purpose!==`learning`?(openBlock(),createBlock(VIcon,{key:0,class:normalizeClass([`studio-ai-sessions__repository-state studio-ai-sessions__repository-state--desktop`,`studio-ai-sessions__repository-state--${repositoryState(sessionItem)}`]),icon:repositoryStateIcon(sessionItem),size:`14`,title:repositoryStateLabel(sessionItem)},null,8,[`class`,`icon`,`title`])):createCommentVNode(``,true),createVNode(VBtn,{class:`studio-ai-sessions__tab-info`,"aria-label":`Session info: ${sessionTabLabel(sessionItem)}`,"aria-expanded":infoSessionId.value===sessionItem.sessionId,"aria-describedby":`${unref(infoId)}-${sessionItem.sessionId}`,icon:unref(mdiInformationOutline),size:`x-small`,variant:`text`,onClick:withModifiers($event=>setSessionInfo(sessionItem.sessionId,infoSessionId.value!==sessionItem.sessionId),[`stop`])},null,8,[`aria-label`,`aria-expanded`,`aria-describedby`,`icon`,`onClick`])]),sessionItem.sessionId===__props.selectedSessionId&&sessionItem.purpose!==`learning`?(openBlock(),createElementBlock(`span`,_hoisted_4$11,[createVNode(VBtn,{class:`studio-ai-sessions__tab-archive`,density:`comfortable`,disabled:__props.selectionArchived||__props.archive.command.isRunning||sessionItem.pinnedSessionId===sessionItem.sessionId,icon:unref(mdiArchiveOutline),size:`small`,title:sessionItem.pinnedSessionId===sessionItem.sessionId?`Unpin this session before archiving it`:`Archive session`,variant:`text`,"aria-label":`Archive session`,onClick:withModifiers(__props.archive.request,[`stop`])},null,8,[`disabled`,`icon`,`title`,`onClick`])])):createCommentVNode(``,true),createVNode(VTooltip,{id:`${unref(infoId)}-${sessionItem.sessionId}`,activator:`parent`,"model-value":infoSessionId.value===sessionItem.sessionId,disabled:!__props.active,"open-delay":1e3,"close-delay":150,"open-on-click":false,"open-on-focus":``,interactive:``,color:`surface-variant`,location:`bottom`,"max-width":320,"onUpdate:modelValue":$event=>(!$event||unref(sessionTooltip).suppressedSessionId.value!==sessionItem.sessionId)&&setSessionInfo(sessionItem.sessionId,$event)},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_5$11,[createBaseVNode(`strong`,null,toDisplayString(sessionTabLabel(sessionItem)),1),createBaseVNode(`dl`,_hoisted_6$10,[(openBlock(true),createElementBlock(Fragment,null,renderList(sessionInfoFacts(sessionItem),fact=>{return openBlock(),createElementBlock(Fragment,{key:fact.key},[createBaseVNode(`dt`,null,toDisplayString(fact.label),1),createBaseVNode(`dd`,null,toDisplayString(fact.value),1)],64)}),128))]),__props.toolbar.sessionsApiPath?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,"prepend-icon":unref(mdiPencilOutline),disabled:sessionItem.archiving||__props.selectionArchived,onClick:withModifiers($event=>renameSession(sessionItem),[`stop`])},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Rename session `,-1)])]),_:1},8,[`prepend-icon`,`disabled`,`onClick`])):createCommentVNode(``,true)])]),_:2},1032,[`id`,`model-value`,`disabled`,`onUpdate:modelValue`])]),_:2},1032,[`class`,`size`,`aria-label`,`disabled`,`data-vibe64-session-id`,`onClick`])}),128)),__props.createVisible&&(sessionLimit.value<1||allSessions.value.length<sessionLimit.value)?(openBlock(),createBlock(Teleport,{key:0,disabled:!__props.createTeleportTarget,to:__props.createTeleportTarget||`body`,defer:``},[createVNode(Vibe64CreateSessionButton_default,{"aria-label":`New session`,"button-class":createSessionButtonClass.value,"icon-only":``,toolbar:__props.toolbar},null,8,[`button-class`,`toolbar`])],8,[`disabled`,`to`])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`after-sessions`,{},void 0,true)]),(openBlock(true),createElementBlock(Fragment,null,renderList(closingSessions.value,closing=>{return openBlock(),createElementBlock(`div`,{key:closing.sessionId,class:`studio-ai-sessions__archive-progress`},[createVNode(VProgressCircular,{indeterminate:``,size:`16`,width:`2`,"aria-hidden":`true`}),createBaseVNode(`div`,null,[createBaseVNode(`div`,_hoisted_7$10,`Closing `+toDisplayString(closing.title)+` — `+toDisplayString(closing.stage),1),createBaseVNode(`div`,_hoisted_8$10,[createTextVNode(toDisplayString(closing.elapsed)+`You can keep working in another session. `,1),closing.slow?(openBlock(),createElementBlock(`span`,_hoisted_9$9,`Completion has not been confirmed; the last reported stage is shown above.`)):createCommentVNode(``,true)])])])}),128)),renamingSession.value?(openBlock(),createBlock(_sfc_main$16,{key:0,session:renamingSession.value,"sessions-api-path":renamingSessionsApiPath.value,onClose:_cache[1]||(_cache[1]=$event=>renamingSession.value=null),onRenamed:_cache[2]||(_cache[2]=$event=>__props.toolbar.refreshSessionData?.({includeList:true,reason:`session-renamed`}))},null,8,[`session`,`sessions-api-path`])):createCommentVNode(``,true)],2)),[[vShow,!__props.createTeleportTarget||allSessions.value.length>0]])}}};var Vibe64SessionToolbar_default=_plugin_vue_export_helper_default(_sfc_main$14,[[`__scopeId`,`data-v-65939382`]]);function normalizedGitActorText(value=``){return String(value||``).trim()}function sessionUsesGithub(session={}){const metadata=session?.metadata&&typeof session.metadata===`object`&&!Array.isArray(session.metadata)?session.metadata:{};const remoteUrl=normalizedGitActorText(metadata.source_remote_url||metadata.github_repository||session.sourceRemoteUrl||session.githubRepository);if(!remoteUrl)return false;if(normalizedGitActorText(metadata.github_repository||session.githubRepository))return true;try{return new URL(remoteUrl).hostname.toLowerCase()===`github.com`}catch{return/^(?:git@|ssh:\/\/git@)github\.com(?::|\/)/iu.test(remoteUrl)}}function sessionGithubCommandActor(session={}){const metadata=session?.metadata&&typeof session.metadata===`object`&&!Array.isArray(session.metadata)?session.metadata:{};const scope=normalizedGitActorText(metadata.session_git_command_actor_scope);const userKey=normalizedGitActorText(metadata.session_git_command_actor_user_key);const account=scope===`local`?`local GitHub`:userKey;const available=sessionUsesGithub(session);if(!account)return{active:false,available,displayLabel:`not selected`,label:`GitHub: not selected`,title:`No GitHub command actor is selected for this session yet.`};return{active:true,available,displayLabel:account,label:`GitHub: ${account}`,title:`GitHub commands for this session run as ${account}.`}}function resolvedModuleComponent(moduleValue){return moduleValue?.default||moduleValue}function defineVibe64AsyncComponent({label=`Vibe64 module`,loader,minHeight=``}={}){if(typeof loader!==`function`)throw new TypeError(`defineVibe64AsyncComponent requires a loader function.`);return defineComponent({name:`Vibe64AsyncComponent`,inheritAttrs:false,setup(_props,context){const component=shallowRef(null);const error=ref(null);const loading=ref(false);const asyncModuleRecoveryRuntime=useShellAsyncModuleRecoveryRuntime();let disposed=false;let requestId=0;async function load(){const activeRequestId=requestId+1;requestId=activeRequestId;loading.value=true;error.value=null;try{const loaded=resolvedModuleComponent(await loader());if(disposed||activeRequestId!==requestId)return false;component.value=markRaw(loaded);return true}catch(loadError){if(disposed||activeRequestId!==requestId)return false;component.value=null;error.value=loadError;asyncModuleRecoveryRuntime?.notify?.(loadError,{label,stale:isDynamicImportError(loadError)});return false}finally{if(!disposed&&activeRequestId===requestId)loading.value=false}}onBeforeUnmount(()=>{disposed=true;requestId+=1});load();return()=>{if(component.value)return h(component.value,context.attrs,context.slots);const errorValue=error.value;const stale=isDynamicImportError(errorValue);return h(Vibe64AsyncModuleState_default,{class:context.attrs.class,style:context.attrs.style,label,loading:loading.value,message:errorValue?dynamicImportErrorMessage(errorValue,{label,stale}):`Loading ${label}.`,minHeight,stale,onReload:()=>asyncModuleRecoveryRuntime?.reload?.(),onRetry:load})}}})}var VIBE64_WELCOME_NAME_KEY=Symbol(`vibe64-welcome-name`);var DIRECT_SESSION_TOOL_IDS=new Set([`info`,`changes`,`repository`,`editor`,`database`,`system`,`ai-terminal`]);var STANDALONE_SESSION_TOOL_IDS=new Set([`changes`,`editor`,`database`,`system`]);var EMPTY_CONVERSATION_WELCOME=`Hi! 👋 I’m excited to build something with you. Tell me what you have in mind—even a half-formed idea is perfect. We’ll shape it together.`;var LEARNING_CONVERSATION_WELCOME=`Hi! 👋 Ask me to teach this lesson. We'll take it one step at a time.`;var EXISTING_PROJECT_CONVERSATION_WELCOME=`Hi! 👋 This is an existing project. Tell me what you’d like to change, check, or improve, and we’ll work through it together.`;var RENEWED_SESSION_CONVERSATION_WELCOME=`Hi! 👋 I’ve received the handover from the previous session and I’m ready to continue. Tell me what you’d like to do next.`;var NUMBERED_QUESTION_UNSURE_VALUE=`I am not sure`;var NUMBERED_QUESTION_UNSURE_CHOICE=Object.freeze({label:NUMBERED_QUESTION_UNSURE_VALUE,recommended:false,selectLabel:NUMBERED_QUESTION_UNSURE_VALUE,value:NUMBERED_QUESTION_UNSURE_VALUE});var EXECUTION_CAPACITY_ERROR_CODES=new Set([`vibe64_capacity_rejected`]);var EXECUTION_SAFETY_ERROR_CODES=new Set([`vibe64_codex_app_server_cleanup_required`,`vibe64_codex_app_server_metadata_failed`,`vibe64_codex_app_server_process_identity_unverified`,`vibe64_codex_helper_runtime_cleanup_required`,`vibe64_codex_helper_runtime_metadata_failed`,`vibe64_execution_cleanup_required`,`vibe64_execution_drain_failed`,`vibe64_execution_ownership_unknown`,`vibe64_managed_execution_provider_unavailable`]);var SHORT_ACTION_DISMISSALS_STORAGE_PREFIX=`vibe64:short-action-dismissals:v1`;var vibe64AutopilotViewEmits=[`busy-change`,`chat-attention`,`execution-attention`,`project-attention`];var vibe64AutopilotViewProps={hiddenByWorkspaceMode:{default:false,type:Boolean},active:{default:true,type:Boolean},sourceWorkspaceAvailable:{default:true,type:Boolean},outputWorkspaceAvailable:{default:null,type:Boolean},lessonsAvailable:Boolean,learningView:{default:`workspace`,type:String,validator:value=>[`workspace`,`learning`].includes(value)},learningAttemptId:{default:``,type:String},agentConnectionError:{default:``,type:String},agentConnectionStatus:{default:`connected`,type:String},retryAgentConnection:{default:()=>{},type:Function},chatCollapsed:{default:false,type:Boolean},cancelAgentMessage:{default:async()=>false,type:Function},conversationRuntime:{required:true,type:Object},conversationLog:{default:()=>({}),type:Object},githubActorTeleportTarget:{default:``,type:String},createSessionTeleportTarget:{default:``,type:String},interruptAgentTurn:{default:async()=>false,type:Function},page:{default:()=>({}),type:Object},previewToolbarTeleportTarget:{default:``,type:String},promptHintPolicy:{default:()=>({enabled:true,ready:false,revision:0,version:0}),type:Object},projectContext:{default:()=>({}),type:Object},projectPane:{default:`preview`,type:String},refreshSessionData:{default:async()=>null,type:Function},refreshSessionWork:{default:async()=>null,type:Function},retryWorkspaceSetup:{default:async()=>false,type:Function},saveSessionWork:{default:async()=>false,type:Function},updateSessionWork:{default:async()=>false,type:Function},sendAgentMessage:{default:async()=>false,type:Function},session:{default:null,type:Object},sessionArchive:{default:()=>({}),type:Object},sessionRenewal:{default:()=>({}),type:Object},sessionSelectionArchived:{default:false,type:Boolean},sessionsApiPath:{default:``,type:[String,Object,Function]},sessionToolbar:{default:()=>({}),type:Object},workState:{default:()=>({}),type:Object}};function emptyConversationWelcomeText({existingProject=false,learning=false,preferredName=``,renewedSession=false}={}){const message=learning?LEARNING_CONVERSATION_WELCOME:renewedSession?RENEWED_SESSION_CONVERSATION_WELCOME:existingProject?EXISTING_PROJECT_CONVERSATION_WELCOME:EMPTY_CONVERSATION_WELCOME;const name=normalizedAgentTurnText(preferredName);return name?message.replace(`Hi!`,`Hi ${name}!`):message}function normalizedAgentTurnText(value=``){return String(value||``).trim()}function agentConnectionThinkingLabel({active=false,status=`connected`}={}){if(!active||[`connected`,`failed`,`restricted`].includes(status))return``;if(status===`initializing`)return`Loading assistant…`;if(status===`disconnected`)return`Connection lost — assistant status unknown.`;return status===`reconciling`?`Checking assistant status...`:`Assistant status could not be verified.`}function normalizeProjectPane$1(value=``){return value===`dashboard`?`dashboard`:`preview`}function sessionNavLabel(session={}){const name=normalizedAgentTurnText(session?.sessionName||session?.metadata?.issue_word);if(name)return name;const sessionId=normalizedAgentTurnText(session?.sessionId);return sessionId.includes(`_`)?sessionId.split(`_`).slice(-2).join(`_`):sessionId.slice(0,12)}function workspaceSetupFixPrompt(workspaceSetup={}){const diagnostic=normalizedAgentTurnText(workspaceSetup?.diagnostic)||`Workspace preparation did not complete.`;const transcript=normalizedAgentTurnText(workspaceSetup?.transcript);const recentTranscript=transcript.length>12e3?`[Earlier preparation output omitted.]\n${transcript.slice(-12e3)}`:transcript;return[`Workspace preparation needs attention.`,`Diagnostic:\n${diagnostic}`,recentTranscript?`Recent preparation output:\n${recentTranscript}`:``,`Diagnose and repair the current workspace while preserving its existing work.`,`When your turn finishes, Vibe64 will automatically rerun its deterministic workspace preparation. Do not merely tell the user to retry.`,`If the repair needs information only the user can provide, ask for it in this temporary conversation.`].filter(Boolean).join(`
|
|
11
|
-
|
|
12
|
-
`)}function previewIdentityFixPrompt({error=``,identity={}}={}){const name=normalizedAgentTurnText(identity?.name)||`configured identity`;const type=normalizedAgentTurnText(identity?.type)||`selector`;const value=normalizedAgentTurnText(identity?.value)||`unknown`;const diagnostic=normalizedAgentTurnText(error)||`The application rejected the identity.`;return[`The managed preview could not sign in as \`${name}\` (${type}: \`${value}\`):`,diagnostic,`Please diagnose and fix this in the current application. Ensure its app-owned, idempotent development seed creates this user profile and any workspace membership the app requires in every fresh database, then run the normal database preparation command and verify the identity exchange. Keep preview authentication material host-managed; do not add, reveal, or hardcode Vibe64 secrets.`].join(`
|
|
13
|
-
|
|
14
|
-
`)}var REPOSITORY_TEMPORARY_AI_GIT_BOUNDARY=[`Vibe64—not Temporary AI—owns every repository operation. The failed operation has already been rolled back.`,`You may inspect Git read-only and edit ordinary working-tree files in this session. Do not change HEAD, branches, refs, the index, stashes, remotes, commits, checkpoints, or repository configuration.`,`Do not run git add, commit, checkout, switch, restore, reset, clean, stash, merge, rebase, cherry-pick, revert, pull, push, fetch, or update-ref. Do not create a recovery ref or stash; Vibe64 already owns durable recovery.`,`Record the initial HEAD and index with read-only commands, leave both byte-for-byte unchanged, and do not publish. Resolve only by editing the conflicting working-tree files; Vibe64 owns applying and verifying the repository operation.`,`Preserve the intended behavior of both the latest saved work and this session. Do not hand-edit generated Genesis maps; Vibe64 regenerates its derived artifacts. A clean index after rollback is not proof that the conflict is resolved.`].join(`
|
|
15
|
-
`);var UPDATE_REPAIR_MESSAGES={completion:`File repairs prepared. Vibe64 must check Update before this repair is finished.`,nextStep:`Vibe64 will check Update after the repair.`,handoff:[`Review every listed conflict against both the saved and session versions, preserving their intended changes. Leave an already-correct file unchanged. Confirm the content is resolved before reporting completion; valid syntax alone is insufficient.`,`Your task is to prepare the file repair, not to run or complete the rebase yourself. Return kind=complete with a factual report as soon as the edits and focused checks are ready for Vibe64 to try Update. Vibe64 then runs Update automatically and returns remaining conflicts to this same conversation.`,`Return kind=continue only when you need an actual user decision, and ask that specific question. Do not wait for the user to click Rebase or tell them to open another repair chat.`,`Describe progress in terms of the user's features and remaining work. Keep HEAD/index/ref bookkeeping in the technical checks, not routine progress or the final reply. Passing application tests is not proof that Update succeeded.`].join(`
|
|
16
|
-
`)};var TEMPORARY_AI_RECOVERY_NOTICE=`This is a separate temporary chat. Temporary AI can edit this session to make the repair. Follow progress here and reply below if it needs a decision.`;function repositoryTemporaryAiDedupeKey({code=``,diagnostic=``,sessionId=``}={}){return[`repository-recovery`,normalizedAgentTurnText(sessionId),normalizedAgentTurnText(code),normalizedAgentTurnText(diagnostic)].join(`|`)}function useVibe64AutopilotView(props,emit,{assistantAccessLoading=null,assistantCanUseAi=null,assistantCanRouteChat=null,assistantCanUseJunior=null,assistantCanUseSenior=null,assistantCanUseNative=null,assistantProgressLabel=null,onAttachmentsAccepted=null,requestTemporaryAi=null}={}){const route=useRoute();const router=useRouter();const projectSlug=useVibe64ProjectSlug();const Vibe64OutputControls=defineVibe64AsyncComponent({label:`Launch controls`,loader:()=>__vitePreload(()=>import(`./Vibe64OutputControls-DAAmA09l.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89])),minHeight:`10rem`});const agentSettings=computed(()=>props.conversationRuntime?.agentSettings);const preferredName=inject(VIBE64_WELCOME_NAME_KEY,()=>{const accounts=useVibe64Accounts();return computed(()=>accounts.status.value?.personalProfile?.preferredName)},true);const currentAgentSettings=computed(()=>agentSettings.value?.settings.value||{});const requestAgentSettings=computed(()=>agentSettings.value?.requestSettings.value||null);const sessionId=computed(()=>normalizedAgentTurnText(props.session?.sessionId));const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const actorKey=computed(()=>unref(viewer)?.actorKey||``);const assistantAccessConfigured=assistantCanUseAi!==null;const assistantAccessPending=computed(()=>assistantAccessConfigured&&unref(assistantAccessLoading)===true);const assistantDirectAllowed=computed(()=>!assistantAccessConfigured||unref(assistantCanUseAi)===true);const assistantJuniorAllowed=computed(()=>assistantCanUseJunior===null?assistantDirectAllowed.value:unref(assistantCanUseJunior)===true);const assistantSeniorAllowed=computed(()=>assistantCanUseSenior===null?assistantDirectAllowed.value:unref(assistantCanUseSenior)===true);const sessionGithubActor=computed(()=>sessionGithubCommandActor(props.session||{}));const sessionGithubActorHeaderVisible=computed(()=>Boolean(props.active&&sessionGithubActor.value.available&&String(props.githubActorTeleportTarget||``).trim()));const sessionSourceRoot=computed(()=>vibe64SessionSourcePath(props.session||{}));const practiceLesson=computed(()=>Boolean(!props.sourceWorkspaceAvailable&&props.learningAttemptId&&props.outputWorkspaceAvailable===true&&props.conversationRuntime?.identity?.noExercise===false));const activeAgentTurn=computed(()=>{const turn=props.session?.agentSession?.turn;return turn&&typeof turn===`object`&&!Array.isArray(turn)?turn:{}});const agentActive=computed(()=>activeAgentTurn.value.active===true);const agentObservationLost=computed(()=>activeAgentTurn.value.status===`observation_lost`);const agentWorking=computed(()=>agentActive.value&&!agentObservationLost.value);const composerConnectionStatus=computed(()=>!agentActive.value&&unref(assistantCanRouteChat)===true&&[`restricted`,`unavailable`,`failed`].includes(props.agentConnectionStatus)?`connected`:props.agentConnectionStatus);const agentNativeTurnReady=computed(()=>Boolean(agentActive.value&&!agentObservationLost.value&&normalizedAgentTurnText(activeAgentTurn.value.id)&&normalizedAgentTurnText(activeAgentTurn.value.state)===`active`&&props.agentConnectionStatus===`connected`));const agentSteerable=computed(()=>agentNativeTurnReady.value&&props.conversationRuntime?.steerable.value===true);const chatCollapsed=computed(()=>Boolean(props.chatCollapsed));const sessionToolbarVisible=computed(()=>Boolean(Array.isArray(props.sessionToolbar?.sessions)&&props.sessionToolbar.sessions.length));const composerKey=computed(()=>JSON.stringify([actorKey.value,projectSlug.value,sessionId.value]));const composerDraft=computed({get:()=>props.conversationRuntime?.draft.value||``,set:value=>{if(props.conversationRuntime)props.conversationRuntime.draft.value=value}});const composerAttachments=computed({get:()=>props.conversationRuntime?.draftAttachments.value||[],set:value=>{if(props.conversationRuntime)props.conversationRuntime.draftAttachments.value=value}});const composerRetrySubmission=computed(()=>props.conversationRuntime?.draftRetry.value||null);const messageDelivery=computed(()=>props.conversationRuntime?.delivery||null);const discardingMessageIds=reactive(new Set);const composerSending=computed(()=>messageDelivery.value?.state.sending===true);const composerQueueing=computed(()=>props.conversationRuntime?.queueWhileSending.value===true);const composerStartupQueueing=computed(()=>composerQueueing.value&&composerSending.value&&activeAgentTurn.value.state===`starting`&&!agentObservationLost.value);const composerSubmissionKind=ref(``);const routingRequest=computed(()=>{try{return JSON.parse(props.session?.metadata?.assistant_routing_request||`null`)}catch{return null}});const routingBusy=computed(()=>assistantRoutingStatusIsPending(routingRequest.value)&&!assistantRoutingRequestCanBeReplaced(routingRequest.value,props.session?.assistantSelection));const composerRoutingQueueing=computed(()=>composerQueueing.value&&composerSending.value&&Boolean(routingRequest.value?.messageId)&&messageDelivery.value?.find(routingRequest.value.messageId)?.status===`pending`);const routingStatusLabel=computed(()=>assistantRoutingStatusLabel(routingRequest.value));function restoreCancelledMessage(messageId){const message=messageDelivery.value?.find(messageId);if(!message||discardingMessageIds.has(messageId)||!unmatchedOptimisticMessages(props.conversationLog?.turns,[message]).length)return;const text=message.payload.draftSnapshot||message.text;const draft=composerDraft.value;composerDraft.value=!draft||draft.startsWith(text)?draft||text:`${text}\n\n${draft}`;messageDelivery.value?.remove(messageId)}const conversationFollowLatestKey=ref(0);const interrupting=ref(false);const saveWorkConfirmOpen=ref(false);const contextFullFailure=ref(null);const saveWorkReview=ref(null);const saveWorkConnectedReview=ref(null);const saveWorkConnectedResults=ref([]);const saveWorkError=ref(``);const saveWorkFailure=ref(null);const saveWorkAttempt=ref(null);const saveWorkSending=ref(false);const shortActionDismissals=ref({saveWork:``,workspaceSetup:``,checkpoint:``});const workspaceSetupRetryError=ref(``);const workspaceSetupRetrying=ref(false);const workspaceSetupFixSending=ref(false);const workspaceSetupFixTaskId=ref(``);const repositoryRecoverySending=ref(false);const checkedUpdateRepairRuns=new Map;const previewAttachmentState=ref({attachDiagnostics:null,capture:null,captureAvailable:false,captureBusy:false,diagnosticsAvailable:false,diagnosticsBusy:false});let messageSequence=0;let repositoryRequestSequence=0;const shortActionDismissalsStorageKey=computed(()=>{const slug=normalizedAgentTurnText(projectSlug.value);const selectedSessionId=sessionId.value;return slug&&selectedSessionId?`${SHORT_ACTION_DISMISSALS_STORAGE_PREFIX}:${encodeURIComponent(slug)}:${encodeURIComponent(selectedSessionId)}`:``});watch(shortActionDismissalsStorageKey,storageKey=>{const stored=readLocalStorageJson(storageKey,{});shortActionDismissals.value={...stored,saveWork:normalizedAgentTurnText(stored?.saveWork),workspaceSetup:normalizedAgentTurnText(stored?.workspaceSetup),checkpoint:normalizedAgentTurnText(stored?.checkpoint)}},{flush:`sync`,immediate:true});function dismissShortAction(name,activityKey=``){const key=normalizedAgentTurnText(activityKey);const storageKey=shortActionDismissalsStorageKey.value;if(!key||!storageKey)return false;shortActionDismissals.value={...readLocalStorageJson(storageKey,{}),...shortActionDismissals.value,...name===`saveWork`?{[key]:true}:{[name]:key}};writeLocalStorageJson(storageKey,shortActionDismissals.value);return true}const checkpointTask=computed(()=>(props.session?.backgroundTasks||[]).find(task=>task.id===`codex_turn_checkpoint`&&task.status===`failed`));const checkpointFailure=computed(()=>checkpointTask.value?.error||``);const checkpointFailureKey=computed(()=>checkpointFailure.value?JSON.stringify([checkpointTask.value.checkpointTurnId,checkpointTask.value.updatedAt,checkpointFailure.value]):``);const checkpointFailureVisible=computed(()=>Boolean(checkpointFailure.value&&shortActionDismissals.value.checkpoint!==checkpointFailureKey.value));const checkpointFailureReason=computed(()=>/\bSIG(?:TERM|KILL|INT)\b/u.test(checkpointFailure.value)?`The snapshot command was interrupted.`:`Vibe64 could not create a recovery snapshot for an assistant turn.`);function dismissCheckpointFailure(){return dismissShortAction(`checkpoint`,checkpointFailureKey.value)}const questionState=useAssistantQuestions({message:()=>latestAssistantMessageAwaitingUserReply(props.conversationLog),extraChoice:NUMBERED_QUESTION_UNSURE_CHOICE});const{answers:questionAnswers,choice:selectedAnswerChoice,questions:numberedQuestions,selectItems:numberedQuestionSelectItems,choices:answerChoices,active:structuredQuestionActive,dismiss:dismissNumberedQuestions}=questionState;const repositoryOperationActive=computed(()=>[props.workState?.operation,props.workState?.updateOperation].some(operation=>[`queued`,`running`,`starting`].includes(String(operation?.status||``).trim().toLowerCase())));const sessionInteractionDisabled=computed(()=>Boolean(!props.active||!sessionId.value||props.sessionSelectionArchived));const composerDisabled=computed(()=>Boolean(sessionInteractionDisabled.value||!assistantDirectAllowed.value));const composerAttachmentsSupported=computed(()=>true);const composerAttachmentsEnabled=computed(()=>Boolean(composerAttachmentsSupported.value&&!composerDisabled.value&&!composerSending.value&&!interrupting.value&&(!agentActive.value||agentSteerable.value)&&!repositoryOperationActive.value));const composerRetryMatchesDraft=computed(()=>props.conversationRuntime?.draftRetryMatches.value===true);const composerSubmitMode=computed(()=>{if(assistantAccountUnavailable.value)return`unavailable`;if(composerConnectionStatus.value===`initializing`)return`initializing`;if(composerConnectionStatus.value===`failed`)return`failed`;if(composerConnectionStatus.value!==`connected`)return`reconnecting`;if(routingBusy.value&&!agentActive.value&&!composerRoutingQueueing.value)return`routing`;if(agentActive.value&&(!agentNativeTurnReady.value&&!composerStartupQueueing.value||!agentSteerable.value&&!composerQueueing.value))return`waiting`;if(composerSending.value&&!composerQueueing.value)return composerSubmissionKind.value===`steer`?`steering`:`sending`;if(agentSteerable.value)return composerRetryMatchesDraft.value?`retry`:`steer`;return composerRetryMatchesDraft.value?`retry`:`send`});const composerSubmitLabel=computed(()=>({routing:`Routing…`,failed:`Unavailable`,unavailable:`Connect AI`,initializing:`Loading…`,reconnecting:props.agentConnectionStatus===`disconnected`?`Reconnecting…`:`Checking…`,retry:`Retry`,sending:`Sending…`,steer:`Steer`,steering:`Steering…`,waiting:`Waiting…`})[composerSubmitMode.value]||``);const composerSubmitAriaLabel=computed(()=>({routing:`Preparing the message recipient`,failed:`Assistant unavailable`,unavailable:`Connect your AI account to send messages`,initializing:`Waiting for the assistant to load`,reconnecting:`Waiting for the connection to recover`,retry:`Retry guidance to assistant`,sending:`Sending message`,steer:`Steer assistant`,steering:`Sending guidance to assistant`,waiting:`Waiting for the assistant to accept guidance`})[composerSubmitMode.value]||`Send message`);const composerSubmitTitle=computed(()=>({routing:`Keep typing while this request is routed`,failed:`Resolve the assistant startup error, then retry. Your draft is kept.`,unavailable:`Open AI Accounts to connect your assistant. Your draft is kept.`,initializing:`Keep typing while the assistant loads`,reconnecting:`Your draft is kept while the connection recovers`,retry:`Retry the same guidance without duplicating it`,sending:`Keep typing while this message is sent`,steer:`Send this guidance to the active assistant turn`,steering:`Keep typing while this guidance is sent`,waiting:`Keep typing while the assistant becomes ready`})[composerSubmitMode.value]||`Send message`);const composerCanSubmit=computed(()=>{if(!props.conversationRuntime?.canSubmit.value||composerDisabled.value||routingBusy.value&&!agentSteerable.value&&!composerRoutingQueueing.value)return false;if(composerConnectionStatus.value!==`connected`||composerSending.value&&!composerQueueing.value||interrupting.value||repositoryOperationActive.value||agentActive.value&&(!agentNativeTurnReady.value&&!composerStartupQueueing.value||!agentSteerable.value&&(!composerQueueing.value||composerAttachments.value.length>0)))return false;if(numberedQuestions.value.length)return numberedQuestions.value.every(question=>String(questionAnswers.value[question.name]||``).trim());return Boolean(answerChoices.value.length&&selectedAnswerChoice.value||composerDraft.value.trim())});const agentStopVisible=computed(()=>agentActive.value||routingBusy.value);const agentStopEnabled=computed(()=>Boolean(agentStopVisible.value&&!interrupting.value&&(!composerSending.value||routingBusy.value||!agentSteerable.value&&composerQueueing.value)));const assistantConnectionReady=computed(()=>composerConnectionStatus.value===`connected`);const reasoningActive=computed(()=>assistantConnectionReady.value&&agentActive.value&&!agentObservationLost.value&&activeAgentTurn.value.phase===`reasoning`);const assistantAccountUnavailable=computed(()=>composerConnectionStatus.value===`unavailable`);const assistantAccountMessage=computed(()=>(props.session?.assistantSelection?.engineId||VIBE64_DEFAULT_AGENT_PROVIDER_ID)===`codex`?`Codex is not connected. Sign in through AI Accounts to continue.`:`The selected AI account or model is unavailable. Check AI Accounts or choose another model.`);const connectionRecoveryVisible=computed(()=>!sessionInteractionDisabled.value&&[`disconnected`,`unknown`,`reconciling`,`unavailable`,`failed`].includes(composerConnectionStatus.value));const thinkingVisible=computed(()=>Boolean(!assistantAccountUnavailable.value&&(agentActive.value||composerSending.value||!assistantConnectionReady.value&&![`failed`,`restricted`].includes(composerConnectionStatus.value)&&!sessionInteractionDisabled.value)));const thinkingLabel=computed(()=>(agentObservationLost.value&&agentActive.value?`Assistant stop not yet confirmed`:``)||agentConnectionThinkingLabel({active:!sessionInteractionDisabled.value,status:composerConnectionStatus.value})||(agentActive.value&&activeAgentTurn.value.phase===`compacting`?`Compacting conversation context…`:``)||(agentActive.value&&activeAgentTurn.value.phase===`background`?`Reply ready · background task still running…`:``)||(unref(props.conversationRuntime?.phase)===`compacting`?`Summarising the assistant's memory before sending…`:``)||(agentActive.value?unref(assistantProgressLabel):``)||(agentActive.value?`Assistant is working...`:``)||(composerSending.value?`Sending to assistant...`:``));const composerHint=computed(()=>agentObservationLost.value?agentActive.value?`The stop is not yet confirmed. Your draft is kept; you can retry Stop.`:`The assistant stopped because its progress could not be tracked. Send a message to continue.`:structuredQuestionActive.value?`Answer the assistant, then send one combined reply.`:``);const composerPlaceholder=computed(()=>numberedQuestions.value.length?`Optional additional context…`:answerChoices.value.length?`Choose an answer above, or type another answer…`:``);const workspaceSetup=computed(()=>{const value=props.session?.workspaceSetup;return value&&typeof value===`object`&&!Array.isArray(value)?value:{}});const workspaceSetupStatus=computed(()=>{const status=normalizedAgentTurnText(workspaceSetup.value?.status);if(status===`required`&&[`queued`,`running`,`starting`].includes(normalizedAgentTurnText(props.workState?.updateOperation?.status)))return`pending`;return[`ambiguous`,`failed`,`required`,`running`,`succeeded`].includes(status)?status:`unconfigured`});const workspaceSetupActivityKey=computed(()=>{const operationKey=normalizedAgentTurnText(workspaceSetup.value?.startedAt||workspaceSetup.value?.updatedAt);return operationKey?`workspace-setup:${operationKey}`:``});const workspaceSetupDismissed=computed(()=>Boolean(workspaceSetupActivityKey.value&&shortActionDismissals.value.workspaceSetup===workspaceSetupActivityKey.value));const workspaceSetupRunning=computed(()=>[`pending`,`running`].includes(workspaceSetupStatus.value));const workspaceSetupActionVisible=computed(()=>Boolean(props.sourceWorkspaceAvailable&&sessionId.value&&workspaceSetupStatus.value!==`unconfigured`));const connectedRepositoryCount=computed(()=>{try{return JSON.parse(props.session?.metadata?.connected_sources||`null`)?.sources?.length||0}catch{return 0}});const connectedUpdateActionVisible=computed(()=>workspaceSetupActionVisible.value&&connectedRepositoryCount.value>0);const workspaceSetupNeedsAttention=computed(()=>[`failed`,`ambiguous`,`required`].includes(workspaceSetupStatus.value));const workspaceSetupOutput=computed(()=>normalizedAgentTurnText(workspaceSetup.value?.transcript)||workspaceSetupDiagnostic.value);const workspaceSetupTitle=computed(()=>({ambiguous:`Workspace setup needs a choice`,failed:`Workspace preparation failed`,required:`Workspace preparation required`,pending:`Waiting for session update…`,running:`Preparing workspace…`,succeeded:`Workspace prepared`})[workspaceSetupStatus.value]||``);const workspaceSetupDiagnostic=computed(()=>workspaceSetupRetryError.value||normalizedAgentTurnText(workspaceSetup.value?.diagnostic));const workspaceSetupCurrentLabel=computed(()=>{if(workspaceSetupStatus.value===`required`)return workspaceSetupDiagnostic.value;if(workspaceSetupStatus.value===`pending`)return`Workspace preparation will start automatically after the update.`;return workspaceSetupRunning.value?normalizedAgentTurnText(workspaceSetup.value?.currentLabel):``});const workspaceSetupError=computed(()=>workspaceSetupRetryError.value||(workspaceSetupNeedsAttention.value&&workspaceSetupStatus.value!==`required`?workspaceSetupDiagnostic.value:``));const workspaceSetupRetryDisabled=computed(()=>Boolean(workspaceSetupRunning.value||workspaceSetupRetrying.value||repositoryOperationActive.value||saveWorkSending.value||saveWorkOperationActive.value||agentActive.value||!sessionId.value||props.sessionSelectionArchived));const workspaceSetupAskDisabled=computed(()=>Boolean(!workspaceSetupNeedsAttention.value||workspaceSetupFixSending.value||!props.active||!sessionId.value||props.sessionSelectionArchived||repositoryOperationActive.value||!assistantJuniorAllowed.value));async function retryWorkspaceSetup(){if(workspaceSetupRetryDisabled.value)return false;shortActionDismissals.value={...shortActionDismissals.value,workspaceSetup:``};if(shortActionDismissalsStorageKey.value)writeLocalStorageJson(shortActionDismissalsStorageKey.value,shortActionDismissals.value);workspaceSetupRetryError.value=``;workspaceSetupRetrying.value=true;try{return await props.retryWorkspaceSetup()!==false}catch(error){workspaceSetupRetryError.value=normalizedAgentTurnText(error?.message||error)||`Workspace preparation could not be started.`;return false}finally{workspaceSetupRetrying.value=false}}function dismissWorkspaceSetupActivity(){return dismissShortAction(`workspaceSetup`,workspaceSetupActivityKey.value)}async function askCodexToFixWorkspaceSetup(){if(workspaceSetupAskDisabled.value||typeof requestTemporaryAi!==`function`)return false;const setup={...workspaceSetup.value,diagnostic:workspaceSetupDiagnostic.value};workspaceSetupFixSending.value=true;try{const result=await requestTemporaryAi({completionMessage:`AI repair finished. Vibe64 is verifying workspace preparation now.`,dedupeKey:[`workspace-setup`,sessionId.value,workspaceSetupStatus.value,normalizedAgentTurnText(setup.updatedAt),normalizedAgentTurnText(setup.diagnostic)].join(`|`),displayMessage:`Fix workspace preparation.`,failureMessage:`Temporary AI stopped before confirming completion. Vibe64 is checking whether its edits repaired workspace preparation.`,message:workspaceSetupFixPrompt(setup),nextStepMessage:`When the AI finishes, Vibe64 will automatically retry workspace preparation to verify the repair.`,recoveryNotice:TEMPORARY_AI_RECOVERY_NOTICE,title:`Fix workspace preparation`});const accepted=result!==false&&result?.ok!==false;const taskId=normalizedAgentTurnText(result?.taskId);if(accepted&&taskId)workspaceSetupFixTaskId.value=taskId;return accepted}finally{workspaceSetupFixSending.value=false}}async function handleTemporaryAiTaskFinished(task={},reportRecovery=()=>{},{force=false}={}){const taskId=normalizedAgentTurnText(task?.id);const status=normalizedAgentTurnText(task?.status);if(task.sessionId===sessionId.value&&task.dedupeKey===subsystemMapTaskKey.value&&[`completed`,`failed`].includes(status)){systemReloadVersion.value+=1;return`subsystem-map`}if(task.recoveryOperation===`update`){const runId=normalizedAgentTurnText(task.runId);if(!taskId||!runId||task.sessionId!==sessionId.value||task.busy||[`starting`,`inProgress`].includes(status)||saveWorkSending.value||saveWorkOperationActive.value||[`checking`,`unconfirmed`].includes(task.recoveryOutcome)||!force&&(status!==`completed`||task.outcomeKind!==`complete`||checkedUpdateRepairRuns.get(taskId)===runId))return false;checkedUpdateRepairRuns.set(taskId,runId);return verifySessionUpdate(task,reportRecovery,!force?normalizedAgentTurnText(task.runConflictId):``)}if(taskId!==workspaceSetupFixTaskId.value||![`completed`,`failed`].includes(status))return false;workspaceSetupFixTaskId.value=``;if(workspaceSetupNeedsAttention.value)await retryWorkspaceSetup();return`workspace-setup`}async function verifySessionUpdate(task,reportRecovery,reviewedConflictId,{retryAi=true}={}){const taskId=task?.id;const checkingSessionId=sessionId.value;const checkingProjectSlug=projectSlug.value;const requestId=taskId?crypto.randomUUID():``;const checkpoint=taskId?reportRecovery(taskId,{status:`checking`,message:`Checking Update…`,recoveryRequestId:requestId}):true;const checkpointSaved=checkpoint&&typeof checkpoint.then===`function`?await checkpoint:checkpoint;if(checkingSessionId!==sessionId.value||checkingProjectSlug!==projectSlug.value)return false;if(checkpointSaved===false){if(taskId)reportRecovery(taskId,{status:`failed`,message:`Update was not started because its recovery checkpoint could not be saved. Try again after the save error is resolved.`});return false}const result=await updateBeforeSave({reviewedConflictId,...requestId?{requestId}:{}});const work=typeof props.refreshSessionWork===`function`?await props.refreshSessionWork().catch(()=>null):null;await nextTick();if(checkingSessionId!==sessionId.value||checkingProjectSlug!==projectSlug.value)return false;if(!taskId)return`repository-update`;const operation=work?.updateOperation?.requestId===requestId?work.updateOperation:null;if([`queued`,`running`,`starting`].includes(operation?.status))return`repository-update`;const succeeded=operation?operation.status===`ready`:result?.ok===true;const confirmedFailure=operation?.status===`failed`||[`vibe64_agent_write_mode_busy`].includes(saveWorkFailure.value?.code)||Boolean(saveWorkFailure.value?.code?.startsWith(`vibe64_session_update_`));const outcome={status:succeeded?`succeeded`:confirmedFailure?`failed`:`unconfirmed`,message:succeeded?`Session updated. Your changes were preserved. Nothing was published.`:confirmedFailure?`Update still needs attention: ${operation?.error||saveWorkError.value||`The operation failed.`}`:`Vibe64 could not confirm this Update result. Check the session's current Update status before trying again.`};if(confirmedFailure&&(saveWorkConflictFailure.value||operation?.conflictRecovery)){const failure=saveWorkFailure.value||operation;const recovery=failure?.details?.conflictRecovery||operation?.conflictRecovery;outcome.recoveryConflictId=recovery?.reviewId||``;if(retryAi){outcome.retryKey=JSON.stringify([failure?.code,recovery?.reviewId||recovery?.canonicalCommit||``,failure?.details?.conflictPaths||saveWorkError.value]);outcome.retryMessage=[`Vibe64 ran Update after the prepared repair, but it did not succeed. The working-tree edits remain. Inspect the current state and repair only the remaining conflicts; do not start over or repeat completed work.`,`Latest Update diagnostic:\n${saveWorkError.value}`,UPDATE_REPAIR_MESSAGES.handoff].join(`
|
|
17
|
-
|
|
18
|
-
`)}}reportRecovery(taskId,outcome);return`repository-update`}async function askCodexToFixPreviewIdentity(input={}){if(typeof requestTemporaryAi!==`function`||!assistantJuniorAllowed.value||!props.active||!sessionId.value||props.sessionSelectionArchived||repositoryOperationActive.value)return false;const identity=input?.identity||{};const identityName=normalizedAgentTurnText(identity.name)||`the selected identity`;const error=normalizedAgentTurnText(input?.error);const result=await requestTemporaryAi({completionMessage:`AI repair finished. Try the preview identity again from the sign-in menu.`,dedupeKey:[`preview-identity`,sessionId.value,normalizedAgentTurnText(identity.type),normalizedAgentTurnText(identity.value),error].join(`|`),displayMessage:`Fix preview sign-in for ${identityName}.`,failureMessage:`Temporary AI stopped before completing the preview identity repair. Review the error and progress below before trying again.`,message:previewIdentityFixPrompt(input),nextStepMessage:`When the AI finishes, try this preview identity again from the sign-in menu.`,recoveryNotice:TEMPORARY_AI_RECOVERY_NOTICE,title:`Fix preview identity`});return result!==false&&result?.ok!==false}function temporaryAiRecoveryUnavailable(isUpdate=false){return Boolean(repositoryRecoverySending.value||typeof requestTemporaryAi!==`function`||!(isUpdate?assistantSeniorAllowed.value:assistantJuniorAllowed.value)||!props.active||!sessionId.value||props.sessionSelectionArchived||repositoryOperationActive.value)}async function fixRepositoryActionError(){if(temporaryAiRecoveryUnavailable(saveWorkActivityIsUpdate.value)||!saveWorkCanResolveWithTemporaryAi.value)return false;const action=saveWorkActivityIsUpdate.value?`Update`:`Save`;repositoryRecoverySending.value=true;try{const result=await requestTemporaryAi({completionMessage:action===`Update`?UPDATE_REPAIR_MESSAGES.completion:`AI repair finished. Review its result, then retry ${action}.`,dedupeKey:repositoryTemporaryAiDedupeKey({code:saveWorkFailure.value?.code,diagnostic:saveWorkError.value,sessionId:sessionId.value}),displayMessage:`Fix this ${action} problem without losing work.`,failureMessage:`Temporary AI stopped before completing the ${action} repair. Review the error and progress below before retrying.`,message:[`Help resolve this Vibe64 ${action} problem. Inspect the current session and canonical repository state, preserve all work, and do not publish until the conflict is understood:`,REPOSITORY_TEMPORARY_AI_GIT_BOUNDARY,action===`Update`?UPDATE_REPAIR_MESSAGES.handoff:``,saveWorkError.value].filter(Boolean).join(`
|
|
19
|
-
|
|
20
|
-
`),nextStepMessage:action===`Update`?UPDATE_REPAIR_MESSAGES.nextStep:`Review the repair, then retry ${action}.`,recoveryNotice:TEMPORARY_AI_RECOVERY_NOTICE,recoveryOperation:action===`Update`?`update`:``,recoveryConflictId:saveWorkFailure.value?.details?.conflictRecovery?.reviewId||``,title:`Resolve ${action}`});return result!==false&&result?.ok!==false}finally{repositoryRecoverySending.value=false}}async function fixRepositoryError({code=``,error=``,title=`Resolve repository problem`}={}){const diagnostic=normalizedAgentTurnText(error);const isUpdate=[`vibe64_session_update_conflict`,`vibe64_session_update_history_diverged`].includes(code);const isIncoming=code===`vibe64_incoming_merge_conflict`;if(temporaryAiRecoveryUnavailable(isUpdate||isIncoming)||!diagnostic)return false;repositoryRecoverySending.value=true;try{const result=await requestTemporaryAi({completionMessage:isUpdate?UPDATE_REPAIR_MESSAGES.completion:`AI repair finished. Review its result, then retry the repository operation.`,dedupeKey:repositoryTemporaryAiDedupeKey({code,diagnostic,sessionId:sessionId.value}),displayMessage:`Fix this repository problem without losing work.`,failureMessage:`Temporary AI stopped before completing the repository repair. Review the error and progress below before retrying.`,message:[`Help resolve this Vibe64 repository problem. Inspect the current session and canonical repository state, preserve all work, and do not publish until the conflict is understood:`,REPOSITORY_TEMPORARY_AI_GIT_BOUNDARY,isUpdate?UPDATE_REPAIR_MESSAGES.handoff:``,isIncoming?`Repair only the listed conflicting files in this receiving session's worktree. Inspect both exact reviewed commits, preserve both sides' intended behavior and all unrelated/staged work. Do not commit, merge, rebase or push. Return to Incoming changes → Review resolved conflicts; only the person's reviewed Merge may integrate this contribution.`:``,diagnostic].join(`
|
|
21
|
-
|
|
22
|
-
`),...isIncoming?{initialRouting:{mode:`senior`,review:false}}:{},nextStepMessage:isUpdate?UPDATE_REPAIR_MESSAGES.nextStep:`Review the repair, then retry the repository operation.`,recoveryNotice:TEMPORARY_AI_RECOVERY_NOTICE,recoveryOperation:isUpdate?`update`:``,recoveryConflictId:isUpdate?saveWorkFailure.value?.details?.conflictRecovery?.reviewId||``:``,title});return result!==false&&result?.ok!==false}finally{repositoryRecoverySending.value=false}}function updateComposerAttachments(attachments=[]){composerAttachments.value=Array.isArray(attachments)?attachments:[]}function updatePreviewAttachmentState(state={}){previewAttachmentState.value={attachDiagnostics:typeof state.attachDiagnostics===`function`?state.attachDiagnostics:null,capture:typeof state.capture===`function`?state.capture:null,captureAvailable:state.captureAvailable===true,captureBusy:state.captureBusy===true,diagnosticsAvailable:state.diagnosticsAvailable===true,diagnosticsBusy:state.diagnosticsBusy===true}}function captureVisiblePreview(){return previewAttachmentState.value.capture?.()??false}function attachPreviewDiagnostics(){return previewAttachmentState.value.attachDiagnostics?.()??false}function nextMessageId(){messageSequence+=1;return createChatMessageId({sequence:messageSequence})}function settleComposerRetry(retry=composerRetrySubmission.value){return props.conversationRuntime?.settleDraftRetry(retry)??false}async function sendChatPayload(payload={},{messageId:existingMessageId=``,submissionKind=`send`,composer=false,questionText=``}={}){if(!props.conversationRuntime?.canSubmit.value||composerSending.value&&!composerQueueing.value||!normalizedAgentTurnText(payload?.message))return false;const messageId=String(existingMessageId||``).trim()||nextMessageId();const sendingSessionId=sessionId.value;const sendingProjectSlug=projectSlug.value;const sendingActorKey=actorKey.value;composerSubmissionKind.value=submissionKind===`steer`?`steer`:`send`;try{const response=await props.conversationRuntime[composer?`submitDraft`:`send`]({...payload,agentSettings:Object.hasOwn(payload,`agentSettings`)?payload.agentSettings:requestAgentSettings.value||null},{messageId,submissionKind,...composer?{questionText}:{}});if(sessionId.value!==sendingSessionId||projectSlug.value!==sendingProjectSlug||actorKey.value!==sendingActorKey)return false;const accepted=response!==false&&response?.ok!==false;if(accepted)conversationFollowLatestKey.value+=1;if(accepted&&payload.attachmentIds?.length)onAttachmentsAccepted?.(payload.attachmentIds);return accepted}catch(error){if(sessionId.value!==sendingSessionId||projectSlug.value!==sendingProjectSlug||actorKey.value!==sendingActorKey)return false;if(error?.code===`vibe64_assistant_routing_cancelled`){restoreCancelledMessage(messageId);return false}const message=normalizedAgentTurnText(error?.message||error)||`Message could not be sent.`;if(error?.code===`vibe64_assistant_context_full`)contextFullFailure.value={message,payload,options:{messageId,submissionKind,composer,questionText}};const attention=executionAttentionForError(error,message);if(attention)emit(`execution-attention`,attention);return false}finally{if(sessionId.value===sendingSessionId&&projectSlug.value===sendingProjectSlug&&actorKey.value===sendingActorKey&&!composerSending.value)composerSubmissionKind.value=``}}function retryContextFull(){const failure=contextFullFailure.value;contextFullFailure.value=null;return failure?sendChatPayload(failure.payload,failure.options):false}async function submitComposerMessage(){if(!composerCanSubmit.value)return false;const retry=composerRetryMatchesDraft.value?composerRetrySubmission.value:null;const draftSnapshot=retry?.draftSnapshot||composerDraft.value;const{message,questionText}=questionState.capture(draftSnapshot);const payload=retry?.payload||chatMessagePayload(message,composerAttachments.value);if(!payload)return false;const submissionKind=retry?.submissionKind||(agentSteerable.value?`steer`:`send`);const questionTextSnapshot=retry?.questionTextSnapshot||questionText;const messageId=retry?.messageId||nextMessageId();questionState.markSubmitted(questionTextSnapshot);return sendChatPayload(payload,{messageId,submissionKind,composer:true,questionText:questionTextSnapshot})}function optimisticMessageById(messageId=``){const request=routingRequest.value;const local=messageDelivery.value?.find(messageId);return request?.messageId===messageId&&routedChatMessage(request,local)||local}async function cancelOptimisticMessage(messageId=``){const message=optimisticMessageById(messageId);if(!message||message.status===`accepted`||message.checking||discardingMessageIds.has(messageId))return false;const delivery=messageDelivery.value;const runtime=props.conversationRuntime;const routed=routingRequest.value?.messageId===messageId;discardingMessageIds.add(messageId);try{if(routed&&message.status===`uncertain`){const receipt=await runtime.inspectDelivery(messageId);if(receipt?.status===`accepted`)return true;if(receipt?.status!==`not-sent`||receipt.messageId!==messageId)return false}if(runtime!==props.conversationRuntime)return false;if(routed&&routingRequest.value?.messageId===messageId&&await props.interruptAgentTurn({reason:`cancel-routing`})===false)return false;if(message.status===`pending`&&await props.cancelAgentMessage(messageId)===false)return false;if(composerRetrySubmission.value?.messageId===messageId)settleComposerRetry(composerRetrySubmission.value);delivery?.remove(messageId);return true}finally{discardingMessageIds.delete(messageId)}}async function editOptimisticMessage(messageId=``){const message=optimisticMessageById(messageId);if(!message||message.status!==`failed`)return false;if(!await cancelOptimisticMessage(messageId))return false;const current=String(composerDraft.value||``);const draft=!current||current.startsWith(message.text)?current||message.text:`${message.text}\n\n${current}`;composerDraft.value=draft;return true}async function resendOptimisticMessage(messageId=``){const message=optimisticMessageById(messageId);if(!message||message.checking||![`failed`,`uncertain`].includes(message.status))return false;const retry=composerRetrySubmission.value?.messageId===messageId?composerRetrySubmission.value:null;if(message.status===`uncertain`){if((await props.conversationRuntime.inspectDelivery(messageId))?.status===`accepted`){settleComposerRetry(retry);return true}if(routingRequest.value?.messageId===messageId&&routingRequest.value?.delivery===`failed`)return false}messageDelivery.value?.remove(messageId);const accepted=await sendChatPayload(message.payload,{messageId,submissionKind:retry?.submissionKind||(agentSteerable.value?`steer`:`send`)});if(accepted)settleComposerRetry(retry);else if(!messageDelivery.value?.find(messageId))messageDelivery.value?.state.messages.push(message);return accepted}const toolbarRepositoryWorkState=computed(()=>{const selectedId=String(props.session?.sessionId||``).trim();return(Array.isArray(props.sessionToolbar?.sessions)?props.sessionToolbar.sessions:[]).find(session=>String(session?.sessionId||``).trim()===selectedId)?.repositoryWorkState||null});const saveWorkRepositoryState=computed(()=>{const inspected=props.workState&&typeof props.workState===`object`?props.workState:{};const monitored=toolbarRepositoryWorkState.value;const inspectedAt=Date.parse(String(inspected.checkedAt||``))||0;const monitoredAt=Date.parse(String(monitored?.checkedAt||``))||0;const monitoredState=String(monitored?.state||``);if(!monitored||monitored.updateStatusPending!==true&&monitoredAt<inspectedAt)return inspected;const monitoredUnsaved=monitoredState===`unsaved`?true:[`saved`,`update_available`].includes(monitoredState)?false:inspected.unsaved;return{...inspected,checkedAt:monitored.checkedAt||inspected.checkedAt,error:monitoredState===`unavailable`?inspected.error||`Repository status is unavailable.`:``,loading:monitoredState===`checking`,unsaved:monitoredUnsaved,updateAvailable:monitored.updateAvailable===true||[`update_available`,`updating`].includes(monitoredState),updateStatusPending:monitored.updateStatusPending===true||monitoredState===`updating`}});const saveConnectedFirst=computed(()=>saveWorkRepositoryState.value?.connectedSaveRequired===true);const saveWorkUnsaved=computed(()=>saveWorkRepositoryState.value?.unsaved===true||saveConnectedFirst.value);const saveWorkRequiresUpdate=computed(()=>Boolean(!saveConnectedFirst.value&&(saveWorkRepositoryState.value?.updateAvailable===true||saveWorkRepositoryState.value?.updateStatusPending===true)));const saveWorkRepositoryBusy=computed(()=>[`saving`,`updating`].includes(String(toolbarRepositoryWorkState.value?.state||``)));const repositoryAssistantStateSettled=computed(()=>[`connected`,`restricted`,`unavailable`,`failed`].includes(props.agentConnectionStatus));const updateWorkDisabled=computed(()=>Boolean(sessionInteractionDisabled.value||!repositoryAssistantStateSettled.value||agentActive.value||composerSending.value||saveWorkSending.value||saveWorkRepositoryBusy.value||saveWorkRepositoryState.value?.loading||saveWorkRepositoryState.value?.error));const saveWorkDisabled=computed(()=>Boolean(updateWorkDisabled.value||!saveWorkRequiresUpdate.value&&!saveWorkUnsaved.value&&!saveWorkRepositoryState.value?.connectedRequirementsPresent&&!saveWorkRepositoryState.value?.connectedInspectionError));const sessionUpdateLabel=computed(()=>{const branch=saveWorkRepositoryState.value?.destination?.branch;return branch?`Update session from ${branch}`:`Update session`});const saveWorkActionLabel=computed(()=>saveConnectedFirst.value?`Save connected first`:saveWorkRequiresUpdate.value?sessionUpdateLabel.value:`Review changes`);const saveWorkHeaderAriaLabel=computed(()=>saveConnectedFirst.value?`Save connected first`:saveWorkRequiresUpdate.value?sessionUpdateLabel.value:`Review selected session changes`);const saveWorkHeaderVisible=computed(()=>Boolean(props.sourceWorkspaceAvailable!==false&&props.active&&sessionId.value));const saveWorkTitle=computed(()=>{if(!repositoryAssistantStateSettled.value){if(props.agentConnectionStatus===`initializing`)return`Checking assistant activity before saving or updating`;return props.agentConnectionStatus===`reconciling`?`Checking the assistant connection before saving or updating`:`Waiting for the assistant to reconnect before saving or updating`}if(repositoryOperationActive.value||saveWorkRepositoryBusy.value)return`Wait for the current repository operation to finish`;if(agentActive.value||composerSending.value)return`Wait for the assistant turn to finish before saving or updating`;if(saveWorkRepositoryState.value?.loading)return`Checking whether this session has work to save`;if(saveWorkRepositoryState.value?.error)return`Repository status is unavailable; check for updates before saving`;if(saveConnectedFirst.value)return`Review and push connected contributions before saving this project`;if(saveWorkRequiresUpdate.value)return saveWorkUnsaved.value?`${sessionUpdateLabel.value}, preserving its unsaved work. Save will be available when the update finishes.`:`${sessionUpdateLabel.value} to load its latest saved changes.`;if(!saveWorkUnsaved.value&&!saveWorkRepositoryState.value?.connectedRequirementsPresent&&!saveWorkRepositoryState.value?.connectedInspectionError)return`No work to save`;return`Review changes and choose where to commit them`});watch(()=>{const attempt=saveWorkAttempt.value;const activeOperation=props.workState?.activeOperation;return{attempt,kind:String(activeOperation?.kind||``).trim(),operationId:String(activeOperation?.operationId||``).trim()}},({attempt,kind,operationId})=>{if(!attempt||attempt.operationId||!operationId||kind!==attempt.kind)return;saveWorkAttempt.value={...attempt,operationId}});const saveWorkOperation=computed(()=>{const saveOperation=props.workState?.operation||null;const updateOperation=props.workState?.updateOperation||null;const attempt=saveWorkAttempt.value;if(attempt){const operation=attempt.kind===`update`?updateOperation:saveOperation;const operationId=String(operation?.operationId||``).trim();return attempt.operationId&&operationId===attempt.operationId?operation:null}const activeOperation=props.workState?.activeOperation;const activeOperationId=String(activeOperation?.operationId||``).trim();if(activeOperationId){const operation=activeOperation?.kind===`update`?updateOperation:saveOperation;return String(operation?.operationId||``).trim()===activeOperationId?operation:null}const saveStatus=String(saveOperation?.status||``).trim().toLowerCase();const updateStatus=String(updateOperation?.status||``).trim().toLowerCase();const saveFailed=saveStatus===`failed`;const updateFailed=updateStatus===`failed`;if(saveFailed!==updateFailed)return updateFailed?updateOperation:saveOperation;if(saveFailed&&updateFailed)return String(updateOperation?.updatedAt||``)>String(saveOperation?.updatedAt||``)?updateOperation:saveOperation;return null});const saveWorkActivityIsUpdate=computed(()=>{if(saveWorkAttempt.value)return saveWorkAttempt.value.kind===`update`;return Boolean(props.workState?.updateOperation&&saveWorkOperation.value===props.workState.updateOperation||!saveWorkOperation.value&&saveWorkRequiresUpdate.value)});const saveWorkActivityKey=computed(()=>{const operationId=normalizedAgentTurnText(saveWorkOperation.value?.operationId);if(!operationId)return``;return`${saveWorkActivityIsUpdate.value?`update-session`:`save-work`}:${operationId}`});const saveWorkActivityDismissed=computed(()=>Boolean(saveWorkActivityKey.value&&(shortActionDismissals.value.saveWork===saveWorkActivityKey.value||shortActionDismissals.value[saveWorkActivityKey.value]===true)));const saveWorkActivityLabel=computed(()=>saveWorkActivityIsUpdate.value?sessionUpdateLabel.value:`Save work`);const saveWorkOperationActive=computed(()=>[`queued`,`running`,`starting`].includes(String(saveWorkOperation.value?.status||``).trim().toLowerCase()));const saveWorkOutput=computed(()=>Array.isArray(saveWorkOperation.value?.events)?saveWorkOperation.value.events.filter(event=>normalizedAgentTurnText(event.message)).map(event=>[event.at,event.message].filter(Boolean).join(` `)).join(`
|
|
23
|
-
`):``);const saveWorkStatus=computed(()=>String(saveWorkOperation.value?.status||(saveWorkSending.value?`starting`:``)));const saveWorkStage=computed(()=>String(saveWorkOperation.value?.stage||(saveWorkSending.value&&!saveWorkOperation.value?`Waiting for the session to be ready`:``)));watch(()=>({code:String(saveWorkOperation.value?.code||``),details:saveWorkOperation.value?.details||(saveWorkOperation.value?.conflictRecovery?{conflictPaths:saveWorkOperation.value.conflictPaths,conflictRecovery:saveWorkOperation.value.conflictRecovery}:null),error:String(saveWorkOperation.value?.error||``),operationId:String(saveWorkOperation.value?.operationId||``),status:String(saveWorkOperation.value?.status||``).trim().toLowerCase()}),operation=>{if(operation.code===`vibe64_session_save_update_required`){if(saveWorkFailure.value?.code===operation.code){saveWorkError.value=``;saveWorkFailure.value=null}return}if(operation.status!==`failed`||!operation.error)return;saveWorkError.value=operation.error;saveWorkFailure.value={code:operation.code,details:operation.details,message:operation.error}},{immediate:true});const saveWorkConflictFailure=computed(()=>[`vibe64_session_save_history_diverged`,`vibe64_session_update_conflict`,`vibe64_session_update_history_diverged`].includes(String(saveWorkFailure.value?.code||``)));const saveWorkCanResolveWithTemporaryAi=computed(()=>Boolean(saveWorkError.value));const updateConflictRecovery=computed(()=>{const recovery=saveWorkFailure.value?.details?.conflictRecovery;return saveWorkFailure.value?.code===`vibe64_session_update_conflict`&&recovery?.reviewId&&recovery.conflictPaths?.length?recovery:null});const resolvedUpdateReview=ref(null);watch(()=>updateConflictRecovery.value?.reviewId,()=>{resolvedUpdateReview.value=null},{flush:`sync`});function reviewResolvedUpdate(){if(updateWorkDisabled.value||repositoryOperationActive.value||props.sessionRenewal?.sourceOperationsSuspended||!updateConflictRecovery.value)return false;const{reviewId,conflictPaths}=updateConflictRecovery.value;resolvedUpdateReview.value={reviewId,conflictPaths:[...conflictPaths]};return true}function applyResolvedUpdate(task=null,reportRecovery=()=>{}){const review=resolvedUpdateReview.value;if(updateWorkDisabled.value||repositoryOperationActive.value||props.sessionRenewal?.sourceOperationsSuspended||!review||review.reviewId!==updateConflictRecovery.value?.reviewId||task&&(task.sessionId!==sessionId.value||task.recoveryOperation!==`update`||task.busy||[`starting`,`inProgress`].includes(task.status)||[`checking`,`unconfirmed`].includes(task.recoveryOutcome)))return false;resolvedUpdateReview.value=null;return verifySessionUpdate(task,reportRecovery,review.reviewId,{retryAi:false})}const saveWorkRetryable=computed(()=>Boolean(saveWorkError.value&&!saveWorkDisabled.value&&!saveWorkConflictFailure.value));async function updateBeforeSave(input={}){const requestSequence=++repositoryRequestSequence;const updatingSessionId=sessionId.value;const updatingProjectSlug=projectSlug.value;const requestIsCurrent=()=>requestSequence===repositoryRequestSequence&&sessionId.value===updatingSessionId&&projectSlug.value===updatingProjectSlug;saveWorkAttempt.value={kind:`update`,operationId:``};saveWorkSending.value=true;saveWorkError.value=``;saveWorkFailure.value=null;try{const result=await props.updateSessionWork(input);if(!requestIsCurrent())return false;saveWorkAttempt.value=null;return result}catch(error){if(!requestIsCurrent())return false;saveWorkFailure.value=error&&typeof error===`object`?{code:String(error.code||error.response?.code||``),details:error.details||error.response?.details||null,message:error instanceof Error?error.message:String(error||``)}:null;saveWorkError.value=error instanceof Error?error.message:String(error||`This session could not be updated.`);return false}finally{if(requestIsCurrent())saveWorkSending.value=false}}function requestSaveWork(){if(saveWorkDisabled.value)return false;if(saveWorkRequiresUpdate.value)return updateBeforeSave();saveWorkReview.value=saveWorkRepositoryState.value?.destination?{...saveWorkRepositoryState.value.destination}:null;saveWorkConnectedReview.value=saveConnectedFirst.value?(saveWorkRepositoryState.value?.connectedReview||[]).map(item=>({projectSlug:item.projectSlug,destination:{...item.destination}})):null;saveWorkConfirmOpen.value=true;return true}function retrySaveWork(){return saveWorkRetryable.value?requestSaveWork():false}function dismissSaveWorkActivity(){if(saveWorkSending.value||saveWorkOperationActive.value)return false;if(!saveWorkActivityKey.value&&saveWorkError.value){saveWorkError.value=``;saveWorkFailure.value=null;return true}return dismissShortAction(`saveWork`,saveWorkActivityKey.value)}function cancelSaveWork(){saveWorkConfirmOpen.value=false}async function confirmSaveWork(){if(saveWorkDisabled.value)return false;const requestSequence=++repositoryRequestSequence;const savingSessionId=sessionId.value;const savingProjectSlug=projectSlug.value;const requestIsCurrent=()=>requestSequence===repositoryRequestSequence&&sessionId.value===savingSessionId&&projectSlug.value===savingProjectSlug;saveWorkAttempt.value={kind:`save`,operationId:``};saveWorkSending.value=true;saveWorkError.value=``;saveWorkFailure.value=null;saveWorkConnectedResults.value=[];saveWorkConfirmOpen.value=false;try{const result=await props.saveSessionWork({destinationReview:saveWorkReview.value,...saveWorkConnectedReview.value!==null?{connectedReview:saveWorkConnectedReview.value}:{}});if(!requestIsCurrent())return false;saveWorkAttempt.value=null;saveWorkConnectedResults.value=result?.connected||[];return result}catch(error){if(!requestIsCurrent())return false;saveWorkFailure.value=error&&typeof error===`object`?{code:String(error.code||error.response?.code||``),details:error.details||error.response?.details||null,message:error instanceof Error?error.message:String(error||``)}:null;saveWorkError.value=error instanceof Error?error.message:String(error||`Session work could not be saved.`);saveWorkConnectedResults.value=saveWorkFailure.value?.details?.connected||[];return false}finally{if(requestIsCurrent())saveWorkSending.value=false}}async function requestAgentInterrupt(){if(!agentStopEnabled.value)return false;const stoppingSessionId=sessionId.value;const stoppingProjectSlug=projectSlug.value;const stoppingTurnId=normalizedAgentTurnText(activeAgentTurn.value.id);interrupting.value=true;let acknowledgeStop;const receipt=new Promise(resolve=>{acknowledgeStop=resolve});const stopWatchingReceipt=watch([sessionId,projectSlug,()=>activeAgentTurn.value.id,()=>activeAgentTurn.value.active],([currentSessionId,currentProjectSlug,turnId,active])=>{if(currentSessionId!==stoppingSessionId||currentProjectSlug!==stoppingProjectSlug)acknowledgeStop(false);else if(stoppingTurnId&&normalizedAgentTurnText(turnId)===stoppingTurnId&&active===false)acknowledgeStop(true)});try{return await Promise.race([props.interruptAgentTurn({reason:`user_interrupt`}),receipt])!==false}finally{stopWatchingReceipt();if(sessionId.value===stoppingSessionId&&projectSlug.value===stoppingProjectSlug)interrupting.value=false}}const chatTurns=computed(()=>{if(!messageDelivery.value||props.conversationLog?.initializing)return[];return chatTurnsWithRouting(messageDelivery.value.turns(Array.isArray(props.conversationLog?.turns)?props.conversationLog.turns:[]),routingRequest.value,composerSending.value).filter(turn=>!turn.optimistic||!discardingMessageIds.has(turn.optimistic.id))});const emptyConversationWelcome=computed(()=>sessionId.value&&!props.conversationLog?.loading&&!props.conversationLog?.error&&!chatTurns.value.length?emptyConversationWelcomeText({existingProject:workspaceSetupStatus.value!==`unconfigured`,learning:Boolean(normalizedAgentTurnText(props.learningAttemptId)),preferredName:preferredName.value,renewedSession:Boolean(normalizedAgentTurnText(props.session?.metadata?.renewed_from))}):``);const conversationLogVisible=computed(()=>Boolean(props.active));const conversationScrollKey=computed(()=>sessionId.value);const chatReloading=ref(false);const chatReloadAvailable=computed(()=>Boolean(props.active&&props.session&&(typeof props.refreshSessionData===`function`||typeof props.conversationLog?.reload===`function`)));async function reloadChatPane(){if(!chatReloadAvailable.value||chatReloading.value)return false;chatReloading.value=true;try{await Promise.allSettled([props.refreshSessionData?.(),props.conversationLog?.reload?.()]);return true}finally{chatReloading.value=false}}async function loadMoreChatTurns(request={}){return typeof props.conversationLog?.loadMore===`function`?props.conversationLog.loadMore(request):false}const rightPaneTab=ref(`preview`);const lastDashboardRoutePath=ref(``);const sourceEditorOpenRequest=ref(null);const systemRestoreRequest=ref(null);const systemReloadVersion=ref(0);const subsystemMapTaskKey=computed(()=>`subsystem-map:${sessionId.value}`);const databaseOpenRequest=ref(null);const systemReturnContext=ref(null);let sourceEditorOpenSequence=0;let systemRestoreSequence=0;const projectPaneValue=computed(()=>normalizeProjectPane$1(props.projectPane));const routeSessionToolId=computed(()=>{const dashboardPrefix=`${normalizeProjectRoutePath(projectAppPath(projectSlug.value,`/dashboard`))}/`;const routePath=`${normalizeProjectRoutePath(route.path)}/`;if(!routePath.startsWith(dashboardPrefix))return``;const segment=routePath.slice(dashboardPrefix.length).split(`/`)[0]||``;const toolId=vibe64SessionToolIdFromRouteSegment(segment);return DIRECT_SESSION_TOOL_IDS.has(toolId)?toolId:``});const routeOutsideLessonDashboard=computed(()=>{if(!practiceLesson.value)return false;const dashboardPrefix=`${normalizeProjectRoutePath(projectAppPath(projectSlug.value,`/dashboard`))}/`;const routePath=`${normalizeProjectRoutePath(route.path)}/`;if(!routePath.startsWith(dashboardPrefix))return false;const segment=routePath.slice(dashboardPrefix.length).split(`/`)[0]||``;return Boolean(segment)&&!LESSON_DASHBOARD_PROJECT_SECTIONS.includes(segment)&&!routeSessionToolId.value});const sourceToolLoading=computed(()=>Boolean(projectPaneValue.value===`dashboard`&&STANDALONE_SESSION_TOOL_IDS.has(routeSessionToolId.value)&&!sessionSourceRoot.value&&!practiceLesson.value&&props.page?.launchBusy));const dashboardShellVisible=computed(()=>Boolean(projectPaneValue.value===`dashboard`&&!sourceToolLoading.value&&!STANDALONE_SESSION_TOOL_IDS.has(rightPaneTab.value)));const dashboardRouteVisible=computed(()=>[`dashboard`,`info`,`repository`].includes(rightPaneTab.value));const sessionToolBackPath=computed(()=>lastDashboardRoutePath.value||projectAppPath(projectSlug.value,`/dashboard/env`));function sessionToolRuntimeState(toolId=``){if(toolId===`ai-terminal`&&!assistantAccessPending.value&&!(assistantCanUseNative===null?assistantDirectAllowed.value:unref(assistantCanUseNative)===true))return{disabled:true,title:`The AI terminal requires access to this conversation’s current connection. Use chat to send through an available mode.`};if(toolId===`editor`)return{disabled:!props.session,title:`Browse repository files, Drop Zone and session files`};if([`database`,`system`].includes(toolId)){const sourceAvailable=Boolean(sessionSourceRoot.value||practiceLesson.value);return{disabled:!sourceAvailable,title:sourceAvailable?toolId===`database`?`Query and map the active session database`:`Explore the current project Cities`:`Create the session source first`}}return{}}const sessionToolControls=computed(()=>VIBE64_SESSION_TOOL_DEFINITIONS.filter(definition=>definition.navigationScope!==`project`&&DIRECT_SESSION_TOOL_IDS.has(definition.id)&&(!practiceLesson.value||LESSON_DASHBOARD_SESSION_TOOLS.includes(definition.id))).map(definition=>({...definition,...sessionToolRuntimeState(definition.id)})));function sessionToolRoutePath(toolId=``){const suffix=vibe64SessionToolDashboardSuffix(toolId);return suffix?projectAppPath(projectSlug.value,suffix):``}function selectSessionTool(toolId=``,{navigate=true}={}){if(!DIRECT_SESSION_TOOL_IDS.has(toolId))return false;const tool=sessionToolControls.value.find(item=>item.id===toolId)||VIBE64_SESSION_TOOL_DEFINITIONS.find(item=>item.id===toolId&&item.navigationScope===`project`);if(!tool||tool.disabled)return false;rightPaneTab.value=toolId;if(navigate){const targetPath=sessionToolRoutePath(toolId);if(targetPath&&normalizeProjectRoutePath(targetPath)!==normalizeProjectRoutePath(route.path))router.push(targetPath)}emit(`project-attention`);return true}function backToDashboard(){const targetPath=sessionToolBackPath.value;if(targetPath&&normalizeProjectRoutePath(targetPath)!==normalizeProjectRoutePath(route.path))router.push(targetPath)}function connectIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return false;return props.conversationLog?.connectIntegrationRequest?.(request)||false}function checkIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return false;return props.conversationLog?.checkIntegrationRequest?.(request)||false}function cancelIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return false;return props.conversationLog?.cancelIntegrationRequest?.(request)||false}function skipIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return false;return props.conversationLog?.skipIntegrationRequest?.(request)||false}function resumeIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return false;return props.conversationLog?.resumeIntegrationRequest?.(request)||false}function openIntegrationRequest(request){if(!props.active||props.sessionSelectionArchived||request.sessionId!==sessionId.value)return;router.push({path:projectAppPath(projectSlug.value,`/dashboard/integrations`),query:{integration:request.integrationId,integrationSession:sessionId.value,integrationTurn:request.turnId,integrationRequest:request.requestId}});emit(`project-attention`)}function rightPaneTabMounted(tabId=``){return rightPaneTab.value===String(tabId||``)}const activeSessionNav=computed(()=>({label:sessionNavLabel(props.session||{}),selectTool:selectSessionTool,sessionId:sessionId.value,status:String(props.session?.status||``),statusLabel:vibe64SessionStatusLabel(props.session?.status),tools:sessionToolControls.value.map(tool=>({...tool,active:rightPaneTab.value===tool.id,disabledReason:tool.disabled?tool.title||``:``,to:sessionToolRoutePath(tool.id)})),...practiceLesson.value?{lesson:true}:{},visible:Boolean(props.session)}));const dashboardSessionContext=computed(()=>({active:Boolean(props.active),activeSessionNav:activeSessionNav.value,copyText:typeof props.page?.copyText===`function`?props.page.copyText:null,embeddedShell:true,...practiceLesson.value?{lessonDashboard:true,learningAttemptId:props.learningAttemptId}:{},projectContext:props.projectContext||{},refreshSessionWork:props.refreshSessionWork,refreshConversation:()=>props.conversationLog?.reload?.(),requestSaveWork,session:props.session||null,sessionId:sessionId.value,sessionsApiPath:props.sessionsApiPath,statusColor:vibe64SessionStatusColor(props.session?.status),statusLabel:vibe64SessionStatusLabel(props.session?.status),workState:props.workState||null}));const systemBackAvailable=computed(()=>Boolean(systemReturnContext.value?.sessionId===sessionId.value));function openSourceEditorFile(target={}){const path=normalizedAgentTurnText(target?.path);if(!path)return false;systemReturnContext.value=target.origin===`system`?{...target.systemContext&&typeof target.systemContext===`object`?target.systemContext:{},sessionId:sessionId.value}:null;sourceEditorOpenSequence+=1;sourceEditorOpenRequest.value={column:Number(target.column||0)||0,line:Number(target.line||0)||0,path,presentation:target.presentation||`interface`,symbolId:target.symbolId||``,symbol:target.symbol||``,sequence:sourceEditorOpenSequence};return selectSessionTool(`editor`)}function openSubsystemTable(target={}){if(!target.qualifiedName)return false;systemReturnContext.value={...target.systemContext,sessionId:sessionId.value};databaseOpenRequest.value={qualifiedName:target.qualifiedName,sequence:Date.now()};return selectSessionTool(`database`)}async function describeSubsystems(){if(typeof requestTemporaryAi!==`function`||!assistantJuniorAllowed.value||!props.active||!sessionId.value||props.sessionSelectionArchived||repositoryOperationActive.value)return false;const result=await requestTemporaryAi({title:`Subsystem map`,dedupeKey:subsystemMapTaskKey.value,displayMessage:`Generate the subsystem map from this application.`,message:[`Create or repair genesis/subsystems.md from the application source, existing Program, and schema. Inspect the repository with your normal tools and preserve substantive existing descriptions and unrelated edits. Responsibilities are full explanations of purpose, scope, main parts and collaboration, not one-line map captions. If boundaries change, transfer the applicable prose and Program assignments to the current directory owners, and revalidate each required main source under its owner.`,`Read .agents/skills/genesis-program/SKILL.md and use its exact subsystem grammar. Resolve the project's Genesis command through its installed skill instructions.`,"Explain meaningful subsystem responsibilities and declare their Program operations and owned/used tables. Each subsystem has one canonical project-relative directory root, recorded in a required ### Source section with one - Directory `path` entry. Cover every indexed source with a declared owner; nested roots own their more specific files. Stack directory-parent rules can inform adoption, but never create a competing owner list. Assign each Program document to exactly one subsystem, allowing its Sources to cite libraries owned elsewhere. UI components can live in the same subsystem as Engine code. Preserve existing stable subsystem ids and responsibility boundaries. Run Genesis inspect subsystems --json on the resulting file and resolve every validation error before claiming success. Creating the file alone is not completion.",`Leave the map as ordinary session changes for review; do not commit, push, or deploy.`].join(`
|
|
24
|
-
|
|
25
|
-
`),completionMessage:`Subsystem map task finished. Review the map and session changes before saving.`,failureMessage:`The subsystem map task stopped before completion. Review its progress and any partial edits.`,nextStepMessage:`The subsystem view refreshes when this task finishes. File changes remain in the session for review and Save.`});return result!==false&&result?.ok!==false}function backToSystemFromEditor(){if(!systemBackAvailable.value)return false;systemRestoreSequence+=1;systemRestoreRequest.value={...systemReturnContext.value,sequence:systemRestoreSequence};return selectSessionTool(`system`)}const sourceEditorAskCodexAvailable=computed(()=>Boolean(props.active&&sessionId.value&&!props.sessionSelectionArchived&&assistantDirectAllowed.value));function prefillComposer(text=``,{append=false}={}){const prompt=normalizedAgentTurnText(text);if(!prompt||!sourceEditorAskCodexAvailable.value)return false;composerDraft.value=append&&composerDraft.value.trim()?`${composerDraft.value}\n\n${prompt}`:prompt;emit(append?`chat-attention`:`project-attention`);return true}function askCodexAboutSourceEditorFile(path=``){const normalizedPath=normalizedAgentTurnText(path);return normalizedPath?prefillComposer(`Please look at \`${normalizedPath}\` and help me with this file.`):false}function updateAgentSetting(parameterId=``,value=``){agentSettings.value?.update({[String(parameterId||``)]:String(value||``)})}watch(()=>[props.active,projectPaneValue.value,route.path,routeSessionToolId.value,routeOutsideLessonDashboard.value,sessionSourceRoot.value,sourceToolLoading.value,assistantAccessPending.value,assistantDirectAllowed.value].join(`|`),()=>{if(!props.active||projectPaneValue.value===`preview`)return;if(sourceToolLoading.value){emit(`project-attention`);return}if(routeSessionToolId.value||routeOutsideLessonDashboard.value){if(routeSessionToolId.value&&selectSessionTool(routeSessionToolId.value,{navigate:false}))return;const fallbackPath=projectAppPath(projectSlug.value,`/dashboard/env`);lastDashboardRoutePath.value=fallbackPath;rightPaneTab.value=`dashboard`;if(normalizeProjectRoutePath(fallbackPath)!==normalizeProjectRoutePath(route.path))router.replace(fallbackPath);return}lastDashboardRoutePath.value=route.path;rightPaneTab.value=`dashboard`},{immediate:true});watch([sessionId,projectSlug,actorKey],()=>{repositoryRequestSequence+=1;saveWorkConfirmOpen.value=false;saveWorkConnectedReview.value=null;saveWorkConnectedResults.value=[];resolvedUpdateReview.value=null;saveWorkSending.value=false;saveWorkAttempt.value=null;saveWorkError.value=``;saveWorkFailure.value=null;composerSubmissionKind.value=``;interrupting.value=false;questionState.reset();workspaceSetupRetryError.value=``;workspaceSetupFixTaskId.value=``;checkedUpdateRepairRuns.clear();systemReturnContext.value=null;systemRestoreRequest.value=null;databaseOpenRequest.value=null});watch(()=>workspaceSetup.value?.updatedAt,()=>{workspaceSetupRetryError.value=``});watch([routingRequest,()=>messageDelivery.value?.state.messages||[]],([request])=>{if(request?.stopped&&!request.helper&&!request.attemptedMessageId)restoreCancelledMessage(request.messageId)},{immediate:true});watch(()=>Boolean(agentActive.value||composerSending.value||interrupting.value||saveWorkSending.value),busy=>{emit(`busy-change`,busy)},{immediate:true});return{Vibe64OutputControls,assistantDirectAllowed,assistantJuniorAllowed,assistantSeniorAllowed,agentActive,reasoningActive,agentObservationLost,agentStopEnabled,agentStopVisible,answerChoices,prefillComposer,askCodexAboutSourceEditorFile,askCodexToFixPreviewIdentity,askCodexToFixWorkspaceSetup,attachPreviewDiagnostics,backToDashboard,backToSystemFromEditor,cancelOptimisticMessage,cancelSaveWork,captureVisiblePreview,chatCollapsed,chatReloadAvailable,chatReloading,chatTurns,checkpointFailure,checkpointFailureReason,checkpointFailureVisible,dismissCheckpointFailure,composerKey,composerAttachments,composerAttachmentsEnabled,composerAttachmentsSupported,composerCanSubmit,composerDisabled,composerDraft,composerHint,composerPlaceholder,composerSending,routingRequest,routingBusy,routingStatusLabel,composerSubmitAriaLabel,composerSubmitLabel,composerSubmitMode,composerSubmitTitle,conversationLogVisible,conversationFollowLatestKey,conversationScrollKey,currentAgentSettings,dashboardSessionContext,dashboardRouteVisible,dashboardShellVisible,sourceToolLoading,dismissSaveWorkActivity,dismissNumberedQuestions,dismissWorkspaceSetupActivity,confirmSaveWork,editOptimisticMessage,emptyConversationWelcome,fixRepositoryActionError,fixRepositoryError,handleTemporaryAiTaskFinished,updateConflictRecovery,resolvedUpdateReview,reviewResolvedUpdate,applyResolvedUpdate,interrupting,loadMoreChatTurns,numberedQuestionSelectItems,numberedQuestions,openIntegrationRequest,skipIntegrationRequest,resumeIntegrationRequest,connectIntegrationRequest,checkIntegrationRequest,cancelIntegrationRequest,openSourceEditorFile,openSubsystemTable,describeSubsystems,databaseOpenRequest,previewAttachmentState,projectSlug,questionAnswers,reloadChatPane,repositoryRecoverySending,repositoryOperationActive,retrySaveWork,retryWorkspaceSetup,requestSaveWork,resendOptimisticMessage,requestAgentInterrupt,rightPaneTab,rightPaneTabMounted,saveWorkConfirmOpen,contextFullFailure,retryContextFull,saveWorkReview,saveConnectedFirst,saveWorkConnectedReview,saveWorkConnectedResults,saveWorkDisabled,updateWorkDisabled,saveWorkActivityDismissed,saveWorkActivityKey,saveWorkActivityIsUpdate,saveWorkActivityLabel,saveWorkActionLabel,saveWorkError,saveWorkFailure,saveWorkHeaderAriaLabel,saveWorkHeaderVisible,saveWorkCanResolveWithTemporaryAi,saveWorkOperation,saveWorkOperationActive,saveWorkOutput,saveWorkRetryable,saveWorkSending,saveWorkStage,saveWorkStatus,saveWorkTitle,saveWorkRequiresUpdate,saveWorkUnsaved,selectSessionTool,sessionId,sessionGithubActor,sessionGithubActorHeaderVisible,sessionSourceRoot,practiceLesson,sessionToolControls,sessionToolbarVisible,selectedAnswerChoice,sourceEditorAskCodexAvailable,sourceEditorOpenRequest,structuredQuestionActive,submitComposerMessage,systemBackAvailable,systemRestoreRequest,systemReloadVersion,thinkingLabel,thinkingVisible,agentWorking,assistantAccountMessage,assistantAccountUnavailable,connectionRecoveryVisible,updateAgentSetting,updateComposerAttachments,updatePreviewAttachmentState,workspaceSetupActionVisible,connectedUpdateActionVisible,workspaceSetupAskDisabled,workspaceSetupActivityKey,workspaceSetupCurrentLabel,workspaceSetupDiagnostic,workspaceSetupDismissed,workspaceSetupFixSending,workspaceSetupNeedsAttention,workspaceSetupError,workspaceSetupOutput,workspaceSetupRetryDisabled,workspaceSetupRetrying,workspaceSetupRunning,workspaceSetupStatus,workspaceSetupTitle}}function executionAttentionForError(error=null,message=``){const code=normalizedAgentTurnText(error?.code);const category=EXECUTION_CAPACITY_ERROR_CODES.has(code)?`capacity`:EXECUTION_SAFETY_ERROR_CODES.has(code)?`ownership`:``;if(!category)return null;return Object.freeze({category,code,message:normalizedAgentTurnText(message)||`This work could not start safely.`})}var PROMPT_HINT_DEBOUNCE_MS=5e3;var PROMPT_HINT_MIN_INTERVAL_MS=3e4;var promptHintOperationSequence=0;function normalizedPromptHintText(value=``){return String(value||``).trim()}function promptHintOperationId(){promptHintOperationSequence+=1;return`hint:${Date.now().toString(36)}:${promptHintOperationSequence.toString(36)}`}function promptHintConversationFingerprint(turns=[]){const recentTurns=(Array.isArray(turns)?turns:[]).slice(-8);return JSON.stringify(recentTurns.map((turn={})=>({assistant:normalizedPromptHintText(turn?.assistant?.text),turnId:normalizedPromptHintText(turn?.turnId),user:normalizedPromptHintText(turn?.user?.text)})))}function useVibe64PromptHints({active=true,blankConversation=false,canRequest=true,conversationKey=``,draft=``,existingProject=false,onSelect=()=>false,policy={},sessionId=``,sessionsApiPath=``}={},{debounceMs=PROMPT_HINT_DEBOUNCE_MS,minIntervalMs=PROMPT_HINT_MIN_INTERVAL_MS,request=(path,options)=>getHttpWebClient().request(path,options)}={}){const originId=vibe64BrowserTabOriginId();const responseStatus=ref(`idle`);const currentSessionId=computed(()=>normalizedPromptHintText(readRefOrGetterValue(sessionId)));const currentSessionsApiPath=computed(()=>normalizedPromptHintText(readRefOrGetterValue(sessionsApiPath)));const currentPolicy=computed(()=>readRefOrGetterValue(policy)||{});const controller=useAssistantSuggestions({active:computed(()=>Boolean(readRefOrGetterValue(active)!==false&&readRefOrGetterValue(canRequest)!==false&¤tPolicy.value.enabled!==false&¤tPolicy.value.ready===true&¤tSessionId.value&¤tSessionsApiPath.value)),requestKey:computed(()=>[currentSessionId.value,currentSessionsApiPath.value,readRefOrGetterValue(conversationKey),currentPolicy.value.revision,currentPolicy.value.version,readRefOrGetterValue(blankConversation),readRefOrGetterValue(existingProject)]),draft:computed(()=>normalizedPromptHintDraft(readRefOrGetterValue(draft))),debounceMs,minIntervalMs,onSelect,async generate({draft:requestDraft,signal}){const targetSession=currentSessionId.value;const targetPath=currentSessionsApiPath.value;const operationId=promptHintOperationId();const cancel=()=>{request(vibe64SessionPromptHintsCancelPath(targetPath,targetSession),{method:`POST`,body:{operationId,originId}}).catch(()=>null)};signal.addEventListener(`abort`,cancel,{once:true});try{const response=await request(vibe64SessionPromptHintsPath(targetPath,targetSession),{method:`POST`,body:{draft:requestDraft,operationId,originId},signal});if(signal.aborted)return[];responseStatus.value=response?.status;return[`ready`,`static`].includes(response?.status)?normalizedPromptHintSuggestions(response.suggestions):[]}finally{signal.removeEventListener(`abort`,cancel)}}});return{blurComposer:controller.blur,composerFocused:controller.composerFocused,dismissPromptHints:controller.dismiss,focusComposer:controller.focus,loading:controller.loading,preview:controller.preview,previewPromptHint:suggestion=>controller.previewSuggestion(normalizedPromptHintSuggestion(suggestion)),selectPromptHint:suggestion=>controller.select(normalizedPromptHintSuggestion(suggestion)),status:computed(()=>controller.loading.value?`loading`:controller.items.value.length===3?responseStatus.value:`idle`),suggestions:controller.items,visible:controller.visible}}var _hoisted_1$12=[`title`];var _hoisted_2$11={class:`studio-autopilot__session-header`};var _hoisted_3$11={key:2,class:`studio-autopilot__save-symbol`,"aria-hidden":`true`};var _hoisted_4$10={class:`studio-autopilot__header-actions studio-autopilot__header-actions--compact`};var _hoisted_5$10={class:`studio-autopilot__header-actions studio-autopilot__header-actions--expanded`};var _hoisted_6$9={class:`studio-autopilot__activity`,"aria-label":`Session activity`};var _hoisted_7$9={class:`studio-autopilot__connection-actions`};var _hoisted_8$9={key:0,class:`text-body-small`};var _hoisted_9$8={key:1,class:`text-body-small`};var _hoisted_10$7={class:`d-flex flex-wrap align-center ga-2`};var _hoisted_11$7={class:`flex-grow-1`};var _hoisted_12$7={class:`text-body-small mb-0`};var _hoisted_13$7={class:`studio-autopilot__checkpoint-details text-body-small`};var _hoisted_14$7={class:`text-body-small`};var _hoisted_15$7={key:0};var _hoisted_16$6={key:1};var _hoisted_17$6={class:`studio-autopilot__composer-actions`};var _hoisted_18$6={key:0,class:`studio-autopilot__settings-access`};var _hoisted_19$5={class:`text-body-small`,role:`status`};var _hoisted_20$5={class:`studio-autopilot__project-panel`,"aria-label":`Project`};var _hoisted_21$5={class:`studio-autopilot__right-pane-page`,role:`tabpanel`};var _hoisted_22$5={class:`studio-autopilot__right-pane-page`,role:`tabpanel`};var _hoisted_23$5={key:2,class:`studio-autopilot__right-pane-page studio-autopilot__session-tool-pane`,role:`tabpanel`};var _hoisted_24$3={class:`studio-autopilot__session-tool-header`};var _hoisted_25$3={class:`studio-autopilot__right-pane-page`};var _hoisted_26$2={class:`studio-autopilot__right-pane-page studio-autopilot__session-tool-pane`,role:`tabpanel`};var _hoisted_27$2={class:`studio-autopilot__session-tool-header`};var _hoisted_28$2={class:`studio-autopilot__right-pane-page studio-autopilot__session-tool-pane`,role:`tabpanel`};var _hoisted_29$2={class:`studio-autopilot__session-tool-header`};var _hoisted_30$2={class:`studio-autopilot__right-pane-page studio-autopilot__session-tool-pane studio-autopilot__architecture-pane`,role:`tabpanel`};var _hoisted_31$2={class:`studio-autopilot__architecture-file`,"aria-label":`Architecture file viewer`};var _hoisted_32$2={class:`studio-autopilot__right-pane-page`,role:`tabpanel`};var _hoisted_33$2={class:`studio-autopilot__learning-code-badge`,"aria-hidden":`true`};var _hoisted_34$1={viewBox:`0 0 24 24`};var _hoisted_35$1=[`d`];var _hoisted_36$1={class:`studio-autopilot__learning-code-status`,role:`status`,"aria-live":`polite`};var _hoisted_37$1={class:`studio-autopilot__learning-code-title`};var _hoisted_38$1={class:`studio-autopilot__learning-code-message`};var _hoisted_39$1={class:`my-3 pl-5`,style:{"overflow-wrap":`anywhere`}};var _hoisted_40$1={key:1,class:`d-flex align-center justify-space-between ga-2 mb-2`};var _hoisted_41$1={class:`text-label-small text-medium-emphasis`};var _hoisted_42$1={key:0,class:`text-body-small mt-1 mb-0`};var _hoisted_43$1={key:3,role:`status`};var _hoisted_44$1={key:4,role:`status`,class:`text-body-small mt-2`};var _hoisted_45$1={key:5,role:`status`,class:`mt-3`};var _hoisted_46$1={class:`text-wrap`,style:{"overflow-wrap":`anywhere`}};var _sfc_main$13={__name:`Vibe64AutopilotView`,props:vibe64AutopilotViewProps,emits:vibe64AutopilotViewEmits,setup(__props,{emit:__emit}){const emit=__emit;const props=__props;const resourceRecoveryControl=inject(VIBE64_RESOURCE_RECOVERY_KEY,null);const architectureFileRequest=ref(null);const architectureProgramRequest=ref(null);watch(()=>props.session?.sessionId,()=>{architectureFileRequest.value=null;architectureProgramRequest.value=null});const resourceRetryBusy=ref(false);function openSubsystemTextLink({event,href},sourcePath,openSource){const relative=href&&!/^(?:[a-z][a-z\d+.-]*:|\/|#)/iu.test(href);const target=sourceEditorLinkTarget({href:relative?new URL(href,`https://source.invalid/${sourcePath}`).pathname.slice(1):href});if(!target)return;event?.preventDefault();openSource(target)}const sessionRenewalActionPresentation=computed(()=>props.sessionRenewal?.actionPresentation||props.sessionRenewal?.advisoryPresentation||{attention:false,color:void 0,label:`Renew session`,reason:`Renew this session with a reviewed handover.`});const sourceOperationsSuspended=computed(()=>props.sessionRenewal?.sourceOperationsSuspended===true);const Vibe64ArchitectureView=defineAsyncComponent(()=>__vitePreload(()=>import(`./index-BUq-MczL.js`).then(n=>n.r).then(module=>module.loadVibe64ArchitectureView()),__vite__mapDeps([57,1,2,3,53,6,4,5,7,48,49,50,39,58,9,10,11,12,13,8,14,15,16,17,18,19,20,21,22,40,41,59,60,23,24,25,26,27,28,61,62,29,30,31,32,33,34,63,64,35,36,65,66,67,68,69,70,71,37,38,42,43,44,45,46,72,73,52,47,51,54,74,75,76,77,78,79,80,55,56,81,82,83,84])));const Vibe64DatabaseWorkspace=defineAsyncComponent(()=>__vitePreload(()=>import(`./index-BUq-MczL.js`).then(n=>n.i).then(module=>module.loadVibe64DatabaseWorkspace()),__vite__mapDeps([57,1,2,3,53,6,4,5,7,48,49,50,39,58,9,10,11,12,13,8,14,15,16,17,18,19,20,21,22,40,41,59,60,23,24,25,26,27,28,61,62,29,30,31,32,33,34,63,64,35,36,65,66,67,68,69,70,71,37,38,42,43,44,45,46,72,73,52,47,51,54,74,75,76,77,78,79,80,55,56,81,82,83,84])));const composerInput=ref(null);const conversationView=ref(null);const composerSendButton=ref(null);const composerSettingsOpen=ref(false);const composerSettingsButton=ref(null);const mainChat=ref(null);const sessionActionsTrigger=ref(null);const temporaryAiWorkspace=ref(null);const workPlanViewer=ref(null);const temporaryAiHasUnreadMessages=computed(()=>temporaryAiWorkspace.value?.hasUnreadMessages===true);const sessionActionsLabel=computed(()=>[`Session actions`,sessionRenewalActionPresentation.value.attention?sessionRenewalActionPresentation.value.label:``,temporaryAiHasUnreadMessages.value?`Unread temporary AI messages`:``].filter(Boolean).join(`: `));const workspaceRecoveryTaskId=ref(``);const thinkingStatusId=`studio-autopilot-thinking-${useId()}`;const testApproval=ref(null);function updateTestApproval(value){if(value.sessionId===props.session?.sessionId)testApproval.value=value.approval}watch(()=>props.session?.sessionId,()=>{testApproval.value=null});const composerAttachmentState=ref({count:0,hasUnresolved:false,uploading:false});const selectedAssistantSessionId=computed(()=>String(props.session?.sessionId||``).trim());const openCodeProgressLabel=ref(``);const openCodeProviderLabel=computed(()=>({deepseek:`DeepSeek`,"zai-coding-plan":`Z.AI`})[String(props.session?.assistantSelection?.modelProviderId||``).trim()]||`OpenCode`);function visibleOpenCodeProgressLabel(progress={}){if(String(progress.tool||``).trim())return`${openCodeProviderLabel.value} is using a tool…`;if(String(progress.partType||``).trim()===`reasoning`||String(progress.type||``).includes(`reasoning`))return`${openCodeProviderLabel.value} is reasoning…`;if(String(progress.text||``).trim())return`${openCodeProviderLabel.value} is writing…`;return`${openCodeProviderLabel.value} is working…`}useRealtimeEvent({enabled:computed(()=>Boolean(props.active&&!props.sessionSelectionArchived&&selectedAssistantSessionId.value&&props.session?.assistantSelection?.engineId===`opencode`)),event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>Boolean(String(payload.sessionId||payload.entityId||``).trim()===selectedAssistantSessionId.value&&(payload.assistantProgress||[`opencode-server-message-delivered`,`opencode-server-turn-active`,`opencode-server-turn-idle`].includes(payload.reason))),onEvent:({payload={}}={})=>{openCodeProgressLabel.value=payload.reason===`opencode-server-turn-idle`?``:visibleOpenCodeProgressLabel(payload.assistantProgress||{})}});watch([selectedAssistantSessionId,()=>props.session?.assistantSelection?.engineId],()=>{openCodeProgressLabel.value=``},{immediate:true});const{resource:modelRoutingResource}=useModelRouting({workflowsOnly:true,enabled:computed(()=>!props.sessionSelectionArchived&&Boolean(selectedAssistantSessionId.value))});const assistantCanConfigureRouting=computed(()=>modelRoutingResource.data.value?.canConfigure===true);const assistantAccessError=computed(()=>props.conversationRuntime.access.accessError.value);const assistantCanUseAiState=computed(()=>props.conversationRuntime.access.canUseChat.value);const assistantCanRouteChat=computed(()=>props.conversationRuntime.access.canRouteChat.value);const assistantCanUseNative=computed(()=>props.conversationRuntime.access.canUseNative.value);const assistantPurposes=computed(()=>props.conversationRuntime.access.purposes.value);const assistantAccessScopeKey=computed(()=>props.conversationRuntime.access.scopeKey.value);const assistantAccessLoading=computed(()=>props.conversationRuntime.access.initialAccessLoading.value);const assistantRestrictionMessage=computed(()=>props.conversationRuntime.access.restrictionMessage.value);const assistantCanUsePurpose=purpose=>props.conversationRuntime.access.canUsePurpose(purpose);const reloadAssistantAccess=()=>props.conversationRuntime.access.reload();const{Vibe64OutputControls,assistantDirectAllowed,assistantJuniorAllowed,assistantSeniorAllowed,agentActive,reasoningActive,agentObservationLost,agentStopEnabled,agentStopVisible,answerChoices,prefillComposer,askCodexAboutSourceEditorFile,askCodexToFixPreviewIdentity,askCodexToFixWorkspaceSetup,attachPreviewDiagnostics,backToDashboard,backToSystemFromEditor,cancelOptimisticMessage,cancelSaveWork,captureVisiblePreview,chatCollapsed,chatReloading,reloadChatPane,chatTurns,checkpointFailure,checkpointFailureReason,checkpointFailureVisible,dismissCheckpointFailure,composerKey,composerAttachments,composerAttachmentsEnabled,composerAttachmentsSupported,composerCanSubmit,composerDisabled,composerDraft,composerHint,composerPlaceholder,composerSending,routingRequest,composerSubmitAriaLabel,composerSubmitMode,composerSubmitTitle,conversationLogVisible,conversationFollowLatestKey,conversationScrollKey,dashboardSessionContext,dashboardRouteVisible,dashboardShellVisible,sourceToolLoading,dismissSaveWorkActivity,dismissNumberedQuestions,dismissWorkspaceSetupActivity,confirmSaveWork,editOptimisticMessage,emptyConversationWelcome,fixRepositoryActionError,fixRepositoryError,handleTemporaryAiTaskFinished,updateConflictRecovery,resolvedUpdateReview,reviewResolvedUpdate,applyResolvedUpdate,interrupting,loadMoreChatTurns,numberedQuestionSelectItems,numberedQuestions,openIntegrationRequest,skipIntegrationRequest,resumeIntegrationRequest,connectIntegrationRequest,checkIntegrationRequest,cancelIntegrationRequest,openSourceEditorFile,openSubsystemTable,describeSubsystems,databaseOpenRequest,previewAttachmentState,projectSlug,questionAnswers,repositoryRecoverySending,repositoryOperationActive,retrySaveWork,retryWorkspaceSetup,requestSaveWork,resendOptimisticMessage,requestAgentInterrupt,rightPaneTab,rightPaneTabMounted,saveWorkConfirmOpen,contextFullFailure,retryContextFull,saveWorkReview,saveConnectedFirst,saveWorkConnectedReview,saveWorkConnectedResults,saveWorkActivityDismissed,saveWorkActivityKey,saveWorkActivityIsUpdate,saveWorkActivityLabel,saveWorkDisabled,updateWorkDisabled,saveWorkError,saveWorkFailure,saveWorkHeaderAriaLabel,saveWorkHeaderVisible,saveWorkCanResolveWithTemporaryAi,saveWorkOperationActive,saveWorkOutput,saveWorkRetryable,saveWorkSending,saveWorkStage,saveWorkStatus,saveWorkTitle,saveWorkRequiresUpdate,saveWorkUnsaved,selectSessionTool,sessionId,sessionGithubActor,sessionGithubActorHeaderVisible,sessionSourceRoot,practiceLesson,sessionToolbarVisible,selectedAnswerChoice,sourceEditorAskCodexAvailable,sourceEditorOpenRequest,structuredQuestionActive,submitComposerMessage,systemBackAvailable,systemRestoreRequest,systemReloadVersion,thinkingLabel,thinkingVisible,agentWorking,assistantAccountMessage,assistantAccountUnavailable,connectionRecoveryVisible,updateComposerAttachments,updatePreviewAttachmentState,workspaceSetupActionVisible,connectedUpdateActionVisible,workspaceSetupAskDisabled,workspaceSetupActivityKey,workspaceSetupCurrentLabel,workspaceSetupDismissed,workspaceSetupFixSending,workspaceSetupNeedsAttention,workspaceSetupError,workspaceSetupOutput,workspaceSetupRetryDisabled,workspaceSetupRetrying,workspaceSetupRunning,workspaceSetupStatus,workspaceSetupTitle}=useVibe64AutopilotView(props,emit,{assistantAccessLoading,assistantCanUseAi:assistantCanUseAiState,assistantCanRouteChat,assistantCanUseJunior:computed(()=>assistantCanUsePurpose(`junior`)),assistantCanUseSenior:computed(()=>assistantCanUsePurpose(`senior`)),assistantCanUseNative,assistantProgressLabel:openCodeProgressLabel,onAttachmentsAccepted:attachmentIds=>composerInput.value?.clearAttachments?.({attachmentIds}),requestTemporaryAi:startTemporaryAiTask});const fileBookmarks=useVibe64StarredFiles({projectSlug,sessionId,sessionsApiPath:()=>props.sessionsApiPath});const{blur:stopTypingOnBlur,noteInputActivity:noteTypingActivity,submit:stopTypingOnSubmit,typingLabel}=useVibe64SessionTypingPresence({active:computed(()=>props.active&&!props.sessionSelectionArchived),projectSlug,sessionId,sessionsApiPath:computed(()=>readRefOrGetterValue(props.sessionsApiPath))});const composerAccessHint=computed(()=>assistantRestrictionMessage.value||composerHint.value);const composerAssistantLabel=computed(()=>{if(testApproval.value?.state===`waiting`)return`Waiting for memory approval`;if(!thinkingVisible.value)return typingLabel.value;if(props.conversationLog?.error)return``;return assistantRestrictionMessage.value||thinkingLabel.value});watch(agentActive,active=>{if(!active)openCodeProgressLabel.value=``},{flush:`sync`,immediate:true});const routingActionSending=ref(``);const routingActionError=ref(``);watch(()=>[routingRequest.value?.messageId,routingRequest.value?.stage,routingRequest.value?.status,routingRequest.value?.delivery],()=>{routingActionError.value=``});async function sendRoutingAction(action){const request=routingRequest.value;if(routingActionSending.value||!request)return;routingActionSending.value=action;routingActionError.value=``;try{const result=action===`implement`?await props.sendAgentMessage({message:`Implement the saved plan. I authorize implementation within its agreed scope.`,planRevision:request.workPlan.revision,submissionKind:`send`}):await props.conversationRuntime.continueWorkflow(request);if(result===false||result?.ok===false)throw new Error(result?.error||`The workflow action did not start. Check the conversation and try again.`);return result}catch(error){routingActionError.value=error?.message||`The workflow action did not start.`;return false}finally{routingActionSending.value=``}}const conversationAssistantLabel=computed(()=>props.session?.assistantSelection?vibe64AssistantSelectionLabel(props.session.assistantSelection):`Assistant`);const updateHandledInRepair=computed(()=>Boolean((saveWorkActivityIsUpdate.value||saveWorkError.value)&&temporaryAiWorkspace.value?.updateRepairVisible));const promptHintsBlankConversation=computed(()=>chatTurns.value.length<1);const promptHintsCanRequest=computed(()=>Boolean(props.active&&props.conversationRuntime?.canSubmit.value&&!props.conversationLog?.loading&&!props.conversationLog?.error&&!props.sessionSelectionArchived&&sessionId.value&&sessionSourceRoot.value&&!agentActive.value&&!composerSending.value&&!interrupting.value&&!repositoryOperationActive.value&&!repositoryRecoverySending.value&&!saveWorkSending.value&&!workspaceSetupRunning.value&&!workspaceSetupRetrying.value&&!sourceOperationsSuspended.value&&(promptHintsBlankConversation.value||assistantCanUsePurpose(`prompt_hint`))&&!structuredQuestionActive.value&&composerAttachmentState.value.count<1&&!composerAttachmentState.value.uploading&&!composerAttachmentState.value.hasUnresolved&&!previewAttachmentState.value.captureBusy&&!previewAttachmentState.value.diagnosticsBusy));const promptHintsConversationKey=computed(()=>JSON.stringify([promptHintConversationFingerprint(chatTurns.value),assistantAccessScopeKey.value,assistantPurposes.value.prompt_hint]));const promptHintsExistingProject=computed(()=>workspaceSetupStatus.value!==`unconfigured`);const{blurComposer:blurPromptHints,dismissPromptHints,focusComposer:focusPromptHints,loading:promptHintsLoading,preview:promptHintPreview,previewPromptHint,selectPromptHint,suggestions:promptHintSuggestions,visible:promptHintsVisible}=useVibe64PromptHints({active:computed(()=>props.active),blankConversation:promptHintsBlankConversation,canRequest:promptHintsCanRequest,conversationKey:promptHintsConversationKey,draft:composerDraft,existingProject:promptHintsExistingProject,onSelect:applyPromptHint,policy:computed(()=>props.promptHintPolicy),sessionId,sessionsApiPath:computed(()=>readRefOrGetterValue(props.sessionsApiPath))});const composerPromptHintPreview=computed(()=>promptHintsVisible.value&&!String(composerDraft.value||``).trim()&&promptHintPreview.value?promptHintPreview.value:``);const composerPromptHintPlaceholder=computed(()=>composerPromptHintPreview.value||composerPlaceholder.value);const composerSupportStatusVisible=computed(()=>Boolean(composerAssistantLabel.value||promptHintsVisible.value));const createPullRequestOpen=ref(false);const sessionPullRequest=computed(()=>vibe64SessionPullRequest(props.session));const sessionPullRequestTarget=computed(()=>sessionPullRequest.value?.number?{path:projectAppPath(projectSlug.value,`/dashboard/pull-requests`),query:{pr:String(sessionPullRequest.value.number)}}:void 0);const githubProject=computed(()=>githubProjectAvailable(props.projectContext));const saveWorkNeedsPullRequest=computed(()=>!saveWorkConnectedReview.value&&githubProject.value&&props.workState?.publicationRequiresPullRequest===true&&!sessionPullRequest.value?.number);const saveWorkCanCreatePullRequest=computed(()=>githubProject.value&&!sessionPullRequest.value?.number&&saveWorkFailure.value?.code===`vibe64_pull_request_required`);const assistantJuniorRestrictionMessage=computed(()=>assistantPurposes.value.junior?.message||`Junior is unavailable. Review model routing.`);const assistantSeniorRestrictionMessage=computed(()=>assistantPurposes.value.senior?.message||`Senior is unavailable. Review model routing.`);const publicationLabel=computed(()=>{if(saveWorkConnectedReview.value)return`Push connected contributions`;if(saveWorkReview.value?.mode===`github`)return`Commit & push`;return`Save`});const dashboardContext=computed(()=>({...dashboardSessionContext.value||{},assistantDirectAllowed:assistantDirectAllowed.value,assistantDraftAvailable:sourceEditorAskCodexAvailable.value,assistantJuniorAllowed:assistantJuniorAllowed.value,assistantJuniorRestrictionMessage:assistantJuniorRestrictionMessage.value,assistantSeniorAllowed:assistantSeniorAllowed.value,assistantSeniorRestrictionMessage:assistantSeniorRestrictionMessage.value,assistantRestrictionMessage:assistantRestrictionMessage.value,requestAssistantDraft:text=>prefillComposer(text,{append:true}),requestUpdateWork:props.updateSessionWork,requestTemporaryAi:fixRepositoryError,sourceOperationsSuspended:sourceOperationsSuspended.value}));const sessionArchiveDisabled=computed(()=>Boolean(props.sessionSelectionArchived||props.sessionArchive?.command?.isRunning||workspaceSetupRunning.value||workspaceSetupRetrying.value));async function sendComposerMessage(){if(conversationView.value?.composerBlocked||composerInput.value?.attachmentsCanSubmit?.()===false)return false;stopTypingOnSubmit();return submitComposerMessage()}async function continueConversation(){composerSettingsOpen.value=false;composerInput.value?.focus?.();if(composerDraft.value.trim()||composerAttachments.value.length)return;composerDraft.value=`Continue.`;await nextTick();if(composerCanSubmit.value)await sendComposerMessage()}function focusComposerSendButton(){composerSendButton.value?.focus()}function updateComposerAttachmentState(state={}){composerAttachmentState.value={count:Number(state?.count||0),hasUnresolved:state?.hasUnresolved===true,uploading:state?.uploading===true}}function focusTargetInside(target,selector){return Boolean(target?.closest?.(selector))}function handleComposerBlur(event={}){stopTypingOnBlur();if(focusTargetInside(event.relatedTarget,`[data-assistant-composer-support], .studio-autopilot__composer`))return;blurPromptHints()}function handleComposerRegionFocusOut(event={}){if(event.currentTarget?.contains?.(event.relatedTarget)||focusTargetInside(event.relatedTarget,`[data-assistant-composer-support]`))return;blurPromptHints()}function handlePromptHintsFocusOut(event={}){if(event.currentTarget?.contains?.(event.relatedTarget)||focusTargetInside(event.relatedTarget,`.studio-autopilot-prompt-textarea`))return;blurPromptHints()}function dismissPromptHintsAndFocus(){composerInput.value?.focus?.({preventScroll:true});dismissPromptHints()}function applyPromptHint(text=``){const suggestion=String(text||``).trim();if(!suggestion)return false;if(composerDraft.value!==suggestion){composerInput.value?.preserveHeightForNextModelValue?.();composerDraft.value=suggestion}nextTick(()=>{composerInput.value?.focus?.({preventScroll:true})});return true}function copyActivityOutput(output=``){return writeClipboardText(output)}function openTemporaryAi(){if(!props.sourceWorkspaceAvailable)return;if(!sessionId.value||props.sessionSelectionArchived)return false;temporaryAiWorkspace.value?.showWorkspace?.();return true}async function startTemporaryAiTask(options={}){if(!assistantCanUsePurpose(options.recoveryOperation===`update`||options.initialRouting?.mode===`senior`?`senior`:`junior`)||props.sessionSelectionArchived)return false;emit(`chat-attention`);const workspace=temporaryAiWorkspace.value;if(typeof workspace?.startTask!==`function`)return false;return workspace.startTask(options)}function reportVerifiedWorkspaceRecovery(){if(!workspaceRecoveryTaskId.value||workspaceSetupStatus.value!==`succeeded`)return false;const reported=temporaryAiWorkspace.value?.reportTaskRecovery?.(workspaceRecoveryTaskId.value,{message:`Workspace preparation succeeded. Vibe64 independently verified the AI repair.`,status:`succeeded`});if(reported)workspaceRecoveryTaskId.value=``;return Boolean(reported)}function reportTemporaryRecovery(taskId,outcome){if(!temporaryAiWorkspace.value)return false;return outcome.status===`checking`?temporaryAiWorkspace.value.persistTaskRecovery?.(taskId,outcome)??false:temporaryAiWorkspace.value.reportTaskRecovery?.(taskId,outcome)??false}watch(()=>[props.workState?.updateOperation,temporaryAiWorkspace.value?.updateRepairTask],([operation,task])=>{if(!task||task.sessionId!==sessionId.value||!task.recoveryRequestId||operation?.requestId!==task.recoveryRequestId||![`checking`,`unconfirmed`].includes(task.recoveryOutcome))return;if(operation.status===`ready`)reportTemporaryRecovery(task.id,{status:`succeeded`,message:`Session updated. Your changes were preserved. Nothing was published.`});else if(operation.status===`failed`)reportTemporaryRecovery(task.id,{status:`failed`,message:`Update still needs attention: ${operation.error||`The operation failed.`}`,recoveryConflictId:operation.conflictRecovery?.reviewId||``})},{flush:`post`});async function finishTemporaryAiTask(task={}){const recovery=await handleTemporaryAiTaskFinished(task,reportTemporaryRecovery);if(!recovery)return false;if(recovery===`workspace-setup`){workspaceRecoveryTaskId.value=String(task.id||``).trim();reportVerifiedWorkspaceRecovery()}return true}function checkTemporaryAiUpdate(task){if(updateWorkDisabled.value)return false;return handleTemporaryAiTaskFinished(task,reportTemporaryRecovery,{force:true})}const saveWorkChecking=ref(false);const saveWorkCheckAvailable=computed(()=>Boolean(saveWorkDisabled.value&&!saveWorkRequiresUpdate.value&&!saveWorkSending.value&&!repositoryOperationActive.value&&!sourceOperationsSuspended.value&&!props.sessionSelectionArchived&&typeof props.sessionToolbar?.refreshRepositoryState===`function`));const saveWorkHeaderHint=computed(()=>{if(saveConnectedFirst.value)return saveWorkTitle.value;const status=saveWorkChecking.value?`Checking for updates…`:saveWorkCheckAvailable.value?`${saveWorkTitle.value}. Click to check for updates.`:saveWorkTitle.value;const destination=props.workState?.destination;if(!destination)return status;if(saveWorkRequiresUpdate.value||saveWorkDisabled.value||saveWorkChecking.value)return`${status}\n${destination.repository}:${destination.branch}`;return`${destination.mode===`local_source`?`Local commit`:destination.mode===`github`?`Commit & push`:`Project version`} · ${destination.repository}:${destination.branch}\n${status}`});async function requestSessionSaveWork(){if(saveWorkChecking.value)return;if(saveWorkCheckAvailable.value){saveWorkChecking.value=true;try{await props.sessionToolbar.refreshRepositoryState(sessionId.value)}finally{saveWorkChecking.value=false}return}const repair=temporaryAiWorkspace.value?.updateRepairTask;if(saveWorkRequiresUpdate.value&&repair){temporaryAiWorkspace.value?.selectTask?.(repair.id);return checkTemporaryAiUpdate(repair)}return requestSaveWork()}async function showMainChat(){temporaryAiWorkspace.value?.closeWorkspace?.();await nextTick();mainChat.value?.focus?.({preventScroll:true})}watch(workspaceSetupStatus,()=>{reportVerifiedWorkspaceRecovery()});watch(selectedAssistantSessionId,()=>{workspaceRecoveryTaskId.value=``});async function attachPreviewFile(file){const uploaded=await(temporaryAiWorkspace.value?.composer||composerInput.value)?.attachFiles?.([file]);if(!Array.isArray(uploaded)||uploaded.length<1)throw new Error(`Open the chat composer before attaching a preview file.`);return uploaded[0]}async function attachPreviewFileProducer(options={}){const uploaded=await(temporaryAiWorkspace.value?.composer||composerInput.value)?.attachFileProducer?.(options);return Array.isArray(uploaded)&&uploaded.length>0?uploaded[0]:null}function requestSessionRenewal(returnFocusTarget=null){props.sessionRenewal?.request?.({returnFocusTarget:returnFocusTarget?.$el||returnFocusTarget});return true}const dashboardAvailable=computed(()=>props.sourceWorkspaceAvailable||practiceLesson.value);provide(VIBE64_LESSON_DASHBOARD_KEY,computed(()=>practiceLesson.value?lessonDashboardScope(props.learningAttemptId,sessionId.value):null));const learningCodeChecking=ref(false);const learningCodeResult=ref(null);const learningCodeState=computed(()=>learningCodeChecking.value?`checking`:learningCodeResult.value?.outcome||(learningCodeResult.value?.error?`blocked`:`idle`));const learningCodeTitles=Object.freeze({idle:`Code check`,checking:`Checking your code…`,passed:`Check passed`,"not-yet":`Not yet`,blocked:`Could not check`});const learningCodeIcons=Object.freeze({idle:`M8 3a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2H3v2h1a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h2v-2H8v-5a2 2 0 0 0-2-2 2 2 0 0 0 2-2V5h2V3m6 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2Z`,checking:`M12 4V1L8 5l4 4V6a6 6 0 0 1 6 6c0 1-.25 1.97-.7 2.8l1.46 1.46A7.93 7.93 0 0 0 20 12a8 8 0 0 0-8-8m0 14a6 6 0 0 1-6-6c0-1 .25-1.97.7-2.8L5.24 7.74A7.93 7.93 0 0 0 4 12a8 8 0 0 0 8 8v3l4-4-4-4v3Z`,passed:`M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17Z`,"not-yet":`M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2 1 21Z`,blocked:`M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20m5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59Z`});watch(practiceLesson,available=>{if(!available)learningCodeResult.value=null});const assistantHost=inject(VIBE64_ASSISTANT_HOST_KEY,null);const learningViewRef=inject(VIBE64_COLLEAGUE_VIEW_KEY,null);const learningLayoutRef=inject(VIBE64_COLLEAGUE_LAYOUT_KEY,null);const learningPreviewRef=inject(VIBE64_COLLEAGUE_PREVIEW_KEY,null);const learningIdentity=computed(()=>props.conversationRuntime?.identity?.learningAttemptId?props.conversationRuntime.identity:null);const learningWorkspaceAvailable=computed(()=>props.outputWorkspaceAvailable??props.sourceWorkspaceAvailable);const learningPaneActive=computed(()=>props.lessonsAvailable&&(props.learningView===`learning`||!learningWorkspaceAvailable.value));const normalWorkspaceActive=computed(()=>!props.lessonsAvailable||!learningPaneActive.value);const learningGestures=inject(VIBE64_TRAINING_LEARNER_GESTURE_KEY,null);function openLearningFile(path){if(!practiceLesson.value||typeof path!==`string`||!path)return false;openSourceEditorFile({path,presentation:`code`});return sourceEditorOpenRequest.value?.path===path}async function checkLearningCode(event){const owner=learningGestures?.value;if(learningCodeChecking.value)return;if(!owner?.submitCode||owner.matchesLearning?.(props.conversationRuntime?.identity)!==true){learningCodeResult.value={error:true,message:`Open this lesson's Learning conversation, then press Check my code again.`};return}learningCodeChecking.value=true;try{const response=await owner.submitCode(event);if(!response)throw new Error(`Your code could not be checked. Press Check my code again.`);learningCodeResult.value=response.checkOutcome===`passed`?{outcome:`passed`,message:`Your code passed the check. Now tell your teacher in Learning, in your own words, what you changed and why.`}:{outcome:`not-yet`,message:response.checkReason||`The check did not pass.`}}catch(error){learningCodeResult.value={error:true,message:String(error?.message||error||`Your code could not be checked.`)}}finally{learningCodeChecking.value=false}}const learningSelected=computed(()=>Boolean(learningIdentity.value&&props.active&&!props.sessionSelectionArchived&&props.conversationRuntime?.available?.value));const learningLayout=Object.freeze({get projectSlug(){return learningIdentity.value?.sourceProjectSlug||``},get learningAttemptId(){return learningIdentity.value?.learningAttemptId},get learnerId(){return learningIdentity.value?.learnerId},get ready(){return learningSelected.value&&Boolean(props.conversationRuntime?.conversationReady?.value)},get projectVisible(){return true},get chatVisible(){return!chatCollapsed.value}});const learningView=Object.freeze({get projectSlug(){return learningLayout.projectSlug},get sessionId(){return learningIdentity.value?.sessionId||``},get learningBinding(){return learningIdentity.value},get ready(){return learningLayout.ready},get learningView(){return props.learningView},get hostConversationSelected(){return false},get temporarySelected(){return false},get conversationId(){return``},openFile:openLearningFile,get pane(){if(!learningLayout.projectVisible)return`chat`;if(props.learningView===`workspace`){if(props.projectPane!==`dashboard`)return`preview`;return vibe64SessionToolRouteSegment(rightPaneTab.value)||`dashboard`}const preview=learningPreviewRef?.value;const binding=learningIdentity.value;return binding&&preview?.sessionId===binding.sessionId&&preview.learningAttemptId===binding.learningAttemptId&&preview.learnerId===binding.learnerId&&(preview.projectSlug||``)===(binding.sourceProjectSlug||``)&&(preview.appVisible===true||preview.presentation?.state?.visible===true)?`preview`:`lessons`}});watchEffect(()=>{if(learningSelected.value){if(learningLayoutRef)learningLayoutRef.value=learningLayout;if(learningViewRef)learningViewRef.value=learningView}else{if(learningViewRef?.value===learningView)learningViewRef.value=null;if(learningLayoutRef?.value===learningLayout)learningLayoutRef.value=null}},{flush:`sync`});onBeforeUnmount(()=>{if(learningViewRef?.value===learningView)learningViewRef.value=null;if(learningLayoutRef?.value===learningLayout)learningLayoutRef.value=null});const assistantLayerSelected=computed(()=>props.active&&!props.sessionSelectionArchived&&!temporaryAiWorkspace.value?.visible);const assistantLayer=reactive({get sessionId(){return sessionId.value}});watchEffect(()=>{if(!assistantHost)return;if(assistantLayerSelected.value)assistantHost.value=assistantLayer;else if(assistantHost.value===assistantLayer)assistantHost.value=null},{flush:`sync`});onBeforeUnmount(()=>{if(assistantHost?.value===assistantLayer)assistantHost.value=null});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:normalizeClass([`studio-autopilot`,{"studio-autopilot--chat-collapsed":unref(chatCollapsed)}])},[unref(sessionGithubActorHeaderVisible)?(openBlock(),createBlock(Teleport,{key:0,to:props.githubActorTeleportTarget},[createBaseVNode(`div`,{class:normalizeClass([`studio-home-shell-session-github-actor`,{"studio-home-shell-session-github-actor--inactive":!unref(sessionGithubActor).active}]),role:`status`,title:unref(sessionGithubActor).title},[createVNode(VIcon,{icon:unref(mdiGithub),size:`14`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(unref(sessionGithubActor).displayLabel),1)],10,_hoisted_1$12)],8,[`to`])):createCommentVNode(``,true),githubProject.value?(openBlock(),createBlock(Vibe64CreatePullRequestDialog_default,{key:1,modelValue:createPullRequestOpen.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>createPullRequestOpen.value=$event),"dashboard-context":dashboardContext.value},null,8,[`modelValue`,`dashboard-context`])):createCommentVNode(``,true),createBaseVNode(`section`,{ref_key:`mainChat`,ref:mainChat,class:`studio-autopilot__chat-panel`,"aria-label":`Session chat`,tabindex:`-1`},[createBaseVNode(`header`,_hoisted_2$11,[unref(sessionToolbarVisible)?(openBlock(),createBlock(Vibe64SessionToolbar_default,{key:0,active:props.active,archive:props.sessionArchive,compact:``,"create-visible":props.sessionToolbar.createSessionVisible===true,"create-teleport-target":props.createSessionTeleportTarget,"max-visible-sessions":3,"selected-session-id":unref(sessionId),"selection-archived":sessionArchiveDisabled.value,toolbar:props.sessionToolbar},null,8,[`active`,`archive`,`create-visible`,`create-teleport-target`,`selected-session-id`,`selection-archived`,`toolbar`])):createCommentVNode(``,true),unref(saveWorkHeaderVisible)?(openBlock(),createBlock(VTooltip,{key:1,"model-value":saveWorkChecking.value,location:`bottom`,"open-on-click":false,"open-on-focus":false,"open-on-hover":false},{activator:withCtx(({props:checkingProps})=>[createVNode(VBtn,mergeProps(checkingProps,{"aria-busy":unref(saveWorkSending)||saveWorkChecking.value?`true`:void 0,"aria-label":saveWorkChecking.value?`Checking repository status`:saveWorkCheckAvailable.value?`Check for updates`:unref(saveWorkHeaderAriaLabel),class:[`studio-autopilot__save-work`,{"studio-autopilot__save-work--check":saveWorkCheckAvailable.value}],color:unref(saveWorkRequiresUpdate)?`warning`:unref(saveWorkUnsaved)?`error`:void 0,disabled:saveWorkChecking.value||unref(saveWorkDisabled)&&!saveWorkCheckAvailable.value||temporaryAiWorkspace.value?.updateRepairTask?.busy,height:`var(--session-action-size, 48px)`,icon:``,title:saveWorkHeaderHint.value,type:`button`,variant:`tonal`,width:`var(--session-action-size, 48px)`,onClick:requestSessionSaveWork}),{default:withCtx(()=>[unref(saveConnectedFirst)?(openBlock(),createBlock(VIcon,{key:0,icon:unref(mdiSourceBranch)},null,8,[`icon`])):unref(saveWorkRequiresUpdate)?(openBlock(),createBlock(VIcon,{key:1,icon:unref(mdiSourceCommit)},null,8,[`icon`])):props.workState?.destination?.mode===`github`?(openBlock(),createElementBlock(`span`,_hoisted_3$11,[createVNode(VIcon,{icon:unref(mdiContentSaveOutline),size:`26`,class:`studio-autopilot__save-symbol-disk`},null,8,[`icon`]),createVNode(VIcon,{icon:unref(mdiSourceCommit),size:`24`,class:`studio-autopilot__save-symbol-commit`},null,8,[`icon`])])):(openBlock(),createBlock(VIcon,{key:3,icon:unref(mdiContentSaveOutline)},null,8,[`icon`]))]),_:1},16,[`aria-busy`,`aria-label`,`class`,`color`,`disabled`,`title`])]),default:withCtx(()=>[_cache[45]||(_cache[45]=createBaseVNode(`span`,{role:`status`},`Checking…`,-1))]),_:1},8,[`model-value`])):createCommentVNode(``,true),props.session?.sourceReady&&!props.sessionSelectionArchived&&props.session.purpose!==`learning`?(openBlock(),createBlock(_sfc_main$23,{key:`${unref(readRefOrGetterValue)(props.sessionsApiPath)}:${unref(sessionId)}`,session:props.session,"sessions-api-path":unref(readRefOrGetterValue)(props.sessionsApiPath),refresh:props.refreshSessionData},null,8,[`session`,`sessions-api-path`,`refresh`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$10,[props.sourceWorkspaceAvailable||props.sessionRenewal?.visible?(openBlock(),createBlock(VMenu,{key:0,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBadge,{color:sessionRenewalActionPresentation.value.attention&&sessionRenewalActionPresentation.value.color||`primary`,dot:``,"model-value":sessionRenewalActionPresentation.value.attention===true||temporaryAiHasUnreadMessages.value,"offset-x":`5`,"offset-y":`5`},{default:withCtx(()=>[createVNode(VBtn,mergeProps({ref_key:`sessionActionsTrigger`,ref:sessionActionsTrigger},menuProps,{"aria-label":sessionActionsLabel.value,"data-vibe64-session-actions":``,height:`48`,icon:unref(mdiDotsVertical),title:`Session actions`,type:`button`,variant:`text`,width:`48`}),null,16,[`aria-label`,`icon`])]),_:2},1032,[`color`,`model-value`])]),default:withCtx(()=>[createVNode(VList,{"aria-label":`Session actions`,density:`compact`,"min-width":`17rem`},{default:withCtx(()=>[unref(workspaceSetupActionVisible)?(openBlock(),createBlock(VListItem,{key:0,"data-vibe64-prepare-workspace":``,"min-height":`48`,disabled:unref(workspaceSetupRetryDisabled),"prepend-icon":unref(mdiWrenchOutline),subtitle:`Run all declared setup steps again`,title:`Prepare workspace`,onClick:unref(retryWorkspaceSetup)},null,8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(connectedUpdateActionVisible)?(openBlock(),createBlock(VListItem,{key:1,"data-vibe64-update-connected":``,"min-height":`48`,disabled:unref(workspaceSetupRetryDisabled),"prepend-icon":unref(mdiSourceBranchSync),subtitle:`Bring connected checkouts up to their branches, then prepare`,title:`Update connected repositories`,onClick:unref(retryWorkspaceSetup)},null,8,[`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),githubProject.value?(openBlock(),createBlock(VListItem,{key:2,"min-height":`48`,"prepend-icon":unref(mdiSourcePull),title:sessionPullRequest.value?.number?`View pull request`:`Create pull request`,subtitle:sessionPullRequest.value?.number?`PR #${sessionPullRequest.value.number}`:`Propose this work for merging`,to:sessionPullRequestTarget.value,disabled:!sessionPullRequest.value?.number&&sourceOperationsSuspended.value,onClick:_cache[1]||(_cache[1]=$event=>!sessionPullRequest.value?.number&&(createPullRequestOpen.value=true))},null,8,[`prepend-icon`,`title`,`subtitle`,`to`,`disabled`])):createCommentVNode(``,true),props.sessionRenewal?.visible?(openBlock(),createBlock(VListItem,{key:3,class:`studio-autopilot__session-action-item`,"data-vibe64-session-renew-action":``,"prepend-icon":unref(mdiAutorenew),subtitle:sessionRenewalActionPresentation.value.reason,title:sessionRenewalActionPresentation.value.label,onClick:_cache[2]||(_cache[2]=$event=>requestSessionRenewal(sessionActionsTrigger.value))},null,8,[`prepend-icon`,`subtitle`,`title`])):createCommentVNode(``,true),props.sourceWorkspaceAvailable?(openBlock(),createBlock(VListItem,{key:4,class:`studio-autopilot__session-action-item`,"data-vibe64-temporary-ai-action":``,disabled:!unref(sessionId)||props.sessionSelectionArchived,subtitle:temporaryAiHasUnreadMessages.value?`New messages in Temporary AI`:`Open a separate short-lived conversation`,title:`Temporary AI`,onClick:openTemporaryAi},{prepend:withCtx(()=>[createVNode(VBadge,{color:`primary`,dot:``,"model-value":temporaryAiHasUnreadMessages.value},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiIncognito)},null,8,[`icon`])]),_:1},8,[`model-value`])]),_:1},8,[`disabled`,`subtitle`])):createCommentVNode(``,true)]),_:1})]),_:1})):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_5$10,[unref(workspaceSetupActionVisible)?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Prepare workspace`,"data-vibe64-prepare-workspace":``,disabled:unref(workspaceSetupRetryDisabled),height:`var(--session-action-size, 48px)`,icon:unref(mdiWrenchOutline),title:`Prepare workspace: run all declared setup steps again`,type:`button`,variant:`text`,width:`var(--session-action-size, 48px)`,onClick:unref(retryWorkspaceSetup)},null,8,[`disabled`,`icon`,`onClick`])):createCommentVNode(``,true),githubProject.value?(openBlock(),createBlock(VBtn,{key:1,icon:unref(mdiSourcePull),height:`var(--session-action-size, 48px)`,width:`var(--session-action-size, 48px)`,variant:`text`,"aria-label":sessionPullRequest.value?.number?`View pull request`:`Create pull request`,title:sessionPullRequest.value?.number?`View pull request #${sessionPullRequest.value.number}`:`Create pull request`,to:sessionPullRequestTarget.value,disabled:!sessionPullRequest.value?.number&&sourceOperationsSuspended.value,onClick:_cache[3]||(_cache[3]=$event=>!sessionPullRequest.value?.number&&(createPullRequestOpen.value=true))},null,8,[`icon`,`aria-label`,`title`,`to`,`disabled`])):createCommentVNode(``,true),props.sessionRenewal?.visible?(openBlock(),createBlock(VBadge,{key:2,color:sessionRenewalActionPresentation.value.color||`primary`,dot:``,"model-value":sessionRenewalActionPresentation.value.attention===true,"offset-x":`5`,"offset-y":`5`},{default:withCtx(()=>[createVNode(VBtn,{"aria-label":sessionRenewalActionPresentation.value.label,color:sessionRenewalActionPresentation.value.color,"data-vibe64-session-renew-action":``,height:`var(--session-action-size, 48px)`,icon:unref(mdiAutorenew),title:sessionRenewalActionPresentation.value.reason,type:`button`,variant:`text`,width:`var(--session-action-size, 48px)`,onClick:_cache[4]||(_cache[4]=$event=>requestSessionRenewal($event.currentTarget))},null,8,[`aria-label`,`color`,`icon`,`title`])]),_:1},8,[`color`,`model-value`])):createCommentVNode(``,true),props.sourceWorkspaceAvailable?(openBlock(),createBlock(VBadge,{key:3,color:`primary`,dot:``,"model-value":temporaryAiHasUnreadMessages.value,"offset-x":`5`,"offset-y":`5`},{default:withCtx(()=>[createVNode(VBtn,{"aria-label":temporaryAiHasUnreadMessages.value?`Open temporary AI: unread messages`:`Open temporary AI`,disabled:!unref(sessionId)||props.sessionSelectionArchived,height:`var(--session-action-size, 48px)`,icon:unref(mdiIncognito),title:temporaryAiHasUnreadMessages.value?`New messages in Temporary AI`:`Open a temporary AI conversation`,type:`button`,variant:`text`,width:`var(--session-action-size, 48px)`,onClick:openTemporaryAi},null,8,[`aria-label`,`disabled`,`icon`,`title`])]),_:1},8,[`model-value`])):createCommentVNode(``,true)])]),createBaseVNode(`div`,_hoisted_6$9,[githubProject.value&&sessionPullRequest.value?(openBlock(),createBlock(VSheet,{key:0,color:`surface-light`,rounded:`lg`,class:`pa-2 text-body-small`,style:{"overflow-wrap":`anywhere`}},{default:withCtx(()=>[createBaseVNode(`strong`,null,toDisplayString(sessionPullRequest.value.number?`PR #${sessionPullRequest.value.number}`:`Pull request branch`),1),createTextVNode(` · Commit & push to `+toDisplayString(sessionPullRequest.value.headRepository)+`:`+toDisplayString(sessionPullRequest.value.headBranch),1)]),_:1})):createCommentVNode(``,true),unref(connectionRecoveryVisible)?(openBlock(),createBlock(VSheet,{key:1,class:`studio-autopilot__connection-recovery`,rounded:`lg`,role:`status`,"data-vibe64-connection-recovery":``},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_7$9,[unref(assistantAccountUnavailable)?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,"min-height":`32`,size:`small`,onClick:_cache[5]||(_cache[5]=$event=>unref(requestVibe64AccountConnectionsDialog)({section:`ai`}))},{default:withCtx(()=>[..._cache[46]||(_cache[46]=[createTextVNode(` Open AI Accounts `,-1)])]),_:1})):createCommentVNode(``,true),unref(assistantAccountUnavailable)&&!props.sessionSelectionArchived?(openBlock(),createBlock(_sfc_main$20,{key:1,session:props.session,"sessions-api-path":props.sessionsApiPath,disabled:sourceOperationsSuspended.value,onSaved:_cache[6]||(_cache[6]=$event=>{reloadAssistantAccess();props.retryAgentConnection()})},null,8,[`session`,`sessions-api-path`,`disabled`])):(openBlock(),createBlock(VBtn,{key:2,variant:`tonal`,"min-height":`32`,size:`small`,disabled:props.agentConnectionStatus===`reconciling`,onClick:_cache[7]||(_cache[7]=$event=>props.retryAgentConnection())},{default:withCtx(()=>[createTextVNode(toDisplayString(props.agentConnectionStatus===`disconnected`?`Reconnect`:`Retry connection`),1)]),_:1},8,[`disabled`])),props.agentConnectionStatus===`failed`&&props.sessionRenewal?.visible?(openBlock(),createBlock(VBtn,{key:3,variant:`tonal`,"min-height":`32`,size:`small`,onClick:_cache[8]||(_cache[8]=$event=>requestSessionRenewal($event.currentTarget))},{default:withCtx(()=>[..._cache[47]||(_cache[47]=[createTextVNode(` Renew session `,-1)])]),_:1})):createCommentVNode(``,true)]),unref(assistantAccountUnavailable)?(openBlock(),createElementBlock(`span`,_hoisted_8$9,toDisplayString(unref(assistantAccountMessage))+` Your draft is kept. `,1)):(openBlock(),createElementBlock(`span`,_hoisted_9$8,toDisplayString(props.agentConnectionStatus===`disconnected`?`Connection lost. Reconnecting automatically.`:props.agentConnectionError||`Checking the assistant connection.`)+` Your draft is kept. `,1))]),_:1})):createCommentVNode(``,true),unref(checkpointFailureVisible)?(openBlock(),createBlock(VAlert,{key:2,class:`studio-autopilot__checkpoint-notice`,type:`warning`,variant:`tonal`,density:`compact`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_10$7,[createBaseVNode(`div`,_hoisted_11$7,[_cache[48]||(_cache[48]=createBaseVNode(`strong`,{class:`text-body-medium`},`Recovery snapshot not saved`,-1)),createBaseVNode(`p`,_hoisted_12$7,toDisplayString(unref(checkpointFailureReason))+` Your files remain in this session. You can keep chatting.`,1)]),createVNode(VBtn,{variant:`text`,"min-height":`48`,"aria-label":`Dismiss recovery snapshot warning`,onClick:unref(dismissCheckpointFailure)},{default:withCtx(()=>[..._cache[49]||(_cache[49]=[createTextVNode(`Dismiss`,-1)])]),_:1},8,[`onClick`])]),(openBlock(),createElementBlock(`details`,{key:unref(checkpointFailure)},[_cache[50]||(_cache[50]=createBaseVNode(`summary`,{class:`text-body-small`},`Technical details`,-1)),_cache[51]||(_cache[51]=createBaseVNode(`p`,{class:`text-body-small mt-2 mb-2`},`Vibe64 tries again after the next assistant turn finishes. A successful snapshot clears this warning. Dismiss hides this failure only; a new failure will appear again.`,-1)),createBaseVNode(`pre`,_hoisted_13$7,toDisplayString(unref(checkpointFailure)),1)]))]),_:1})):createCommentVNode(``,true),testApproval.value&&unref(resourceRecoveryControl)?(openBlock(),createBlock(VSheet,{key:3,class:`d-flex flex-wrap align-center justify-space-between ga-2 pa-2`,color:`surface-variant`,rounded:`lg`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_14$7,toDisplayString(testApproval.value.state===`waiting`?`Tests need memory approval`:`Resuming the original test…`),1),(openBlock(),createBlock(resolveDynamicComponent(unref(resourceRecoveryControl)),{key:`${unref(sessionId)}:${testApproval.value.admissionId}`,"admission-id":testApproval.value.admissionId,"session-id":unref(sessionId),disabled:testApproval.value.state!==`waiting`,onRetryResult:_cache[9]||(_cache[9]=$event=>props.refreshSessionData?.()),onRecheck:_cache[10]||(_cache[10]=$event=>props.refreshSessionData?.())},null,40,[`admission-id`,`session-id`,`disabled`]))]),_:1})):createCommentVNode(``,true),unref(saveWorkConnectedResults).length?(openBlock(),createBlock(VAlert,{key:4,type:`info`,variant:`tonal`,closable:``,"onClick:close":_cache[11]||(_cache[11]=$event=>saveWorkConnectedResults.value=[])},{default:withCtx(()=>[_cache[52]||(_cache[52]=createBaseVNode(`p`,{class:`mb-2`},`Connected contributions pushed. The main project was not pushed.`,-1)),createBaseVNode(`ul`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(saveWorkConnectedResults),result=>{return openBlock(),createElementBlock(`li`,{key:result.sessionId},[createTextVNode(toDisplayString(result.repository)+` · `,1),createBaseVNode(`code`,null,toDisplayString(result.saveCommit?.slice(0,12)),1),result.recorded===false?(openBlock(),createElementBlock(`span`,_hoisted_15$7,` — retry Save to record this confirmed commit.`)):result.reconciled===false?(openBlock(),createElementBlock(`span`,_hoisted_16$6,` — open its session to finish reconciliation.`)):createCommentVNode(``,true)])}),128))]),_cache[53]||(_cache[53]=createBaseVNode(`p`,{class:`mt-2 mb-0`},`Review these contributions in the receiving projects’ Incoming changes.`,-1))]),_:1})):createCommentVNode(``,true),createVNode(Vibe64TemporaryActionTerminal_default,{active:unref(saveWorkOperationActive)||unref(saveWorkSending),dismissed:unref(saveWorkActivityDismissed)||updateHandledInRepair.value,error:unref(saveWorkError),"error-title":`${unref(saveWorkActivityLabel)} needs attention`,height:`clamp(8rem, 22vh, 14rem)`,"operation-key":unref(saveWorkActivityKey),output:unref(saveWorkOutput),retryable:unref(saveWorkRetryable),stage:unref(saveWorkStage),starting:unref(saveWorkSending),status:unref(saveWorkStatus),subtitle:unref(saveWorkActivityIsUpdate)?`Replay current work on the latest saved version`:`Canonical project Save`,title:unref(saveWorkActivityLabel),onCopy:_cache[13]||(_cache[13]=$event=>copyActivityOutput(unref(saveWorkOutput))),onDismiss:unref(dismissSaveWorkActivity),onRetry:unref(retrySaveWork)},createSlots({_:2},[unref(saveWorkError)&&(unref(saveWorkCanResolveWithTemporaryAi)||saveWorkCanCreatePullRequest.value)?{name:`error-actions`,fn:withCtx(()=>[unref(updateConflictRecovery)?(openBlock(),createBlock(VBtn,{key:0,variant:`tonal`,height:`48`,disabled:unref(updateWorkDisabled)||sourceOperationsSuspended.value||temporaryAiWorkspace.value?.updateRepairTask?.busy,onClick:unref(reviewResolvedUpdate)},{default:withCtx(()=>[..._cache[54]||(_cache[54]=[createTextVNode(` Review resolved conflicts `,-1)])]),_:1},8,[`disabled`,`onClick`])):createCommentVNode(``,true),unref(saveWorkCanResolveWithTemporaryAi)?(openBlock(),createBlock(Vibe64TemporaryAiFixAction_default,{key:1,disabled:unref(repositoryRecoverySending)||!(unref(saveWorkActivityIsUpdate)?unref(assistantSeniorAllowed):unref(assistantJuniorAllowed)),pending:unref(repositoryRecoverySending),title:(unref(saveWorkActivityIsUpdate)?unref(assistantSeniorAllowed):unref(assistantJuniorAllowed))?`Open temporary AI to resolve this repository problem`:unref(saveWorkActivityIsUpdate)?assistantSeniorRestrictionMessage.value:assistantJuniorRestrictionMessage.value,onClick:unref(fixRepositoryActionError)},null,8,[`disabled`,`pending`,`title`,`onClick`])):createCommentVNode(``,true),saveWorkCanCreatePullRequest.value?(openBlock(),createBlock(VBtn,{key:2,color:`primary`,variant:`flat`,height:`48`,disabled:unref(saveWorkDisabled)||sourceOperationsSuspended.value,onClick:_cache[12]||(_cache[12]=$event=>createPullRequestOpen.value=true)},{default:withCtx(()=>[..._cache[55]||(_cache[55]=[createTextVNode(` Create draft PR `,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true)]),key:`0`}:void 0]),1032,[`active`,`dismissed`,`error`,`error-title`,`operation-key`,`output`,`retryable`,`stage`,`starting`,`status`,`subtitle`,`title`,`onDismiss`,`onRetry`]),createVNode(_sfc_main$17,{"project-slug":unref(projectSlug),"session-id":unref(sessionId),failure:unref(saveWorkFailure),disabled:unref(saveWorkSending)||unref(saveWorkOperationActive)||sourceOperationsSuspended.value||unref(agentActive),onReplaced:_cache[14]||(_cache[14]=$event=>{props.refreshSessionData?.();props.refreshSessionWork?.()})},null,8,[`project-slug`,`session-id`,`failure`,`disabled`]),createVNode(Vibe64TemporaryActionTerminal_default,{active:unref(workspaceSetupRunning)||unref(workspaceSetupRetrying),dismissed:unref(workspaceSetupDismissed),error:unref(workspaceSetupError),"error-title":`Workspace preparation needs attention`,height:`clamp(8rem, 22vh, 14rem)`,"operation-key":unref(workspaceSetupActivityKey),output:unref(workspaceSetupOutput),retryable:unref(workspaceSetupNeedsAttention)&&unref(workspaceSetupStatus)!==`required`&&!unref(workspaceSetupRetryDisabled)&&!resourceRetryBusy.value,stage:unref(workspaceSetupCurrentLabel),starting:unref(workspaceSetupRunning)||unref(workspaceSetupRetrying),status:unref(workspaceSetupStatus),subtitle:`Project dependency preparation`,title:unref(workspaceSetupTitle),onCopy:_cache[17]||(_cache[17]=$event=>copyActivityOutput(unref(workspaceSetupOutput))),onDismiss:unref(dismissWorkspaceSetupActivity),onRetry:unref(retryWorkspaceSetup)},createSlots({_:2},[unref(workspaceSetupNeedsAttention)?{name:`error-actions`,fn:withCtx(()=>[unref(resourceRecoveryControl)&&props.session?.workspaceSetup?.resourceAdmissionId?(openBlock(),createBlock(resolveDynamicComponent(unref(resourceRecoveryControl)),{key:`${unref(sessionId)}:${props.session.workspaceSetup.resourceAdmissionId}`,"admission-id":props.session.workspaceSetup.resourceAdmissionId,"session-id":unref(sessionId),disabled:unref(workspaceSetupRetryDisabled)&&!resourceRetryBusy.value,onBusy:_cache[15]||(_cache[15]=$event=>resourceRetryBusy.value=$event),onRetryResult:_cache[16]||(_cache[16]=$event=>props.refreshSessionData?.()),onRecheck:unref(retryWorkspaceSetup)},null,40,[`admission-id`,`session-id`,`disabled`,`onRecheck`])):unref(workspaceSetupStatus)===`required`?(openBlock(),createBlock(VBtn,{key:1,disabled:unref(workspaceSetupRetryDisabled),loading:unref(workspaceSetupRetrying),size:`small`,title:`Run all declared workspace setup steps, including any database preparation`,variant:`tonal`,onClick:unref(retryWorkspaceSetup)},{default:withCtx(()=>[..._cache[56]||(_cache[56]=[createTextVNode(` Prepare workspace `,-1)])]),_:1},8,[`disabled`,`loading`,`onClick`])):(openBlock(),createBlock(Vibe64TemporaryAiFixAction_default,{key:2,disabled:unref(workspaceSetupAskDisabled),pending:unref(workspaceSetupFixSending),title:unref(assistantJuniorAllowed)?`Open temporary AI to resolve workspace preparation`:assistantJuniorRestrictionMessage.value,onClick:unref(askCodexToFixWorkspaceSetup)},null,8,[`disabled`,`pending`,`title`,`onClick`]))]),key:`0`}:void 0]),1032,[`active`,`dismissed`,`error`,`operation-key`,`output`,`retryable`,`stage`,`starting`,`status`,`title`,`onDismiss`,`onRetry`])]),createVNode(Vibe64ConversationLog_default,{ref_key:`conversationView`,ref:conversationView,"voice-runtime":props.active&&!props.sessionSelectionArchived?props.conversationRuntime:null,working:unref(agentWorking),"integration-action-pending":props.conversationLog?.integrationActionPending,"integration-connections":props.conversationLog?.integrationConnections,"integration-action-error":props.conversationLog?.integrationActionError,"integration-requests-enabled":props.active&&!props.sessionSelectionArchived,"session-id":unref(sessionId),"assistant-label":conversationAssistantLabel.value,class:`studio-autopilot__conversation`,error:props.conversationLog?.error,"error-reloadable":props.conversationLog?.errorReloadable,"follow-latest-key":unref(conversationFollowLatestKey),"has-more-before":props.conversationLog?.hasMoreBefore,loading:props.conversationLog?.loading,"loading-more":props.conversationLog?.loadingMore,"load-more-error":props.conversationLog?.loadMoreError,reloading:unref(chatReloading),"scroll-key":unref(conversationScrollKey),"source-root":unref(sessionSourceRoot),turns:unref(chatTurns),"hidden-by-workspace-mode":props.hiddenByWorkspaceMode,visible:unref(conversationLogVisible)&&!unref(chatCollapsed)&&!temporaryAiWorkspace.value?.visible,"welcome-message":unref(emptyConversationWelcome),onCancelTurn:unref(cancelOptimisticMessage),onEditTurn:unref(editOptimisticMessage),onLoadMore:unref(loadMoreChatTurns),onOpenSourceFile:unref(openSourceEditorFile),onOpenPlanHistory:_cache[29]||(_cache[29]=$event=>workPlanViewer.value?.showPlan(`history`)),onOpenIntegration:unref(openIntegrationRequest),onSkipIntegration:unref(skipIntegrationRequest),onResumeIntegration:unref(resumeIntegrationRequest),onConnectIntegration:unref(connectIntegrationRequest),onCheckIntegration:unref(checkIntegrationRequest),onCancelIntegration:unref(cancelIntegrationRequest),onResendTurn:unref(resendOptimisticMessage),onReload:unref(reloadChatPane)},{hints:withCtx(()=>[createVNode(unref(AssistantComposerSupport_default),{activity:{label:composerAssistantLabel.value},loading:!composerAssistantLabel.value&&unref(promptHintsVisible)&&unref(promptHintsLoading),"status-id":thinkingStatusId,suggestions:!composerAssistantLabel.value&&unref(promptHintsVisible)?unref(promptHintSuggestions):[],onDismiss:dismissPromptHintsAndFocus,onFocusout:handlePromptHintsFocusOut,onPreview:unref(previewPromptHint),onSelect:unref(selectPromptHint)},createSlots({_:2},[unref(reasoningActive)&&composerAssistantLabel.value===`Assistant is working...`?{name:`activity`,fn:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiCircle),size:`7`,color:`primary`},null,8,[`icon`]),_cache[57]||(_cache[57]=createBaseVNode(`span`,null,[createTextVNode(`Assistant is working`),createBaseVNode(`span`,{class:`studio-autopilot__reasoning-dots`},`...`)],-1))]),key:`0`}:void 0]),1032,[`activity`,`loading`,`suggestions`,`onPreview`,`onSelect`])]),composer:withCtx(({composerBlocked,setVoiceFeedbackTarget})=>[createBaseVNode(`div`,{class:`studio-autopilot__composer`,onFocusout:handleComposerRegionFocusOut},[createVNode(Vibe64RoutingNotice_default,{request:unref(routingRequest),selection:props.session?.assistantSelection,mode:unref(assistantRoutingFromMetadata)(props.session?.metadata)?.mode||``,active:props.active&&unref(conversationLogVisible),"pending-action":routingActionSending.value,"action-error":routingActionError.value,busy:unref(agentActive)||unref(composerSending)||composerBlocked,onRetry:_cache[18]||(_cache[18]=$event=>sendRoutingAction(`continue`)),onImplement:_cache[19]||(_cache[19]=$event=>sendRoutingAction(`implement`)),onViewPlan:_cache[20]||(_cache[20]=$event=>workPlanViewer.value?.showPlan(`current`)),onSkip:_cache[21]||(_cache[21]=$event=>props.interruptAgentTurn({reason:`skip-review`}))},null,8,[`request`,`selection`,`mode`,`active`,`pending-action`,`action-error`,`busy`]),(openBlock(),createBlock(_sfc_main$40,{ref_key:`composerInput`,ref:composerInput,key:unref(composerKey),"saved-attachments":unref(composerAttachments),modelValue:unref(composerDraft),"onUpdate:modelValue":_cache[28]||(_cache[28]=$event=>isRef(composerDraft)?composerDraft.value=$event:null),"aria-label":`Message AI assistant`,"attachments-enabled":unref(composerAttachmentsEnabled),"described-by":composerSupportStatusVisible.value?thinkingStatusId:``,disabled:unref(composerDisabled),density:`compact`,placeholder:composerPromptHintPlaceholder.value,"placeholder-affects-height":!composerPromptHintPreview.value,rows:1,"session-id":unref(sessionId),"submit-enabled":unref(composerCanSubmit)&&!composerBlocked,"tab-to-submit":``,onAttachmentStateChange:updateComposerAttachmentState,onAttachmentsChange:unref(updateComposerAttachments),onBlur:handleComposerBlur,onEscape:unref(dismissPromptHints),onFocus:unref(focusPromptHints),onInputActivity:unref(noteTypingActivity),onSubmit:sendComposerMessage,onTabToSubmit:focusComposerSendButton},{"input-start":withCtx(()=>[createVNode(unref(AssistantQuestionInputs_default),{answers:unref(questionAnswers),"onUpdate:answers":_cache[22]||(_cache[22]=$event=>isRef(questionAnswers)?questionAnswers.value=$event:null),choice:unref(selectedAnswerChoice),"onUpdate:choice":_cache[23]||(_cache[23]=$event=>isRef(selectedAnswerChoice)?selectedAnswerChoice.value=$event:null),questions:unref(numberedQuestions),"select-items":unref(numberedQuestionSelectItems),choices:unref(answerChoices),onDismiss:unref(dismissNumberedQuestions)},null,8,[`answers`,`choice`,`questions`,`select-items`,`choices`,`onDismiss`])]),footer:withCtx(({attachmentState})=>[createBaseVNode(`div`,_hoisted_17$6,[!props.sessionSelectionArchived?(openBlock(),createBlock(Vibe64ChatModeControls_default,{key:0,session:props.session,"sessions-api-path":props.sessionsApiPath,goal:unref(readRefOrGetterValue)(props.conversationRuntime?.goalState)?.goal,purposes:assistantPurposes.value,disabled:sourceOperationsSuspended.value,active:unref(agentActive),"can-configure":assistantCanConfigureRouting.value,connecting:[`initializing`,`reconciling`].includes(props.agentConnectionStatus),loading:assistantAccessLoading.value,"load-error":assistantAccessError.value,onReload:reloadAssistantAccess,onSaved:reloadAssistantAccess,onCustom:_cache[24]||(_cache[24]=$event=>{composerSettingsButton.value=$event;composerSettingsOpen.value=true})},{default:withCtx(()=>[composerAccessHint.value?(openBlock(),createElementBlock(`div`,_hoisted_18$6,[createBaseVNode(`div`,_hoisted_19$5,[createTextVNode(toDisplayString(composerAccessHint.value)+` `,1),unref(agentObservationLost)&&!unref(agentActive)?(openBlock(),createBlock(VBtn,{key:0,size:`small`,variant:`text`,disabled:unref(composerDisabled)||unref(composerSending),onClick:continueConversation},{default:withCtx(()=>[..._cache[58]||(_cache[58]=[createTextVNode(` Continue `,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true)])])):createCommentVNode(``,true)]),_:1},8,[`session`,`sessions-api-path`,`goal`,`purposes`,`disabled`,`active`,`can-configure`,`connecting`,`loading`,`load-error`])):createCommentVNode(``,true),createVNode(VMenu,{eager:``,location:`top start`,"close-on-content-click":false},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{"aria-label":`Add to message`,title:`Add to message`,icon:unref(mdiPlus),size:`small`,variant:`text`,class:`studio-autopilot__composer-action`}),null,16,[`icon`])]),default:withCtx(()=>[createVNode(VCard,{class:`studio-autopilot__composer-menu pa-2`,"aria-label":`Add to message`},{default:withCtx(()=>[unref(composerAttachmentsSupported)?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Attach files`,class:`studio-autopilot__composer-action justify-start`,disabled:!unref(composerAttachmentsEnabled)||!attachmentState.canAddFiles,"prepend-icon":unref(mdiPaperclip),size:`small`,title:`Attach files`,type:`button`,variant:`text`,onClick:_cache[25]||(_cache[25]=$event=>composerInput.value?.openFilePicker?.())},{default:withCtx(()=>[..._cache[59]||(_cache[59]=[createTextVNode(` Attach files `,-1)])]),_:1},8,[`disabled`,`prepend-icon`])):createCommentVNode(``,true),unref(composerAttachmentsSupported)&&unref(previewAttachmentState).captureAvailable?(openBlock(),createBlock(VBtn,{key:1,"aria-label":`Attach visible preview`,class:`studio-autopilot__composer-action justify-start`,"aria-busy":unref(previewAttachmentState).captureBusy?`true`:void 0,disabled:!unref(composerAttachmentsEnabled)||!attachmentState.canAddFiles||unref(previewAttachmentState).captureBusy,"prepend-icon":unref(mdiEyePlusOutline),size:`small`,title:`Attach visible preview`,type:`button`,variant:`text`,onClick:unref(captureVisiblePreview)},{default:withCtx(()=>[..._cache[60]||(_cache[60]=[createTextVNode(` Attach visible preview `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),unref(composerAttachmentsSupported)&&unref(previewAttachmentState).diagnosticsAvailable?(openBlock(),createBlock(VBtn,{key:2,"aria-label":`Attach console & network`,class:`studio-autopilot__composer-action justify-start`,"aria-busy":unref(previewAttachmentState).diagnosticsBusy?`true`:void 0,disabled:!unref(composerAttachmentsEnabled)||!attachmentState.canAddFiles||unref(previewAttachmentState).diagnosticsBusy,"prepend-icon":unref(mdiConsoleNetworkOutline),size:`small`,title:`Attach console and network diagnostics`,type:`button`,variant:`text`,onClick:unref(attachPreviewDiagnostics)},{default:withCtx(()=>[..._cache[61]||(_cache[61]=[createTextVNode(` Attach console & network `,-1)])]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true)]),_:2},1024)]),_:2},1024),createVNode(Vibe64StarredFilesMenu_default,{bookmarks:unref(fileBookmarks),onOpenFile:unref(openSourceEditorFile)},null,8,[`bookmarks`,`onOpenFile`]),createVNode(Vibe64AgentPlanUsage_default,{active:props.active&&!props.sessionSelectionArchived,session:props.session,"conversation-runtime":props.conversationRuntime,"sessions-api-path":props.sessionsApiPath},null,8,[`active`,`session`,`conversation-runtime`,`sessions-api-path`]),createVNode(Vibe64WorkPlan_default,{ref_key:`workPlanViewer`,ref:workPlanViewer,session:props.session,"sessions-api-path":props.sessionsApiPath,active:props.active&&unref(conversationLogVisible),busy:unref(agentActive)},null,8,[`session`,`sessions-api-path`,`active`,`busy`]),createVNode(Vibe64SessionAssistantMenu_default,{modelValue:composerSettingsOpen.value,"onUpdate:modelValue":_cache[26]||(_cache[26]=$event=>composerSettingsOpen.value=$event),target:composerSettingsButton.value,"can-configure":assistantCanConfigureRouting.value,"changes-disabled":sourceOperationsSuspended.value,session:props.session,"sessions-api-path":props.sessionsApiPath,onSaved:_cache[27]||(_cache[27]=$event=>{props.refreshSessionData?.();reloadAssistantAccess()})},null,8,[`modelValue`,`target`,`can-configure`,`changes-disabled`,`session`,`sessions-api-path`]),createVNode(Vibe64ComposerDelivery_default,{ref_key:`composerSendButton`,ref:composerSendButton,"stop-visible":unref(agentStopVisible),"stop-enabled":unref(agentStopEnabled),stopping:unref(interrupting),"can-submit":unref(composerCanSubmit)&&!composerBlocked&&attachmentState.canSubmit,sending:unref(composerSending),"submit-mode":unref(composerSubmitMode),"submit-aria-label":unref(composerSubmitAriaLabel),"submit-title":unref(composerSubmitTitle),onStop:unref(requestAgentInterrupt),onSubmit:sendComposerMessage},null,8,[`stop-visible`,`stop-enabled`,`stopping`,`can-submit`,`sending`,`submit-mode`,`submit-aria-label`,`submit-title`,`onStop`])]),createBaseVNode(`div`,{ref:setVoiceFeedbackTarget,class:`studio-autopilot__voice-feedback`},null,512)]),_:2},1032,[`saved-attachments`,`modelValue`,`attachments-enabled`,`described-by`,`disabled`,`placeholder`,`placeholder-affects-height`,`session-id`,`submit-enabled`,`onAttachmentsChange`,`onEscape`,`onFocus`,`onInputActivity`]))],32)]),_:1},8,[`voice-runtime`,`working`,`integration-action-pending`,`integration-connections`,`integration-action-error`,`integration-requests-enabled`,`session-id`,`assistant-label`,`error`,`error-reloadable`,`follow-latest-key`,`has-more-before`,`loading`,`loading-more`,`load-more-error`,`reloading`,`scroll-key`,`source-root`,`turns`,`hidden-by-workspace-mode`,`visible`,`welcome-message`,`onCancelTurn`,`onEditTurn`,`onLoadMore`,`onOpenSourceFile`,`onOpenIntegration`,`onSkipIntegration`,`onResumeIntegration`,`onConnectIntegration`,`onCheckIntegration`,`onCancelIntegration`,`onResendTurn`,`onReload`]),props.sourceWorkspaceAvailable?(openBlock(),createBlock(Vibe64TemporaryAiWorkspace_default,{key:0,ref_key:`temporaryAiWorkspace`,ref:temporaryAiWorkspace,active:props.active&&!unref(chatCollapsed),"session-selected":props.active,"assistant-selection":props.session?.assistantSelection,"assistant-ready":Boolean(unref(sessionId))&&!props.sessionSelectionArchived,"can-configure-routing":assistantCanConfigureRouting.value,"preview-attachment-state":unref(previewAttachmentState),"project-slug":unref(projectSlug),"session-id":unref(sessionId),"main-has-messages":unref(chatTurns).length>0,"sessions-api-path":props.sessionsApiPath,"repository-busy":unref(saveWorkOperationActive)||unref(saveWorkSending),"update-disabled":unref(updateWorkDisabled),"update-disabled-reason":unref(saveWorkTitle),"can-review-update":Boolean(unref(updateConflictRecovery)),"workspace-setup-status":unref(workspaceSetupStatus),onCheckUpdate:checkTemporaryAiUpdate,onReviewUpdate:unref(reviewResolvedUpdate),onSelectMainChat:showMainChat,onTaskFinished:finishTemporaryAiTask},null,8,[`active`,`session-selected`,`assistant-selection`,`assistant-ready`,`can-configure-routing`,`preview-attachment-state`,`project-slug`,`session-id`,`main-has-messages`,`sessions-api-path`,`repository-busy`,`update-disabled`,`update-disabled-reason`,`can-review-update`,`workspace-setup-status`,`onReviewUpdate`])):createCommentVNode(``,true)],512),createBaseVNode(`section`,_hoisted_20$5,[dashboardAvailable.value&&unref(sourceToolLoading)?(openBlock(),createBlock(Vibe64AsyncModuleState_default,{key:0,class:`studio-autopilot__right-pane-page`,label:`session source`,loading:``})):createCommentVNode(``,true),dashboardAvailable.value&&props.projectPane===`dashboard`?withDirectives((openBlock(),createBlock(Vibe64DashboardShell_default,{key:1,class:`studio-autopilot__dashboard-shell`,"dashboard-context":dashboardContext.value},{default:withCtx(()=>[withDirectives(createBaseVNode(`div`,_hoisted_21$5,[unref(dashboardRouteVisible)?renderSlot(_ctx.$slots,`dashboard`,{dashboardContext:dashboardContext.value},void 0,true,0):createCommentVNode(``,true)],512),[[vShow,unref(dashboardRouteVisible)]]),withDirectives(createBaseVNode(`div`,_hoisted_22$5,[props.sourceWorkspaceAvailable&&unref(rightPaneTabMounted)(`ai-terminal`)?renderSlot(_ctx.$slots,`ai-terminal`,{active:unref(rightPaneTab)===`ai-terminal`},void 0,true,0):createCommentVNode(``,true)],512),[[vShow,unref(rightPaneTab)===`ai-terminal`]])]),_:3},8,[`dashboard-context`])),[[vShow,unref(dashboardShellVisible)&&normalWorkspaceActive.value]]):createCommentVNode(``,true),dashboardAvailable.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`changes`?withDirectives((openBlock(),createElementBlock(`section`,_hoisted_23$5,[createBaseVNode(`header`,_hoisted_24$3,[createVNode(Vibe64DashboardBackButton_default,{onClick:unref(backToDashboard)},null,8,[`onClick`])]),createBaseVNode(`div`,_hoisted_25$3,[renderSlot(_ctx.$slots,`dashboard`,{dashboardContext:dashboardContext.value},void 0,true)])],512)),[[vShow,normalWorkspaceActive.value]]):createCommentVNode(``,true),withDirectives(createBaseVNode(`section`,_hoisted_26$2,[createBaseVNode(`header`,_hoisted_27$2,[createVNode(Vibe64DashboardBackButton_default,{onClick:_cache[30]||(_cache[30]=$event=>unref(systemBackAvailable)?unref(backToSystemFromEditor)():unref(backToDashboard)())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(systemBackAvailable)?`Back to Architecture`:`Back to dashboard`),1)]),_:1})]),props.sourceWorkspaceAvailable&&unref(rightPaneTabMounted)(`editor`)?(openBlock(),createBlock(Vibe64SessionFiles_default,{key:assistantAccessScopeKey.value,"repo-available":Boolean(unref(sessionSourceRoot)),active:props.active&&normalWorkspaceActive.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`editor`,"agent-active":unref(agentActive),"file-bookmarks":unref(fileBookmarks),"assistant-available":assistantCanUsePurpose(`source_explanation`),"assistant-unavailable-message":assistantPurposes.value.source_explanation?.message||`Source explanations are unavailable.`,"ask-codex-available":unref(sourceEditorAskCodexAvailable),class:`studio-autopilot__session-tool-content`,"open-request":unref(sourceEditorOpenRequest),"project-slug":unref(projectSlug),"session-id":unref(sessionId),"sessions-api-path":unref(readRefOrGetterValue)(props.sessionsApiPath),onAskCodexAboutFile:unref(askCodexAboutSourceEditorFile),onOpenProgram:_cache[31]||(_cache[31]=$event=>{architectureProgramRequest.value={id:$event};unref(selectSessionTool)(`system`)})},null,8,[`repo-available`,`active`,`agent-active`,`file-bookmarks`,`assistant-available`,`assistant-unavailable-message`,`ask-codex-available`,`open-request`,`project-slug`,`session-id`,`sessions-api-path`,`onAskCodexAboutFile`])):createCommentVNode(``,true),unref(practiceLesson)&&unref(rightPaneTabMounted)(`editor`)?(openBlock(),createBlock(Vibe64SessionSourceEditor_default,{key:1,"lesson-scoped":``,active:props.active&&normalWorkspaceActive.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`editor`,"agent-active":unref(agentActive),"assistant-available":false,"assistant-unavailable-message":`Ask your lesson teacher in Learning about this code.`,class:`studio-autopilot__session-tool-content`,"file-bookmarks":unref(fileBookmarks),"open-request":unref(sourceEditorOpenRequest),"project-slug":props.conversationRuntime.identity.sourceProjectSlug,"session-id":unref(sessionId),"sessions-api-path":unref(readRefOrGetterValue)(props.sessionsApiPath)},null,8,[`active`,`agent-active`,`file-bookmarks`,`open-request`,`project-slug`,`session-id`,`sessions-api-path`])):createCommentVNode(``,true)],512),[[vShow,normalWorkspaceActive.value&&dashboardAvailable.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`editor`]]),withDirectives(createBaseVNode(`section`,_hoisted_28$2,[createBaseVNode(`header`,_hoisted_29$2,[createVNode(Vibe64DashboardBackButton_default,{onClick:_cache[32]||(_cache[32]=$event=>unref(systemBackAvailable)?unref(backToSystemFromEditor)():unref(backToDashboard)())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(systemBackAvailable)?`Back to Architecture`:`Back to dashboard`),1)]),_:1})]),dashboardAvailable.value&&unref(rightPaneTabMounted)(`database`)?(openBlock(),createBlock(unref(Vibe64DatabaseWorkspace),{key:assistantAccessScopeKey.value,"open-request":unref(databaseOpenRequest),active:props.active&&normalWorkspaceActive.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`database`,"assistant-available":!unref(practiceLesson)&&assistantCanUsePurpose(`junior`),"assistant-unavailable-message":unref(practiceLesson)?`Ask your lesson teacher in Learning about this data.`:assistantJuniorRestrictionMessage.value,class:`studio-autopilot__session-tool-content`,"learning-attempt-id":unref(practiceLesson)?props.learningAttemptId:``,"project-slug":unref(practiceLesson)?props.conversationRuntime.identity.sourceProjectSlug:unref(projectSlug),"session-id":unref(sessionId),"sessions-api-path":props.sessionsApiPath,onRequestOverviewAssistant:_cache[33]||(_cache[33]=$event=>assistantCanUsePurpose(`junior`)?startTemporaryAiTask($event):unref(prefillComposer)($event.message,{append:true}))},null,8,[`open-request`,`active`,`assistant-available`,`assistant-unavailable-message`,`learning-attempt-id`,`project-slug`,`session-id`,`sessions-api-path`])):createCommentVNode(``,true)],512),[[vShow,normalWorkspaceActive.value&&dashboardAvailable.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`database`]]),withDirectives(createBaseVNode(`section`,_hoisted_30$2,[dashboardAvailable.value&&unref(rightPaneTabMounted)(`system`)?(openBlock(),createBlock(unref(Vibe64ArchitectureView),{key:0,"assistant-available":!unref(practiceLesson)&&unref(assistantJuniorAllowed)&&!unref(repositoryOperationActive)&&!props.sessionSelectionArchived,active:props.active&&normalWorkspaceActive.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`system`,class:`studio-autopilot__session-tool-content`,"resolve-request-url":unref(resolveStudioRequestUrl),"restore-request":unref(systemRestoreRequest),"open-program-request":architectureProgramRequest.value,"reload-version":unref(systemReloadVersion),"project-slug":unref(projectSlug),onOpenTable:unref(openSubsystemTable),onDescribeSubsystems:unref(describeSubsystems),"session-id":unref(sessionId),onInspectFile:_cache[34]||(_cache[34]=$event=>architectureFileRequest.value={...$event,presentation:`interface`}),onOpenSourceFileImmersive:unref(openSourceEditorFile),onOpenSourceFile:unref(openSourceEditorFile)},{navigation:withCtx(()=>[createVNode(Vibe64DashboardBackButton_default,{onClick:unref(backToDashboard)},null,8,[`onClick`])]),text:withCtx(({text,sourcePath,openSource})=>[createVNode(unref(LongTextPreviewBlocks_default),{blocks:unref(parseLongTextReviewBlocks)(text||``),onOpenLink:$event=>openSubsystemTextLink($event,sourcePath,openSource)},null,8,[`blocks`,`onOpenLink`])]),"file-interface":withCtx(({request,active,architecture,openFile,updateLocation,openProgram})=>[createVNode(Vibe64SessionSourceEditor_default,{"single-file":``,"lesson-scoped":unref(practiceLesson),active:props.active&&active,"agent-active":unref(agentActive),"architecture-facts":architecture,"file-bookmarks":unref(fileBookmarks),"ask-codex-available":unref(sourceEditorAskCodexAvailable),onAskCodexAboutFile:unref(askCodexAboutSourceEditorFile),onOpenProgram:openProgram,"open-request":request,"project-slug":unref(practiceLesson)?props.conversationRuntime.identity.sourceProjectSlug:unref(projectSlug),"session-id":unref(sessionId),"sessions-api-path":unref(readRefOrGetterValue)(props.sessionsApiPath),onOpenSourceFile:openFile,onInterfaceLocation:updateLocation,"assistant-available":assistantCanUsePurpose(`source_explanation`),"assistant-unavailable-message":assistantPurposes.value.source_explanation?.message||`Source explanations are unavailable.`},null,8,[`lesson-scoped`,`active`,`agent-active`,`architecture-facts`,`file-bookmarks`,`ask-codex-available`,`onAskCodexAboutFile`,`onOpenProgram`,`open-request`,`project-slug`,`session-id`,`sessions-api-path`,`onOpenSourceFile`,`onInterfaceLocation`,`assistant-available`,`assistant-unavailable-message`])]),_:1},8,[`assistant-available`,`active`,`resolve-request-url`,`restore-request`,`open-program-request`,`reload-version`,`project-slug`,`onOpenTable`,`onDescribeSubsystems`,`session-id`,`onOpenSourceFileImmersive`,`onOpenSourceFile`])):createCommentVNode(``,true),createVNode(VDialog,{"model-value":Boolean(architectureFileRequest.value),"max-width":`1100`,"onUpdate:modelValue":_cache[36]||(_cache[36]=$event=>!$event&&(architectureFileRequest.value=null))},{default:withCtx(()=>[createBaseVNode(`section`,_hoisted_31$2,[createBaseVNode(`header`,null,[createBaseVNode(`strong`,null,toDisplayString(architectureFileRequest.value?.path),1),createVNode(VBtn,{variant:`text`,"aria-label":`Close file viewer`,onClick:_cache[35]||(_cache[35]=$event=>architectureFileRequest.value=null)},{default:withCtx(()=>[..._cache[62]||(_cache[62]=[createTextVNode(`Close`,-1)])]),_:1})]),architectureFileRequest.value?(openBlock(),createBlock(Vibe64SessionSourceEditor_default,{"single-file":``,"lesson-scoped":unref(practiceLesson),key:architectureFileRequest.value.path,active:props.active,"agent-active":unref(agentActive),"open-request":architectureFileRequest.value,"project-slug":unref(practiceLesson)?props.conversationRuntime.identity.sourceProjectSlug:unref(projectSlug),"session-id":unref(sessionId),"sessions-api-path":unref(readRefOrGetterValue)(props.sessionsApiPath),onOpenSourceFile:unref(openSourceEditorFile),"assistant-available":assistantCanUsePurpose(`source_explanation`),"assistant-unavailable-message":assistantPurposes.value.source_explanation?.message||`Source explanations are unavailable.`},null,8,[`lesson-scoped`,`active`,`agent-active`,`open-request`,`project-slug`,`session-id`,`sessions-api-path`,`onOpenSourceFile`,`assistant-available`,`assistant-unavailable-message`])):createCommentVNode(``,true)])]),_:1},8,[`model-value`])],512),[[vShow,normalWorkspaceActive.value&&dashboardAvailable.value&&props.projectPane===`dashboard`&&unref(rightPaneTab)===`system`]]),withDirectives(createBaseVNode(`div`,_hoisted_32$2,[createVNode(unref(TrainingPreviewPresentation_default),{"agent-connection-status":props.agentConnectionStatus,"lessons-available":props.lessonsAvailable,"app-available":props.outputWorkspaceAvailable??props.sourceWorkspaceAvailable,"attempt-id":props.learningAttemptId,"learning-binding":props.sourceWorkspaceAvailable?null:props.conversationRuntime?.identity,"learning-pane-active":learningPaneActive.value,"workspace-active":normalWorkspaceActive.value&&props.projectPane===`preview`,active:props.active&&(props.lessonsAvailable||props.projectPane===`preview`)&&!props.sessionSelectionArchived,"project-slug":props.conversationRuntime?.identity?.noExercise===false?props.conversationRuntime.identity.sourceProjectSlug:unref(projectSlug),"session-id":selectedAssistantSessionId.value},{lessons:withCtx(()=>[renderSlot(_ctx.$slots,`learning`,{dashboardContext:dashboardContext.value},void 0,true),unref(practiceLesson)?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`studio-autopilot__learning-code-check`,`is-${learningCodeState.value}`])},[createBaseVNode(`span`,_hoisted_33$2,[(openBlock(),createElementBlock(`svg`,_hoisted_34$1,[createBaseVNode(`path`,{d:unref(learningCodeIcons)[learningCodeState.value]},null,8,_hoisted_35$1)]))]),createBaseVNode(`div`,_hoisted_36$1,[createBaseVNode(`p`,_hoisted_37$1,toDisplayString(unref(learningCodeTitles)[learningCodeState.value]),1),createBaseVNode(`p`,_hoisted_38$1,toDisplayString(learningCodeChecking.value?`Running this lesson's check on your saved files…`:learningCodeResult.value?.message||`For a code question, edit the files your teacher names in Dashboard → Files, then press Check my code. Only your own edits there count.`),1)]),createVNode(VBtn,{class:`studio-autopilot__learning-code-button`,color:`primary`,disabled:learningCodeChecking.value,loading:learningCodeChecking.value,"min-height":`44`,rounded:`pill`,variant:learningCodeState.value===`passed`?`tonal`:`flat`,onClick:checkLearningCode},{default:withCtx(()=>[..._cache[63]||(_cache[63]=[createTextVNode(` Check my code `,-1)])]),_:1},8,[`disabled`,`loading`,`variant`]),learningCodeChecking.value?(openBlock(),createBlock(VProgressLinear,{key:0,class:`studio-autopilot__learning-code-progress`,color:`primary`,indeterminate:``,rounded:``})):createCommentVNode(``,true)],2)):createCommentVNode(``,true)]),default:withCtx(({appVisible,presentation})=>[props.outputWorkspaceAvailable??props.sourceWorkspaceAvailable?(openBlock(),createBlock(Vibe64ProjectOnboarding_default,{key:0,"learning-binding":props.sourceWorkspaceAvailable?null:props.conversationRuntime?.identity,active:props.active&&(props.lessonsAvailable?appVisible:props.projectPane===`preview`),"presentation-active":props.active&&props.lessonsAvailable&&!props.sessionSelectionArchived,archived:props.sessionSelectionArchived,busy:sourceOperationsSuspended.value||unref(agentActive)||Boolean(props.page?.busy||props.page?.launchBusy),"can-ask":unref(assistantJuniorAllowed),"request-temporary-ai":startTemporaryAiTask,"session-id":selectedAssistantSessionId.value,presentation},{default:withCtx(()=>[createVNode(unref(Vibe64OutputControls),{"learning-binding":props.sourceWorkspaceAvailable?null:props.conversationRuntime?.identity,"ask-codex-to-fix-preview-identity":props.sourceWorkspaceAvailable&&unref(assistantJuniorAllowed)?unref(askCodexToFixPreviewIdentity):null,"attach-preview-file":props.sourceWorkspaceAvailable?attachPreviewFile:null,"prepare-preview-file":props.sourceWorkspaceAvailable?attachPreviewFileProducer:null,"auto-start-managed-preview":!props.sessionSelectionArchived,"button-label":`Run`,"button-size":`small`,"button-variant":`tonal`,busy:unref(agentActive)||Boolean(props.page?.busy||props.page?.launchBusy),"preview-goal-state":props.conversationRuntime?.goalState,class:`studio-autopilot__preview-launch`,"embedded-preview":``,"preview-displayed":(props.lessonsAvailable||props.projectPane===`preview`)&&appVisible,session:props.session,"source-operations-suspended":props.sourceWorkspaceAvailable?sourceOperationsSuspended.value:unref(agentActive),"toolbar-teleport-target":(props.lessonsAvailable||props.projectPane===`preview`)&&appVisible?props.previewToolbarTeleportTarget:``,"window-displayed":props.active,onPreviewAttachmentState:unref(updatePreviewAttachmentState),onTestApproval:updateTestApproval},null,8,[`learning-binding`,`ask-codex-to-fix-preview-identity`,`attach-preview-file`,`prepare-preview-file`,`auto-start-managed-preview`,`busy`,`preview-goal-state`,`preview-displayed`,`session`,`source-operations-suspended`,`toolbar-teleport-target`,`window-displayed`,`onPreviewAttachmentState`])]),_:2},1032,[`learning-binding`,`active`,`presentation-active`,`archived`,`busy`,`can-ask`,`session-id`,`presentation`])):createCommentVNode(``,true)]),_:3},8,[`agent-connection-status`,`lessons-available`,`app-available`,`attempt-id`,`learning-binding`,`learning-pane-active`,`workspace-active`,`active`,`project-slug`,`session-id`])],512),[[vShow,!dashboardAvailable.value||learningPaneActive.value||normalWorkspaceActive.value&&props.projectPane!==`dashboard`]])]),createVNode(VDialog,{"model-value":Boolean(unref(resolvedUpdateReview)),"max-width":`36rem`,"aria-label":`Apply resolved Update`,scrollable:``,"onUpdate:modelValue":_cache[39]||(_cache[39]=$event=>!$event&&(resolvedUpdateReview.value=null))},{default:withCtx(()=>[unref(resolvedUpdateReview)?(openBlock(),createBlock(VCard,{key:0},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[..._cache[64]||(_cache[64]=[createTextVNode(`Apply resolved Update`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[_cache[65]||(_cache[65]=createBaseVNode(`p`,null,`Confirm that these files preserve the intended changes from both this session and the latest saved version.`,-1)),createBaseVNode(`ul`,_hoisted_39$1,[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(resolvedUpdateReview).conflictPaths,file=>{return openBlock(),createElementBlock(`li`,{key:file},toDisplayString(file),1)}),128))]),_cache[66]||(_cache[66]=createBaseVNode(`p`,null,`Repairs may be made manually or in any coding chat. Vibe64 will check the repository state and apply Update. Nothing is published.`,-1))]),_:1}),createVNode(VCardActions,{class:`flex-wrap`},{default:withCtx(()=>[createVNode(VBtn,{onClick:_cache[37]||(_cache[37]=$event=>resolvedUpdateReview.value=null)},{default:withCtx(()=>[..._cache[67]||(_cache[67]=[createTextVNode(`Cancel`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,height:`auto`,"min-height":`48`,style:{"max-width":`100%`},disabled:unref(updateWorkDisabled)||sourceOperationsSuspended.value||temporaryAiWorkspace.value?.updateRepairTask?.busy,onClick:_cache[38]||(_cache[38]=$event=>unref(applyResolvedUpdate)(temporaryAiWorkspace.value?.updateRepairTask,reportTemporaryRecovery))},{default:withCtx(()=>[..._cache[68]||(_cache[68]=[createBaseVNode(`span`,{class:`text-wrap`},`I've resolved these conflicts — apply Update`,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`]),createVNode(VDialog,{"model-value":Boolean(unref(contextFullFailure)),"max-width":`30rem`,"aria-label":`Not enough room`,"onUpdate:modelValue":_cache[41]||(_cache[41]=$event=>!$event&&(contextFullFailure.value=null))},{default:withCtx(()=>[unref(contextFullFailure)?(openBlock(),createBlock(VCard,{key:0,rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[..._cache[69]||(_cache[69]=[createTextVNode(`Not enough room`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createBaseVNode(`p`,null,toDisplayString(unref(contextFullFailure).message),1),_cache[70]||(_cache[70]=createBaseVNode(`p`,{class:`text-body-small mt-3 mb-0`},`Your message was not sent and nothing was lost. Try again to summarise the assistant's memory and send it, or choose another assistant.`,-1))]),_:1}),createVNode(VCardActions,{class:`flex-wrap ga-2 px-6 pb-5`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{height:`48`,variant:`text`,onClick:_cache[40]||(_cache[40]=$event=>contextFullFailure.value=null)},{default:withCtx(()=>[..._cache[71]||(_cache[71]=[createTextVNode(`Close`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,height:`48`,onClick:unref(retryContextFull)},{default:withCtx(()=>[..._cache[72]||(_cache[72]=[createTextVNode(`Summarise and continue`,-1)])]),_:1},8,[`onClick`])]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`]),createVNode(VDialog,{modelValue:unref(saveWorkConfirmOpen),"onUpdate:modelValue":_cache[44]||(_cache[44]=$event=>isRef(saveWorkConfirmOpen)?saveWorkConfirmOpen.value=$event:null),"max-width":`30rem`,"aria-label":unref(saveWorkConnectedReview)?`Save connected first`:`Save changes`,scrollable:``},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(saveWorkConnectedReview)?`Save connected first`:`Save changes`),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[unref(saveWorkConnectedReview)?(openBlock(),createElementBlock(Fragment,{key:0},[_cache[73]||(_cache[73]=createBaseVNode(`p`,null,`Commit and push changed connected sources to these contribution branches, one repository at a time.`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(saveWorkConnectedReview),item=>{return openBlock(),createBlock(VSheet,{key:item.destination.sessionId,color:`surface-light`,rounded:`lg`,class:`pa-3 mb-2`,style:{"overflow-wrap":`anywhere`}},{default:withCtx(()=>[createBaseVNode(`strong`,null,toDisplayString(item.destination.repository)+`:`+toDisplayString(item.destination.branch),1)]),_:2},1024)}),128)),_cache[74]||(_cache[74]=createBaseVNode(`p`,null,`The main project’s changes stay local. Each receiving project can merge or discard its contribution in Incoming changes.`,-1))],64)):createCommentVNode(``,true),!unref(saveWorkConnectedReview)?(openBlock(),createElementBlock(`div`,_hoisted_40$1,[createBaseVNode(`span`,null,toDisplayString(props.workState?.changedPaths?.length||0)+` changed `+toDisplayString(props.workState?.changedPaths?.length===1?`file`:`files`),1),createVNode(VBtn,{height:`48`,variant:`text`,onClick:_cache[42]||(_cache[42]=$event=>{unref(cancelSaveWork)();unref(selectSessionTool)(`changes`)})},{default:withCtx(()=>[..._cache[75]||(_cache[75]=[createTextVNode(`View diff`,-1)])]),_:1})])):createCommentVNode(``,true),unref(saveWorkReview)&&!unref(saveWorkConnectedReview)?(openBlock(),createBlock(VSheet,{key:2,color:`surface-light`,rounded:`lg`,class:`pa-3`,style:{"overflow-wrap":`anywhere`}},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_41$1,toDisplayString(unref(saveWorkReview).mode===`github`?`GitHub`:unref(saveWorkReview).mode===`local_source`?`Local project`:`Project version`),1),createBaseVNode(`strong`,null,toDisplayString(unref(saveWorkReview).repository)+`:`+toDisplayString(unref(saveWorkReview).branch),1),sessionPullRequest.value?(openBlock(),createElementBlock(`p`,_hoisted_42$1,`PR #`+toDisplayString(sessionPullRequest.value.number)+` · `+toDisplayString(sessionPullRequest.value.headBranch)+` → `+toDisplayString(sessionPullRequest.value.baseBranch),1)):createCommentVNode(``,true)]),_:1})):!unref(saveWorkReview)?(openBlock(),createElementBlock(`p`,_hoisted_43$1,`Refresh repository status to review the destination.`)):createCommentVNode(``,true),_cache[76]||(_cache[76]=createBaseVNode(`p`,{class:`text-body-small mt-3 mb-0`},`Save open file edits first.`,-1)),saveWorkNeedsPullRequest.value?(openBlock(),createElementBlock(`p`,_hoisted_44$1,`A pull request is required.`)):createCommentVNode(``,true),unref(saveWorkDisabled)?(openBlock(),createElementBlock(`p`,_hoisted_45$1,toDisplayString(unref(saveWorkTitle)),1)):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`flex-wrap ga-2 px-6 pb-5`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:unref(saveWorkSending),height:`48`,type:`button`,variant:`text`,onClick:unref(cancelSaveWork)},{default:withCtx(()=>[..._cache[77]||(_cache[77]=[createTextVNode(` Cancel `,-1)])]),_:1},8,[`disabled`,`onClick`]),!unref(saveWorkConnectedReview)&&githubProject.value&&!sessionPullRequest.value?.number?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,height:`48`,variant:saveWorkNeedsPullRequest.value?`flat`:`outlined`,disabled:unref(saveWorkDisabled)||!unref(saveWorkReview),onClick:_cache[43]||(_cache[43]=$event=>{unref(cancelSaveWork)();createPullRequestOpen.value=true})},{default:withCtx(()=>[..._cache[78]||(_cache[78]=[createTextVNode(` Create draft PR `,-1)])]),_:1},8,[`variant`,`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{"aria-busy":unref(saveWorkSending)?`true`:void 0,color:`primary`,"min-height":`48`,disabled:unref(saveWorkDisabled)||!unref(saveWorkReview)||saveWorkNeedsPullRequest.value,type:`button`,variant:saveWorkNeedsPullRequest.value?`outlined`:`flat`,onClick:unref(confirmSaveWork)},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_46$1,toDisplayString(unref(saveWorkSending)?`Committing…`:publicationLabel.value),1)]),_:1},8,[`aria-busy`,`disabled`,`variant`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`aria-label`])],2)}}};var Vibe64AutopilotView_default=_plugin_vue_export_helper_default(_sfc_main$13,[[`__scopeId`,`data-v-86b60d19`]]);var _sfc_main$12={__name:`Vibe64InteractiveTerminal`,props:{closeLabel:{default:`Close terminal`,type:String},closeOnCleanExit:{default:true,type:Boolean},commandPreview:{default:``,type:String},error:{default:``,type:String},errorTitle:{default:`Terminal needs attention`,type:String},fill:{default:true,type:Boolean},height:{default:`100%`,type:String},presentation:{default:`inline`,type:String},showClose:{default:true,type:Boolean},showCopy:{default:true,type:Boolean},showInterrupt:{default:true,type:Boolean},stage:{default:``,type:String},status:{default:``,type:String},subtitle:{default:``,type:String},terminal:{required:true,type:Object},title:{default:`Interactive terminal`,type:String},visible:{default:false,type:Boolean}},emits:[`clean-exit`,`close`,`copy`,`interrupt`,`retry`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const forwardedSlots=[`actions-after`,`actions-before`,`before-terminal`,`error-actions`,`footer`,`heading`,`overlay`];function terminalValue(name,fallback=null){const value=unref(props.terminal?.[name]);return typeof value===`undefined`?fallback:value}watch(()=>[String(terminalValue(`terminalSessionId`,``)),String(terminalValue(`terminalStatus`,props.status)||``),terminalValue(`terminalExitCode`,null)],([terminalSessionId,status,exitCode],previous=[])=>{const previousStatus=String(previous[1]||``);if(props.closeOnCleanExit&&terminalSessionId&&status===`exited`&&[`closing`,`running`].includes(previousStatus)&&(exitCode===null||Number(exitCode)===0))emit(`clean-exit`,{terminalSessionId})});return(_ctx,_cache)=>{return openBlock(),createBlock(Vibe64Terminal_default,{"close-label":__props.closeLabel,collapsible:false,"command-preview":__props.commandPreview,error:__props.error,"error-title":__props.errorTitle,expanded:true,fill:__props.fill,height:__props.height,"mobile-takeover":``,presentation:__props.presentation,"show-close":__props.showClose,"show-copy":__props.showCopy,"show-interrupt":__props.showInterrupt,stage:__props.stage,status:__props.status,subtitle:__props.subtitle,terminal:__props.terminal,title:__props.title,visible:__props.visible,onClose:_cache[0]||(_cache[0]=$event=>_ctx.$emit(`close`)),onCopy:_cache[1]||(_cache[1]=$event=>_ctx.$emit(`copy`,$event)),onInterrupt:_cache[2]||(_cache[2]=$event=>_ctx.$emit(`interrupt`)),onRetry:_cache[3]||(_cache[3]=$event=>_ctx.$emit(`retry`))},createSlots({_:2},[renderList(forwardedSlots,slotName=>{return{name:slotName,fn:withCtx(slotProps=>[renderSlot(_ctx.$slots,slotName,normalizeProps(guardReactiveProps(slotProps||{})))])}})]),1032,[`close-label`,`command-preview`,`error`,`error-title`,`fill`,`height`,`presentation`,`show-close`,`show-copy`,`show-interrupt`,`stage`,`status`,`subtitle`,`terminal`,`title`,`visible`])}}};var STALE_OPERATION_CODES=new Set([`vibe64_stale_command_start`]);function plainObject$1(value=null){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function responseDetails(source={}){return plainObject$1(source.details)}function responseCode(source={}){return String(source?.code||source?.errors?.[0]?.code||responseDetails(source).code||``).trim()}function responseStatus(source={}){const value=source?.status??source?.statusCode??responseDetails(source).status??responseDetails(source).statusCode??null;if(value==null||value===``)return null;const number=Number(value);return Number.isFinite(number)?number:null}function responseOperationOutcome(source={}){return String(source?.operationOutcome||responseDetails(source).operationOutcome||``).trim()}function responseRefreshRecommended(source={}){return source?.refreshRecommended===true||responseDetails(source).refreshRecommended===true}function isVibe64StaleOperation(source={}){const code=responseCode(source);const operationOutcome=responseOperationOutcome(source);if(responseRefreshRecommended(source))return true;if(operationOutcome===`stale_operation`)return true;if(operationOutcome===`state_rejected`&&STALE_OPERATION_CODES.has(code))return true;return responseStatus(source)===409&&STALE_OPERATION_CODES.has(code)}function vibe64StaleOperationResult(source={}){const stale=isVibe64StaleOperation(source);const operationOutcome=responseOperationOutcome(source);return{code:responseCode(source),ok:false,operationOutcome:operationOutcome||(stale?`stale_operation`:``),refreshRecommended:responseRefreshRecommended(source)||stale,stale:true,status:responseStatus(source)}}function plainObject(value={}){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function normalizedId(value=``){return String(value||``).trim()}function commandMissingResponse(message){return{error:message,ok:false}}function useProvidedPath(providedPath,fallback){return computed(()=>String(readRefOrGetterValue(providedPath)||fallback()||``))}function useVibe64TerminalCommands({sessionsApiPath:providedSessionsApiPath=null,vibe64ApiPath:providedVibe64ApiPath=null}={}){const paths=usePaths();const sessionsApiPath=useProvidedPath(providedSessionsApiPath,()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:`app`}));const vibe64ApiPath=useProvidedPath(providedVibe64ApiPath,()=>paths.api(VIBE64_API_SUFFIX,{surface:`app`}));const startTerminalCommand=useCommand({access:`never`,apiSuffix:VIBE64_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:`POST`,path:String(context.path||``)}),buildRawPayload:(_model,{context})=>plainObject(context.payload),fallbackRunError:`Terminal failed to start.`,messages:{error:`Terminal failed to start.`},onRunError:async error=>{if(isVibe64StaleOperation(error))throw vibe64StaleOperationResult(error)},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.terminal.start`,suppressSuccessMessage:true,surfaceId:`app`,writeMethod:`POST`});const closeTerminalCommand=useCommand({access:`never`,apiSuffix:VIBE64_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:`DELETE`,path:String(context.path||``)}),fallbackRunError:`Terminal could not close.`,messages:{error:`Terminal could not close.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.terminal.close`,suppressSuccessMessage:true,surfaceId:`app`,writeMethod:`DELETE`});const writeTerminalCommand=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_payload,{context})=>({method:`POST`,path:String(context.path||``)}),buildRawPayload:(_model,{context})=>({attachmentIds:Array.isArray(context.attachmentIds)?context.attachmentIds:[],text:String(context.text||``)}),fallbackRunError:`Terminal input could not be sent.`,messages:{error:`Terminal input could not be sent.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.terminal.write`,suppressSuccessMessage:true,surfaceId:`app`,writeMethod:`POST`});async function runStart(path,payload={}){return await startTerminalCommand.run({path,payload})}async function runClose(path){return await closeTerminalCommand.run({path})}async function startAgentTerminal(sessionId=``){const normalizedSessionId=normalizedId(sessionId);if(!normalizedSessionId)return commandMissingResponse(`Vibe64 session id is required.`);return await runStart(vibe64AgentTerminalPath(sessionsApiPath.value,normalizedSessionId),vibe64RealtimeOriginPayload())}async function startGlobalCodexTerminal(){return await runStart(vibe64GlobalCodexTerminalPath(vibe64ApiPath.value))}async function closeAgentTerminal(sessionId=``,terminalSessionId=``){const normalizedSessionId=normalizedId(sessionId);const normalizedTerminalSessionId=normalizedId(terminalSessionId);if(!normalizedSessionId||!normalizedTerminalSessionId)return commandMissingResponse(`AI terminal id is required.`);return await runClose(vibe64AgentTerminalPath(sessionsApiPath.value,normalizedSessionId,normalizedTerminalSessionId))}async function sendAgentTerminalText(sessionId=``,terminalSessionId=``,text=``,{attachmentIds=[]}={}){const normalizedSessionId=normalizedId(sessionId);const normalizedTerminalSessionId=normalizedId(terminalSessionId);const normalizedText=String(text||``);if(!normalizedSessionId||!normalizedTerminalSessionId||!normalizedText)return commandMissingResponse(`AI terminal id and input are required.`);return await writeTerminalCommand.run({attachmentIds:Array.isArray(attachmentIds)?attachmentIds.map(normalizedId).filter(Boolean):[],text:normalizedText,path:vibe64AgentTerminalControlTextPath(sessionsApiPath.value,normalizedSessionId,normalizedTerminalSessionId)})}async function closeGlobalCodexTerminal(scopeIdOrTerminalSessionId=``,terminalSessionId=``){const normalizedTerminalSessionId=normalizedId(terminalSessionId||scopeIdOrTerminalSessionId);if(!normalizedTerminalSessionId)return commandMissingResponse(`Codex terminal id is required.`);return await runClose(vibe64GlobalCodexTerminalPath(vibe64ApiPath.value,normalizedTerminalSessionId))}return{closeAgentTerminal,closeGlobalCodexTerminal,closeTerminalCommand,sendAgentTerminalText,startAgentTerminal,startGlobalCodexTerminal,startTerminalCommand,writeTerminalCommand}}function useVibe64CodexCommands(){const paths=usePaths();return{...useVibe64TerminalCommands({sessionsApiPath:computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:`app`})),vibe64ApiPath:computed(()=>paths.api(VIBE64_API_SUFFIX,{surface:`app`}))}),...useVibe64AttachmentCommands()}}function attachmentPathForTerminal(attachmentPath=``){const normalizedPath=String(attachmentPath||``).trim();return normalizedPath?`[${normalizedPath}] `:``}function useAgentTerminalAttachments({assistantLabel=`Codex`,canUpload=()=>true,deleteAttachment,ensureTerminalReady,focusTerminal,sendAttachmentPath,sessionId,terminalSessionId,uploadAttachment}={}){const label=()=>String(unref(assistantLabel)||`AI`);const uploadAllowed=()=>Boolean(unref(sessionId))&&(typeof canUpload===`function`?canUpload()!==false:unref(canUpload)!==false);function currentTarget(attachment){return uploadAllowed()&&attachment.sessionId===unref(sessionId)&&attachment.terminalSessionId===unref(terminalSessionId)}async function injectUploadedAttachments(uploaded=[]){for(const attachment of uploaded){if(!currentTarget(attachment))throw new Error(`The terminal changed before the attachment was delivered. Attach the file again.`);const fileName=String(attachment.fileName||`attachment`);const terminalText=attachmentPathForTerminal(attachment.path);if(!terminalText)throw new Error(`${fileName} uploaded, but no attachment path was returned.`);if(!await sendAttachmentPath(terminalText,[attachment.attachmentId],{sessionId:attachment.sessionId,terminalSessionId:attachment.terminalSessionId}))throw new Error(`${fileName} uploaded, but its path could not be sent to ${label()}.`)}}const attachments=useAgentAttachments({canUpload:uploadAllowed,deleteAttachment,onUploaded:async(uploaded=[])=>{await injectUploadedAttachments(uploaded);const fileLabel=uploaded.length===1?uploaded[0].fileName:`${uploaded.length} files`;if(uploaded.every(currentTarget)){attachments.status.value=`${fileLabel} attached. Press Enter in ${label()} when ready.`;focusTerminal()}return{accepted:true}},sessionId,uploadAttachment:async(currentSessionId,file,options={})=>{if(!await ensureTerminalReady()||!uploadAllowed()||currentSessionId!==unref(sessionId)||options.signal?.aborted)throw new Error(`${label()} terminal is not ready for attachments.`);const targetTerminalId=unref(terminalSessionId);return{...await uploadAttachment(currentSessionId,file,options),terminalSessionId:targetTerminalId}}});if(terminalSessionId!==void 0)watch(()=>unref(terminalSessionId),(_next,previous)=>{if(!previous)return;attachments.abandonAttachments();attachments.clearStatus()},{flush:`sync`});return{attachmentDragActive:attachments.dragActive,attachmentCanAddFiles:attachments.canAddFiles,attachmentQueueItems:attachments.queueItems,attachmentStatus:attachments.status,attachmentUploading:attachments.uploading,abandonAttachments:attachments.abandonAttachments,cancelAttachment:attachments.cancelAttachment,clearAttachmentStatus:attachments.clearStatus,handleAttachmentDragEnter:attachments.handleDragEnter,handleAttachmentDragLeave:attachments.handleDragLeave,handleAttachmentDragOver:attachments.handleDragOver,handleAttachmentDrop:attachments.handleDrop,removeAttachment:attachments.removeAttachment,resetAttachmentDragState:attachments.resetDragState,retryAttachment:attachments.retryAttachment,uploadAttachmentFiles:attachments.uploadFiles}}var CODEX_ACTIVITY_QUIET_MS=2200;var TERMINAL_STREAM_QUIET_MS=2500;function useCodexTerminalOutput({emitBusyChanged,sessionId}={}){const codexBusy=ref(false);const codexWorking=ref(false);const terminalStreaming=ref(false);let codexIdleTimer=null;let terminalStreamingTimer=null;let codexBusyOutputVersion=0;let terminalOutput=``;let terminalOutputVersion=0;function clearCodexIdleTimer(){if(!codexIdleTimer)return;globalThis.clearTimeout(codexIdleTimer);codexIdleTimer=null}function emitCodexActivityChanged(){const payload={busy:codexBusy.value,sessionId:unref(sessionId),streaming:terminalStreaming.value,working:codexWorking.value};emitBusyChanged?.(payload)}function clearTerminalStreamingTimer(){if(!terminalStreamingTimer)return;globalThis.clearTimeout(terminalStreamingTimer);terminalStreamingTimer=null}function setTerminalStreaming(nextStreaming){const streaming=Boolean(nextStreaming);if(terminalStreaming.value===streaming)return;terminalStreaming.value=streaming;emitCodexActivityChanged()}function markTerminalStreaming(){setTerminalStreaming(true);clearTerminalStreamingTimer();terminalStreamingTimer=globalThis.setTimeout(()=>{terminalStreamingTimer=null;setTerminalStreaming(false)},TERMINAL_STREAM_QUIET_MS)}function setCodexBusy(nextBusy){const busy=Boolean(nextBusy);if(codexBusy.value===busy)return;codexBusy.value=busy;emitCodexActivityChanged()}function setCodexWorking(nextWorking){const working=Boolean(nextWorking);if(codexWorking.value===working)return;codexWorking.value=working;emitCodexActivityChanged()}function clearCodexWorking(){setCodexWorking(false)}function markCodexBusy(){clearCodexIdleTimer();codexBusyOutputVersion=terminalOutputVersion;setCodexBusy(true)}function clearCodexBusy(){clearCodexIdleTimer();codexBusyOutputVersion=terminalOutputVersion;setCodexBusy(false)}function scheduleCodexIdleWhenQuiet(){if(!codexBusy.value||terminalOutputVersion<=codexBusyOutputVersion)return;clearCodexIdleTimer();codexIdleTimer=globalThis.setTimeout(()=>{codexIdleTimer=null;clearCodexBusy()},CODEX_ACTIVITY_QUIET_MS)}function noteTerminalOutput(){terminalOutputVersion+=1;scheduleCodexIdleWhenQuiet()}function writeTerminalOutput(output){terminalOutput=String(output||``);noteTerminalOutput()}function appendTerminalOutput(chunk){const outputChunk=String(chunk||``);if(!outputChunk)return;markTerminalStreaming();terminalOutput+=outputChunk;noteTerminalOutput()}function resetTerminalOutput(){clearTerminalStreamingTimer();setTerminalStreaming(false);clearCodexBusy();clearCodexWorking();terminalOutput=``;terminalOutputVersion+=1}return{appendTerminalOutput,clearCodexBusy,clearCodexWorking,codexBusy,codexWorking,getTerminalOutput:()=>terminalOutput,markCodexBusy,resetTerminalOutput,terminalStreaming,writeTerminalOutput}}var VIBE64_CODEX_APP_SERVER_TASK_ID=`codex_app_server`;function normalizedText$1(value=``){return String(value||``).trim()}function objectValue(value={}){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function arrayValue(value=[]){return Array.isArray(value)?value:[]}function sessionBackgroundTasks(session={}){return arrayValue(session?.backgroundTasks).filter(task=>task&&typeof task===`object`&&!Array.isArray(task))}function codexReconnectRequiredText(value=``){const text=normalizedText$1(value);return Boolean(text)&&(text.includes(`vibe64_codex_reconnect_required`)||text.includes(`Codex authentication was rejected. Reconnect Codex to continue.`))}function codexReconnectRequiredResult(result={}){const source=objectValue(result);return normalizedText$1(source.code)===`vibe64_codex_reconnect_required`||codexReconnectRequiredText(source.error)||codexReconnectRequiredText(source.message)||codexReconnectRequiredText(source.observed)||arrayValue(source.errors).some(error=>normalizedText$1(error?.code)===`vibe64_codex_reconnect_required`||codexReconnectRequiredText(error?.message))}function codexReconnectRequiredSignature(session={}){const sessionId=normalizedText$1(session?.sessionId);const backgroundTask=sessionBackgroundTasks(session).find(task=>normalizedText$1(task.id)===`codex_app_server`&&codexReconnectRequiredResult(task));if(backgroundTask)return[sessionId,`background-task`,normalizedText$1(backgroundTask.id),normalizedText$1(backgroundTask.status),normalizedText$1(backgroundTask.updatedAt),normalizedText$1(backgroundTask.error),normalizedText$1(backgroundTask.message)].join(`|`);const terminal=objectValue(session?.agentSession?.terminal);if(codexReconnectRequiredResult(terminal))return[sessionId,`terminal`,normalizedText$1(terminal.id||terminal.terminalSessionId),normalizedText$1(terminal.status),normalizedText$1(terminal.outputVersion),normalizedText$1(terminal.error||terminal.closeError||terminal.terminalError)].join(`|`);const turn=objectValue(session?.agentSession?.turn);if(codexReconnectRequiredResult(turn))return[sessionId,`agent-turn`,normalizedText$1(session?.agentSession?.thread?.id),normalizedText$1(turn.id),normalizedText$1(turn.status),normalizedText$1(turn.updatedAt),normalizedText$1(turn.error||turn.message)].join(`|`);return``}function normalizedText(value=``){return String(value||``).trim()}function terminalErrorCode(source={}){if(!source||typeof source!==`object`)return``;return normalizedText(source.code||source.errors?.[0]?.code||source.cause?.code)}function terminalErrorText(source={}){if(!source||typeof source!==`object`)return normalizedText(source);return normalizedText(source.error||source.message||source.errors?.[0]?.message||source.cause?.message)}function terminalOwnerAccessDenied(source={}){const code=terminalErrorCode(source);if(code===`vibe64_terminal_owner_mismatch`||code===`vibe64_terminal_owner_required`)return true;const message=terminalErrorText(source).toLowerCase();return message.includes(`belongs to a different vibe64 user`)||message.includes(`restart it before using it again`)||message.includes(`recorded terminal ownership`)}function vibe64TerminalErrorMessage(source={},fallback=`Terminal action failed.`){const code=terminalErrorCode(source);if(code===`vibe64_terminal_owner_mismatch`)return`This terminal belongs to a different Vibe64 user. Open a new terminal for your account.`;if(code===`vibe64_terminal_owner_required`)return`This terminal is from an older Vibe64 session. Restart it before using it again.`;if(code===`vibe64_github_required`||code===`vibe64_github_reconnect_required`||code===`vibe64_github_user_required`||code===`vibe64_user_required`)return terminalErrorText(source)||`Connect GitHub before using this terminal.`;if(code===`vibe64_github_confirmation_required`)return`This GitHub operation needs explicit confirmation before Codex can run it.`;return terminalErrorText(source)||fallback}var _hoisted_1$11=[`aria-hidden`];var _hoisted_2$10=[`disabled`];var _hoisted_3$10={key:0,class:`vibe64-codex-session__drop-overlay`,"aria-live":`polite`,role:`status`};var _hoisted_4$9={key:1,class:`vibe64-codex-session__start-panel`};var _hoisted_5$9={class:`vibe64-codex-session__start-icon`};var _hoisted_6$8={class:`vibe64-codex-session__start-copy`};var _hoisted_7$8={class:`vibe64-codex-session__command`};var _hoisted_8$8={key:0,class:`text-caption text-medium-emphasis`};var _sfc_main$11={__name:`Vibe64CodexSession`,props:{session:{type:Object,default:null},visible:{type:Boolean,default:true},allowStart:{type:Boolean,default:true},displayMode:{type:String,default:`full`},readOnly:{type:Boolean,default:false},listenWhenHidden:{type:Boolean,default:false},autoFocus:{type:Boolean,default:false},scope:{type:String,default:`session`,validator:value=>[`session`,`global`].includes(value)},terminal:{type:Object,default:null}},emits:[`activity-change`,`session-update`],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;const codexCommands=useVibe64CodexCommands();const copyStatus=ref(``);const componentMounted=ref(false);const terminalAttachmentFileInput=ref(null);const staleTerminalSessionIds=ref(new Set);let terminalStartPromise=null;const globalScope=computed(()=>props.scope===`global`);const sessionId=computed(()=>props.session?.sessionId||``);const terminalScopeId=computed(()=>globalScope.value?`global`:sessionId.value);const terminalAttachmentsEnabled=computed(()=>Boolean(!globalScope.value&&!props.readOnly&&sessionId.value));const sessionSource=computed(()=>vibe64SessionSourcePath(props.session||{}));const terminalDisplayActive=computed(()=>props.visible&&props.displayMode!==`headless`);const rawServerCodexTerminal=computed(()=>{if(props.terminal&&typeof props.terminal===`object`&&!Array.isArray(props.terminal))return props.terminal;const terminal=props.session?.agentSession?.terminal;return terminal&&typeof terminal===`object`&&!Array.isArray(terminal)?terminal:{}});const serverCodexTerminal=computed(()=>{const terminal=rawServerCodexTerminal.value;if(terminal.stale||terminal.restartRequired)return{...terminal,id:``,terminalSessionId:``,status:`stale`};const terminalId=String(terminal.id||terminal.terminalSessionId||``).trim();if(!terminalId||!staleTerminalSessionIds.value.has(terminalId))return terminal;return{...terminal,id:``,terminalSessionId:``,status:``}});const serverTerminalSession=computed(()=>({commandPreview:String(serverCodexTerminal.value.commandPreview||``),id:String(serverCodexTerminal.value.id||serverCodexTerminal.value.terminalSessionId||``),status:String(serverCodexTerminal.value.status||``)}));const hiddenTerminalListenActive=computed(()=>Boolean(props.listenWhenHidden&&serverTerminalSession.value.id&&!terminalDisplayActive.value));const terminalStreamActive=computed(()=>Boolean(terminalDisplayActive.value||hiddenTerminalListenActive.value));const terminalPresentation=computed(()=>terminalDisplayActive.value?`inline`:`headless`);const hasTerminalSession=computed(()=>Boolean(terminalSessionId.value||serverTerminalSession.value.id));const canUseTerminal=computed(()=>{if(globalScope.value)return Boolean(terminalStreamActive.value&&terminalScopeId.value&&(props.allowStart||serverTerminalSession.value.id));return Boolean(terminalStreamActive.value&&sessionId.value&&(serverTerminalSession.value.id||props.allowStart&&sessionSource.value))});const canStartTerminal=computed(()=>{if(globalScope.value)return Boolean(props.allowStart&&terminalDisplayActive.value&&terminalScopeId.value);return Boolean(props.allowStart&&terminalDisplayActive.value&&sessionId.value&&sessionSource.value)});const{appendTerminalOutput:noteTerminalOutputChunk,clearCodexBusy,clearCodexWorking,codexBusy,codexWorking,markCodexBusy,resetTerminalOutput,terminalStreaming,writeTerminalOutput:noteTerminalOutputSnapshot}=useCodexTerminalOutput({emitBusyChanged:emitCodexActivityChanged,sessionId:terminalScopeId});const terminalController=useVibe64Terminal({driver:createWebSocketTerminalDriver({closeSession:closeCodexTerminalDriverSession,webSocketUrl(terminalId){return webSocketUrlForScope(terminalScopeId.value,terminalId)}}),fitOnResize:true,initiallyVisible:false,liveResize:true,onOutput:handleTerminalOutput,onStatusUpdate:handleTerminalStatusUpdate,onUserData:handleTerminalUserData,readOnly:computed(()=>props.readOnly),resizeReportDelayMs:120});const{closeTerminalSocket,connectTerminalSocket,disposeTerminalUi,focusTerminal:focusTerminalUi,resetTerminalDisplay,resetTerminalSessionState,sendTerminalData:sendTerminalBytes,terminalFocused,terminalCommandPreview,terminalConnectionStatus,terminalError,terminalExited,terminalSessionId,terminalStarting,terminalStatus}=terminalController;const terminalErrorTitle=computed(()=>{if(terminalError.value===`Codex authentication was rejected. Reconnect Codex to continue.`)return`Reconnect Codex`;return String(terminalError.value||``).includes(`app-server`)?`Codex app-server is not available`:`Codex terminal needs attention`});const terminalErrorActionText=computed(()=>{if(terminalStarting.value)return`Starting Codex…`;return terminalError.value===`Codex authentication was rejected. Reconnect Codex to continue.`?`Reconnect Codex`:`Restart Codex`});const terminalSubtitle=computed(()=>{if(terminalStarting.value)return`Starting Codex`;if(terminalExited.value)return``;if(terminalConnectionStatus.value===`reconnecting`)return`Reconnecting Codex`;if(terminalConnectionStatus.value===`connecting`)return`Connecting Codex`;return``});const{abandonAttachments:abandonTerminalAttachments,attachmentCanAddFiles,attachmentDragActive,attachmentQueueItems,attachmentStatus,cancelAttachment,clearAttachmentStatus,handleAttachmentDragEnter,handleAttachmentDragLeave,handleAttachmentDragOver,handleAttachmentDrop,removeAttachment,retryAttachment,resetAttachmentDragState,uploadAttachmentFiles}=useAgentTerminalAttachments({canUpload:terminalAttachmentsEnabled,deleteAttachment:codexCommands.deleteAttachment,ensureTerminalReady,focusTerminal,sendAttachmentPath:sendAttachmentPathForScope,sessionId:terminalScopeId,terminalSessionId,uploadAttachment:uploadAttachmentForScope});const terminalAttachmentActionLabel=computed(()=>attachmentCanAddFiles.value?`Attach files to Codex terminal`:`Codex terminal attachment limit reached`);function openTerminalAttachmentPicker(){if(!terminalAttachmentsEnabled.value||!attachmentCanAddFiles.value)return false;terminalAttachmentFileInput.value?.click?.();return true}function handleTerminalAttachmentFileSelection(event){const input=event?.currentTarget||event?.target||null;const files=Array.from(input?.files||[]);if(input)input.value=``;if(files.length<1||!terminalAttachmentsEnabled.value||!attachmentCanAddFiles.value)return;uploadAttachmentFiles(files)}function handleTerminalAttachmentDragEnter(event){event?.preventDefault?.();if(!terminalAttachmentsEnabled.value)return;handleAttachmentDragEnter(event)}function handleTerminalAttachmentDragOver(event){event?.preventDefault?.();if(!terminalAttachmentsEnabled.value)return;handleAttachmentDragOver(event)}function handleTerminalAttachmentDragLeave(event){event?.preventDefault?.();if(!terminalAttachmentsEnabled.value)return;handleAttachmentDragLeave(event)}function handleTerminalAttachmentDrop(event){event?.preventDefault?.();if(!terminalAttachmentsEnabled.value)return;handleAttachmentDrop(event)}const terminalCanStart=computed(()=>Boolean(canStartTerminal.value));const sessionSourcePending=computed(()=>Boolean(!globalScope.value&&terminalDisplayActive.value&&sessionId.value&&!sessionSource.value&&!hasTerminalSession.value));const terminalStartActionVisible=computed(()=>!sessionSourcePending.value);const terminalServerStale=computed(()=>Boolean(serverCodexTerminal.value.stale||serverCodexTerminal.value.restartRequired));const terminalStartIcon=computed(()=>terminalExited.value||terminalServerStale.value?mdiRestart:mdiPlayCircleOutline);const terminalReconnectRequired=computed(()=>terminalError.value===CODEX_RECONNECT_REQUIRED_MESSAGE);const sessionCodexReconnectSignature=computed(()=>codexReconnectRequiredSignature(props.session||{}));const terminalStartButtonIcon=computed(()=>{if(terminalReconnectRequired.value||terminalExited.value||terminalServerStale.value)return mdiRestart;return mdiPlayCircleOutline});const terminalStartPanelTitle=computed(()=>{if(sessionSourcePending.value)return`Session source is being prepared`;if(terminalStarting.value)return`Starting Codex`;if(terminalReconnectRequired.value)return`Reconnect Codex`;if(terminalServerStale.value)return`Codex terminal needs restart`;return terminalExited.value?`Codex terminal exited`:`Codex terminal is off`});const terminalStartPanelMessage=computed(()=>{if(sessionSourcePending.value)return`Codex will start from the session source after the clone has been created.`;if(terminalStarting.value)return`Preparing this session terminal.`;if(terminalReconnectRequired.value)return`Reconnect the Codex account before starting this session terminal.`;if(terminalServerStale.value)return serverCodexTerminal.value.message||`The previous Codex terminal is still running, but Vibe64 cannot attach to it. Restart it for this session.`;return terminalExited.value?`Restart it for this session.`:`Start it for this session.`});const terminalStartButtonText=computed(()=>{if(terminalStarting.value)return`Starting Codex…`;if(terminalReconnectRequired.value)return`Reconnect Codex`;return terminalExited.value||terminalServerStale.value?`Restart Codex`:`Start Codex`});const showTerminalStartPanel=computed(()=>componentMounted.value&&(sessionSourcePending.value||terminalStarting.value&&terminalDisplayActive.value||canUseTerminal.value&&terminalCanStart.value&&(!terminalSessionId.value||terminalExited.value||terminalServerStale.value)));function handleTerminalCopy(){copyStatus.value=`Terminal text copied.`}function handleTerminalInterrupt(){clearCodexBusy();clearCodexWorking()}function ensureTerminalReady(){if(!canUseTerminal.value){if(terminalCanStart.value)terminalError.value=`Create the session clone before starting Codex.`;return Promise.resolve(false)}if(terminalStartPromise)return terminalStartPromise;terminalStartPromise=startTerminalOnce();return terminalStartPromise.finally(()=>{terminalStartPromise=null})}function emitCodexActivityChanged(payload={}){const busy=Object.hasOwn(payload,`busy`)?Boolean(payload.busy):Boolean(codexBusy.value);const working=Object.hasOwn(payload,`working`)?Boolean(payload.working):Boolean(codexWorking.value);const streaming=Object.hasOwn(payload,`streaming`)?Boolean(payload.streaming):Boolean(terminalStreaming.value);emit(`activity-change`,{active:Boolean(streaming),busy,scope:props.scope,sessionId:String(payload.sessionId||terminalScopeId.value||``),streaming,terminalSessionId:terminalSessionId.value||serverTerminalSession.value.id||``,working})}function emitTerminalSessionState(extra={}){const currentTerminalId=String(extra.agentTerminalSessionId||terminalSessionId.value||``);if(!terminalScopeId.value||!currentTerminalId)return;emit(`session-update`,{agentTerminalCommandPreview:terminalCommandPreview.value,agentTerminalSessionId:currentTerminalId,agentTerminalStatus:terminalStatus.value,sessionId:terminalScopeId.value,...extra})}function handleTerminalOutput({chunk=``,output=``,source=``}={}){if(source===`append`){noteTerminalOutputChunk(chunk);return}noteTerminalOutputSnapshot(output)}function handleTerminalStatusUpdate({closeError=``,status=``}={}){if(closeError)terminalError.value=String(closeError);emitTerminalSessionState();if(status===`exited`){clearCodexBusy();clearCodexWorking()}}function handleTerminalUserData(data){const input=String(data||``);if(input.includes(``)){clearCodexBusy();clearCodexWorking();return}if(input.includes(`\r`))markCodexBusy()}function startTerminalSessionForScope(currentScopeId){return globalScope.value?codexCommands.startGlobalCodexTerminal():codexCommands.startAgentTerminal(currentScopeId)}function closeTerminalSessionForScope(currentScopeId,terminalId){return globalScope.value?codexCommands.closeGlobalCodexTerminal(currentScopeId,terminalId):codexCommands.closeAgentTerminal(currentScopeId,terminalId)}async function closeCodexTerminalDriverSession(terminalId){const result=await closeTerminalSessionForScope(terminalScopeId.value,terminalId);if(result?.ok===false)throw new Error(vibe64TerminalErrorMessage(result,`Codex terminal process could not be stopped.`));return result}async function applyCodexTerminalSession(session={},{fallbackStatus=`running`,ownership=`attached`,preserveOutput=true}={}){const nextTerminalSessionId=String(session.id||session.terminalSessionId||``).trim();if(!nextTerminalSessionId)return{applied:false,hasTerminalSession:Boolean(terminalSessionId.value)};const previousTerminalSessionId=String(terminalSessionId.value||``);const sameTerminalSession=previousTerminalSessionId===nextTerminalSessionId;const terminalSessionChanged=Boolean(previousTerminalSessionId&&previousTerminalSessionId!==nextTerminalSessionId);if(terminalSessionChanged)resetTerminalOutput();await terminalController.attachTerminal({...session,id:nextTerminalSessionId},{connect:false,fallbackStatus,ownership,preserveOutput,resize:!sameTerminalSession});return{applied:true,sameTerminalSession,terminalSessionChanged,terminalSessionId:nextTerminalSessionId}}function webSocketUrlForScope(currentScopeId,terminalId){return globalScope.value?vibe64GlobalCodexTerminalWebSocketUrl(currentScopeId,terminalId):vibe64AgentTerminalWebSocketUrl(currentScopeId,terminalId)}function openCodexReconnectDialog(){requestVibe64AccountConnectionsDialog({codexReconnectRequired:true,providerId:`codex`,refresh:false})}function codexAccountConnectedPayload(payload={}){const accountId=String(payload?.accountId||payload?.connectionId||``).trim().toLowerCase();const status=String(payload?.status||``).trim().toLowerCase();return accountId===`codex`&&payload?.connected===true&&(!status||status===`connected`)}async function recoverCodexTerminalAfterAccountReconnect(){if(!terminalReconnectRequired.value)return;terminalError.value=``;closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();resetTerminalOutput();await ensureTerminalReady()}useRealtimeEvent({enabled:computed(()=>Boolean(componentMounted.value&&terminalReconnectRequired.value)),event:VIBE64_ACCOUNTS_CHANGED_EVENT,matches({payload={}}={}){return codexAccountConnectedPayload(payload)},onEvent(){recoverCodexTerminalAfterAccountReconnect()}});async function uploadAttachmentForScope(currentScopeId,file,options={}){if(globalScope.value)throw new Error(`Temporary attachments are available in session Codex terminals.`);return codexCommands.uploadAttachment(currentScopeId,file,options)}async function sendAttachmentPathForScope(text,attachmentIds=[],target={}){if(globalScope.value||!sessionId.value||!terminalSessionId.value)throw new Error(`Codex terminal is not ready for attachments.`);const response=await codexCommands.sendAgentTerminalText(target.sessionId,target.terminalSessionId,text,{attachmentIds});if(response?.ok===false)throw new Error(response.error||`Attachment path could not be sent to Codex.`);return true}async function sendTerminalData(data,{source=`program`}={}){const input=String(data||``);try{if(!await ensureTerminalReady())return false;if(!await sendTerminalBytes(input))return false;if(source===`user`&&input.includes(``)){clearCodexBusy();clearCodexWorking()}else if(source===`user`&&input.includes(`\r`))markCodexBusy();return true}catch(sendError){terminalError.value=String(sendError?.message||sendError||`Terminal input failed.`);return false}}async function sendEscape(){return sendTerminalData(`\x1B`,{source:`user`})}async function focusTerminal(){if(!hasTerminalSession.value)return false;return focusTerminalUi()}async function focusWritableTerminalWhenShown(visible){if(!visible||props.readOnly||!hasTerminalSession.value)return;await nextTick();focusTerminal();for(const delayMs of[50,150,300])globalThis.setTimeout(()=>{if(terminalDisplayActive.value&&props.autoFocus&&!props.readOnly&&!terminalFocused.value)focusTerminal()},delayMs)}async function connectAttachedTerminal(){if(!await connectTerminalSocket()){const message=String(terminalError.value||`Terminal stream failed to connect.`);if(terminalSessionMissingError(message)||terminalOwnerAccessDenied(message)){markTerminalSessionStale(terminalSessionId.value||serverTerminalSession.value.id,message);return false}throw new Error(message)}return true}async function startTerminalOnce(){if(terminalReconnectRequired.value){openCodexReconnectDialog();return false}if(terminalExited.value&&terminalCanStart.value){closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();resetTerminalOutput()}if(terminalSessionId.value)return await connectAttachedTerminal();if(!terminalCanStart.value)return false;terminalStarting.value=true;terminalError.value=``;try{const session=await startTerminalSessionForScope(terminalScopeId.value);if(session?.ok===false){if(codexReconnectRequiredResult(session)){terminalError.value=CODEX_RECONNECT_REQUIRED_MESSAGE;openCodexReconnectDialog();return false}if(terminalOwnerAccessDenied(session)){const message=vibe64TerminalErrorMessage(session,`Codex terminal failed to start.`);markTerminalSessionStale(serverTerminalSession.value.id,message);terminalError.value=message;return false}throw new Error(vibe64TerminalErrorMessage(session,`Codex terminal failed to start.`))}if(!session?.id)throw new Error(`Codex terminal failed to start.`);await applyCodexTerminalSession(session,{fallbackStatus:`running`,ownership:`owned`});emitTerminalSessionState();return await connectAttachedTerminal()}catch(startError){terminalError.value=terminalError.value||vibe64TerminalErrorMessage(startError,`Codex terminal failed to start.`);return false}finally{terminalStarting.value=false}}function connectTerminalWhenReady(){if(!canUseTerminal.value||!terminalSessionId.value)return;connectAttachedTerminal().catch(error=>{terminalError.value=terminalError.value||String(error?.message||error||`Terminal stream failed to connect.`)})}async function attachTerminalSession(session={}){const attached=await applyCodexTerminalSession(session,{fallbackStatus:`running`});if(!attached.applied)return Boolean(terminalSessionId.value);if(attached.sameTerminalSession)return true;if(!canUseTerminal.value||!componentMounted.value)return true;try{return await connectAttachedTerminal()}catch(attachError){const message=String(attachError?.message||attachError||`Terminal stream failed to connect.`);if(terminalOwnerAccessDenied(message)){markTerminalSessionStale(session.id||terminalSessionId.value||serverTerminalSession.value.id,message);terminalError.value=message;return false}terminalError.value=terminalError.value||message;return false}}function terminalSessionMissingError(message=``){return/terminal session not found/iu.test(String(message||``))}function markTerminalSessionStale(terminalId=``,message=``){const normalizedTerminalId=String(terminalId||``).trim();if(normalizedTerminalId)staleTerminalSessionIds.value=new Set([...staleTerminalSessionIds.value,normalizedTerminalId]);closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();resetTerminalOutput();abandonTerminalAttachments();terminalError.value=String(message||``);emitTerminalSessionState({agentTerminalSessionId:normalizedTerminalId,agentTerminalStatus:`stale`})}function detachTerminal(){terminalStartPromise=null;abandonTerminalAttachments();closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay();resetTerminalOutput();clearAttachmentStatus();resetAttachmentDragState()}async function closeTerminal(){await abandonTerminalAttachments();if(!terminalSessionId.value){detachTerminal();return true}if(!await terminalController.closeTerminal({deleteSession:true}))return false;terminalStartPromise=null;resetTerminalOutput();clearAttachmentStatus();resetAttachmentDragState();return true}async function restartTerminal(){if(terminalReconnectRequired.value){openCodexReconnectDialog();return}terminalError.value=``;if(!await closeTerminal())return;await ensureTerminalReady()}watch(serverTerminalSession,terminal=>{attachTerminalSession(terminal)},{flush:`post`,immediate:true});watch(sessionId,(nextSessionId,previousSessionId)=>{if(previousSessionId&&previousSessionId!==nextSessionId)detachTerminal();staleTerminalSessionIds.value=new Set;resetAttachmentDragState();clearAttachmentStatus()});watch(canUseTerminal,ready=>{if(ready&&terminalSessionId.value)connectTerminalWhenReady()});watch([sessionCodexReconnectSignature,componentMounted,()=>props.displayMode],([signature,mounted,displayMode])=>{if(!signature||!mounted||displayMode===`headless`)return;terminalError.value=CODEX_RECONNECT_REQUIRED_MESSAGE},{flush:`post`,immediate:true});watch(terminalDisplayActive,(visible,previousVisible)=>{if(visible&&(previousVisible===false||props.autoFocus))focusWritableTerminalWhenShown(visible)},{flush:`post`,immediate:true});onMounted(()=>{componentMounted.value=true;connectTerminalWhenReady()});onBeforeUnmount(()=>{componentMounted.value=false;detachTerminal();disposeTerminalUi()});__expose({focusTerminal:()=>focusWritableTerminalWhenShown(terminalDisplayActive.value),sendEscape});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`vibe64-codex-session`,{"vibe64-codex-session--compact":__props.displayMode===`compact`,"vibe64-codex-session--focused":unref(terminalFocused),"vibe64-codex-session--headless":__props.displayMode===`headless`}]),"aria-hidden":__props.displayMode===`headless`?`true`:void 0,onDragenter:handleTerminalAttachmentDragEnter,onDragover:handleTerminalAttachmentDragOver,onDragleave:handleTerminalAttachmentDragLeave,onDrop:handleTerminalAttachmentDrop},[terminalAttachmentsEnabled.value?(openBlock(),createElementBlock(`input`,{key:0,ref_key:`terminalAttachmentFileInput`,ref:terminalAttachmentFileInput,disabled:!unref(attachmentCanAddFiles),hidden:``,multiple:``,type:`file`,onChange:handleTerminalAttachmentFileSelection},null,40,_hoisted_2$10)):createCommentVNode(``,true),createVNode(_sfc_main$12,{"command-preview":unref(terminalCommandPreview),error:unref(terminalError),"error-title":terminalErrorTitle.value,fill:``,height:`100%`,"mobile-takeover":``,presentation:terminalPresentation.value,"show-copy":``,"show-interrupt":!__props.readOnly,stage:terminalSubtitle.value,status:unref(terminalStatus),subtitle:terminalSubtitle.value,terminal:unref(terminalController),title:`Codex terminal`,visible:terminalStreamActive.value,onCleanExit:closeTerminal,onClose:closeTerminal,onCopy:handleTerminalCopy,onInterrupt:handleTerminalInterrupt},{"error-actions":withCtx(()=>[terminalCanStart.value?(openBlock(),createBlock(VBtn,{key:0,"aria-busy":unref(terminalStarting)?`true`:void 0,class:`vibe64-codex-session__start-action`,color:`primary`,disabled:unref(terminalStarting),"prepend-icon":unref(mdiRestart),size:`small`,variant:`flat`,onClick:restartTerminal},{default:withCtx(()=>[createTextVNode(toDisplayString(terminalErrorActionText.value),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])):createCommentVNode(``,true),createVNode(VBtn,{size:`small`,variant:`tonal`,onClick:closeTerminal},{default:withCtx(()=>[..._cache[0]||(_cache[0]=[createTextVNode(` Close terminal `,-1)])]),_:1})]),"actions-before":withCtx(()=>[terminalAttachmentsEnabled.value?(openBlock(),createBlock(VBtn,{key:0,"aria-label":terminalAttachmentActionLabel.value,class:`vibe64-codex-session__attachment-action`,disabled:!unref(attachmentCanAddFiles),icon:unref(mdiPaperclip),size:`small`,title:terminalAttachmentActionLabel.value,type:`button`,variant:`text`,onClick:openTerminalAttachmentPicker},null,8,[`aria-label`,`disabled`,`icon`,`title`])):createCommentVNode(``,true)]),overlay:withCtx(()=>[unref(attachmentDragActive)?(openBlock(),createElementBlock(`div`,_hoisted_3$10,[createVNode(VSheet,{class:`vibe64-codex-session__drop-card`,rounded:`lg`,elevation:`4`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiPaperclip),size:`28`},null,8,[`icon`]),_cache[1]||(_cache[1]=createBaseVNode(`span`,null,`Drop temporary files for Codex`,-1))]),_:1})])):createCommentVNode(``,true),showTerminalStartPanel.value?(openBlock(),createElementBlock(`div`,_hoisted_4$9,[createVNode(VSheet,{class:`vibe64-codex-session__start-card`,rounded:`lg`,elevation:`4`,role:`status`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_5$9,[createVNode(VIcon,{icon:terminalStartIcon.value,size:`30`},null,8,[`icon`])]),createBaseVNode(`div`,_hoisted_6$8,[createBaseVNode(`strong`,null,toDisplayString(terminalStartPanelTitle.value),1),createBaseVNode(`span`,null,toDisplayString(terminalStartPanelMessage.value),1)]),terminalStartActionVisible.value?(openBlock(),createBlock(VBtn,{key:0,"aria-busy":unref(terminalStarting)?`true`:void 0,class:`vibe64-codex-session__start-action`,color:`primary`,disabled:unref(terminalStarting),"prepend-icon":terminalStartButtonIcon.value,size:`default`,variant:`flat`,onClick:restartTerminal},{default:withCtx(()=>[createTextVNode(toDisplayString(terminalStartButtonText.value),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])):createCommentVNode(``,true)]),_:1})])):createCommentVNode(``,true)]),"before-terminal":withCtx(()=>[createVNode(_sfc_main$41,{items:unref(attachmentQueueItems),joined:false,onCancel:unref(cancelAttachment),onRemove:unref(removeAttachment),onRetry:unref(retryAttachment)},null,8,[`items`,`onCancel`,`onRemove`,`onRetry`])]),footer:withCtx(({commandPreview,status})=>[createBaseVNode(`span`,_hoisted_7$8,toDisplayString(commandPreview||`Codex is not running.`),1),copyStatus.value||unref(attachmentStatus)?(openBlock(),createElementBlock(`span`,_hoisted_8$8,toDisplayString(unref(attachmentStatus)||copyStatus.value),1)):createCommentVNode(``,true),status?(openBlock(),createBlock(VChip,{key:1,size:`x-small`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(status),1)]),_:2},1024)):createCommentVNode(``,true)]),_:1},8,[`command-preview`,`error`,`error-title`,`presentation`,`show-interrupt`,`stage`,`status`,`subtitle`,`terminal`,`visible`])],42,_hoisted_1$11)}}};var Vibe64CodexSession_default=_plugin_vue_export_helper_default(_sfc_main$11,[[`__scopeId`,`data-v-25875427`]]);var _hoisted_1$10=[`aria-hidden`];var _hoisted_2$9=[`disabled`];var _hoisted_3$9={key:0,class:`text-caption px-3 py-2 ma-0`};var _hoisted_4$8={key:0,class:`vibe64-native-agent-session__drop-overlay`,role:`status`};var _hoisted_5$8={key:1,class:`vibe64-native-agent-session__start-panel`};var _hoisted_6$7={class:`vibe64-native-agent-session__start-icon`};var _hoisted_7$7={class:`vibe64-native-agent-session__start-copy`};var _hoisted_8$7={class:`vibe64-native-agent-session__command`};var _hoisted_9$7={key:0,class:`text-caption text-medium-emphasis`,role:`status`};var _sfc_main$10={__name:`Vibe64NativeAgentSession`,props:{allowStart:{default:true,type:Boolean},displayMode:{default:`full`,type:String},listenWhenHidden:{default:false,type:Boolean},readOnly:{default:false,type:Boolean},session:{default:null,type:Object},visible:{default:true,type:Boolean}},emits:[`session-update`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const terminalCommands=useVibe64TerminalCommands();const attachmentCommands=useVibe64AttachmentCommands();const attachmentFileInput=ref(null);const assistantLabel=computed(()=>props.session?.assistantSelection?.engineId===`claude`?`Claude Code`:`OpenCode`);const sessionId=computed(()=>String(props.session?.sessionId||``));const sessionSource=computed(()=>vibe64SessionSourcePath(props.session||{}));const displayActive=computed(()=>props.visible&&props.displayMode!==`headless`);const serverTerminal=computed(()=>{const terminal=props.session?.agentSession?.terminal;return terminal&&typeof terminal===`object`&&!Array.isArray(terminal)?terminal:{}});const serverTerminalId=computed(()=>String(serverTerminal.value.id||serverTerminal.value.terminalSessionId||``));const hiddenListenActive=computed(()=>Boolean(props.listenWhenHidden&&serverTerminalId.value&&!displayActive.value));const terminalStreamActive=computed(()=>Boolean(displayActive.value||hiddenListenActive.value));const terminalPresentation=computed(()=>displayActive.value?`inline`:`headless`);const terminalController=useVibe64Terminal({driver:createWebSocketTerminalDriver({closeSession:closeDriverSession,webSocketUrl(terminalId){return vibe64AgentTerminalWebSocketUrl(sessionId.value,terminalId)}}),fitOnResize:true,initiallyVisible:false,liveResize:true,onStatusUpdate:emitTerminalState,readOnly:computed(()=>props.readOnly),resizeReportDelayMs:120});const{applyTerminalSession,closeTerminalSocket,connectTerminalSocket,disposeTerminalUi,focusTerminal,resetTerminalDisplay,resetTerminalSessionState,terminalCommandPreview,terminalError,terminalExited,terminalSessionId,terminalStarting,terminalStatus}=terminalController;const showAttachmentAction=computed(()=>Boolean(props.session?.assistantSelection?.engineId===`opencode`&&!props.readOnly&&displayActive.value));const attachmentsEnabled=computed(()=>Boolean(showAttachmentAction.value&&sessionId.value&&terminalSessionId.value&&terminalStatus.value===`running`));const{abandonAttachments,attachmentCanAddFiles,attachmentDragActive,attachmentQueueItems,attachmentStatus,cancelAttachment,clearAttachmentStatus,handleAttachmentDragEnter,handleAttachmentDragLeave,handleAttachmentDragOver,handleAttachmentDrop,removeAttachment,retryAttachment,uploadAttachmentFiles}=useAgentTerminalAttachments({assistantLabel,canUpload:attachmentsEnabled,deleteAttachment:attachmentCommands.deleteAttachment,ensureTerminalReady:()=>attachmentsEnabled.value,focusTerminal,async sendAttachmentPath(text,attachmentIds,target){const result=await terminalCommands.sendAgentTerminalText(target.sessionId,target.terminalSessionId,text,{attachmentIds});if(result?.ok===false)throw new Error(vibe64TerminalErrorMessage(result,`The attachment could not be sent to OpenCode.`));return true},sessionId,terminalSessionId,uploadAttachment:attachmentCommands.uploadAttachment});function handleAttachmentSelection(event){const input=event.currentTarget;const files=Array.from(input.files||[]);input.value=``;uploadAttachmentFiles(files)}function handleTerminalPaste(event){if(props.session?.assistantSelection?.engineId!==`opencode`)return;const files=assistantAttachmentFilesFromPasteEvent(event);if(!files.length)return;event.preventDefault();event.stopPropagation();uploadAttachmentFiles(files)}watch(attachmentsEnabled,enabled=>{if(enabled)return;abandonAttachments();clearAttachmentStatus()},{flush:`sync`});const sourcePending=computed(()=>Boolean(displayActive.value&&sessionId.value&&!sessionSource.value&&!terminalSessionId.value));const canStart=computed(()=>Boolean(props.allowStart&&displayActive.value&&sessionId.value&&sessionSource.value));const showStartPanel=computed(()=>Boolean(displayActive.value&&!terminalStarting.value&&(!terminalSessionId.value||terminalExited.value)));const terminalSubtitle=computed(()=>{if(terminalStarting.value)return`Starting ${assistantLabel.value}`;return terminalExited.value?`Exited`:terminalStatus.value===`running`?``:`${assistantLabel.value} agent session`});function emitTerminalState(){const id=String(terminalSessionId.value||serverTerminalId.value||``);if(!sessionId.value||!id)return;emit(`session-update`,{agentTerminalCommandPreview:terminalCommandPreview.value,agentTerminalSessionId:id,agentTerminalStatus:terminalStatus.value,sessionId:sessionId.value})}async function closeDriverSession(terminalId){const result=await terminalCommands.closeAgentTerminal(sessionId.value,terminalId);if(result?.ok===false)throw new Error(vibe64TerminalErrorMessage(result,`OpenCode terminal process could not be stopped.`));return result}async function attachTerminal(session={}){const id=String(session.id||session.terminalSessionId||``).trim();if(!id||id===terminalSessionId.value)return Boolean(id);closeTerminalSocket();resetTerminalDisplay();await applyTerminalSession({...session,id},{fallbackStatus:session.status||`running`,ownership:`attached`});if(terminalStreamActive.value)connectTerminalSocket();return true}async function startTerminal(){if(!canStart.value)return false;if(terminalExited.value){closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}terminalStarting.value=true;terminalError.value=``;try{const session=await terminalCommands.startAgentTerminal(sessionId.value);if(session?.ok===false||!session?.id)throw new Error(vibe64TerminalErrorMessage(session,`${assistantLabel.value} terminal failed to start.`));await applyTerminalSession(session,{fallbackStatus:`running`,ownership:`owned`});emitTerminalState();return await connectTerminalSocket()}catch(error){terminalError.value=vibe64TerminalErrorMessage(error,`${assistantLabel.value} terminal failed to start.`);return false}finally{terminalStarting.value=false}}async function closeTerminal(){await abandonAttachments();if(!terminalSessionId.value){detachTerminal();return true}if(!await terminalController.closeTerminal({deleteSession:true}))return false;resetTerminalDisplay();emitTerminalState();return true}async function restartTerminal(){terminalError.value=``;if(terminalSessionId.value&&!await closeTerminal())return false;return startTerminal()}function detachTerminal(){closeTerminalSocket();resetTerminalSessionState();resetTerminalDisplay()}watch(serverTerminal,terminal=>{attachTerminal(terminal)},{flush:`post`,immediate:true});watch(terminalStreamActive,active=>{if(active&&terminalSessionId.value)connectTerminalSocket()});watch(sessionId,(_next,previous)=>{if(previous)detachTerminal()});onMounted(()=>{if(terminalStreamActive.value&&terminalSessionId.value)connectTerminalSocket()});onBeforeUnmount(()=>{detachTerminal();disposeTerminalUi()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`vibe64-native-agent-session`,{"vibe64-native-agent-session--headless":__props.displayMode===`headless`}]),"aria-hidden":__props.displayMode===`headless`?`true`:void 0,onDragenter:_cache[1]||(_cache[1]=withModifiers((...args)=>unref(handleAttachmentDragEnter)&&unref(handleAttachmentDragEnter)(...args),[`prevent`])),onDragover:_cache[2]||(_cache[2]=withModifiers((...args)=>unref(handleAttachmentDragOver)&&unref(handleAttachmentDragOver)(...args),[`prevent`])),onDragleave:_cache[3]||(_cache[3]=withModifiers((...args)=>unref(handleAttachmentDragLeave)&&unref(handleAttachmentDragLeave)(...args),[`prevent`])),onDrop:_cache[4]||(_cache[4]=withModifiers((...args)=>unref(handleAttachmentDrop)&&unref(handleAttachmentDrop)(...args),[`prevent`])),onPasteCapture:handleTerminalPaste},[showAttachmentAction.value?(openBlock(),createElementBlock(`input`,{key:0,ref_key:`attachmentFileInput`,ref:attachmentFileInput,disabled:!unref(attachmentCanAddFiles),hidden:``,multiple:``,type:`file`,onChange:handleAttachmentSelection},null,40,_hoisted_2$9)):createCommentVNode(``,true),createVNode(_sfc_main$12,{"command-preview":unref(terminalCommandPreview),error:unref(terminalError),"error-title":`${assistantLabel.value} terminal needs attention`,fill:``,height:`100%`,presentation:terminalPresentation.value,"show-interrupt":!__props.readOnly,stage:terminalSubtitle.value,status:unref(terminalStatus),subtitle:terminalSubtitle.value,terminal:unref(terminalController),title:`${assistantLabel.value} terminal`,visible:terminalStreamActive.value,onCleanExit:closeTerminal,onClose:closeTerminal},{"actions-before":withCtx(()=>[showAttachmentAction.value?(openBlock(),createBlock(VBtn,{key:0,"aria-label":`Attach files to OpenCode terminal`,disabled:!unref(attachmentCanAddFiles),icon:unref(mdiPaperclip),size:`small`,title:`Attach files to OpenCode terminal`,type:`button`,variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>attachmentFileInput.value?.click())},null,8,[`disabled`,`icon`])):createCommentVNode(``,true)]),"before-terminal":withCtx(()=>[__props.session?.assistantSelection?.engineId===`claude`?(openBlock(),createElementBlock(`p`,_hoisted_3$9,` Claude resumes this conversation in a new interactive process. Finish or stop any active chat turn first. Chat is unavailable while this terminal is open. Claude may ask you to complete its first-use setup or sign in. `)):createCommentVNode(``,true),createVNode(_sfc_main$41,{items:unref(attachmentQueueItems),joined:false,"session-id":sessionId.value,onCancel:unref(cancelAttachment),onRemove:unref(removeAttachment),onRetry:unref(retryAttachment)},null,8,[`items`,`session-id`,`onCancel`,`onRemove`,`onRetry`])]),overlay:withCtx(()=>[unref(attachmentDragActive)?(openBlock(),createElementBlock(`div`,_hoisted_4$8,[createVNode(VSheet,{class:`vibe64-native-agent-session__drop-card`,elevation:`4`,rounded:`lg`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiPaperclip),size:`28`},null,8,[`icon`]),_cache[5]||(_cache[5]=createBaseVNode(`span`,null,`Drop files for OpenCode`,-1))]),_:1})])):createCommentVNode(``,true),showStartPanel.value?(openBlock(),createElementBlock(`div`,_hoisted_5$8,[createVNode(VSheet,{class:`vibe64-native-agent-session__start-card`,elevation:`4`,role:`status`,rounded:`lg`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_6$7,[createVNode(VIcon,{icon:unref(terminalExited)?unref(mdiRestart):unref(mdiPlayCircleOutline),size:`30`},null,8,[`icon`])]),createBaseVNode(`div`,_hoisted_7$7,[createBaseVNode(`strong`,null,toDisplayString(unref(terminalExited)?`${assistantLabel.value} terminal exited`:`${assistantLabel.value} terminal is off`),1),createBaseVNode(`span`,null,toDisplayString(sourcePending.value?`The terminal can start after the session source is ready.`:`Start an interactive ${assistantLabel.value} terminal for this session.`),1)]),!sourcePending.value?(openBlock(),createBlock(VBtn,{key:0,"aria-busy":unref(terminalStarting)?`true`:void 0,class:`vibe64-native-agent-session__start-action`,color:`primary`,disabled:unref(terminalStarting),"prepend-icon":unref(terminalExited)?unref(mdiRestart):unref(mdiPlayCircleOutline),variant:`flat`,onClick:restartTerminal},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(terminalStarting)?`Starting ${assistantLabel.value}…`:unref(terminalExited)?`Restart ${assistantLabel.value}`:`Start ${assistantLabel.value}`),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])):createCommentVNode(``,true)]),_:1})])):createCommentVNode(``,true)]),footer:withCtx(({commandPreview,status})=>[createBaseVNode(`span`,_hoisted_8$7,toDisplayString(commandPreview||`${assistantLabel.value} is not running.`),1),unref(attachmentStatus)?(openBlock(),createElementBlock(`span`,_hoisted_9$7,toDisplayString(unref(attachmentStatus)),1)):createCommentVNode(``,true),status?(openBlock(),createBlock(VChip,{key:1,size:`x-small`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(status),1)]),_:2},1024)):createCommentVNode(``,true)]),_:1},8,[`command-preview`,`error`,`error-title`,`presentation`,`show-interrupt`,`stage`,`status`,`subtitle`,`terminal`,`title`,`visible`])],42,_hoisted_1$10)}}};var Vibe64NativeAgentSession_default=_plugin_vue_export_helper_default(_sfc_main$10,[[`__scopeId`,`data-v-957305bf`]]);var SESSION_RENEWAL_MAX_HANDOVER_CHARACTERS=2e4;var SESSION_RENEWAL_PROGRESS_STAGES=Object.freeze([Object.freeze({id:`handover`,label:`Prepare the handover`,stages:new Set([`draft_generating`,`draft_ready`])}),Object.freeze({id:`quiesce`,label:`Stop the old session safely`,stages:new Set([`old_quiescing`])}),Object.freeze({id:`successor`,label:`Create the fresh session`,stages:new Set([`successor_creating`,`successor_discarding`,`successor_setup`])}),Object.freeze({id:`briefing`,label:`Brief the fresh assistant`,stages:new Set([`successor_seeding`,`successor_acknowledged`])}),Object.freeze({id:`archive`,label:`Archive the old session`,stages:new Set([`old_archiving`])}),Object.freeze({id:`activate`,label:`Open the fresh session`,stages:new Set([`successor_activating`,`completed`])})]);var SESSION_RENEWAL_RESTORE_PROGRESS=Object.freeze([Object.freeze({id:`restore`,label:`Restore the old session safely`,state:`active`})]);function sessionRenewalText(value=``){return String(value??``).replaceAll(`\r
|
|
26
|
-
`,`
|
|
27
|
-
`).replaceAll(`\r`,`
|
|
28
|
-
`)}function sessionRenewalDraftCharacterCount(value=``){return Array.from(sessionRenewalText(value)).length}function sessionRenewalPhase(renewal=null,{initialLoading=false,loadError=``}={}){if(!renewal&&initialLoading)return`loading`;if(!renewal&&String(loadError||``).trim())return`load_error`;const status=String(renewal?.status||``).trim();if(!renewal||status===`cancelled`)return`intro`;if(status===`review`)return`review`;if(status===`failed`)return`failed`;if(status===`completed`)return`completed`;return`progress`}function sessionRenewalStageProgress(stage=``){const currentStage=String(stage||``).trim();if(currentStage===`failure_restoring`)return SESSION_RENEWAL_RESTORE_PROGRESS.map(step=>({...step}));const activeIndex=SESSION_RENEWAL_PROGRESS_STAGES.findIndex(step=>step.stages.has(currentStage));return SESSION_RENEWAL_PROGRESS_STAGES.map((step,index)=>({id:step.id,label:step.label,state:currentStage===`completed`||activeIndex>=0&&index<activeIndex?`complete`:index===activeIndex?`active`:`pending`}))}function sessionRenewalStageLabel(stage=``){return{draft_generating:`Preparing the handover…`,failure_restoring:`Restoring the old session…`,old_archiving:`Archiving the old session…`,old_quiescing:`Stopping old session tools…`,successor_acknowledged:`Fresh assistant is ready…`,successor_activating:`Opening the fresh session…`,successor_creating:`Creating the fresh session…`,successor_discarding:`Resetting the fresh session safely…`,successor_seeding:`Briefing the fresh assistant…`,successor_setup:`Preparing the fresh workspace…`}[String(stage||``).trim()]||`Renewing this session…`}function sessionRenewalFailureSupportingMessage(renewal=null){let message=``;if(String(renewal?.error?.code||``).trim()===`vibe64_session_renewal_restore_failed`)message=`The old session and its recovery state are retained, but it is not writable yet. Retry to finish restoring it safely.`;else message=`The old session remains available. Fix the reported condition, then retry the same saved renewal.`;return String(renewal?.error?.message||``).trim()===message?``:message}function sessionRenewalAdvisoryPresentation(advisory={}){const severity=String(advisory?.severity||`none`).trim();const recommended=advisory?.recommended===true;return{attention:recommended,color:severity===`soon`?`warning`:recommended?`primary`:void 0,label:severity===`soon`?`Renew soon`:recommended?`Consider renewal`:`Renew session`,reason:String(advisory?.reason||`Renew this session with a reviewed handover.`).trim()}}function sessionRenewalOperationKey(sessionId=``,{now=Date.now(),randomId=``}={}){const safeSessionId=String(sessionId||``).trim().replace(/[^A-Za-z0-9_.-]+/gu,`-`).slice(0,48)||`session`;const safeRandomId=String(randomId||``).trim().replace(/[^A-Za-z0-9_.-]+/gu,``).slice(0,40)||Math.random().toString(36).slice(2,14);return`renewal:${safeSessionId}:${Number(now).toString(36)}:${safeRandomId}`.slice(0,128)}var _hoisted_1$9={class:`studio-session-renewal__heading`};var _hoisted_2$8={class:`studio-session-renewal__icon`,"aria-hidden":`true`};var _hoisted_3$8={class:`studio-session-renewal__notice-with-action`};var _hoisted_4$7={class:`studio-session-renewal__notice-copy`};var _hoisted_5$7={class:`text-body-small`};var _hoisted_6$6={key:1,class:`studio-session-renewal__skeleton`,"aria-label":`Loading session renewal`,role:`status`};var _hoisted_7$6={class:`studio-session-renewal__notice-copy`};var _hoisted_8$6={class:`text-title-small`};var _hoisted_9$6={class:`text-body-medium`};var _hoisted_10$6=[`aria-live`];var _hoisted_11$6={class:`text-title-small`};var _hoisted_12$6={"aria-label":`Session renewal progress`,class:`studio-session-renewal__steps text-body-medium`};var _hoisted_13$6=[`aria-current`];var _hoisted_14$6={class:`studio-session-renewal__step-icon`,"aria-hidden":`true`};var _hoisted_15$6={class:`d-sr-only`};var _hoisted_16$5={class:`studio-session-renewal__inline-actions`};var _hoisted_17$5={class:`studio-session-renewal__notice-copy`};var _hoisted_18$5={key:0,class:`text-body-small`};var _hoisted_19$4={key:0,"aria-label":`Saved source details to preserve`,class:`studio-session-renewal__source-details text-body-small`};var _hoisted_20$4={key:3,class:`studio-session-renewal__supporting text-body-small`,role:`status`};var _hoisted_21$4={key:0,class:`studio-session-renewal__supporting text-body-small`};var _hoisted_22$4={class:`studio-session-renewal__notice-copy`};var _hoisted_23$4={class:`text-body-small`};var _sfc_main$9={__name:`Vibe64SessionRenewalDialog`,props:{renewal:{default:()=>({}),type:Object}},setup(__props){const props=__props;const{smAndDown}=useDisplay();const renewalTitleId=`vibe64-session-renewal-title-${useId()}`;const assistantSelectionReady=ref(false);const successorWorkflowEngineId=ref(``);const dialogBusy=computed(()=>Boolean(props.renewal.successorSelectionPending||props.renewal.busy&&props.renewal.phase!==`progress`));const renewalProgress=computed(()=>{const steps=Array.isArray(props.renewal.steps)?props.renewal.steps:[];if(!steps.length)return 0;const completed=steps.reduce((value,step)=>value+(step.state===`complete`?1:step.state===`active`?.5:0),0);return Math.round(completed/steps.length*100)});const canConfirmRenewal=computed(()=>Boolean(props.renewal.canConfirm&&assistantSelectionReady.value&&successorWorkflowEngineId.value));const manualDraft=computed(()=>props.renewal.renewal?.draft?.origin===`manual`);const failedSupportingMessage=computed(()=>sessionRenewalFailureSupportingMessage(props.renewal.renewal));const manualSourceItems=computed(()=>{const source=props.renewal.renewal?.basis?.source;if(!source||typeof source!==`object`||Array.isArray(source))return[];return[{label:`Authority`,value:source.authority},{label:`Repository`,value:source.repository},{label:`Reference`,value:source.ref},{label:`Commit`,value:source.commit}].filter(item=>String(item.value||``).trim()).map(item=>({...item,value:String(item.value).trim()}))});function stepStateLabel(state=``){return{active:`Current step`,complete:`Complete`,pending:`Not started`}[String(state||``)]||``}function closeFromModel(value){if(!value&&!dialogBusy.value)props.renewal.close?.()}function confirmRenewal(){if(canConfirmRenewal.value)props.renewal.confirm?.(successorWorkflowEngineId.value)}return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"aria-labelledby":renewalTitleId,fullscreen:unref(smAndDown),"model-value":__props.renewal.open,"max-width":`46rem`,persistent:dialogBusy.value,scrollable:``,onAfterLeave:_cache[2]||(_cache[2]=$event=>__props.renewal.restoreTriggerFocus?.()),"onUpdate:modelValue":closeFromModel},{default:withCtx(()=>[createVNode(VCard,{class:normalizeClass([`studio-session-renewal`,{"studio-session-renewal--fullscreen":unref(smAndDown)}]),"data-vibe64-session-renewal":``,"data-vibe64-session-renewal-phase":__props.renewal.phase,rounded:unref(smAndDown)?`0`:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`studio-session-renewal__header`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_1$9,[createBaseVNode(`span`,_hoisted_2$8,[createVNode(VIcon,{icon:unref(mdiAutorenew),size:`24`},null,8,[`icon`])]),createBaseVNode(`span`,null,[createBaseVNode(`h2`,{id:renewalTitleId,class:`text-title-medium`},`Renew this session`),_cache[3]||(_cache[3]=createBaseVNode(`span`,{class:`studio-session-renewal__subtitle text-body-small`},` Continue in a fresh conversation `,-1))])]),createVNode(VBtn,{"aria-label":`Close session renewal`,"data-vibe64-session-renewal-close":`icon`,disabled:dialogBusy.value,height:`48`,icon:unref(mdiClose),title:`Close`,variant:`text`,width:`48`,onClick:__props.renewal.close},null,8,[`disabled`,`icon`,`onClick`])]),_:1}),createVNode(VDivider),createVNode(VCardText,{class:`studio-session-renewal__body`},{default:withCtx(()=>[__props.renewal.refreshError&&__props.renewal.phase!==`load_error`?(openBlock(),createBlock(VAlert,{key:0,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),role:`status`,type:`warning`,variant:`tonal`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_3$8,[createBaseVNode(`span`,_hoisted_4$7,[_cache[4]||(_cache[4]=createBaseVNode(`strong`,{class:`text-title-small`},`Latest progress could not be checked`,-1)),_cache[5]||(_cache[5]=createBaseVNode(`span`,{class:`text-body-medium`},`The last saved renewal state is shown. Nothing has been discarded.`,-1)),createBaseVNode(`span`,_hoisted_5$7,toDisplayString(__props.renewal.refreshError),1)]),createVNode(VBtn,{"aria-busy":__props.renewal.refreshing?`true`:void 0,disabled:__props.renewal.refreshing,height:`48`,type:`button`,variant:`text`,onClick:__props.renewal.reload},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.refreshing?`Checking…`:`Check again`),1)]),_:1},8,[`aria-busy`,`disabled`,`onClick`])])]),_:1},8,[`icon`])):createCommentVNode(``,true),__props.renewal.phase===`loading`?(openBlock(),createElementBlock(`div`,_hoisted_6$6,[createVNode(VSkeletonLoader,{type:`paragraph, paragraph`}),createVNode(VSkeletonLoader,{height:`224`,type:`image`})])):__props.renewal.phase===`load_error`?(openBlock(),createBlock(StudioErrorNotice_default,{key:2,title:`Session renewal could not load`,error:__props.renewal.loadError},null,8,[`error`])):__props.renewal.phase===`intro`?(openBlock(),createElementBlock(Fragment,{key:3},[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`studio-session-renewal__lead text-body-large`},` Vibe64 will ask this session to write a detailed handover, let you review it, and create a fresh session from the current saved version. `,-1)),__props.renewal.advisoryPresentation?.attention?(openBlock(),createBlock(VAlert,{key:0,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),type:__props.renewal.advisoryPresentation.color===`warning`?`warning`:`info`,variant:`tonal`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_7$6,[createBaseVNode(`strong`,_hoisted_8$6,toDisplayString(__props.renewal.advisoryPresentation.label),1),createBaseVNode(`span`,_hoisted_9$6,toDisplayString(__props.renewal.advisoryPresentation.reason),1)])]),_:1},8,[`icon`,`type`])):createCommentVNode(``,true),createVNode(VSheet,{class:`studio-session-renewal__assurance text-body-medium`,color:`surface-variant`,rounded:`lg`},{default:withCtx(()=>[createVNode(VIcon,{color:`primary`,icon:unref(mdiArchiveCheckOutline),size:`22`},null,8,[`icon`]),_cache[6]||(_cache[6]=createBaseVNode(`span`,null,[createBaseVNode(`strong`,{class:`font-weight-medium`},`Your old session is kept until the handover is delivered.`),createTextVNode(` Once it reaches the fresh assistant conversation, renewal completes even if the model cannot answer. `)],-1))]),_:1}),_cache[8]||(_cache[8]=createBaseVNode(`p`,{class:`studio-session-renewal__supporting text-body-small`},` Before starting, save or discard any source changes and wait for assistant, workspace, Save, and Update activity to finish. `,-1))],64)):__props.renewal.phase===`progress`?(openBlock(),createElementBlock(Fragment,{key:4},[createBaseVNode(`div`,{class:`studio-session-renewal__progress-copy`,"aria-live":__props.renewal.refreshError?`off`:`polite`,role:`status`},[createBaseVNode(`strong`,_hoisted_11$6,toDisplayString(__props.renewal.stageLabel),1),_cache[9]||(_cache[9]=createBaseVNode(`span`,{class:`text-body-small`},`You can close this window. Progress is saved and will resume safely.`,-1))],8,_hoisted_10$6),createVNode(VProgressLinear,{"aria-label":`Session renewal in progress`,class:`studio-session-renewal__progress-line`,color:`primary`,indeterminate:!__props.renewal.refreshError,"model-value":__props.renewal.refreshError?renewalProgress.value:void 0,rounded:``},null,8,[`indeterminate`,`model-value`]),createBaseVNode(`ol`,_hoisted_12$6,[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.renewal.steps,step=>{return openBlock(),createElementBlock(`li`,{key:step.id,"aria-current":step.state===`active`?`step`:void 0,class:normalizeClass([`studio-session-renewal__step--${step.state}`,{"font-weight-medium":step.state===`active`}])},[createBaseVNode(`span`,_hoisted_14$6,[createVNode(VIcon,{icon:step.state===`complete`?unref(mdiCheck):step.state===`active`?unref(mdiCircleSlice4):unref(mdiCircleOutline),size:`18`},null,8,[`icon`])]),createBaseVNode(`span`,null,toDisplayString(step.label),1),createBaseVNode(`span`,_hoisted_15$6,toDisplayString(stepStateLabel(step.state)),1)],10,_hoisted_13$6)}),128))])],64)):__props.renewal.phase===`review`?(openBlock(),createElementBlock(Fragment,{key:5},[_cache[15]||(_cache[15]=createBaseVNode(`p`,{class:`studio-session-renewal__lead text-body-large`},` Review what the fresh assistant will receive. Add anything important before continuing. `,-1)),__props.renewal.draftConflict?(openBlock(),createBlock(VAlert,{key:0,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),role:`alert`,type:`warning`,variant:`tonal`},{default:withCtx(()=>[_cache[12]||(_cache[12]=createBaseVNode(`span`,{class:`studio-session-renewal__notice-copy`},[createBaseVNode(`strong`,{class:`text-title-small`},`This handover changed elsewhere`),createBaseVNode(`span`,{class:`text-body-medium`},`Your unsaved edits are still here. Choose which version to continue editing before saving or renewing.`)],-1)),createBaseVNode(`div`,_hoisted_16$5,[createVNode(VBtn,{height:`48`,type:`button`,variant:`text`,onClick:__props.renewal.keepLocalDraft},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(` Keep my edits `,-1)])]),_:1},8,[`onClick`]),createVNode(VBtn,{color:`primary`,height:`48`,type:`button`,variant:`tonal`,onClick:__props.renewal.acceptLatestDraft},{default:withCtx(()=>[..._cache[11]||(_cache[11]=[createTextVNode(` Discard my edits and use latest `,-1)])]),_:1},8,[`onClick`])])]),_:1},8,[`icon`])):createCommentVNode(``,true),manualDraft.value?(openBlock(),createBlock(VAlert,{key:1,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),type:`info`,variant:`tonal`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_17$5,[_cache[13]||(_cache[13]=createBaseVNode(`strong`,{class:`text-title-small`},`Complete the handover template`,-1)),_cache[14]||(_cache[14]=createBaseVNode(`span`,{class:`text-body-medium`},` The assistant could not provide a verified handover. Fill in every section, and keep the Saved source details unchanged so the fresh assistant can verify its exact starting point. `,-1)),__props.renewal.renewal?.error?.message?(openBlock(),createElementBlock(`span`,_hoisted_18$5,toDisplayString(__props.renewal.renewal.error.message),1)):createCommentVNode(``,true)]),manualSourceItems.value.length?(openBlock(),createElementBlock(`dl`,_hoisted_19$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(manualSourceItems.value,item=>{return openBlock(),createElementBlock(Fragment,{key:item.label},[createBaseVNode(`dt`,null,toDisplayString(item.label),1),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(item.value),1)])],64)}),128))])):createCommentVNode(``,true)]),_:1},8,[`icon`])):__props.renewal.renewal?.error?.message?(openBlock(),createBlock(VAlert,{key:2,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),type:`info`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.renewal.error.message),1)]),_:1},8,[`icon`])):createCommentVNode(``,true),createVNode(VTextarea,{"model-value":__props.renewal.draftText,autofocus:``,class:`studio-session-renewal__draft`,counter:__props.renewal.maxHandoverCharacters,error:Boolean(__props.renewal.draftError),"error-messages":__props.renewal.draftError,label:`Handover for the fresh session`,"persistent-counter":``,rows:`12`,variant:`outlined`,"onUpdate:modelValue":__props.renewal.setDraftText},{counter:withCtx(()=>[createBaseVNode(`span`,null,toDisplayString(__props.renewal.draftCharacterCount.toLocaleString())+` / `+toDisplayString(__props.renewal.maxHandoverCharacters.toLocaleString()),1)]),_:1},8,[`model-value`,`counter`,`error`,`error-messages`,`onUpdate:modelValue`]),__props.renewal.draftDirty?(openBlock(),createElementBlock(`p`,_hoisted_20$4,` Unsaved edits are kept in this browser tab if you close this window or switch sessions. `)):createCommentVNode(``,true),createVNode(Vibe64WorkflowSelector_default,{active:__props.renewal.open&&__props.renewal.phase===`review`,disabled:dialogBusy.value,"initial-engine-id":__props.renewal.workflowEngineId,"onUpdate:ready":_cache[0]||(_cache[0]=$event=>assistantSelectionReady.value=$event),"onUpdate:workflow":_cache[1]||(_cache[1]=$event=>successorWorkflowEngineId.value=$event)},null,8,[`active`,`disabled`,`initial-engine-id`]),_cache[16]||(_cache[16]=createBaseVNode(`p`,{class:`studio-session-renewal__supporting text-body-small`},` Renewing will stop this session’s tools, create and prepare a fresh session, deliver the handover, then archive this one. `,-1))],64)):__props.renewal.phase===`failed`?(openBlock(),createElementBlock(Fragment,{key:6},[createVNode(StudioErrorNotice_default,{title:`Session renewal needs attention`,error:__props.renewal.renewal?.error?.message||`Session renewal could not continue.`},null,8,[`error`]),failedSupportingMessage.value?(openBlock(),createElementBlock(`p`,_hoisted_21$4,toDisplayString(failedSupportingMessage.value),1)):createCommentVNode(``,true)],64)):__props.renewal.phase===`completed`?(openBlock(),createElementBlock(Fragment,{key:7},[createVNode(VSheet,{class:`studio-session-renewal__success text-body-medium`,color:`surface-variant`,rounded:`lg`,role:`status`},{default:withCtx(()=>[createVNode(VIcon,{color:`success`,icon:unref(mdiCheckCircleOutline),size:`28`},null,8,[`icon`]),createBaseVNode(`span`,null,[_cache[17]||(_cache[17]=createBaseVNode(`strong`,{class:`font-weight-medium`},`The fresh session is ready.`,-1)),createTextVNode(` `+toDisplayString(__props.renewal.successorSelectionError?`It is ready to open; the old session remains available in the archive.`:`Opening it now; the old session remains available in the archive.`),1)])]),_:1}),__props.renewal.maintenanceNeedsRetry?(openBlock(),createBlock(VAlert,{key:0,class:`studio-session-renewal__notice`,density:`compact`,icon:unref(mdiInformationOutline),role:`status`,type:`warning`,variant:`tonal`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_22$4,[_cache[18]||(_cache[18]=createBaseVNode(`strong`,{class:`text-title-small`},`Cleanup needs retry`,-1)),_cache[19]||(_cache[19]=createBaseVNode(`span`,{class:`text-body-medium`},` The fresh session is ready, but Vibe64 has not finished retiring every old-session resource. `,-1)),createBaseVNode(`span`,_hoisted_23$4,toDisplayString(__props.renewal.maintenanceError),1)])]),_:1},8,[`icon`])):createCommentVNode(``,true),__props.renewal.successorSelectionError?(openBlock(),createBlock(StudioErrorNotice_default,{key:1,title:`The fresh session could not be opened automatically`,error:__props.renewal.successorSelectionError},null,8,[`error`])):createCommentVNode(``,true)],64)):createCommentVNode(``,true)]),_:1}),createVNode(VDivider),createVNode(VCardActions,{class:normalizeClass([`studio-session-renewal__actions`,{"studio-session-renewal__actions--compact":unref(smAndDown)}])},{default:withCtx(()=>[__props.renewal.phase===`review`?(openBlock(),createBlock(VBtn,{key:0,"aria-busy":__props.renewal.pendingAction===`cancel`?`true`:void 0,class:`studio-session-renewal__action`,disabled:dialogBusy.value||Boolean(__props.renewal.draftConflict),height:`48`,type:`button`,variant:`text`,onClick:__props.renewal.cancel},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.pendingAction===`cancel`?__props.renewal.actionLabel:__props.renewal.draftDirty?`Discard edits and cancel`:`Cancel renewal`),1)]),_:1},8,[`aria-busy`,`disabled`,`onClick`])):(openBlock(),createBlock(VBtn,{key:1,class:`studio-session-renewal__action`,"data-vibe64-session-renewal-close":`footer`,disabled:dialogBusy.value,height:`48`,type:`button`,variant:`text`,onClick:__props.renewal.close},{default:withCtx(()=>[..._cache[20]||(_cache[20]=[createTextVNode(` Close `,-1)])]),_:1},8,[`disabled`,`onClick`])),_cache[21]||(_cache[21]=createBaseVNode(`span`,{class:`studio-session-renewal__actions-spacer`},null,-1)),__props.renewal.phase===`load_error`?(openBlock(),createBlock(VBtn,{key:2,"aria-busy":__props.renewal.refreshing?`true`:void 0,autofocus:``,class:`studio-session-renewal__action studio-session-renewal__action--primary`,disabled:__props.renewal.refreshing,height:`48`,type:`button`,variant:`tonal`,onClick:__props.renewal.reload},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.refreshing?`Checking…`:`Try again`),1)]),_:1},8,[`aria-busy`,`disabled`,`onClick`])):__props.renewal.phase===`intro`?(openBlock(),createBlock(VBtn,{key:3,"aria-busy":__props.renewal.pendingAction===`draft`?`true`:void 0,autofocus:``,class:`studio-session-renewal__action studio-session-renewal__action--primary`,color:`primary`,disabled:__props.renewal.busy,height:`48`,"prepend-icon":unref(mdiFileDocumentEditOutline),type:`button`,variant:`flat`,onClick:__props.renewal.requestDraft},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.actionLabel||`Prepare handover`),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`,`onClick`])):__props.renewal.phase===`review`?(openBlock(),createElementBlock(Fragment,{key:4},[createVNode(VBtn,{"aria-busy":__props.renewal.pendingAction===`save`?`true`:void 0,class:`studio-session-renewal__action`,disabled:!__props.renewal.canSaveDraft,height:`48`,type:`button`,variant:`tonal`,onClick:__props.renewal.saveDraft},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.pendingAction===`save`?__props.renewal.actionLabel:`Save draft`),1)]),_:1},8,[`aria-busy`,`disabled`,`onClick`]),createVNode(VBtn,{"aria-busy":__props.renewal.pendingAction===`confirm`?`true`:void 0,class:`studio-session-renewal__action studio-session-renewal__action--primary`,color:`primary`,disabled:!canConfirmRenewal.value,height:`48`,"prepend-icon":unref(mdiAutorenew),type:`button`,variant:`flat`,onClick:confirmRenewal},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.pendingAction===`confirm`?__props.renewal.actionLabel:`Renew session`),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`])],64)):__props.renewal.phase===`failed`?(openBlock(),createBlock(VBtn,{key:5,"aria-busy":__props.renewal.pendingAction===`retry`?`true`:void 0,autofocus:``,class:`studio-session-renewal__action studio-session-renewal__action--primary`,color:`primary`,disabled:__props.renewal.busy,height:`48`,"prepend-icon":unref(mdiRefresh),type:`button`,variant:`flat`,onClick:__props.renewal.retry},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.actionLabel||`Retry`),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`,`onClick`])):__props.renewal.phase===`completed`?(openBlock(),createElementBlock(Fragment,{key:6},[__props.renewal.maintenanceNeedsRetry?(openBlock(),createBlock(VBtn,{key:0,"aria-busy":__props.renewal.pendingAction===`retry`?`true`:void 0,class:`studio-session-renewal__action`,disabled:__props.renewal.busy,height:`48`,"prepend-icon":unref(mdiRefresh),type:`button`,variant:`tonal`,onClick:__props.renewal.retry},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.pendingAction===`retry`?__props.renewal.actionLabel:`Retry cleanup`),1)]),_:1},8,[`aria-busy`,`disabled`,`prepend-icon`,`onClick`])):createCommentVNode(``,true),createVNode(VBtn,{"aria-busy":__props.renewal.successorSelectionPending?`true`:void 0,autofocus:Boolean(__props.renewal.successorSelectionError),class:`studio-session-renewal__action studio-session-renewal__action--primary`,color:`primary`,disabled:__props.renewal.successorSelectionPending,height:`48`,type:`button`,variant:`flat`,onClick:__props.renewal.openSuccessor},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.renewal.successorSelectionPending?`Opening…`:`Open fresh session`),1)]),_:1},8,[`aria-busy`,`autofocus`,`disabled`,`onClick`])],64)):createCommentVNode(``,true)]),_:1},8,[`class`])]),_:1},8,[`class`,`data-vibe64-session-renewal-phase`,`rounded`])]),_:1},8,[`fullscreen`,`model-value`,`persistent`])}}};var Vibe64SessionRenewalDialog_default=_plugin_vue_export_helper_default(_sfc_main$9,[[`__scopeId`,`data-v-89b9be36`]]);var TRAINING_GUIDE_DURATION_MS=8e3;var trainingGuide=shallowRef(null);var overlays=0;var sequence=0;function registerTrainingGuideOverlay(){overlays+=1;let registered=true;return()=>{if(!registered)return;registered=false;overlays-=1;if(overlays===0)trainingGuide.value=null}}function cssString(value){return String(value).replace(/["\\]/gu,`\\$&`)}function stepSelector(step){return step.id===`file`?`[data-vibe64-guide-path="${cssString(step.path)}"]`:`[data-vibe64-guide="${cssString(step.id)}"]`}function guideElementVisible(element){if(!element?.isConnected||element.closest(`[inert], [aria-hidden='true']`))return false;if(typeof element.checkVisibility===`function`&&!element.checkVisibility({visibilityProperty:true}))return false;const rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0}function findTrainingGuideStep(steps=[],root=globalThis.document){if(!root)return null;for(let index=steps.length-1;index>=0;index-=1){const element=[...root.querySelectorAll(stepSelector(steps[index]))].find(guideElementVisible);if(element)return{step:steps[index],element,final:index===steps.length-1}}return null}var PANE_SWITCH=`pane-switch`;function findPaneSwitch(root=globalThis.document){if(!root)return null;return[...root.querySelectorAll(`[data-vibe64-guide="${PANE_SWITCH}"]`)].filter(guideElementVisible).at(-1)||null}function clearTrainingGuide(id){if(!id||trainingGuide.value?.id===id)trainingGuide.value=null}async function showTrainingGuide(guide,{settleMs=0,durationMs=TRAINING_GUIDE_DURATION_MS}={}){if(!guide?.highlight)return{shown:false,reason:`highlight-off`};if(overlays===0)return{shown:false,reason:`overlay-unavailable`};const deadline=Date.now()+settleMs;let found=findTrainingGuideStep(guide.steps);while(!found?.final&&Date.now()<deadline){await new Promise(resolve=>setTimeout(resolve,50));found=findTrainingGuideStep(guide.steps)}if(!found){const element=findPaneSwitch();if(element)found={step:{id:PANE_SWITCH},element}}if(!found)return{shown:false,reason:`target-hidden`};if(overlays===0)return{shown:false,reason:`overlay-unavailable`};sequence+=1;trainingGuide.value=Object.freeze({id:`guide-${sequence}`,element:found.element,step:found.step.id,caption:String(guide.caption||``),expiresAt:Date.now()+durationMs});return{shown:true,step:found.step.id}}async function runTrainingGuideCommand(command,{navigateBrowser,view}={}){const{guide,...navigation}=command;let focus=null;if(guide.navigate){if(typeof navigateBrowser!==`function`)throw new Error(`Lesson workspace navigation is unavailable in this installation.`);focus=await navigateBrowser(navigation);if(guide.filePath&&(typeof view?.openFile!==`function`||view.openFile(guide.filePath)!==true))throw new Error(`This lesson's Files view could not open that practice project file.`)}const receipt=await showTrainingGuide(guide,{settleMs:guide.navigate?1500:0});return{...focus?{focus}:{},guide:receipt}}function useTrainingMainPresentation({identity,current,preview,voice,enabled,ready,retain,browserNavigation=inject(VIBE64_BROWSER_NAVIGATION_KEY,null),view=inject(VIBE64_COLLEAGUE_VIEW_KEY,null)}){const clientId=globalThis.crypto.randomUUID();const conversationId=mainConversationId(identity);const base=`${identity.sessionsApiPath}/${encodeURIComponent(identity.sessionId)}/training/presentation`;const error=ref(``);let mounted=true;let generation=0;const alive=()=>mounted&¤t.value&&enabled.value;const scope=()=>({mounted:alive(),clientId,conversationId,runtimeConversationId:conversationId,actorKey:identity.actorKey});const voiceSession=computed(()=>voice?.controller.state.binding?.conversationId===conversationId?voice.controller.state.session:null);function selectedPreview(){const handle=preview?.value;return handle?.sessionId===identity.sessionId&&(handle.projectSlug||``)===(identity.sourceProjectSlug||``)&&handle.learningAttemptId===identity.learningAttemptId&&handle.learnerId===identity.learnerId?handle:null}const original=getHttpWebClient();const resource=useEndpointResource({path:`${base}?clientId=${encodeURIComponent(clientId)}`,queryKey:[`vibe64`,`training`,`main-presentation`,identity.actorKey,identity.learnerId,identity.learningAttemptId,identity.sessionId,clientId],enabled:computed(()=>alive()&&ready.value),client:{async request(path,options){return{generation,value:await original.request(path,options)}}},queryOptions:{retry:false},fallbackLoadError:`The lesson presentation could not be read.`});const product=computed(()=>{const status=Number(resource.query.error.value?.statusCode||resource.query.error.value?.status||0);return alive()&&status!==401&&status!==403&&resource.data.value?.generation===generation?resource.data.value.value:null});const commandOptions={ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,access:`never`,apiSuffix:`/vibe64/training`,placementSource:`vibe64.training.main-presentation`,suppressSuccessMessage:true,buildRawPayload:(_model,{context})=>context.body,buildCommandOptions:(_model,{context})=>({path:context.path,method:`POST`}),fallbackRunError:`The lesson presentation receipt was not confirmed. Read its current status before continuing.`};const command=useCommand(commandOptions);const focusCommand=useCommand(commandOptions);async function acknowledge(body){if(!alive())throw new Error(`This Main lesson browser is no longer selected.`);const expected=generation;const payload=body.focus?{...body,focus:Object.fromEntries([`projectSlug`,`sessionId`,`pane`,`learningMode`,`learningView`,`learningContent`,`learningAttemptId`,`databaseScreen`,`databaseView`,`previewScreen`].filter(key=>Object.hasOwn(body.focus,key)).map(key=>[key,body.focus[key]]))}:body;const result=await command.run({path:`${base}/ack`,body:payload});if(!alive()||expected!==generation)return result;if(result?.ok!==true)throw new Error(result?.error||`The lesson presentation receipt was not confirmed.`);return result}const cue=useTrainingPresentationCue({scope,presentation:()=>selectedPreview()?.presentation,voiceSession,acknowledge,error,holdMainReplies:true});const navigation=createTrainingNavigation({scope,navigate:()=>browserNavigation?.value||selectedPreview()?async command=>{const navigateBrowser=browserNavigation?.value;if(command.guide){const handle=view?.value;const lessonView=handle?.projectSlug===(identity.sourceProjectSlug||``)&&handle?.sessionId===identity.sessionId&&handle?.learningBinding?.learningAttemptId===identity.learningAttemptId?handle:null;return runTrainingGuideCommand(command,{navigateBrowser,view:lessonView})}if(!command.presentation){if(navigateBrowser)return navigateBrowser(command);throw new Error(`Lesson workspace navigation is unavailable in this installation.`)}const handle=selectedPreview();if(!alive()||!handle||(command.projectSlug||``)!==(identity.sourceProjectSlug||``)||command.sessionId!==identity.sessionId||command.pane!==`preview`)throw new Error(`Use this exact learner lesson’s existing presentation handle.`);if(command.presentation?.operation===`cue`)cue.requireCueCapacity();const expected=generation;const result=navigateBrowser?await navigateBrowser(command):{focus:{projectSlug:identity.sourceProjectSlug||``,sessionId:identity.sessionId,pane:`preview`},presentation:trainingPresentationReceipt(await executeTrainingPresentationOperation(handle.presentation,command.presentation))};if(!alive()||generation!==expected||!navigateBrowser&&selectedPreview()!==handle)throw new Error(`The lesson presentation changed while its operation was running.`);return result}:null,beforeNavigate:()=>void 0,acknowledge,error});async function refresh(){if(!alive())return null;const expected=generation;const result=await resource.query.refetch();return alive()&&expected===generation?result:null}watch(()=>[alive(),ready.value,selectedPreview()],async()=>{if(!alive()||!ready.value)return;const expected=generation;try{const result=await focusCommand.run({path:`${base}/focus`,body:{clientId,focus:{pane:selectedPreview()?`preview`:`session`,...identity.noExercise===false?{projectSlug:identity.sourceProjectSlug}:{}}}});if(!alive()||expected!==generation)return;if(result?.ok!==true)throw new Error(result?.error||`This Main lesson browser could not report its view.`);await refresh()}catch(cause){if(alive()&&expected===generation)error.value=cause.message}},{immediate:true});async function handleNavigation(command){const retained=retain?.();try{await navigation.handle(command)}finally{retained?.release()}}watch(product,value=>{if(!value||!alive())return;if(value.cue)cue.observe(value.cue);if(value.navigation)handleNavigation(value.navigation)},{flush:`sync`,immediate:true});watch(current,valid=>{if(valid)return;generation+=1;cue.retire(`This Main learner conversation is no longer available.`);navigation.reset()},{flush:`sync`});onScopeDispose(()=>{cue.retire(`This Main lesson owner was retired.`);mounted=false;generation+=1;navigation.reset()});return{clientId,error,refresh,receiveEvent(event){if(!alive())return;if([`configuration`,`settled`].includes(event.type))return refresh();if([`error`,`replaced`].includes(event.type))cue.retire(`The native explanation was retired.`)},voiceState:(state,turns)=>cue.voiceState(state,conversationId,turns),narration:value=>cue.narration(value,conversationId),playback:event=>cue.playback(event,conversationId),retire:reason=>cue.retire(reason)}}function refetchMountedSessionResource(resource){if(typeof resource?.query?.refetch===`function`)return resource.query.refetch({cancelRefetch:false});return resource?.reload?.()}function useVibe64MountedSessionData({active=false,learningAttemptId:learningAttemptInput,learnerId:learnerInput,projectSlug:projectSlugInput,sessionId,sessionsApiPath,summarySession=null}={}){const learningAttemptId=computed(()=>readRefOrGetterValue(learningAttemptInput));const learnerId=computed(()=>String(readRefOrGetterValue(learnerInput)||``));const projectSlug=projectSlugInput===void 0&&learningAttemptInput===void 0?useVibe64ProjectSlug():computed(()=>readRefOrGetterValue(projectSlugInput));const detailRecord=ref(null);const agentTurnOverlay=ref(null);const agentConnectionStatus=ref(`initializing`);const agentConnectionError=ref(``);const mountedActive=computed(()=>readRefOrGetterValue(active)===true);const activeSessionId=computed(()=>String(readRefOrGetterValue(sessionId)||``).trim());const activeSessionsApiPath=computed(()=>String(readRefOrGetterValue(sessionsApiPath)||``).trim());const learningScopeReady=computed(()=>learningAttemptId.value===void 0||Boolean(learningAttemptId.value&&learnerId.value&&!projectSlug.value&&activeSessionsApiPath.value===`/api/learning/${learningAttemptId.value}/vibe64/sessions`));const eventMatchesScope=payload=>learningScopeReady.value&&vibe64SessionEventMatchesScope(payload,{projectSlug:projectSlug.value,learningAttemptId:learningAttemptId.value});const activityEventMatchesScope=payload=>learningAttemptId.value===void 0?!payload.learningAttemptId:eventMatchesScope(payload);const listSession=computed(()=>{const session=readRefOrGetterValue(summarySession);return learningScopeReady.value&&session?.sessionId===activeSessionId.value?session:null});const detailPath=computed(()=>activeSessionId.value&&activeSessionsApiPath.value?vibe64SessionPath(activeSessionsApiPath.value,activeSessionId.value):``);const detailQueryKey=computed(()=>[...vibe64SessionQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,{learningAttemptId:learningAttemptId.value,learnerId:learnerId.value}),activeSessionId.value,`detail`]);const detailResource=useEndpointResource({enabled:computed(()=>Boolean(learningScopeReady.value&&activeSessionId.value&&activeSessionsApiPath.value)),fallbackLoadError:`Vibe64 session could not be loaded.`,path:detailPath,queryKey:detailQueryKey,queryOptions:{queryFn:({signal})=>getHttpWebClient().request(detailPath.value,{signal:AbortSignal.any([signal,AbortSignal.timeout(2e4)])}),retry:false,refetchOnMount:`always`,refetchOnWindowFocus:false},readMethod:`GET`,realtime:{event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>eventMatchesScope(payload)&&mountedSessionRealtimeShouldRefresh({payload},activeSessionId.value)},refreshOnPull:true,requestRecoveryLabel:`Vibe64 session`});const detailState=computed(()=>mountedSessionDetailLoadState({detailSession:detailRecord.value,fetching:Boolean(detailResource.isFetching?.value),listSession:listSession.value,loadError:detailResource.loadError?.value||``,loading:Boolean(detailResource.isLoading?.value||detailResource.isInitialLoading?.value),sessionId:activeSessionId.value}));const baseSession=computed(()=>mountedSessionRecord(detailRecord.value,listSession.value,activeSessionId.value));const session=computed(()=>enrichVibe64SessionForDisplay(sessionWithAgentTurnRealtimeOverlay(baseSession.value,agentTurnOverlay.value)));let refreshInFlight=null;function acceptSessionResponse(candidate=null){const nextRecord=latestSessionDetailRecord(detailRecord.value,candidate,activeSessionId.value);if(!nextRecord||nextRecord===detailRecord.value)return false;detailRecord.value=nextRecord;const canonicalRevision=vibe64SessionRevision(nextRecord);if(canonicalRevision!==null&&canonicalRevision>=Number(agentTurnOverlay.value?.revision))agentTurnOverlay.value=null;return true}async function refresh(options={}){const reason=typeof options===`string`?options:String(options?.reason||``);if(!learningScopeReady.value||!activeSessionId.value||!activeSessionsApiPath.value)return null;if(refreshInFlight)return refreshInFlight;const startedAtMs=Date.now();vibe64SessionDebugLog(`client.mountedSession.refresh.start`,{reason,sessionId:activeSessionId.value});refreshInFlight=Promise.resolve(refetchMountedSessionResource(detailResource));try{const result=await refreshInFlight;vibe64SessionDebugLog(`client.mountedSession.refresh.done`,{...vibe64SessionDebugSummary(session.value||{}),durationMs:vibe64SessionDebugDurationMs(startedAtMs),reason,sessionId:activeSessionId.value});return result}catch(error){vibe64SessionDebugLog(`client.mountedSession.refresh.error`,{durationMs:vibe64SessionDebugDurationMs(startedAtMs),error:vibe64SessionDebugError(error),reason,sessionId:activeSessionId.value});throw error}finally{refreshInFlight=null}}function refreshInBackground(reason=``){refresh({reason}).catch(()=>{})}useRealtimeEvent({enabled:computed(()=>Boolean(activeSessionId.value)),event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>Boolean(activityEventMatchesScope(payload)&&agentTurnRealtimeOverlayFromPayload(payload,activeSessionId.value)),onEvent:({payload={}}={})=>{if(!activityEventMatchesScope(payload))return;const overlay=agentTurnRealtimeOverlayFromPayload(payload,activeSessionId.value);if(!overlay)return;agentTurnOverlay.value=latestAgentTurnRealtimeOverlay(agentTurnOverlay.value,overlay);vibe64SessionDebugLog(`client.mountedSession.agentTurn`,{active:overlay.active===true,reason:overlay.reason,sessionId:overlay.sessionId,threadId:String(overlay.agentSession?.thread?.id||``),turnId:String(overlay.agentSession?.turn?.id||``)})}});const realtimeSocket=useRealtimeSocket({required:false});let connectionGeneration=realtimeSocket.connected?1:0;let reconciliationInFlight=null;let reconciliationController=null;let reconciliationRetryTimer=null;let reconciliationRetryDelay=1e3;let disposed=false;function clearReconciliationRetry(){clearTimeout(reconciliationRetryTimer);reconciliationRetryTimer=null}function scheduleReconciliationRetry(){clearReconciliationRetry();if(disposed||!realtimeSocket.connected||globalThis.document?.hidden)return;reconciliationRetryTimer=setTimeout(()=>{reconciliationRetryTimer=null;if(!globalThis.document?.hidden)reconcileMountedAgentSession(`retry`)},reconciliationRetryDelay);reconciliationRetryDelay=Math.min(reconciliationRetryDelay*2,3e4)}async function reconcileMountedAgentSession(reason=`realtime-connect`){if(disposed||!realtimeSocket.connected||!learningScopeReady.value||!activeSessionId.value||!activeSessionsApiPath.value)return null;if(reconciliationInFlight)return reconciliationInFlight;clearReconciliationRetry();const generation=connectionGeneration;const controller=new AbortController;reconciliationController=controller;const currentConnection=()=>!disposed&&realtimeSocket.connected&&generation===connectionGeneration;const timeout=setTimeout(()=>{controller.abort(new Error(`Assistant status check timed out.`))},45e3);const cancelled=new Promise((_resolve,reject)=>{controller.signal.addEventListener(`abort`,()=>reject(controller.signal.reason),{once:true})});if(agentConnectionStatus.value!==`connected`)agentConnectionStatus.value=[`disconnected`,`unknown`,`reconciling`,`unavailable`,`failed`].includes(agentConnectionStatus.value)?`reconciling`:`initializing`;vibe64SessionDebugLog(`client.mountedSession.agentConnection.check`,{reason,sessionId:activeSessionId.value,status:agentConnectionStatus.value});const checking=(async()=>{if(mountedActive.value)refreshInBackground(reason);else{const refreshed=await refresh({reason});if(!currentConnection()||controller.signal.aborted)return null;if(refreshed?.isError)throw refreshed.error}const recoveringActiveAgentWork=sessionRecordHasActiveAgentWork(session.value);if(!mountedActive.value&&!recoveringActiveAgentWork){agentConnectionStatus.value=`initializing`;return session.value}const result=await getHttpWebClient().request(vibe64SessionPath(activeSessionsApiPath.value,activeSessionId.value,`/agent-session`),{body:{},method:`POST`,signal:controller.signal});if(result?.ok!==true)throw Object.assign(new Error(result?.error||`Assistant status could not be reconciled.`),{code:result?.code});if(currentConnection()&&!controller.signal.aborted){agentConnectionStatus.value=`connected`;agentConnectionError.value=``;reconciliationRetryDelay=1e3;if(recoveringActiveAgentWork)refreshInBackground(`agent-session-reconciled`)}return session.value})();reconciliationInFlight=Promise.race([checking,cancelled]).catch(error=>{if(currentConnection()){if(error?.code===VIBE64_ASSISTANT_ACCESS_ERROR_CODES.RESTRICTED){agentConnectionStatus.value=`restricted`;agentConnectionError.value=``;return null}agentConnectionError.value=String(error?.message||`The assistant could not be started. Please retry.`);if(error?.code===VIBE64_ASSISTANT_ACCESS_ERROR_CODES.UNAVAILABLE)agentConnectionStatus.value=`unavailable`;else if([`vibe64_agent_control_path_too_long`,`vibe64_agent_control_recovery_failed`,`vibe64_codex_history_unsupported`].includes(error?.code))agentConnectionStatus.value=`failed`;else{agentConnectionStatus.value=`unknown`;scheduleReconciliationRetry()}console.warn(`Vibe64 assistant status check failed.`,{code:String(error?.code||``),message:String(error?.message||``),reason,sessionId:activeSessionId.value})}vibe64SessionDebugLog(`client.mountedSession.agentConnection.error`,{error:vibe64SessionDebugError(error),reason,sessionId:activeSessionId.value});return null}).finally(()=>{clearTimeout(timeout);reconciliationController=null;reconciliationInFlight=null;if(!disposed&&realtimeSocket.connected&&generation!==connectionGeneration)reconcileMountedAgentSession(`realtime-reconnected`);else if(!disposed&&realtimeSocket.connected&&mountedActive.value&&agentConnectionStatus.value===`initializing`)reconcileMountedAgentSession(`provider-not-prepared`)});return reconciliationInFlight}const reconcileAfterConnectionChange=reason=>{connectionGeneration+=1;reconciliationRetryDelay=1e3;reconciliationController?.abort();reconcileMountedAgentSession(reason)};const reconcileAfterRealtimeConnect=()=>reconcileAfterConnectionChange(`realtime-connect`);useRealtimeEvent({enabled:computed(()=>Boolean(activeSessionId.value)),event:VIBE64_CONNECTIONS_CHANGED_EVENT,onEvent:()=>reconcileAfterConnectionChange(`account-connections-changed`)});useRealtimeEvent({enabled:computed(()=>Boolean(activeSessionId.value)),event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>eventMatchesScope(payload)&&(learningAttemptId.value!==void 0||payload.projectSlug===projectSlug.value)&&payload.sessionId===activeSessionId.value&&payload.reason===`session-assistant-selection-updated`,onEvent:()=>{agentConnectionStatus.value=`initializing`;reconcileAfterConnectionChange(`assistant-selection-changed`)}});const markRealtimeDisconnected=()=>{connectionGeneration+=1;clearReconciliationRetry();reconciliationController?.abort();agentConnectionStatus.value=`disconnected`};const reconcileAfterVisible=()=>{if(!globalThis.document?.hidden&&agentConnectionStatus.value===`unknown`)reconcileMountedAgentSession(`visible`)};function retryAgentConnection(){if(disposed)return;if(realtimeSocket.connected)return reconcileMountedAgentSession(`manual-retry`);realtimeSocket.connect?.()}globalThis.document?.addEventListener(`visibilitychange`,reconcileAfterVisible);realtimeSocket.on(`connect`,reconcileAfterRealtimeConnect);realtimeSocket.on(`connect_error`,markRealtimeDisconnected);realtimeSocket.on(`disconnect`,markRealtimeDisconnected);if(realtimeSocket.connected)queueMicrotask(()=>{reconcileMountedAgentSession(`initial-realtime-connect`)});watch(mountedActive,active=>{if(active&&[`initializing`,`disconnected`,`unknown`,`reconciling`].includes(agentConnectionStatus.value))reconcileMountedAgentSession(`provider-not-ready`)});onScopeDispose(()=>{disposed=true;clearReconciliationRetry();reconciliationController?.abort();globalThis.document?.removeEventListener(`visibilitychange`,reconcileAfterVisible);realtimeSocket.off(`connect`,reconcileAfterRealtimeConnect);realtimeSocket.off(`connect_error`,markRealtimeDisconnected);realtimeSocket.off(`disconnect`,markRealtimeDisconnected)});watch(detailResource.data,candidate=>{acceptSessionResponse(candidate||null)},{immediate:true});let summaryRefreshKey=``;watch(()=>{const reason=mountedSessionDetailRefreshReason(detailRecord.value,listSession.value,activeSessionId.value);return{detailRevision:vibe64SessionRevision(detailRecord.value),fetching:Boolean(detailResource.isFetching?.value),listRevision:vibe64SessionRevision(listSession.value),reason,sessionId:activeSessionId.value}},state=>{if(!state.reason){summaryRefreshKey=``;return}if(state.fetching)return;const refreshKey=[state.sessionId,state.reason,state.detailRevision??``,state.listRevision??``].join(`|`);if(refreshKey===summaryRefreshKey)return;summaryRefreshKey=refreshKey;refreshInBackground(state.reason)},{flush:`post`,immediate:true});watch(detailState,state=>{vibe64SessionDebugLog(`client.mountedSession.detailState`,{loading:state.loading===true,ready:state.ready===true,sessionId:state.sessionId,state:state.state})},{immediate:true});return{acceptSessionResponse,agentConnectionError,agentConnectionStatus,detailState,retryAgentConnection,refresh,resource:detailResource,session}}var ASSISTANT_ACCESS_IGNORED_REALTIME_REASONS=new Set([`assistant-stream`,`opencode-credential-failure`,`opencode-provider-failure`,`opencode-server-assistant-message`,`opencode-server-message-delivered`,`opencode-server-progress`,`opencode-server-reasoning`,`opencode-server-tool`,`claude-stream-message`,`claude-stream-message-delivered`]);function assistantAccessText(value=``){return String(value??``).trim()}function useVibe64AssistantAccess({active=true,learningAttemptId:learningAttemptInput,learnerId:learnerInput,projectSlug:projectSlugInput,viewer:viewerInput,sessionId=``,sessionsApiPath=``}={}){const learningAttemptId=computed(()=>readRefOrGetterValue(learningAttemptInput));const learnerId=computed(()=>assistantAccessText(readRefOrGetterValue(learnerInput)));const projectSlug=projectSlugInput===void 0&&learningAttemptInput===void 0?useVibe64ProjectSlug():computed(()=>readRefOrGetterValue(projectSlugInput));const viewer=viewerInput===void 0?hasInjectionContext()?inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`}):{actorKey:`local`}:viewerInput;const actorKey=computed(()=>unref(viewer)?.actorKey||``);const currentSessionId=computed(()=>assistantAccessText(readRefOrGetterValue(sessionId)));const currentSessionsApiPath=computed(()=>assistantAccessText(readRefOrGetterValue(sessionsApiPath)));const learningScopeReady=computed(()=>learningAttemptId.value===void 0||Boolean(learningAttemptId.value&&learnerId.value&&!projectSlug.value&¤tSessionsApiPath.value===`/api/learning/${learningAttemptId.value}/vibe64/sessions`));const enabled=computed(()=>Boolean(learningScopeReady.value&&readRefOrGetterValue(active)!==false&¤tSessionId.value&¤tSessionsApiPath.value&&actorKey.value));const accessPath=computed(()=>enabled.value?vibe64SessionPath(currentSessionsApiPath.value,currentSessionId.value,`/assistant-access`):``);const realtime={events:[VIBE64_SESSION_CHANGED_EVENT,VIBE64_CONNECTIONS_CHANGED_EVENT,VIBE64_ACCOUNTS_CHANGED_EVENT],matches:({event=``,payload={}}={})=>{if(event===`vibe64.connections.changed`||event===`vibe64.accounts.changed`)return true;if(!learningScopeReady.value||(learningAttemptId.value===void 0?Boolean(payload.learningAttemptId):!vibe64SessionEventMatchesScope(payload,{learningAttemptId:learningAttemptId.value})))return false;const reason=assistantAccessText(payload.reason);if([`codex-app-server-turn-active`,`codex-app-server-turn-idle`,`opencode-server-turn-active`,`opencode-server-turn-idle`,`claude-stream-turn-active`,`claude-stream-turn-idle`].includes(reason))return mountedSessionRealtimeShouldRefresh({payload:{...payload,reason:``}},currentSessionId.value);return!ASSISTANT_ACCESS_IGNORED_REALTIME_REASONS.has(reason)&&mountedSessionRealtimeShouldRefresh({payload},currentSessionId.value)}};const accessResource=useEndpointResource({enabled,fallbackLoadError:`AI access could not be loaded.`,path:accessPath,queryKey:computed(()=>[...vibe64SessionQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,{learningAttemptId:learningAttemptId.value,learnerId:learnerId.value}),currentSessionId.value,`assistant-access`,actorKey.value||`signed-out`]),queryOptions:{refetchOnMount:`always`,refetchOnWindowFocus:true},readMethod:`GET`,realtime,refreshOnPull:true,requestRecoveryLabel:`AI access`});const scopeKey=computed(()=>JSON.stringify(learningAttemptId.value===void 0?[projectSlug.value,currentSessionId.value,actorKey.value]:[`learning`,learnerId.value,learningAttemptId.value,currentSessionId.value,actorKey.value]));const access=computed(()=>{const value=accessResource.data.value;return learningScopeReady.value&&actorKey.value&&value&&value.ok!==false?value:null});const purposes=computed(()=>access.value?.purposes||{});const currentPurpose=computed(()=>purposes.value[access.value?.currentMode]);const accessLabel=computed(()=>{const selection=currentPurpose.value?.effectiveSelection;return currentPurpose.value?.backupUsed?`Shared backup`:selection?vibe64AssistantSelectionLabel(selection):assistantAccessText(access.value?.accessLabel)||`Unavailable`});const canUseChat=computed(()=>access.value?.canUse===true);const canRouteChat=computed(()=>!access.value?.steering&¤tPurpose.value?.available===true);const canUseNative=computed(()=>access.value?.nativeCanUse===true);const canUseAi=computed(()=>access.value?.canUseAny??canUseChat.value);const canUsePurpose=purpose=>purposes.value[purpose]?.available===true;const accessError=computed(()=>vibe64ResourceResponseError(accessResource.data.value,`AI access could not be loaded.`)||assistantAccessText(accessResource.loadError.value));const initialAccessLoading=computed(()=>Boolean(readRefOrGetterValue(active)!==false&&!access.value&&!accessError.value&&(!enabled.value||accessResource.isInitialLoading.value||accessResource.isLoading.value)));const restrictionMessage=computed(()=>{if(canUseChat.value||initialAccessLoading.value)return``;if(access.value?.steering&&access.value?.ownerOnly&&!canUseNative.value)return`Only the owner can steer this turn. You can send a message when it finishes.`;if(currentPurpose.value&&!currentPurpose.value.available)return currentPurpose.value.message;if(access.value?.available===true&&access.value?.ownerOnly===true)return`Only the workspace owner can use this personal AI connection.`;if(!access.value||access.value.available!==true)return accessError.value||`The selected AI connection is unavailable.`;return``});return{access,accessError,accessLabel,canUseAi,canUseChat,canRouteChat,canUseNative,canUsePurpose,purposes,scopeKey,initialAccessLoading,reload:accessResource.reload,restrictionMessage}}var AGENT_SETTINGS_STORAGE_KEY=`vibe64:agent-settings`;function normalizeAgentSettingsEmail(value=``){return String(value||``).trim().toLowerCase()}function agentSettingsStorageKey(baseKey=``,projectSlug=``,email=``){const projectKey=vibe64ProjectScopedStorageKey(baseKey,projectSlug);const normalizedEmail=normalizeAgentSettingsEmail(email);return normalizedEmail?`${projectKey}:user:${normalizedEmail}`:projectKey}function useVibe64AgentSettings({projectSlug:projectSlugInput}={}){const projectSlug=projectSlugInput===void 0?useVibe64ProjectSlug():computed(()=>toValue(projectSlugInput));const storageKey=computed(()=>agentSettingsStorageKey(AGENT_SETTINGS_STORAGE_KEY,projectSlug.value,``));const settings=ref(defaultVibe64AgentSettings());function load(){settings.value=normalizeVibe64AgentSettings(readLocalStorageJson(storageKey.value,defaultVibe64AgentSettings()))}function update(partial={}){settings.value=normalizeVibe64AgentSettings({...settings.value,...partial&&typeof partial===`object`&&!Array.isArray(partial)?partial:{}})}watch(storageKey,load,{immediate:true});watch(settings,value=>{writeLocalStorageJson(storageKey.value,normalizeVibe64AgentSettings(value))},{deep:true});return{requestSettings:computed(()=>{const value=settings.value;return value.providerId!==VIBE64_DEFAULT_AGENT_PROVIDER_ID||value.model||value.thinking?value:null}),settings,update}}function browserDraftStorage(identity){try{const storage=typeof window!==`undefined`?window.sessionStorage:null;return storage?{storage,key:`vibe64:chat-composer:v1:${JSON.stringify([...identity.learningAttemptId===void 0?[identity.actorKey,identity.projectSlug,identity.sessionId]:[identity.actorKey,`learning`,identity.learnerId,identity.learningAttemptId,identity.sessionId]])}`}:null}catch{return null}}function createConversationApplication(conversation,{identity,viewer,summarySession,shell}){const{active,current}=conversation;const mounted=useVibe64MountedSessionData({...identity,active,summarySession:computed(()=>toValue(summarySession)?.sessionId===identity.sessionId?toValue(summarySession):null)});const conversationLog=proxyRefs(useVibe64ConversationLog({...identity,active,session:mounted.session,conversation}));const access=useVibe64AssistantAccess({...identity,viewer,active});const agentSettings=useVibe64AgentSettings(identity);const turn=computed(()=>mounted.session.value?.agentSession?.turn||{});const steerable=computed(()=>conversation.steerable.value&&turn.value.active===true&&turn.value.status!==`observation_lost`&&Boolean(turn.value.id)&&turn.value.state===`active`&&mounted.agentConnectionStatus.value===`connected`);const available=computed(()=>current.value&&!isArchivedVibe64Session(mounted.session.value||{})&&!mounted.detailState.value?.error&&!access.accessError.value);function projectTrainingQuestion(reference){return Object.fromEntries([`attemptId`,`questionId`,`assessmentId`,`issuedRevision`,`topicHash`,`lessonHash`].map(key=>[key,reference[key]]))}const trainingQuestion=computed(()=>{const reference=conversation.snapshot.value?.trainingQuestion;if(!available.value||identity.learningAttemptId===void 0||reference?.attemptId!==identity.learningAttemptId)return null;return Object.freeze(projectTrainingQuestion(reference))});const presentation=identity.learningAttemptId!==void 0?useTrainingMainPresentation({identity,current,preview:shell.preview,voice:shell.voice,browserNavigation:shell.browserNavigation,retain:()=>conversation.retain(),ready:computed(()=>Boolean(conversation.snapshot.value)),enabled:computed(()=>available.value&&(toValue(summarySession)?.noExercise!==false||identity.noExercise===false))}):null;if(identity.learningAttemptId!==void 0&&presentation){const{channel,body,layout,view,feedback}=shell;const rawActor=computed(()=>toValue(viewer)?.actorKey||``);const selected=()=>current.value&&active.value&&available.value&&rawActor.value===identity.viewerActorKey;const matchingView=computed(()=>{const binding=view?.value?.learningBinding;return binding&&[`actorKey`,`viewerActorKey`,`learnerId`,`learningAttemptId`,`sessionId`,`sourceProjectSlug`].every(key=>binding[key]===identity[key])?view.value:null});const focus=computed(()=>({projectSlug:identity.sourceProjectSlug||``,sessionId:identity.sessionId,pane:matchingView.value?.pane||``,learningView:matchingView.value?.learningView||`learning`}));const workspace=identity.noExercise===false?useTrainingWorkspaceObservation({actor:rawActor,layout:layout||ref(null),view:matchingView,focus,selection:{projectSlug:ref(``),restoring:ref(false),error:computed(()=>mounted.detailState.value?.error||``)}}):null;const product=computed(()=>({conversationId:mainConversationId(identity),trainingQuestion:trainingQuestion.value,loaded:Boolean(conversation.snapshot.value)}));const drawer={owner:computed(()=>body?.value?.actorKey===identity.viewerActorKey?body.value:null),conversationId:computed(()=>body?.value?.actorKey===identity.viewerActorKey?body.value.conversationId:``),bodyVisible:computed(()=>body?.value?.actorKey===identity.viewerActorKey&&body.value.visible===true),xs:computed(()=>body?.value?.compact===true)};const gestures=useTrainingLearnerGestures({scope:{actorKey:rawActor,product,clientId:presentation.clientId,current:selected,learningBinding:identity,preserveDrawer:true},workspace:{get focus(){return focus.value},settle:workspace},drawer,observe:async options=>{const{conversationId:_derivedByServer,...requestBody}=options.body;const result=await getHttpWebClient().request(`${identity.sessionsApiPath}/${encodeURIComponent(identity.sessionId)}/training/observations`,{...options,body:requestBody});if(result?.ok===false)throw new Error(result.error||`The practical observation was not confirmed.`);return result},failure:error=>feedback?.report({source:`vibe64.training`,intent:`action-feedback`,severity:`error`,message:error.message,dedupeKey:`vibe64.training:${error.message}`,dedupeWindowMs:1e3})});watch(()=>selected(),valid=>{if(valid&&channel)channel.value=gestures;else{gestures.clear();if(channel?.value===gestures)channel.value=null}},{immediate:true,flush:`sync`});onScopeDispose(()=>{gestures.clear();if(channel?.value===gestures)channel.value=null})}const refreshGoal=()=>{if(!globalThis.document?.hidden)conversation.refreshGoal()};useRealtimeEvent({enabled:active,event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>vibe64SessionEventMatchesScope(payload,identity)&&(identity.learningAttemptId!==void 0||payload.projectSlug===identity.projectSlug)&&payload.sessionId===identity.sessionId&&[`codex-goal`,`claude-goal`,`assistant-routing-changed`].includes(payload.reason),onEvent:refreshGoal});for(const event of[VIBE64_ACCOUNTS_CHANGED_EVENT,VIBE64_CONNECTIONS_CHANGED_EVENT])useRealtimeEvent({enabled:active,event,matches:()=>true,onEvent:refreshGoal});function prepareMessage(payload,{messageId,submissionKind=steerable.value?`steer`:`send`}={}){if(!available.value)throw new Error(`This conversation is no longer available.`);if(!access.canUseChat.value)throw new Error(access.restrictionMessage.value||`AI access is not ready.`);const queuedStartup=conversation.queueWhileSending.value&&conversation.delivery.state.sending&&turn.value.state===`starting`&&turn.value.status!==`observation_lost`&&mounted.agentConnectionStatus.value===`connected`;if(turn.value.active&&conversation.steerable.value&&!steerable.value&&!queuedStartup)throw new Error(`Wait for this turn to finish or stop it before sending.`);const authored=conversation.delivery.find(messageId)?.payload||payload;if(authored.request)return authored;const body=agentTurnControlPayloadFromContext(authored);const data=Object.fromEntries([`agentSettings`,`displayMessage`,`displayAttachments`,`genesisTask`,`planRevision`,`reviewAction`,`originId`].filter(key=>Object.hasOwn(body,key)).map(key=>[key,body[key]]));const reference=Object.hasOwn(authored,`trainingQuestion`)?authored.trainingQuestion:trainingQuestion.value;if(identity.learningAttemptId!==void 0&&reference?.attemptId===identity.learningAttemptId)data.trainingQuestion=projectTrainingQuestion(reference);if(presentation)data.clientId=Object.hasOwn(authored,`clientId`)?authored.clientId:presentation.clientId;return{...authored,submissionKind,data,request:{text:String(authored.message||``),data,...authored.attachmentIds?.length?{attachmentIds:authored.attachmentIds}:{},...submissionKind===`steer`?{steer:true}:{}}}}async function send(payload,options={}){const prepared=prepareMessage(payload,options);try{const result=await conversation.send(prepared,options);if(result?.ok===false)throw vibe64ApiError(result,`Message could not be sent.`);return result}finally{mounted.refresh({reason:`agent-message-accepted`}).catch(()=>{})}}async function continueWorkflow(request){if(!available.value)throw new Error(`This conversation is no longer available.`);const messageId=String(request?.messageId||``).trim();const message=String(request?.input?.message||``);if(!messageId||!message.trim())throw new Error(`Refresh the session before continuing this workflow.`);try{const result=await getHttpWebClient().request(vibe64SessionPath(identity.sessionsApiPath,identity.sessionId,`/agent-message`),{body:{messageId,message,reviewAction:`retry`},method:`POST`});if(result?.ok===false)throw vibe64ApiError(result,`Workflow could not continue.`);return result}finally{mounted.refresh({reason:`agent-message-accepted`}).catch(()=>{})}}async function submitDraft(payload,options={}){const prepared=prepareMessage(payload,options);try{const result=await conversation.submitDraft(prepared,options);if(result?.ok===false)throw vibe64ApiError(result,`Message could not be sent.`);return result}finally{mounted.refresh({reason:`agent-message-accepted`}).catch(()=>{})}}async function interrupt(input=`user_interrupt`){if(!current.value)return false;const control=typeof input===`object`?input:{reason:input};try{const result=control.reason===`cancel-routing`?await getHttpWebClient().request(vibe64SessionPath(identity.sessionsApiPath,identity.sessionId,`/agent-turn/interrupt`),{body:agentTurnControlPayloadFromContext(control),method:`POST`}):await conversation.cancel();if(result?.ok===false)throw vibe64ApiError(result,`Assistant turn could not be interrupted.`);return result}finally{presentation?.retire(`The person stopped this Main explanation.`);mounted.refresh({reason:`agent-turn-interrupted`}).catch(()=>{})}}return{identity,mounted,conversationLog,access,agentSettings,available,steerable,trainingQuestion,presentation,phase:computed(()=>conversation.snapshot.value?.phase||``),...identity.learningAttemptId!==void 0?{conversationReady:computed(()=>Boolean(conversation.snapshot.value))}:{},...identity.learningAttemptId!==void 0?{async prepareVoice(){if(!current.value||!available.value||!access.canUseChat.value)throw new Error(`This lesson conversation is no longer available for voice.`);if(!conversation.snapshot.value)await conversation.reload();if(!current.value||!available.value||!access.canUseChat.value||!conversation.snapshot.value||conversation.error.value)throw new Error(`Wait for this lesson’s chat updates to load, then open voice again.`)}}:{},canSubmit:conversation.canSubmit,queueWhileSending:conversation.queueWhileSending,delivery:conversation.delivery,draft:conversation.draft,draftAttachments:conversation.draftAttachments,draftRetry:conversation.draftRetry,draftRetryMatches:conversation.draftRetryMatches,settleDraftRetry:conversation.settleDraftRetry,send,continueWorkflow,submitDraft,interrupt,goalState:conversation.goalState,goalView:conversation.goalView,goalLoadError:conversation.goalLoadError,changeGoal:conversation.changeGoal,refreshGoal:conversation.refreshGoal,sendAgentMessage:input=>send(input,{messageId:input.messageId,submissionKind:input.submissionKind}),cancelMessage:conversation.cancelMessage,inspectDelivery:conversation.inspectDelivery,retain(){const retained=conversation.retain();return{runtime:retained.runtime.application,release:retained.release}}}}function useVibe64ConversationRuntime({sessionId,projectSlug,sessionsApiPath,learningAttemptId,learnerId,noExercise,sourceProjectSlug,active=true,summarySession}={}){const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const queryClient=useQueryClient();const channel=inject(VIBE64_TRAINING_LEARNER_GESTURE_KEY,null);const shell={channel,body:inject(VIBE64_COLLEAGUE_BODY_KEY,null),browserNavigation:inject(VIBE64_BROWSER_NAVIGATION_KEY,null),layout:inject(VIBE64_COLLEAGUE_LAYOUT_KEY,null),view:inject(VIBE64_COLLEAGUE_VIEW_KEY,null),preview:inject(VIBE64_COLLEAGUE_PREVIEW_KEY,null),voice:useVibe64Voice(),feedback:channel?useShellWebErrorRuntime():null};const identity=computed(()=>{const target={sessionId:String(toValue(sessionId)||``),projectSlug:String(toValue(projectSlug)||``),actorKey:toValue(viewer)?.actorKey||``,sessionsApiPath:scopedDevelopmentApiUrl(String(toValue(sessionsApiPath)||``),String(toValue(projectSlug)||``))};const attempt=toValue(learningAttemptId);if(attempt!==void 0){target.viewerActorKey=target.actorKey;target.learningAttemptId=attempt;target.learnerId=typeof toValue(learnerId)===`string`?toValue(learnerId):``;if(toValue(noExercise)===false){target.noExercise=false;target.sourceProjectSlug=String(toValue(sourceProjectSlug)||``)}target.actorKey=(target.noExercise!==false||/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/u.test(target.sourceProjectSlug))&&!target.projectSlug&&target.learnerId&&target.actorKey&&target.sessionsApiPath===`/api/learning/${attempt}/vibe64/sessions`?JSON.stringify([`learning`,target.actorKey,target.learnerId,attempt]):``}return Object.freeze(target)});const api=createAssistantApi({request:(url,options)=>getHttpWebClient().request(url,options),resolveBasePath:()=>`/api/assistant/app`,resolveSurfaceId:()=>`app`});const binding=useAssistantConversation({conversationId:()=>{const target=identity.value;if(!target.sessionId||!target.actorKey||target.learningAttemptId===void 0&&!target.projectSlug)return``;try{return mainConversationId(target)}catch{return``}},actorKey:()=>identity.value.actorKey,endpoint:`/api/assistant/app`,surfaceId:`app`,hostSurfaceId:`app`,workspaceSlug:``,active,goal:true,deferWhileWorking:true,onEvent(event){const application=binding.runtime.value?.application;const presentation=application?.presentation?.receiveEvent(event);const target=application?.identity;if(event.type===`settled`&&target?.learningAttemptId!==void 0&&target.viewerActorKey===toValue(viewer)?.actorKey)for(const resource of[`learning`,`author-preview`]){const queryKey=[`vibe64`,`training`,resource,target.viewerActorKey];const saved=queryClient.getQueryData(queryKey);if(saved?.reader===target.viewerActorKey&&saved.value?.active?.attemptId===target.learningAttemptId)queryClient.invalidateQueries({queryKey,exact:true})}return presentation},draftStorage:()=>browserDraftStorage(identity.value),api:{...api,sendConversationMessage(id,input,...options){const voice=shell.voice?.controller.state;if(voice?.binding?.conversationId===id)voice.session?.inviteSpeech(input.messageId);return api.sendConversationMessage(id,input,...options)}},application(conversation){const target=mainConversationTarget(conversation.identity.conversationId);return createConversationApplication(conversation,{viewer,summarySession,shell,identity:Object.freeze({...identity.value,...target,actorKey:conversation.identity.actorKey})})}});return computed(()=>binding.runtime.value?.application||null)}var SESSION_RENEWAL_POLL_INTERVAL_MS=1200;var SESSION_RENEWAL_BACKGROUND_POLL_INTERVAL_MS=5e3;var SESSION_RENEWAL_RETRY_POLL_INTERVAL_MS=6e4;var SESSION_RENEWAL_DRAFT_STORAGE_PREFIX=`vibe64:session-renewal-draft`;function renewalRevision(value=null){const revision=Number(value?.revision);return Number.isSafeInteger(revision)&&revision>=1?revision:null}function browserSessionStorage(root=globalThis){try{return root?.sessionStorage||root?.window?.sessionStorage||null}catch{return null}}function renewalDraftStorageKey(projectSlug=``,sessionId=``,viewerScope=``,renewalId=``){const project=String(projectSlug||``).trim();const session=String(sessionId||``).trim();const viewer=String(viewerScope||``).trim();const renewal=String(renewalId||``).trim();return project&&session&&viewer&&renewal?`${SESSION_RENEWAL_DRAFT_STORAGE_PREFIX}:${encodeURIComponent(viewer)}:${encodeURIComponent(project)}:${encodeURIComponent(session)}:${encodeURIComponent(renewal)}`:``}function renewalHandoverValidationMessage(error=null){const response=error?.response;if(!String(error?.code||response?.code||response?.errors?.[0]?.code||``).trim().startsWith(`vibe64_session_renewal_handover_`))return``;return String(error?.message||response?.errors?.[0]?.message||response?.error||`Review the handover and correct the highlighted problem.`).trim()}function keepRenewalHandoverValidationInContext(error=null){if(renewalHandoverValidationMessage(error))throw error}function useVibe64SessionRenewal({active=true,draftStorage=browserSessionStorage(),focusSession=async()=>null,refreshSessionData=async()=>null,selectSession=()=>null,selectedSession,selectedSessionId,sessionsApiPath}={}){const projectSlug=useVibe64ProjectSlug();const hostActive=computed(()=>readRefOrGetterValue(active)!==false);const sessionId=computed(()=>String(readRefOrGetterValue(selectedSessionId)||``).trim());const session=computed(()=>readRefOrGetterValue(selectedSession)||null);const apiPath=computed(()=>String(readRefOrGetterValue(sessionsApiPath)||``).trim());const renewalPath=computed(()=>sessionId.value&&apiPath.value?vibe64SessionPath(apiPath.value,sessionId.value,`/renewal`):``);const open=ref(false);const triggerFocusTarget=shallowRef(null);const pendingActionState=ref(null);const draftText=ref(``);const hydratedDraftIdentity=ref(``);const hydratedDraftText=ref(``);const hydratedDraftGuard=ref(null);const draftConflictState=ref(null);const draftStorageIdentity=ref(``);const draftStorageHydrated=ref(false);const draftValidationError=ref(``);const localOperationKey=ref(``);const snapshot=ref(null);const viewerScope=ref(``);const handledSuccessorId=ref(``);const successorSelectionPendingId=ref(``);const successorSelectionError=ref(``);const manualReloading=ref(false);const resource=useEndpointResource({enabled:computed(()=>Boolean(sessionId.value&&apiPath.value)),fallbackLoadError:`Session renewal could not be loaded.`,path:renewalPath,queryKey:computed(()=>[...vibe64SessionQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value),sessionId.value,`renewal`]),queryOptions:{refetchOnMount:`always`,refetchOnWindowFocus:false},readMethod:`GET`,realtime:{event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>mountedSessionRealtimeShouldRefresh({payload},sessionId.value)},refreshOnPull:true,requestRecoveryLabel:`Session renewal`});const postCommand=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_model,{context})=>({method:`POST`,path:String(context?.path||``)}),buildRawPayload:(_model,{context})=>vibe64RealtimeOriginPayload(context?.body||{}),fallbackRunError:`Session renewal could not continue.`,messages:{error:`Session renewal could not continue.`},onRunError:keepRenewalHandoverValidationInContext,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.sessions.renewal.post`,suppressSuccessMessage:true,surfaceId:`app`,writeMethod:`POST`});const patchCommand=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_model,{context})=>({method:`PATCH`,path:String(context?.path||``)}),buildRawPayload:(_model,{context})=>vibe64RealtimeOriginPayload(context?.body||{}),fallbackRunError:`The handover draft could not be saved.`,messages:{error:`The handover draft could not be saved.`},onRunError:keepRenewalHandoverValidationInContext,ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.sessions.renewal.patch`,suppressSuccessMessage:true,surfaceId:`app`,writeMethod:`PATCH`});const renewal=computed(()=>snapshot.value);const advisory=computed(()=>session.value?.renewalAdvisory||{});const advisoryPresentation=computed(()=>sessionRenewalAdvisoryPresentation(advisory.value));const loadError=computed(()=>String(resource.loadError?.value||``));const refreshError=computed(()=>snapshot.value&&loadError.value?loadError.value:``);const refreshing=computed(()=>Boolean(manualReloading.value||snapshot.value&&resource.isLoading?.value));const initialLoading=computed(()=>Boolean(!snapshot.value&&(resource.isInitialLoading?.value||resource.isLoading?.value)));const phase=computed(()=>sessionRenewalPhase(renewal.value,{initialLoading:initialLoading.value,loadError:loadError.value}));const maintenanceNeedsRetry=computed(()=>Boolean(renewal.value?.status===`completed`&&renewal.value?.maintenance?.status===`failed`));const maintenanceInProgress=computed(()=>Boolean(renewal.value?.status===`completed`&&renewal.value?.maintenance?.status===`pending`));const maintenanceError=computed(()=>String(renewal.value?.maintenance?.error?.message||`The fresh session is ready, but Vibe64 could not finish retiring the old session resources.`).trim());const stageLabel=computed(()=>sessionRenewalStageLabel(renewal.value?.stage));const actionPresentation=computed(()=>{const status=String(renewal.value?.status||``).trim();if(status===`review`)return{attention:true,color:`primary`,label:`Review handover`,reason:`Review the handover before creating the fresh session.`};if(status===`running`)return{attention:true,color:`primary`,label:`Renewal in progress`,reason:stageLabel.value};if(status===`failed`)return{attention:true,color:`error`,label:`Renewal needs attention`,reason:String(renewal.value?.error?.message||`Open session renewal to continue safely.`).trim()};if(status===`completed`){if(maintenanceNeedsRetry.value)return{attention:true,color:`warning`,label:`Cleanup needs retry`,reason:maintenanceError.value};return{attention:true,color:successorSelectionError.value?`error`:`success`,label:successorSelectionError.value?`Open fresh session`:`Opening fresh session`,reason:successorSelectionError.value||`The fresh session is ready.`}}return advisoryPresentation.value});const steps=computed(()=>sessionRenewalStageProgress(renewal.value?.stage));const draftCharacterCount=computed(()=>sessionRenewalDraftCharacterCount(draftText.value));const draftTooLong=computed(()=>draftCharacterCount.value>SESSION_RENEWAL_MAX_HANDOVER_CHARACTERS);const draftDirty=computed(()=>Boolean(hydratedDraftIdentity.value&&sessionRenewalText(draftText.value)!==sessionRenewalText(hydratedDraftText.value)));const manualDraftIncomplete=computed(()=>Boolean(renewal.value?.manualRequired===true&&String(renewal.value?.draft?.hash||``).trim()&&String(renewal.value?.draft?.hash||``).trim()===String(renewal.value?.manualTemplateHash||``).trim()&&!draftDirty.value));const draftError=computed(()=>{if(draftTooLong.value)return`Handover must be ${SESSION_RENEWAL_MAX_HANDOVER_CHARACTERS.toLocaleString()} characters or fewer.`;if(draftValidationError.value)return draftValidationError.value;return manualDraftIncomplete.value?`Complete every handover section before creating the fresh session.`:``});const draftConflict=computed(()=>draftConflictState.value);const pendingAction=computed(()=>pendingActionState.value?.sessionId===sessionId.value?String(pendingActionState.value?.name||``):``);const sourceOperationsSuspended=computed(()=>Boolean([`draft`,`confirm`,`retry`].includes(pendingAction.value)||[`running`,`completed`].includes(String(renewal.value?.status||``).trim())||String(renewal.value?.stage||``).trim()===`failure_restoring`));const actionLabel=computed(()=>pendingAction.value?String(pendingActionState.value?.label||``):``);const busy=computed(()=>Boolean(pendingAction.value));const canConfirm=computed(()=>Boolean(phase.value===`review`&&sessionRenewalText(draftText.value).trim()&&!draftTooLong.value&&!draftValidationError.value&&!manualDraftIncomplete.value&&!draftConflict.value&&!busy.value));const canSaveDraft=computed(()=>Boolean(phase.value===`review`&&draftDirty.value&&!draftTooLong.value&&!draftValidationError.value&&!draftConflict.value&&!busy.value));const visible=computed(()=>{const status=String(renewal.value?.status||``).trim();const durableRenewalNeedsAccess=[`completed`,`failed`,`review`,`running`].includes(status);return Boolean(sessionId.value&&(durableRenewalNeedsAccess||session.value?.archived!==true&&session.value?.status!==`archived`))});function renewalDraftState(candidate=null){const draft=candidate?.draft;const identity=draft?`${Number(draft.revision||0)}:${String(draft.hash||``)}`:``;return{guard:{expectedHash:String(draft?.hash||``),expectedRevision:Number(draft?.revision||0),operationKey:String(candidate?.operationKey||currentOperationKey())},identity,text:identity?sessionRenewalText(draft?.text):``}}function activeDraftStorageKey(){return draftStorageIdentity.value}function removeStoredDraft(){const key=activeDraftStorageKey();if(!key||!draftStorage)return;try{draftStorage.removeItem(key)}catch{}}function persistStoredDraft(){const key=activeDraftStorageKey();if(!key||!draftStorage||!draftStorageHydrated.value)return;if(phase.value!==`review`||!draftDirty.value||!hydratedDraftIdentity.value||!renewal.value?.renewalId){removeStoredDraft();return}try{draftStorage.setItem(key,JSON.stringify({baseGuard:hydratedDraftGuard.value,baseIdentity:hydratedDraftIdentity.value,baseText:hydratedDraftText.value,renewalId:String(renewal.value.renewalId),text:sessionRenewalText(draftText.value)}))}catch{}}function restoreStoredDraft(candidate=null){if(draftStorageHydrated.value)return;draftStorageHydrated.value=true;const key=activeDraftStorageKey();if(!key||!draftStorage||String(candidate?.status||``)!==`review`)return;try{const stored=JSON.parse(String(draftStorage.getItem(key)||`null`));if(!stored||typeof stored!==`object`||Array.isArray(stored)||String(stored.renewalId||``)!==String(candidate?.renewalId||``)||!String(stored.baseIdentity||``)||typeof stored.baseText!==`string`||typeof stored.text!==`string`||!stored.baseGuard||typeof stored.baseGuard!==`object`||Array.isArray(stored.baseGuard)){removeStoredDraft();return}hydratedDraftIdentity.value=String(stored.baseIdentity);hydratedDraftText.value=sessionRenewalText(stored.baseText);hydratedDraftGuard.value={expectedHash:String(stored.baseGuard.expectedHash||``),expectedRevision:Number(stored.baseGuard.expectedRevision||0),operationKey:String(stored.baseGuard.operationKey||``)};draftText.value=sessionRenewalText(stored.text)}catch{removeStoredDraft()}}function resetDraftHydration(){hydratedDraftIdentity.value=``;hydratedDraftText.value=``;hydratedDraftGuard.value=null;draftConflictState.value=null;draftStorageHydrated.value=false;draftValidationError.value=``;draftText.value=``}function prepareDraftContext(candidate=null,nextViewerScope=``){const normalizedViewerScope=String(nextViewerScope||``).trim();if(!normalizedViewerScope)return false;const nextStorageIdentity=candidate?renewalDraftStorageKey(projectSlug.value,sessionId.value,normalizedViewerScope,candidate.renewalId):``;if(viewerScope.value===normalizedViewerScope&&draftStorageIdentity.value===nextStorageIdentity)return true;persistStoredDraft();viewerScope.value=normalizedViewerScope;draftStorageIdentity.value=nextStorageIdentity;resetDraftHydration();snapshot.value=null;localOperationKey.value=``;return true}function hydrateDraft(candidate=null,{preserveLocal=false}={}){const next=renewalDraftState(candidate);hydratedDraftIdentity.value=next.identity;hydratedDraftText.value=next.text;hydratedDraftGuard.value=next.guard;if(!preserveLocal)draftText.value=next.text;draftConflictState.value=null;draftValidationError.value=``}function reconcileDraft(candidate=null){const next=renewalDraftState(candidate);if(next.identity===hydratedDraftIdentity.value)return;if(!(String(candidate?.status||``)===`review`)||!hydratedDraftIdentity.value||!draftDirty.value||next.text===sessionRenewalText(draftText.value)){hydrateDraft(candidate);return}draftConflictState.value=next}function acceptRenewal(candidate=null,{responseViewerScope=``}={}){if(candidate===null||candidate===void 0){if(!prepareDraftContext(null,responseViewerScope))return false;if(!snapshot.value)snapshot.value=null;return true}if(typeof candidate!==`object`||Array.isArray(candidate)||String(candidate.sessionId||``).trim()!==sessionId.value)return false;const candidateRevision=renewalRevision(candidate);if(candidateRevision===null)return false;if(!prepareDraftContext(candidate,responseViewerScope))return false;const currentRevision=renewalRevision(snapshot.value);if(currentRevision!==null&&candidateRevision<=currentRevision)return candidateRevision===currentRevision;restoreStoredDraft(candidate);reconcileDraft(candidate);snapshot.value=candidate;persistStoredDraft();return true}function currentOperationKey(){return String(renewal.value?.operationKey||localOperationKey.value||``).trim()}function createOperationKey(){const randomId=globalThis.crypto?.randomUUID?.()||``;localOperationKey.value=sessionRenewalOperationKey(sessionId.value,{randomId});return localOperationKey.value}function draftGuard(){const guard=hydratedDraftGuard.value||renewalDraftState(renewal.value).guard;return{expectedHash:String(guard?.expectedHash||``),expectedRevision:Number(guard?.expectedRevision||0),operationKey:String(guard?.operationKey||currentOperationKey())}}async function reload(){if(manualReloading.value)return renewal.value;manualReloading.value=true;try{await resource.reload?.();return renewal.value}finally{manualReloading.value=false}}let nextActionId=0;async function runAction(name,label,operation){const actionSessionId=sessionId.value;if(!actionSessionId||busy.value)return null;const actionId=++nextActionId;pendingActionState.value={actionId,label,name,sessionId:actionSessionId};try{let response;try{response=await operation()}catch(error){if(sessionId.value!==actionSessionId)return null;throw error}if(sessionId.value!==actionSessionId)return null;if(!response||response.ok===false)throw vibe64ApiError(response,`Session renewal could not continue.`);if(!acceptRenewal(response.renewal||null,{responseViewerScope:response.viewerScope}))return null;reload().catch(()=>null);return response.renewal||null}finally{if(pendingActionState.value?.actionId===actionId)pendingActionState.value=null}}async function requestDraft(){if(busy.value)return null;const operationKey=createOperationKey();return runAction(`draft`,`Starting…`,()=>postCommand.run({body:{operationKey},path:`${renewalPath.value}/draft`}))}async function saveDraft({pendingActionName=`save`}={}){if(!canSaveDraft.value)return renewal.value;try{return await runAction(pendingActionName,`Saving…`,()=>patchCommand.run({body:{...draftGuard(),draft:sessionRenewalText(draftText.value)},path:`${renewalPath.value}/draft`}))}catch(error){const message=renewalHandoverValidationMessage(error);if(!message)throw error;draftValidationError.value=message;return null}}async function confirm(workflowEngineId=``){if(!canConfirm.value)return null;if(draftDirty.value){if(!await saveDraft({pendingActionName:`confirm`}))return null}try{return await runAction(`confirm`,`Renewing…`,()=>postCommand.run({body:{...draftGuard(),...workflowEngineId?{workflowEngineId}:{}},path:`${renewalPath.value}/confirm`}))}catch(error){const message=renewalHandoverValidationMessage(error);if(!message)throw error;draftValidationError.value=message;return null}}async function cancel(){if(phase.value!==`review`||draftConflict.value||busy.value)return null;const result=await runAction(`cancel`,`Cancelling…`,()=>postCommand.run({body:draftGuard(),path:`${renewalPath.value}/cancel`}));if(result?.status===`cancelled`)open.value=false;return result}async function retry(){if(phase.value!==`failed`&&!maintenanceNeedsRetry.value||busy.value)return null;return runAction(`retry`,maintenanceNeedsRetry.value?`Retrying cleanup…`:`Retrying…`,()=>postCommand.run({body:{operationKey:currentOperationKey()},path:`${renewalPath.value}/retry`}))}function request({returnFocusTarget=null}={}){if(!visible.value||!hostActive.value)return;const target=returnFocusTarget?.$el||returnFocusTarget;triggerFocusTarget.value=typeof target?.focus===`function`?target:null;open.value=true;reload().catch(()=>null)}function close(){persistStoredDraft();open.value=false}function restoreTriggerFocus(){if(open.value)return false;const target=triggerFocusTarget.value;triggerFocusTarget.value=null;if(target?.isConnected!==true||typeof target.focus!==`function`)return false;target.focus({preventScroll:true});return true}function setDraftText(value=``){draftText.value=sessionRenewalText(value);draftValidationError.value=``;persistStoredDraft()}function acceptLatestDraft(){const conflict=draftConflictState.value;if(!conflict)return;hydratedDraftIdentity.value=conflict.identity;hydratedDraftText.value=conflict.text;hydratedDraftGuard.value=conflict.guard;draftText.value=conflict.text;draftConflictState.value=null;draftValidationError.value=``;persistStoredDraft()}function keepLocalDraft(){const conflict=draftConflictState.value;if(!conflict)return;hydratedDraftIdentity.value=conflict.identity;hydratedDraftText.value=conflict.text;hydratedDraftGuard.value=conflict.guard;draftConflictState.value=null;persistStoredDraft()}function availableSuccessorId(){return renewal.value?.status===`completed`?String(renewal.value?.successor?.sessionId||``).trim():``}function refreshResultError(result=null){if(Array.isArray(result)){for(const entry of result){if(entry?.status===`rejected`)return entry.reason instanceof Error?entry.reason:new Error(String(entry?.reason||`Session list could not be refreshed.`));if(entry?.status===`fulfilled`){const nestedError=refreshResultError(entry.value);if(nestedError)return nestedError}}return null}if(result&&typeof result===`object`&&!Array.isArray(result)&&(result.isError===true||result.status===`error`))return result.error instanceof Error?result.error:new Error(String(result.error||`Session list could not be refreshed.`));return null}async function openSuccessor(){const successorId=availableSuccessorId();if(!successorId||!hostActive.value||handledSuccessorId.value===successorId||successorSelectionPendingId.value)return false;const predecessorSessionId=sessionId.value;successorSelectionPendingId.value=successorId;successorSelectionError.value=``;try{const refreshFailure=refreshResultError(await refreshSessionData({includeList:true,reason:`session-renewal-successor-available`}));if(refreshFailure)throw refreshFailure;if(!hostActive.value||sessionId.value!==predecessorSessionId||availableSuccessorId()!==successorId)return false;await Promise.resolve(selectSession(successorId));handledSuccessorId.value=successorId;triggerFocusTarget.value=null;open.value=false;await Promise.resolve(focusSession(successorId)).catch(()=>null);return true}catch(error){if(hostActive.value&&sessionId.value===predecessorSessionId){successorSelectionError.value=error instanceof Error?error.message:String(error||`The fresh session could not be opened.`);open.value=true}return false}finally{if(successorSelectionPendingId.value===successorId)successorSelectionPendingId.value=``}}let pollTimer=null;function clearPoll(){if(pollTimer){clearTimeout(pollTimer);pollTimer=null}}function schedulePoll(){clearPoll();if(!hostActive.value||renewal.value?.status!==`running`&&!maintenanceInProgress.value&&!maintenanceNeedsRetry.value)return;const pollIntervalMs=maintenanceNeedsRetry.value?SESSION_RENEWAL_RETRY_POLL_INTERVAL_MS:open.value?SESSION_RENEWAL_POLL_INTERVAL_MS:SESSION_RENEWAL_BACKGROUND_POLL_INTERVAL_MS;pollTimer=setTimeout(async()=>{pollTimer=null;await reload().catch(()=>null);schedulePoll()},pollIntervalMs)}watch([projectSlug,sessionId],()=>{persistStoredDraft();snapshot.value=null;localOperationKey.value=``;viewerScope.value=``;draftStorageIdentity.value=``;resetDraftHydration();handledSuccessorId.value=``;successorSelectionPendingId.value=``;successorSelectionError.value=``;triggerFocusTarget.value=null;open.value=false},{immediate:true});watch(()=>resource.data?.value||null,response=>{if(!response||response.ok===false)return;acceptRenewal(response.renewal||null,{responseViewerScope:response.viewerScope})},{immediate:true});watch(hostActive,activeNow=>{if(!activeNow){triggerFocusTarget.value=null;open.value=false;clearPoll()}},{immediate:true});watch([hostActive,open,projectSlug,sessionId,()=>renewal.value?.status,()=>renewal.value?.maintenance?.status],schedulePoll,{immediate:true});watch([hostActive,()=>availableSuccessorId()],([activeNow,successorId])=>{if(activeNow&&successorId&&handledSuccessorId.value!==successorId)openSuccessor()},{immediate:true});onScopeDispose(()=>{persistStoredDraft();triggerFocusTarget.value=null;clearPoll()});return{actionPresentation,actionLabel,workflowEngineId:computed(()=>assistantRoutingFromMetadata(session.value?.metadata||{})?.workflowEngineId||session.value?.assistantSelection?.engineId||``),acceptLatestDraft,advisory,advisoryPresentation,busy,canConfirm,canSaveDraft,cancel,close,confirm,draftCharacterCount,draftConflict,draftDirty,draftError,draftText,draftTooLong,initialLoading,keepLocalDraft,loadError,maintenanceError,maintenanceInProgress,maintenanceNeedsRetry,maxHandoverCharacters:SESSION_RENEWAL_MAX_HANDOVER_CHARACTERS,open,openSuccessor,pendingAction,phase,refreshError,refreshing,reload,renewal,request,requestDraft,restoreTriggerFocus,retry,setDraftText,saveDraft,sourceOperationsSuspended,stageLabel,steps,successorSelectionError,successorSelectionPending:computed(()=>Boolean(successorSelectionPendingId.value)),visible}}var SESSION_WORK_TASK_IDS=[`codex_turn_checkpoint`,`save-work`,`update-session`];async function focusRuntimeSessionChat(sessionId=``,root=globalThis.document){const normalizedId=String(sessionId||``).trim();if(!normalizedId||!root?.querySelectorAll)return false;await nextTick();await nextTick();const target=[...root.querySelectorAll(`[data-vibe64-session-runtime-id]`)].find(element=>element.getAttribute(`data-vibe64-session-runtime-id`)===normalizedId)?.querySelector?.(`.studio-autopilot__chat-panel`);target?.focus?.({preventScroll:true});return Boolean(target)}function proxySessionDialogs(dialogs={}){return Object.fromEntries(Object.entries(dialogs).map(([name,dialog])=>[name,proxyRefs(dialog)]))}function runtimeHostToolbarSessions({activeAgentThinking=false,fallbackSessions=[],selectedSession=null,selectedSessionId=``,sessions=null}={}){const currentId=String(selectedSessionId||``).trim();const navigationSessions=sessions??fallbackSessions;return(Array.isArray(navigationSessions)?navigationSessions:[]).map(session=>{const sessionId=String(session?.sessionId||``).trim();if(!sessionId)return session;const source=sessionId===currentId&&selectedSession?.sessionId===sessionId?selectedSession:session;const agentThinking=Boolean((sessionId===currentId?activeAgentThinking:session.agentThinking)||sessionRecordHasActiveAgentWork(source));return Boolean(session?.agentThinking)===agentThinking?session:{...session,agentThinking}})}function runtimeHostAgentWorking({selectedSession=null,transientAgentThinking=false}={}){return Boolean(transientAgentThinking||sessionRecordHasActiveAgentWork(selectedSession))}function createVibe64SessionWorkRefreshQueue({inspect}={}){if(typeof inspect!==`function`)throw new TypeError(`Session work refresh requires an inspector.`);let active=null;let disposed=false;let refreshAfterActive=false;async function drain(){do{refreshAfterActive=false;await inspect({isCurrent:()=>!disposed&&!refreshAfterActive})}while(!disposed&&refreshAfterActive)}function request(){if(disposed)return Promise.resolve();if(active){refreshAfterActive=true;return active}active=Promise.resolve().then(drain).finally(()=>{active=null});return active}return Object.freeze({dispose(){disposed=true;refreshAfterActive=false},request})}var ACTIVE_WORK_TASK_STATUSES=[`queued`,`running`,`starting`];function workTaskActive(task={}){return ACTIVE_WORK_TASK_STATUSES.includes(String(task?.status||``).trim().toLowerCase())}function runtimeHostWorkInspectionRevision(session={}){return runtimeHostWorkTaskRevision(session,{progress:false})}function runtimeHostWorkTaskRevision(session={},{progress=true}={}){return(Array.isArray(session?.backgroundTasks)?session.backgroundTasks:[]).filter(task=>SESSION_WORK_TASK_IDS.includes(String(task?.id||``))).map(task=>{if(!progress&&task.id!==`codex_turn_checkpoint`&&workTaskActive(task))return[task.id,String(task.status||``).trim().toLowerCase(),String(task.operationId||``)].join(`:`);const events=Array.isArray(task?.events)?task.events:[];const latestEvent=events.at(-1)||{};return[String(task?.id||``),String(task?.status||``),String(task?.updatedAt||``),String(events.length),String(latestEvent.at||``),String(latestEvent.kind||``),String(latestEvent.status||``)].join(`:`)}).sort().join(`|`)}function runtimeHostWorkTaskState(session={}){const tasks=Array.isArray(session?.backgroundTasks)?session.backgroundTasks:[];const operation=tasks.find(task=>String(task?.id||``)===`save-work`)||null;const updateOperation=tasks.find(task=>String(task?.id||``)===`update-session`)||null;const activeOperation=[operation,updateOperation].find(workTaskActive);return{activeOperation:activeOperation?{kind:activeOperation===operation?`save`:`update`,operationId:String(activeOperation.operationId||``).trim()}:null,operation,updateOperation}}function useVibe64SessionRuntimeHost(props,emit){const initialSession=(unref(props.sessionData.sessions)||[]).find(session=>session.sessionId===String(props.sessionId||``).trim());const learningScope=initialSession?.purpose===`learning`?{learningAttemptId:String(initialSession.learningAttemptId||``).trim(),learnerId:String(readRefOrGetterValue(props.sessionData.learningLearnerId)||``).trim(),sessionId:initialSession.sessionId,noExercise:initialSession.noExercise!==false,sourceProjectSlug:initialSession.noExercise===false?String(initialSession.projectSlug||``).trim():``}:null;if(learningScope&&(!learningScope.learnerId||!learningScope.learningAttemptId||(learningScope.noExercise?learningScope.sessionId!==`learning-${learningScope.learningAttemptId}`:!learningScope.sessionId||!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/u.test(learningScope.sourceProjectSlug))))throw new Error(`This learning conversation has no confirmed learner and attempt.`);const selectedSessionId=computed(()=>learningScope?.sessionId||String(props.sessionId||``).trim());const sessionsApiPath=learningScope?`/api/learning/${encodeURIComponent(learningScope.learningAttemptId)}/vibe64/sessions`:props.sessionData.sessionsApiPath;const runtimeProjectContext=computed(()=>learningScope?{}:props.projectContext||{});const selectedListSession=computed(()=>{return(unref(props.sessionData.sessions)||[]).find(session=>session.sessionId===selectedSessionId.value)||null});const conversationRuntime=useVibe64ConversationRuntime({active:computed(()=>Boolean(props.active)),projectSlug:computed(()=>runtimeProjectContext.value.slug||``),sessionId:selectedSessionId,sessionsApiPath,...learningScope?{learningAttemptId:learningScope.learningAttemptId,learnerId:learningScope.learnerId,noExercise:learningScope.noExercise,sourceProjectSlug:learningScope.sourceProjectSlug}:{},summarySession:selectedListSession});const mounted={session:computed(()=>conversationRuntime.value?.mounted.session.value||null),detailState:computed(()=>conversationRuntime.value?.mounted.detailState.value||{}),agentConnectionError:computed(()=>conversationRuntime.value?.mounted.agentConnectionError.value||``),agentConnectionStatus:computed(()=>conversationRuntime.value?.mounted.agentConnectionStatus.value||`initializing`),refresh:options=>conversationRuntime.value?.mounted.refresh(options),retryAgentConnection:(...args)=>conversationRuntime.value?.mounted.retryAgentConnection(...args)};const selectedSession=mounted.session;const selectedSessionArchived=computed(()=>isArchivedVibe64Session(selectedSession.value||{}));const selectedSessionTitle=computed(()=>vibe64SessionDisplayTitle(selectedSession.value||{})||`Session ${props.sessionData.shortSessionId(selectedSessionId.value)}`);const autopilotAgentThinking=ref(false);const activeAgentWorking=computed(()=>runtimeHostAgentWorking({selectedSession:selectedSession.value,transientAgentThinking:autopilotAgentThinking.value}));const workState=ref({checkedAt:``,error:``,loading:!learningScope,operation:null,unsaved:null});useRealtimeEvent({event:VIBE64_PROJECT_CHANGED_EVENT,matches:({payload={}}={})=>!learningScope&&payload.projectSlug===props.projectContext?.slug&&typeof payload.repositoryWorkflow?.requirePullRequest===`boolean`,onEvent:({payload})=>{workState.value={...workState.value,publicationRequiresPullRequest:workState.value.destination?.mode===`github`&&payload.repositoryWorkflow.requirePullRequest}}});let workStateActive=true;async function inspectWorkState({isCurrent}){const sessionId=selectedSessionId.value;const sessionArchived=selectedSessionArchived.value;const requestIsCurrent=()=>Boolean(workStateActive&&isCurrent()&&!sourceOperationsSuspended.value&&selectedSessionId.value===sessionId&&selectedSessionArchived.value===sessionArchived);if(sourceOperationsSuspended.value)return;if(!sessionId||sessionArchived){if(requestIsCurrent())workState.value={checkedAt:new Date().toISOString(),error:``,loading:false,operation:null,unsaved:null};return}if(requestIsCurrent()&&(workState.value.unsaved===null||workState.value.unsaved===void 0))workState.value={...workState.value,loading:true};try{const result=await getHttpWebClient().request(vibe64SessionPath(readRefOrGetterValue(props.sessionData.sessionsApiPath),sessionId,`/work`),{method:`GET`,timeoutMs:12e4});if(result?.ok===false)throw new Error(vibe64ApiResponseError(result,`Session work could not be inspected.`));if(requestIsCurrent())workState.value={...result,checkedAt:new Date().toISOString(),error:``,loading:false}}catch(error){if(requestIsCurrent())workState.value={checkedAt:new Date().toISOString(),error:error instanceof Error?error.message:String(error||`Session work could not be inspected.`),loading:false,operation:null,unsaved:null}}}const workStateRefreshQueue=createVibe64SessionWorkRefreshQueue({inspect:inspectWorkState});async function refreshWorkState(observedWork=null){if(sourceOperationsSuspended.value)return workState.value;if(observedWork&&typeof observedWork===`object`&&observedWork.ok!==false&&String(observedWork.sessionId||``).trim()===selectedSessionId.value){workState.value={...observedWork,checkedAt:new Date().toISOString(),error:``,loading:false};return workState.value}await workStateRefreshQueue.request();return workState.value}async function refreshSessionData(options={}){if(!(options?.includeList===true))return mounted.refresh(options);return Promise.allSettled([mounted.refresh(options),props.sessionData.refreshSessionData(options)])}const renewalModel=useVibe64SessionRenewal({active:computed(()=>Boolean(props.active)),focusSession:focusRuntimeSessionChat,refreshSessionData:props.sessionData.refreshSessionData,selectSession:props.sessionData.selectSessionId,selectedSession,selectedSessionId:learningScope?``:selectedSessionId,sessionsApiPath:learningScope?``:sessionsApiPath});const sourceOperationsSuspended=computed(()=>Boolean(learningScope||unref(renewalModel.sourceOperationsSuspended)));const dialogs=proxySessionDialogs({archive:props.sessionData.archive,renewal:renewalModel});const conversationLog=computed(()=>conversationRuntime.value?.conversationLog||null);const selection=proxyRefs({isArchived:selectedSessionArchived,selectedSession,selectedSessionDetailState:mounted.detailState,selectedSessionId,selectedSessionTitle,statusColor:vibe64SessionStatusColor,statusLabel:vibe64SessionStatusLabel});const autopilotSessionToolbar=proxyRefs({sessionsApiPath,workingSessionsApiPath:props.sessionData.sessionsApiPath,refreshSessionData,projectContext:runtimeProjectContext,refreshRepositoryState:props.refreshRepositoryState,canCreateSession:props.sessionData.canCreateSession,createSession:props.sessionData.createSession,createSessionCommand:props.sessionData.createSessionCommand,createSessionRunning:props.sessionData.createSessionRunning,createSessionVisible:props.sessionData.createSessionVisible,...learningScope?{canCreateSession:false,createSessionVisible:false}:{},createSessionTitle:props.sessionData.createSessionTitle,selectSession:props.sessionData.selectSessionId,sessions:computed(()=>runtimeHostToolbarSessions({activeAgentThinking:activeAgentWorking.value,fallbackSessions:unref(props.sessionData.sessions),selectedSession:selectedSession.value,selectedSessionId:selectedSessionId.value,sessions:props.toolbarSessions})),shortSessionId:props.sessionData.shortSessionId});const pageError=computed(()=>String(mounted.detailState.value?.error||(learningScope?readRefOrGetterValue(props.sessionData.learningLoadError):readRefOrGetterValue(props.sessionData.workingLoadError??props.sessionData.sessionList?.loadError))||``));const guardedPage=computed(()=>({busy:Boolean(mounted.detailState.value?.loading),copyText:async(value=``)=>typeof navigator===`undefined`?false:navigator.clipboard?.writeText?.(String(value||``)),error:pageError.value,launchBusy:Boolean(mounted.detailState.value?.loading)}));const interruptFeedback=useUiFeedback({dedupeWindowMs:0,errorChannel:`banner`,source:`vibe64.sessions.agent-turn.interrupt.feedback`});watch([selectedSessionId,()=>props.active,()=>selectedSession.value?.agentSession?.turn?.id,()=>selectedSession.value?.agentSession?.turn?.active],()=>interruptFeedback.success());async function interruptAgentTurn(input=`user_interrupt`){const sessionId=selectedSessionId.value;if(!sessionId)return false;const control=input&&typeof input===`object`&&!Array.isArray(input)?input:{reason:String(input||`user_interrupt`)};const turnId=selectedSession.value?.agentSession?.turn?.id;interruptFeedback.success();try{const result=await conversationRuntime.value.interrupt(control);if(result?.ok===false)throw vibe64ApiError(result,`Assistant turn could not be interrupted.`);refreshSessionData({reason:`agent-turn-interrupted`}).catch(()=>null);return result?.ok!==false}catch(error){const turn=selectedSession.value?.agentSession?.turn;if(props.active&&selectedSessionId.value===sessionId&&turn?.active&&turn.id===turnId)interruptFeedback.error(error,`Assistant turn could not be interrupted.`);refreshSessionData({reason:`agent-turn-interrupt-failed`}).catch(()=>null);return false}}function sendAgentMessage(input={}){return conversationRuntime.value?.sendAgentMessage(input)??false}async function retryWorkspaceSetup(){if(learningScope)return false;const sessionId=selectedSessionId.value;if(!sessionId)return false;const result=await getHttpWebClient().request(vibe64SessionPath(readRefOrGetterValue(props.sessionData.sessionsApiPath),sessionId,`/workspace-setup/retry`),{body:{},method:`POST`});if(result?.ok===false)throw new Error(result.error||`Workspace preparation could not be started.`);await refreshSessionData({reason:`workspace-setup-retry`});return true}async function saveSessionWork({destinationReview,connectedReview}={}){if(learningScope)return false;const sessionId=selectedSessionId.value;if(!sessionId)return false;const result=await getHttpWebClient().request(vibe64SessionPath(readRefOrGetterValue(props.sessionData.sessionsApiPath),sessionId,`/save`),{body:{...vibe64RealtimeOriginPayload(),destinationReview,...connectedReview!==void 0?{connectedReview}:{}},method:`POST`});await Promise.allSettled([refreshSessionData({reason:`session-work-save`}),refreshWorkState()]);if(result?.ok===false&&result?.code===`vibe64_session_save_update_required`)return result;if(result?.ok===false)throw vibe64ApiError(result,`Session work could not be saved.`);return result}async function updateSessionWork({reviewedConflictId=``,historyReview=void 0,requestId=``}={}){if(learningScope)return false;const sessionId=selectedSessionId.value;if(!sessionId)return false;let result;try{result=await getHttpWebClient().request(vibe64SessionPath(readRefOrGetterValue(props.sessionData.sessionsApiPath),sessionId,`/updates/apply`),{body:vibe64RealtimeOriginPayload({reviewedConflictId,...historyReview?{historyReview}:{},...requestId?{requestId}:{}}),method:`POST`})}finally{await Promise.allSettled([refreshSessionData({reason:`session-work-update`}),refreshWorkState()])}if(result?.ok===false)throw vibe64ApiError(result,`This session could not be updated.`);return result}async function cancelAgentMessage(messageId=``){return conversationRuntime.value?.cancelMessage(String(messageId||``).trim())??false}function setAutopilotBusy(busy=false){autopilotAgentThinking.value=Boolean(busy)}function emitToolbarControls(){emit(`toolbar-controls-ready`,{controls:{archive:dialogs.archive},sessionId:selectedSessionId.value})}function emitBusy(){emit(`busy-change`,{agentThinking:activeAgentWorking.value,busy:guardedPage.value.busy,sessionId:selectedSessionId.value})}function emitProjectAttention(){emit(`project-attention`)}function emitChatAttention(){emit(`chat-attention`)}const agentTerminal={sessionUpdate:()=>refreshSessionData()};const selectedAgentTerminalId=computed(()=>String(selectedSession.value?.agentSession?.terminal?.id||selectedSession.value?.agentSession?.terminal?.terminalSessionId||``));onMounted(()=>{emitToolbarControls();emitBusy();emit(`page-error-change`,{error:pageError.value,sessionId:selectedSessionId.value})});watch([activeAgentWorking,()=>guardedPage.value.busy],emitBusy,{flush:`post`});watch(selectedSessionId,()=>{autopilotAgentThinking.value=false},{flush:`sync`});watch(pageError,error=>{emit(`page-error-change`,{error,sessionId:selectedSessionId.value})},{flush:`post`});watch(workState,state=>{emit(`work-state-change`,{sessionId:selectedSessionId.value,workState:{...state}})},{deep:true,flush:`post`,immediate:true});watch(sourceOperationsSuspended,(suspended,wasSuspended)=>{emit(`source-operations-suspension-change`,{sessionId:selectedSessionId.value,suspended:suspended===true});if(wasSuspended===true&&suspended!==true)refreshWorkState()},{flush:`sync`,immediate:true});watch(()=>{return`${selectedSessionId.value}:${selectedSessionArchived.value}:${runtimeHostWorkTaskRevision(selectedSession.value)}`},()=>{const taskState=runtimeHostWorkTaskState(selectedSession.value);if(taskState.operation||taskState.updateOperation)workState.value={...workState.value,...taskState,checkedAt:new Date().toISOString(),error:``,loading:false}},{flush:`post`,immediate:true});watch(()=>{return`${selectedSessionId.value}:${selectedSessionArchived.value}:${runtimeHostWorkInspectionRevision(selectedSession.value)}`},()=>{refreshWorkState()},{flush:`post`,immediate:true});onBeforeUnmount(()=>{interruptFeedback.success();workStateActive=false;workStateRefreshQueue.dispose()});return{agentConnectionError:mounted.agentConnectionError,agentConnectionStatus:mounted.agentConnectionStatus,retryAgentConnection:mounted.retryAgentConnection,agentTerminal,autopilotModeActive:computed(()=>Boolean(props.active)),autopilotSessionToolbar,cancelAgentMessage,codexTerminalCanStart:computed(()=>Boolean(!learningScope&&props.active&&selectedSession.value?.sessionId===selectedSessionId.value)),conversationLog,conversationRuntime,dialogs,emitChatAttention,emitProjectAttention,guardedPage,interruptAgentTurn,refreshSessionData,refreshWorkState,retryWorkspaceSetup,runtimeProjectContext,sessionRenewal:dialogs.renewal,saveSessionWork,sessionsApiPath,sourceWorkspaceAvailable:computed(()=>!learningScope),outputWorkspaceAvailable:computed(()=>!learningScope||learningScope.noExercise===false),learningAttemptId:learningScope?.learningAttemptId||``,selectedAgentTerminalId,selection,sendAgentMessage,setAutopilotBusy,updateSessionWork,workState}}var _hoisted_1$8=[`data-vibe64-agent-turn-active`,`data-vibe64-session-runtime-id`];var _sfc_main$8={__name:`Vibe64SessionRuntimeHost`,props:{lessonsAvailable:Boolean,learningView:{default:`workspace`,type:String},workspacePurpose:{default:``,type:String},refreshRepositoryState:{default:null,type:Function},createSessionTeleportTarget:{default:``,type:String},active:{default:false,type:Boolean},chatCollapsed:{default:false,type:Boolean},githubActorTeleportTarget:{default:``,type:String},sessionData:{required:true,type:Object},sessionId:{required:true,type:String},toolbarSessions:{default:null,type:Array},projectPane:{default:`preview`,type:String},previewToolbarTeleportTarget:{default:``,type:String},promptHintPolicy:{default:()=>({enabled:true,ready:false,revision:0,version:0}),type:Object},projectContext:{default:()=>({}),type:Object}},emits:[`busy-change`,`chat-attention`,`execution-attention`,`page-error-change`,`source-operations-suspension-change`,`work-state-change`,`toolbar-controls-ready`,`project-attention`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const{agentConnectionError,agentConnectionStatus,retryAgentConnection,autopilotModeActive,autopilotSessionToolbar,agentTerminal,cancelAgentMessage,codexTerminalCanStart,conversationLog,conversationRuntime,dialogs,emitChatAttention,emitProjectAttention,guardedPage,interruptAgentTurn,refreshSessionData,refreshWorkState,retryWorkspaceSetup,runtimeProjectContext,saveSessionWork,sessionsApiPath,sourceWorkspaceAvailable,outputWorkspaceAvailable,learningAttemptId,sessionRenewal,selectedAgentTerminalId,selection,setAutopilotBusy,sendAgentMessage,updateSessionWork,workState}=useVibe64SessionRuntimeHost(props,emit);const selectedAssistantEngineId=computed(()=>String(selection.selectedSession?.assistantSelection?.engineId||``));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`studio-ai-session-runtime`,"data-vibe64-agent-turn-active":unref(selection).selectedSession?.agentSession?.turn?.active===true?`true`:`false`,"data-vibe64-session-runtime-id":props.sessionId},[createVNode(Vibe64AutopilotView_default,{"source-workspace-available":unref(sourceWorkspaceAvailable),"output-workspace-available":unref(outputWorkspaceAvailable),"lessons-available":props.lessonsAvailable,"learning-view":props.learningView,"learning-attempt-id":unref(learningAttemptId),active:unref(autopilotModeActive),"hidden-by-workspace-mode":Boolean(props.workspacePurpose&&unref(selection).selectedSession&&!unref(vibe64SessionMatchesPurpose)(unref(selection).selectedSession,props.workspacePurpose)),"agent-connection-error":unref(agentConnectionError),"agent-connection-status":unref(agentConnectionStatus),"retry-agent-connection":unref(retryAgentConnection),"chat-collapsed":props.chatCollapsed,"create-session-teleport-target":props.createSessionTeleportTarget,"cancel-agent-message":unref(cancelAgentMessage),"conversation-log":unref(conversationLog),"conversation-runtime":unref(conversationRuntime),"github-actor-teleport-target":props.githubActorTeleportTarget,"interrupt-agent-turn":unref(interruptAgentTurn),page:unref(guardedPage),"project-context":unref(runtimeProjectContext),"preview-toolbar-teleport-target":props.previewToolbarTeleportTarget,"prompt-hint-policy":props.promptHintPolicy,"refresh-session-data":unref(refreshSessionData),"refresh-session-work":unref(refreshWorkState),"retry-workspace-setup":unref(retryWorkspaceSetup),"save-session-work":unref(saveSessionWork),"session-archive":unref(dialogs).archive,"session-renewal":unref(sessionRenewal),session:unref(selection).selectedSession,"sessions-api-path":unref(sessionsApiPath),"session-selection-archived":unref(selection).isArchived,"session-toolbar":unref(autopilotSessionToolbar),"send-agent-message":unref(sendAgentMessage),"update-session-work":unref(updateSessionWork),"work-state":unref(workState),"project-pane":props.projectPane,onBusyChange:unref(setAutopilotBusy),onChatAttention:unref(emitChatAttention),onExecutionAttention:_cache[0]||(_cache[0]=$event=>emit(`execution-attention`,$event)),onProjectAttention:unref(emitProjectAttention)},{"ai-terminal":withCtx(({active:tabActive})=>[unref(sourceWorkspaceAvailable)&&selectedAssistantEngineId.value===`codex`?(openBlock(),createBlock(Vibe64CodexSession_default,{key:0,class:`studio-ai-sessions__tab-terminal`,"allow-start":tabActive&&unref(codexTerminalCanStart),"display-mode":tabActive?`full`:`headless`,"listen-when-hidden":!tabActive&&Boolean(unref(selectedAgentTerminalId)),"read-only":!tabActive,scope:`session`,session:unref(selection).selectedSession,terminal:null,visible:tabActive,onSessionUpdate:unref(agentTerminal).sessionUpdate},null,8,[`allow-start`,`display-mode`,`listen-when-hidden`,`read-only`,`session`,`visible`,`onSessionUpdate`])):unref(sourceWorkspaceAvailable)&&[`claude`,`opencode`].includes(selectedAssistantEngineId.value)?(openBlock(),createBlock(Vibe64NativeAgentSession_default,{key:1,class:`studio-ai-sessions__tab-terminal`,"allow-start":tabActive,"display-mode":tabActive?`full`:`headless`,"listen-when-hidden":!tabActive&&Boolean(unref(selectedAgentTerminalId)),"read-only":!tabActive,session:unref(selection).selectedSession,visible:tabActive,onSessionUpdate:unref(agentTerminal).sessionUpdate},null,8,[`allow-start`,`display-mode`,`listen-when-hidden`,`read-only`,`session`,`visible`,`onSessionUpdate`])):createCommentVNode(``,true)]),dashboard:withCtx(dashboardSlotProps=>[renderSlot(_ctx.$slots,`dashboard`,{dashboardContext:{...dashboardSlotProps?.dashboardContext||{},sessions:props.toolbarSessions??unref(autopilotSessionToolbar).sessions}},void 0,true)]),learning:withCtx(learningSlotProps=>[renderSlot(_ctx.$slots,`learning`,normalizeProps(guardReactiveProps(learningSlotProps||{})),void 0,true)]),_:3},8,[`source-workspace-available`,`output-workspace-available`,`lessons-available`,`learning-view`,`learning-attempt-id`,`active`,`hidden-by-workspace-mode`,`agent-connection-error`,`agent-connection-status`,`retry-agent-connection`,`chat-collapsed`,`create-session-teleport-target`,`cancel-agent-message`,`conversation-log`,`conversation-runtime`,`github-actor-teleport-target`,`interrupt-agent-turn`,`page`,`project-context`,`preview-toolbar-teleport-target`,`prompt-hint-policy`,`refresh-session-data`,`refresh-session-work`,`retry-workspace-setup`,`save-session-work`,`session-archive`,`session-renewal`,`session`,`sessions-api-path`,`session-selection-archived`,`session-toolbar`,`send-agent-message`,`update-session-work`,`work-state`,`project-pane`,`onBusyChange`,`onChatAttention`,`onProjectAttention`]),createVNode(Vibe64SessionRenewalDialog_default,{renewal:unref(dialogs).renewal},null,8,[`renewal`])],8,_hoisted_1$8)}}};var Vibe64SessionRuntimeHost_default=_plugin_vue_export_helper_default(_sfc_main$8,[[`__scopeId`,`data-v-d9417d33`]]);var VIBE64_CHAT_COLUMN_STORAGE_KEY=`vibe64:studio-chat-column-width`;var VIBE64_CHAT_COLUMN_DEFAULT_WIDTH_PX=512;var VIBE64_CHAT_COLUMN_MIN_WIDTH_PX=320;var VIBE64_CHAT_COLUMN_MAX_WIDTH_PX=720;var VIBE64_PROJECT_COLUMN_MIN_WIDTH_PX=480;var VIBE64_PROJECT_COLUMN_GAP_PX=12;var VIBE64_CHAT_COLUMN_KEYBOARD_STEP_PX=16;var staticChatColumnBounds=Object.freeze({max:720,min:320});function vibe64ChatColumnBounds(containerWidth=0){const width=Number(containerWidth);if(!Number.isFinite(width)||width<=0)return{...staticChatColumnBounds};return{max:Math.max(320,Math.min(720,Math.floor(width-VIBE64_PROJECT_COLUMN_MIN_WIDTH_PX-VIBE64_PROJECT_COLUMN_GAP_PX))),min:320}}function constrainVibe64ChatColumnWidth(value,bounds=staticChatColumnBounds,fallback=512){const min=Number.isFinite(bounds?.min)?bounds.min:320;const max=Math.max(min,Number.isFinite(bounds?.max)?bounds.max:720);return Math.round(Math.min(max,Math.max(min,Number.isFinite(value)?value:fallback)))}function vibe64ChatColumnWidthForKey(key=``,currentWidth=0,bounds={}){if(key===`Home`)return constrainVibe64ChatColumnWidth(bounds.min,bounds);if(key===`End`)return constrainVibe64ChatColumnWidth(bounds.max,bounds);if(key===`ArrowLeft`)return constrainVibe64ChatColumnWidth(currentWidth-VIBE64_CHAT_COLUMN_KEYBOARD_STEP_PX,bounds);if(key===`ArrowRight`)return constrainVibe64ChatColumnWidth(currentWidth+VIBE64_CHAT_COLUMN_KEYBOARD_STEP_PX,bounds);return null}function useVibe64ChatColumnResize(){const separator=ref(null);const resizing=ref(false);const preferredWidth=ref(constrainVibe64ChatColumnWidth(readLocalStorageJson(VIBE64_CHAT_COLUMN_STORAGE_KEY,null),staticChatColumnBounds));const bounds=ref({...staticChatColumnBounds});const width=computed(()=>constrainVibe64ChatColumnWidth(preferredWidth.value,bounds.value));let drag=null;let pendingLayoutWidth=null;let resizeFrame=null;let resizeObserver=null;let windowResizeFallbackActive=false;function splitPane(){return separator.value?.parentElement||null}function syncBounds(){const containerWidth=splitPane()?.clientWidth||0;if(containerWidth>0)bounds.value=vibe64ChatColumnBounds(containerWidth)}function save(){writeLocalStorageJson(VIBE64_CHAT_COLUMN_STORAGE_KEY,width.value)}function layoutTargets(){if(typeof document===`undefined`)return[];return[splitPane(),document.querySelector(`.studio-home-shell-heading`)].filter(Boolean)}function applyLayoutWidth(value){for(const target of layoutTargets())target.style.setProperty(`--studio-home-chat-column-width`,`${value}px`);separator.value?.setAttribute?.(`aria-valuenow`,String(value))}function flushLayoutWidth(){resizeFrame=null;if(pendingLayoutWidth===null)return;const value=pendingLayoutWidth;pendingLayoutWidth=null;applyLayoutWidth(value)}function scheduleLayoutWidth(value){pendingLayoutWidth=value;if(resizeFrame!==null||typeof window===`undefined`||typeof window.requestAnimationFrame!==`function`){if(resizeFrame===null)flushLayoutWidth();return}resizeFrame=window.requestAnimationFrame(flushLayoutWidth)}function cancelScheduledLayout(){if(resizeFrame!==null&&typeof window!==`undefined`&&typeof window.cancelAnimationFrame===`function`)window.cancelAnimationFrame(resizeFrame);resizeFrame=null;pendingLayoutWidth=null}function stopResize(event){if(event?.pointerId!==void 0&&drag?.pointerId!==void 0&&event.pointerId!==drag.pointerId)return;const completedDrag=drag;drag=null;resizing.value=false;if(typeof window!==`undefined`){window.removeEventListener(`pointermove`,moveResize);window.removeEventListener(`pointerup`,stopResize);window.removeEventListener(`pointercancel`,stopResize)}if(!completedDrag)return;if(completedDrag.target?.hasPointerCapture?.(completedDrag.pointerId))completedDrag.target.releasePointerCapture(completedDrag.pointerId);cancelScheduledLayout();preferredWidth.value=completedDrag.width;applyLayoutWidth(width.value);save()}function moveResize(event){if(!drag||event.pointerId!==drag.pointerId)return;drag.width=constrainVibe64ChatColumnWidth(drag.startWidth+event.clientX-drag.startX,bounds.value);scheduleLayoutWidth(drag.width)}function startResize(event){if(event.button!==0||typeof window===`undefined`)return;event.preventDefault();syncBounds();drag={pointerId:event.pointerId,startWidth:width.value,startX:event.clientX,target:event.currentTarget,width:width.value};resizing.value=true;event.currentTarget?.setPointerCapture?.(event.pointerId);window.addEventListener(`pointermove`,moveResize);window.addEventListener(`pointerup`,stopResize);window.addEventListener(`pointercancel`,stopResize)}function resizeWithKeyboard(event){syncBounds();const nextWidth=vibe64ChatColumnWidthForKey(event.key,width.value,bounds.value);if(nextWidth===null)return;event.preventDefault();preferredWidth.value=nextWidth;save()}function observeSplitPane(){const pane=splitPane();if(!pane)return;if(typeof ResizeObserver===`undefined`){if(typeof window!==`undefined`){windowResizeFallbackActive=true;window.addEventListener(`resize`,syncBounds)}return}resizeObserver=new ResizeObserver(syncBounds);resizeObserver.observe(pane)}watch(width,applyLayoutWidth,{immediate:true});onMounted(async()=>{await nextTick();syncBounds();applyLayoutWidth(width.value);observeSplitPane()});onBeforeUnmount(()=>{stopResize();cancelScheduledLayout();resizeObserver?.disconnect?.();resizeObserver=null;if(windowResizeFallbackActive&&typeof window!==`undefined`)window.removeEventListener(`resize`,syncBounds);windowResizeFallbackActive=false;for(const target of layoutTargets())target.style.removeProperty(`--studio-home-chat-column-width`)});return{bounds,resizing,resizeWithKeyboard,separator,startResize,width}}var DEFAULT_MAX_CONCURRENCY=2;var DEFAULT_STALE_AFTER_MS=3e5;var DEFAULT_STALE_CHECK_INTERVAL_MS=6e4;var DEFAULT_CANONICAL_CHECK_INTERVAL_MS=3e5;function createVibe64SessionRepositoryStatusQueue({maxConcurrency=DEFAULT_MAX_CONCURRENCY,now=()=>Date.now(),onState=()=>null,requestWork,staleAfterMs=DEFAULT_STALE_AFTER_MS}={}){if(typeof requestWork!==`function`)throw new TypeError(`Session repository status requires a work inspector.`);const concurrency=Math.max(1,Number(maxConcurrency||0));const records=new Map;const pending=new Map;const activeSessions=new Set;const canonicalUpdatePending=new Map;const refreshAfterActive=new Set;const waiters=new Set;let active=0;let disposed=false;function settled(){if(active||pending.size)return;for(const resolve of waiters)resolve();waiters.clear()}function observe(sessionId=``,workState=null){const id=String(sessionId||``).trim();if(!id)return;const state=workState&&typeof workState===`object`?{...workState}:{};if(canonicalUpdatePending.has(id)){const expectedCommit=canonicalUpdatePending.get(id);if(expectedCommit&&state.canonicalCommit===expectedCommit&&state.updateStatusPending!==true)canonicalUpdatePending.delete(id);else{state.updateAvailable=true;state.updateStatusPending=true}}const checkedAt=String(state.checkedAt||``).trim();records.set(id,{checkedAtMs:checkedAt?Date.parse(checkedAt)||now():now(),workState:state});onState({sessionId:id,workState:state})}function markUpdatePending(sessionId=``,canonicalCommit=``){const id=String(sessionId||``).trim();if(!id)return;const prior=records.get(id)?.workState||{};canonicalUpdatePending.set(id,String(canonicalCommit||``).trim());observe(id,{...prior,checkedAt:``,error:``,loading:false,updateAvailable:true,updateStatusPending:true})}function confirmCanonical(sessionId=``,{canonicalCommit=``,updateAvailable=false}={}){const id=String(sessionId||``).trim();const commit=String(canonicalCommit||``).trim();const expectedCommit=canonicalUpdatePending.get(id);if(updateAvailable&&(!expectedCommit||expectedCommit===commit))markUpdatePending(id,commit);else if(expectedCommit===``)canonicalUpdatePending.set(id,commit)}function markCanonicalCheckUnavailable(sessionId=``,error=``){const id=String(sessionId||``).trim();if(!id)return;observe(id,{...records.get(id)?.workState||{},checkedAt:new Date(now()).toISOString(),error:String(error||`Repository update status is unavailable.`),loading:false})}function fresh(sessionId){const checkedAtMs=records.get(sessionId)?.checkedAtMs||0;return checkedAtMs>0&&now()-checkedAtMs<staleAfterMs}async function inspect(sessionId){active+=1;activeSessions.add(sessionId);if(!(records.get(sessionId)?.workState||null))observe(sessionId,{checkedAt:``,error:``,loading:true,operation:null,unsaved:null});try{const result=await requestWork(sessionId);if(disposed)return;if(result?.ok===false)throw new Error(String(result?.message||result?.error||`Session work could not be inspected.`));observe(sessionId,{...result,checkedAt:new Date(now()).toISOString(),error:``,loading:false})}catch(error){if(disposed)return;observe(sessionId,{checkedAt:new Date(now()).toISOString(),error:error instanceof Error?error.message:String(error||`Session work could not be inspected.`),loading:false,operation:null,unsaved:null})}finally{active-=1;activeSessions.delete(sessionId);if(refreshAfterActive.delete(sessionId)&&!disposed)pending.set(sessionId,true);drain();settled()}}function drain(){if(disposed){pending.clear();settled();return}while(active<concurrency&&pending.size){const[sessionId]=pending.entries().next().value;pending.delete(sessionId);inspect(sessionId)}}function enqueue(sessionIds=[],{force=false}={}){for(const rawSessionId of sessionIds){const sessionId=String(rawSessionId||``).trim();if(!sessionId||pending.has(sessionId)||!force&&fresh(sessionId))continue;if(activeSessions.has(sessionId)){if(force)refreshAfterActive.add(sessionId);continue}pending.set(sessionId,true)}drain()}function removeExcept(sessionIds=[]){const retained=new Set(sessionIds.map(sessionId=>String(sessionId||``).trim()).filter(Boolean));for(const sessionId of records.keys())if(!retained.has(sessionId)){records.delete(sessionId);pending.delete(sessionId);refreshAfterActive.delete(sessionId);canonicalUpdatePending.delete(sessionId)}}function dispose(){disposed=true;pending.clear();refreshAfterActive.clear();canonicalUpdatePending.clear();settled()}function waitForIdle(){if(!active&&!pending.size)return Promise.resolve();return new Promise(resolve=>waiters.add(resolve))}return{dispose,confirmCanonical,enqueue,markCanonicalCheckUnavailable,markUpdatePending,observe,removeExcept,waitForIdle}}function useVibe64SessionRepositoryStatusRegistry({maxVisibleSessions=3,onState=()=>null,selectedSessionId,sessionSourceOperationsSuspended=()=>false,sessions,sessionsApiPath}={}){const visibleSessions=computed(()=>visibleVibe64ToolbarSessions({limit:maxVisibleSessions,selectedSessionId:readRefOrGetterValue(selectedSessionId),sessions:readRefOrGetterValue(sessions)||[]}));const visibleSessionIds=computed(()=>visibleSessions.value.map(session=>String(session?.sessionId||``).trim()).filter(Boolean));const selectedId=computed(()=>String(readRefOrGetterValue(selectedSessionId)||``).trim());const apiPath=computed(()=>String(readRefOrGetterValue(sessionsApiPath)||``).trim());const suspendedVisibleSessionIds=computed(()=>visibleSessionIds.value.filter(sessionId=>sessionSourceOperationsSuspended(sessionId)===true));const canonicalChecks=new Map;const canonicalCheckedAt=new Map;const canonicalAccessRevisions=new Map;const forcedCanonicalFollowups=new Set;let disposed=false;function sourceOperationsSuspended(sessionId=``){const id=String(sessionId||``).trim();return Boolean(id&&sessionSourceOperationsSuspended(id)===true)}function canonicalAccessRevision(sessionId=``){return Number(canonicalAccessRevisions.get(sessionId)||0)}function advanceCanonicalAccessRevision(sessionId=``){const id=String(sessionId||``).trim();if(!id)return 0;const revision=canonicalAccessRevision(id)+1;canonicalAccessRevisions.set(id,revision);return revision}const queue=createVibe64SessionRepositoryStatusQueue({onState,async requestWork(sessionId){return getHttpWebClient().request(vibe64SessionPath(apiPath.value,sessionId,`/work`),{method:`GET`,timeoutMs:12e4})}});function inspectVisible({force=false,includeSelected=false,sessionId=``}={}){if(!apiPath.value)return;const requestedId=String(sessionId||``).trim();const ids=visibleSessionIds.value.filter(id=>!sourceOperationsSuspended(id)&&(includeSelected||id!==selectedId.value)&&(!requestedId||id===requestedId));queue.enqueue(ids,{force})}function observeCanonicalCheck(sessionId,result){if(forcedCanonicalFollowups.has(sessionId))return;const checkedAt=String(result.checkedAt||``);if(checkedAt&&checkedAt<=(canonicalCheckedAt.get(sessionId)||``))return;if(checkedAt)canonicalCheckedAt.set(sessionId,checkedAt);queue.confirmCanonical(sessionId,result);inspectVisible({force:true,includeSelected:true,sessionId})}async function checkCanonical(sessionId=``,{force=false}={}){const id=String(sessionId||``).trim();if(disposed||!id||!apiPath.value||sourceOperationsSuspended(id))return null;const accessRevision=canonicalAccessRevision(id);if(canonicalChecks.has(id)){const active=canonicalChecks.get(id);if(active.accessRevision===accessRevision){if(force)forcedCanonicalFollowups.add(id);return active.promise}}let request;const requestIsCurrent=()=>Boolean(!disposed&&!sourceOperationsSuspended(id)&&canonicalAccessRevision(id)===accessRevision&&canonicalChecks.get(id)?.promise===request);request=getHttpWebClient().request(vibe64SessionCheckUpdatesPath(apiPath.value,id),{body:{force},method:`POST`}).then(result=>{if(!requestIsCurrent())return null;if(result?.ok===false)throw new Error(String(result?.message||result?.error||`Repository update status is unavailable.`));observeCanonicalCheck(id,result);return result}).catch(error=>{if(requestIsCurrent())queue.markCanonicalCheckUnavailable(id,error instanceof Error?error.message:String(error||`Repository update status is unavailable.`));return null}).finally(()=>{if(canonicalChecks.get(id)?.promise!==request)return;canonicalChecks.delete(id);if(!disposed&&!sourceOperationsSuspended(id)&&forcedCanonicalFollowups.delete(id))return checkCanonical(id,{force:true})});canonicalChecks.set(id,{accessRevision,promise:request});return request}async function refresh(sessionId){await checkCanonical(sessionId,{force:true});await queue.waitForIdle()}watch(()=>[apiPath.value,selectedId.value,...visibleSessionIds.value],()=>{queue.removeExcept(visibleSessionIds.value);for(const id of canonicalCheckedAt.keys())if(!visibleSessionIds.value.includes(id))canonicalCheckedAt.delete(id);inspectVisible();if(!canonicalCheckedAt.has(selectedId.value))checkCanonical(selectedId.value)},{immediate:true});let priorSuspendedSessionIds=new Set;watch(suspendedVisibleSessionIds,sessionIds=>{const nextSuspendedSessionIds=new Set(sessionIds);for(const sessionId of new Set([...priorSuspendedSessionIds,...nextSuspendedSessionIds])){const wasSuspended=priorSuspendedSessionIds.has(sessionId);const suspended=nextSuspendedSessionIds.has(sessionId);if(wasSuspended===suspended)continue;advanceCanonicalAccessRevision(sessionId);forcedCanonicalFollowups.delete(sessionId);if(!suspended&&visibleSessionIds.value.includes(sessionId))checkCanonical(sessionId,{force:true})}priorSuspendedSessionIds=nextSuspendedSessionIds},{flush:`sync`,immediate:true});useRealtimeEvent({enabled:computed(()=>visibleSessionIds.value.length>0),event:VIBE64_SESSION_CHANGED_EVENT,matches:({payload={}}={})=>Boolean(visibleSessionIds.value.includes(repositoryStatusSessionId(payload))&&!sourceOperationsSuspended(repositoryStatusSessionId(payload))&&repositoryStatusRealtimeShouldRefresh(payload)),onEvent:({payload={}}={})=>{const sessionId=repositoryStatusSessionId(payload);if(sourceOperationsSuspended(sessionId))return;if(payload.reason===`session-pull-request`){advanceCanonicalAccessRevision(sessionId);canonicalCheckedAt.delete(sessionId)}if(payload.reason===`session-repository-checked`){observeCanonicalCheck(sessionId,payload.repositoryUpdateCheck);return}inspectVisible({force:true,includeSelected:true,sessionId});if(repositoryStatusRealtimeNeedsCanonicalCheck(payload)){queue.markUpdatePending(sessionId,payload.canonicalCommit);checkCanonical(sessionId,{force:true})}}});useRealtimeEvent({enabled:computed(()=>visibleSessionIds.value.length>0),event:VIBE64_SOURCE_EDITOR_FILE_CHANGED_EVENT,matches:({payload={}}={})=>visibleSessionIds.value.includes(repositoryStatusSessionId(payload))&&!sourceOperationsSuspended(repositoryStatusSessionId(payload)),onEvent:({payload={}}={})=>inspectVisible({force:true,includeSelected:true,sessionId:repositoryStatusSessionId(payload)})});const browserDocument=typeof document===`undefined`?null:document;const interval=typeof window===`undefined`?null:window.setInterval(()=>{if(browserDocument?.visibilityState===`hidden`)return;inspectVisible()},DEFAULT_STALE_CHECK_INTERVAL_MS);const canonicalInterval=typeof window===`undefined`?null:window.setInterval(()=>{if(browserDocument?.visibilityState===`hidden`)return;checkCanonical(selectedId.value)},DEFAULT_CANONICAL_CHECK_INTERVAL_MS);const refreshWhenVisible=()=>{if(browserDocument?.visibilityState!==`visible`)return;inspectVisible({force:true});checkCanonical(selectedId.value)};browserDocument?.addEventListener(`visibilitychange`,refreshWhenVisible);onScopeDispose(()=>{disposed=true;browserDocument?.removeEventListener(`visibilitychange`,refreshWhenVisible);if(interval!==null)window.clearInterval(interval);if(canonicalInterval!==null)window.clearInterval(canonicalInterval);canonicalChecks.clear();canonicalCheckedAt.clear();canonicalAccessRevisions.clear();forcedCanonicalFollowups.clear();queue.dispose()});return{inspectVisible,observe:queue.observe,refresh,visibleSessionIds}}var vibe64SessionPanelEmits=[`chat-attention`,`execution-attention`,`title-change`,`project-attention`];var vibe64SessionPanelProps={active:{default:true,type:Boolean},learningResource:{default:null,type:Object},learningView:{default:`workspace`,type:String,validator:value=>[`workspace`,`learning`].includes(value)},purposeFilter:{default:``,type:String,validator:value=>[``,`working`,`learning`].includes(value)},createSessionTeleportTarget:{default:``,type:String},chatCollapsed:{default:false,type:Boolean},githubActorTeleportTarget:{default:``,type:String},projectContext:{default:()=>({}),type:Object},projectPane:{default:``,type:String},previewToolbarTeleportTarget:{default:``,type:String}};function useVibe64SessionPanel(props,emit){const route=useRoute();const projectSlug=useVibe64ProjectSlug();const fallbackArchive={command:{isRunning:false},request:()=>null};const dismissedPageError=ref(``);const mountedRuntimeSessionIds=ref([]);const runtimeStateBySessionId=reactive({});const sessionData=useVibe64SessionData({learningResource:()=>props.learningResource,purposeFilter:()=>props.purposeFilter,onTitleChange(title){emit(`title-change`,title)}});const projectSettingsKey=computed(()=>projectSettingsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value));const projectSettings=useEndpointResource({enabled:computed(()=>Boolean(projectSlug.value)),fallbackLoadError:`Project settings could not load.`,path:computed(()=>scopedDevelopmentApiUrl(PROJECT_SETTINGS_ENDPOINT,projectSlug.value)),queryKey:projectSettingsKey,realtime:{event:VIBE64_PROJECT_CHANGED_EVENT,queryKey:computed(()=>projectSettingsKey.value.slice(0,-1))},refreshOnPull:true,requestRecoveryLabel:`Project settings`});const promptHintPolicy=computed(()=>{const promptHints=projectSettings.data.value?.promptHints;return{enabled:promptHints?.enabled!==false,ready:Boolean(promptHints&&!projectSettings.loadError.value)}});const canonicalSelection=proxyRefs({isArchived:sessionData.isSelectedSessionArchived,selectedSession:sessionData.selectedSession,selectedSessionId:sessionData.selectedSessionId});const selectedPurposeVisible=computed(()=>vibe64SessionMatchesPurpose(canonicalSelection.selectedSession||(sessionData.sessions.value||[]).find(session=>session.sessionId===canonicalSelection.selectedSessionId),props.purposeFilter));const selection=proxyRefs({isArchived:computed(()=>selectedPurposeVisible.value&&canonicalSelection.isArchived),selectedSession:computed(()=>selectedPurposeVisible.value?canonicalSelection.selectedSession:null),selectedSessionId:computed(()=>selectedPurposeVisible.value?canonicalSelection.selectedSessionId:``)});let repositoryStatusRegistry={observe:()=>null};repositoryStatusRegistry=useVibe64SessionRepositoryStatusRegistry({onState:applyRuntimeWorkState,selectedSessionId:()=>canonicalSelection.selectedSessionId,sessionSourceOperationsSuspended:sessionId=>(sessionData.sessions.value||[]).some(session=>session.sessionId===sessionId&&session.purpose===`learning`)||runtimeStateBySessionId[sessionId]?.sourceOperationsSuspended===true,sessions:sessionData.sessions,sessionsApiPath:sessionData.sessionsApiPath});const canonicalToolbarSessions=computed(()=>sessionPanelToolbarSessions({runtimeStateBySessionId,selectedSession:canonicalSelection.selectedSession,selectedSessionId:canonicalSelection.selectedSessionId,sessions:sessionData.sessions.value||[]}));const toolbarSessions=computed(()=>canonicalToolbarSessions.value.filter(session=>vibe64SessionMatchesPurpose(session,props.purposeFilter)));const toolbar=proxyRefs({sessionsApiPath:sessionData.selectedSessionsApiPath||sessionData.sessionsApiPath,workingSessionsApiPath:sessionData.sessionsApiPath,refreshSessionData:sessionData.refreshSessionData,refreshRepositoryState:repositoryStatusRegistry.refresh,canCreateSession:sessionData.canCreateSession,createSession:sessionData.createSession,createSessionCommand:sessionData.createSessionCommand,createSessionRunning:sessionData.createSessionRunning,createSessionVisible:sessionData.createSessionVisible,createSessionTitle:sessionData.createSessionTitle,selectSession:sessionData.selectSessionId,sessions:toolbarSessions,shortSessionId:sessionData.shortSessionId});const projectPane=computed(()=>normalizeProjectPane(props.projectPane||route.query.pane));const chatCollapsed=computed(()=>Boolean(props.chatCollapsed));const dashboardProjectActive=computed(()=>projectPane.value===`dashboard`);const emptyDashboardContext=computed(()=>sessionPanelDashboardContext(props.projectContext,sessionData.sessionsApiPath));const emptyBlockedReason=computed(()=>String(!toolbar.canCreateSession&&toolbar.createSessionTitle?toolbar.createSessionTitle:``).trim());const selectedRuntimeState=computed(()=>runtimeStateBySessionId[selection.selectedSessionId]||null);const sessionLoadError=computed(()=>Boolean(sessionData.sessionList.loadError));const workingSessionLoadError=computed(()=>Boolean(unref(sessionData.workingLoadError??sessionData.sessionList.loadError)));const runtimeHostSessionIds=computed(()=>{const visibleSessionIds=new Set(canonicalToolbarSessions.value.filter(session=>!session.archiving).map(session=>session.sessionId));if(canonicalSelection.selectedSessionId)visibleSessionIds.add(canonicalSelection.selectedSessionId);if(workingSessionLoadError.value){for(const mountedSessionId of mountedRuntimeSessionIds.value)if(!props.learningResource||runtimeStateBySessionId[mountedSessionId]?.purpose!==`learning`)visibleSessionIds.add(mountedSessionId)}const archivingIds=new Set(canonicalToolbarSessions.value.filter(session=>session.archiving).map(session=>session.sessionId));return mountedRuntimeSessionIds.value.filter(sessionId=>visibleSessionIds.has(sessionId)&&!archivingIds.has(sessionId))});const emptyStateActivity=computed(()=>sessionPanelEmptyStateActivity({createSessionRunning:sessionData.createSessionRunning.value,selectedSession:selection.selectedSession,sessionListInitialLoading:sessionData.sessionList.isInitialLoading}));const emptyStateLoading=computed(()=>Boolean(emptyStateActivity.value));const emptyStateInitialLoading=computed(()=>emptyStateActivity.value===`loading`);const emptyStateStatusText=computed(()=>emptyStateActivity.value===`creating`?`Creating session.`:`Loading sessions.`);const emptyChatHintText=computed(()=>{if(emptyStateActivity.value===`creating`)return`Creating session.`;if(emptyStateActivity.value===`loading`)return`Loading sessions.`;return emptyBlockedReason.value||`Use the + button to start a session.`});const emptyPreviewTitleText=computed(()=>{if(emptyStateActivity.value===`creating`)return`Creating session.`;return emptyStateLoading.value?`Loading session.`:`Create a session to start preview.`});const emptyPreviewDetailText=computed(()=>{if(emptyStateLoading.value)return``;return emptyBlockedReason.value});const emptyCreateAttention=computed(()=>Boolean(!emptyStateLoading.value&&toolbar.canCreateSession&&(toolbar.sessions||[]).length<1));const emptyLayoutVisible=computed(()=>!selection.selectedSession);const selectedArchive=computed(()=>sessionData.archive||fallbackArchive);const selectedSessionArchiving=computed(()=>sessionPanelSelectedSessionArchiving({archive:selectedArchive.value,selectedSessionId:selection.selectedSessionId}));const rawPageError=computed(()=>blockingVibe64SessionPageError({hasMountedRuntime:runtimeHostSessionIds.value.length>0,runtimePageError:selectedRuntimeState.value?.pageError,selectedSession:selection.selectedSession,selectedSessionLoadError:``,sessionListLoadError:sessionData.sessionList.loadError,sessions:toolbar.sessions||[]}));const pageError=computed(()=>sessionPanelPageErrorMessage(rawPageError.value));const visiblePageError=computed(()=>Boolean(pageError.value&&dismissedPageError.value!==pageError.value));const runtimeHostDiagnostics=computed(()=>sessionPanelRuntimeHostDiagnostics({mountedRuntimeSessionIds:mountedRuntimeSessionIds.value,runtimeHostSessionIds:runtimeHostSessionIds.value,runtimeStateBySessionId,selectedSessionId:canonicalSelection.selectedSessionId,sessionLoadError:sessionLoadError.value,sessions:canonicalToolbarSessions.value}));watch(sessionData.sessions,(sessions=[])=>{if(workingSessionLoadError.value&&!props.learningResource){if(canonicalSelection.selectedSessionId)ensureRuntimeHost(canonicalSelection.selectedSessionId);return}const visibleSessionIds=new Set(sessions.map(session=>session.sessionId));if(workingSessionLoadError.value){for(const mountedSessionId of mountedRuntimeSessionIds.value)if(runtimeStateBySessionId[mountedSessionId]?.purpose!==`learning`)visibleSessionIds.add(mountedSessionId)}mountedRuntimeSessionIds.value=mountedRuntimeSessionIds.value.filter(sessionId=>visibleSessionIds.has(sessionId));for(const sessionId of Object.keys(runtimeStateBySessionId))if(!visibleSessionIds.has(sessionId))delete runtimeStateBySessionId[sessionId];if(canonicalSelection.selectedSessionId)ensureRuntimeHost(canonicalSelection.selectedSessionId)});watch(()=>[canonicalSelection.selectedSessionId,canonicalSelection.selectedSessionId?`selected`:`empty`].join(`|`),()=>{if(canonicalSelection.selectedSessionId)ensureRuntimeHost(canonicalSelection.selectedSessionId)},{immediate:true});watch(pageError,error=>{if(!error)dismissedPageError.value=``});watch(runtimeHostDiagnostics,diagnostics=>{vibe64SessionDebugLog(`client.sessionPanel.runtimeHosts.changed`,diagnostics)},{immediate:true});return{chatCollapsed,dashboardProjectActive,dismissPageError,emitChatAttention,emitProjectAttention,emptyChatHintText,emptyCreateAttention,emptyDashboardContext,emptyLayoutVisible,emptyPreviewDetailText,emptyPreviewTitleText,emptyStateInitialLoading,emptyStateLoading,emptyStateStatusText,pageError,promptHintPolicy,projectPane,runtimeHostSessionIds,selectedArchive,selectedSessionArchiving,selection,sessionData,setRuntimeBusy,setRuntimePageError,setRuntimeSourceOperationsSuspended,setRuntimeWorkState,setRuntimeToolbarControls,toolbar,visiblePageError};function emitProjectAttention(){emit(`project-attention`)}function emitChatAttention(){emit(`chat-attention`)}function dismissPageError(){dismissedPageError.value=String(pageError.value||``)}function ensureRuntimeState(sessionId=``){const key=String(sessionId||``);if(!key)return null;if(!runtimeStateBySessionId[key])runtimeStateBySessionId[key]={purpose:(sessionData.sessions.value||[]).find(session=>session.sessionId===key)?.purpose||`working`,toolbarControls:null,agentThinking:false,busy:false,pageError:``,sourceOperationsSuspended:false,repositoryWorkState:{checkedAt:``,state:`checking`}};return runtimeStateBySessionId[key]}function ensureRuntimeHost(sessionId=``){const key=String(sessionId||``);if(!key||mountedRuntimeSessionIds.value.includes(key))return;mountedRuntimeSessionIds.value=[...mountedRuntimeSessionIds.value,key];ensureRuntimeState(key)}function setRuntimeToolbarControls({controls=null,sessionId=``}={}){const state=ensureRuntimeState(sessionId);if(state)state.toolbarControls=controls}function setRuntimeBusy({agentThinking=false,busy=false,sessionId=``}={}){const state=ensureRuntimeState(sessionId);if(state){state.busy=Boolean(busy);state.agentThinking=Boolean(agentThinking)}}function setRuntimePageError({error=``,sessionId=``}={}){const state=ensureRuntimeState(sessionId);if(state)state.pageError=String(error||``)}function setRuntimeSourceOperationsSuspended({sessionId=``,suspended=false}={}){const state=ensureRuntimeState(sessionId);if(state)state.sourceOperationsSuspended=suspended===true}function setRuntimeWorkState({sessionId=``,workState=null}={}){repositoryStatusRegistry.observe(sessionId,workState)}function applyRuntimeWorkState({sessionId=``,workState=null}={}){const state=ensureRuntimeState(sessionId);if(state)state.repositoryWorkState=sessionRepositoryWorkState(workState)}}function sessionRepositoryWorkState(workState=null){const source=workState&&typeof workState===`object`?workState:{};const freshness={checkedAt:String(source.checkedAt||``),...source.updateStatusPending===true?{updateStatusPending:true}:{}};const operationStatus=String(source.operation?.status||``).trim();const operationCode=String(source.operation?.code||``).trim();const updateStatus=String(source.updateOperation?.status||``).trim();if(operationStatus===`running`)return{...freshness,state:`saving`};if(updateStatus===`running`)return{...freshness,state:`updating`};if(operationStatus===`failed`&&operationCode!==`vibe64_session_save_update_required`||updateStatus===`failed`)return{...freshness,state:`needs_help`,updateAvailable:source.updateAvailable===true};if((source.loading||source.unsaved===null||source.unsaved===void 0)&&source.updateAvailable!==true)return{...freshness,state:source.error?`unavailable`:`checking`};const changedCount=Array.isArray(source.changedPaths)?source.changedPaths.length:0;if(source.unsaved===true||source.connectedSaveRequired===true)return{changedCount,...freshness,state:`unsaved`,updateAvailable:source.updateAvailable===true};return{...freshness,state:source.error?`unavailable`:source.updateAvailable===true?`update_available`:`saved`}}function normalizeProjectPane(value=``){return[`dashboard`,`preview`].includes(value)?value:`preview`}function sessionPanelPageErrorMessage(error=``){const message=String(error||``).trim();if(/^request failed\.?$/iu.test(message))return`The session API request failed. Check that the Vibe64 server is running, then refresh the session.`;return message}function sessionPanelSelectedSessionArchiving({archive=null,selectedSessionId=``}={}){const selectedId=String(selectedSessionId||``).trim();const archivingId=String(archive?.archivingSessionId||``).trim();return Boolean(archive?.archiving&&selectedId&&archivingId===selectedId)}function sessionPanelDashboardContext(projectContext={},sessionsApiPath=``){return{projectContext:projectContext&&typeof projectContext===`object`&&!Array.isArray(projectContext)?projectContext:{},sessionsApiPath:String(unref(sessionsApiPath)||``)}}function sessionPanelToolbarSessions({purposeFilter=``,runtimeStateBySessionId={},selectedSession=null,selectedSessionId=``,sessions=[]}={}){const normalizedSelectedSessionId=String(selectedSessionId||``).trim();return sessions.filter(session=>vibe64SessionMatchesPurpose(session,purposeFilter)).map(session=>{const sessionId=String(session?.sessionId||``).trim();if(!sessionId)return session;const runtimeState=runtimeStateBySessionId[sessionId]||null;const sourceSession=sessionId===normalizedSelectedSessionId&&selectedSession?.sessionId===sessionId?selectedSession:session;const agentThinking=Boolean(runtimeState?.busy||runtimeState?.agentThinking||sessionRecordHasActiveAgentWork(sourceSession));return{...session,agentThinking,repositoryWorkState:runtimeState?.repositoryWorkState||{checkedAt:``,state:`checking`}}})}function sessionPanelRuntimeHostDiagnostics({mountedRuntimeSessionIds=[],runtimeHostSessionIds=[],runtimeStateBySessionId={},selectedSessionId=``,sessionLoadError=false,sessions=[]}={}){const mountedIds=mountedRuntimeSessionIds.map(sessionId=>String(sessionId||``).trim()).filter(Boolean);const renderedIds=runtimeHostSessionIds.map(sessionId=>String(sessionId||``).trim()).filter(Boolean);const sessionIds=sessions.map(session=>String(session?.sessionId||``).trim()).filter(Boolean);const renderedSet=new Set(renderedIds);const selectedId=String(selectedSessionId||``).trim();const sessionSet=new Set(sessionIds);const stateIds=Object.keys(runtimeStateBySessionId||{}).map(sessionId=>String(sessionId||``).trim()).filter(Boolean);const states=stateIds.map(sessionId=>runtimeStateBySessionId[sessionId]).filter(Boolean);return{activeRuntimeHostCount:selectedId&&mountedIds.includes(selectedId)?1:0,busyRuntimeHostCount:states.filter(state=>Boolean(state?.busy)).length,hiddenMountedRuntimeHostCount:mountedIds.filter(sessionId=>sessionId!==selectedId).length,mountedRuntimeHostCount:mountedIds.length,mountedRuntimeSessionIds:mountedIds,orphanedMountedRuntimeHostCount:mountedIds.filter(sessionId=>!sessionSet.has(sessionId)).length,pageErrorRuntimeHostCount:states.filter(state=>String(state?.pageError||``).trim()).length,renderedRuntimeHostCount:renderedIds.length,renderedRuntimeSessionIds:renderedIds,runtimeStateCount:stateIds.length,selectedSessionId:selectedId,sessionLoadError:Boolean(sessionLoadError),unrenderedMountedRuntimeHostCount:mountedIds.filter(sessionId=>!renderedSet.has(sessionId)).length,visibleRuntimeHostCount:renderedIds.length,visibleRuntimeSessionIds:renderedIds,visibleSessionCount:sessionIds.length}}function sessionPanelEmptyStateActivity({createSessionRunning=false,selectedSession=null,sessionListInitialLoading=false}={}){if(selectedSession)return``;if(createSessionRunning)return`creating`;return sessionListInitialLoading?`loading`:``}var _hoisted_1$7={key:0,class:`studio-ai-sessions__error-overlay`};var _hoisted_2$7=[`aria-valuemax`,`aria-valuemin`,`aria-valuenow`];var _hoisted_3$7=[`aria-hidden`,`inert`];var _hoisted_4$6={class:`studio-ai-sessions__empty-main`,"aria-label":`Session chat`};var _hoisted_5$6={class:`studio-ai-sessions__empty-session-header`};var _hoisted_6$5={class:`studio-ai-sessions__empty-chat-body`};var _hoisted_7$5={key:0,class:`studio-ai-sessions__empty-hint`,role:`status`};var _hoisted_8$5={class:`studio-ai-sessions__empty-project-panel`,"aria-label":`Project`};var _hoisted_9$5={key:0,class:`studio-ai-sessions__dashboard-empty-pane`};var _hoisted_10$5={key:1,class:`studio-ai-sessions__preview-empty-pane`};var _hoisted_11$5={class:`studio-ai-sessions__preview-empty-content`};var _hoisted_12$5={class:`studio-ai-sessions__preview-empty-title`};var _hoisted_13$5={key:0,class:`studio-ai-sessions__preview-empty-detail`};var _hoisted_14$5={key:1,class:`studio-ai-sessions__preview-empty-loading`,role:`status`};var _hoisted_15$5=[`aria-hidden`,`inert`];var _sfc_main$7={__name:`Vibe64SessionPanel`,props:vibe64SessionPanelProps,emits:vibe64SessionPanelEmits,setup(__props,{expose:__expose,emit:__emit}){const hostConversation=inject(VIBE64_HOST_CONVERSATION_KEY,null);const emit=__emit;const props=__props;const sessionTooltip=createVibe64SessionTooltipState();provide(VIBE64_SESSION_TOOLTIP_KEY,sessionTooltip);const{chatCollapsed,dashboardProjectActive,dismissPageError,emitChatAttention,emitProjectAttention,emptyChatHintText,emptyCreateAttention,emptyDashboardContext,emptyLayoutVisible,emptyPreviewDetailText,emptyPreviewTitleText,emptyStateInitialLoading,emptyStateStatusText,pageError,promptHintPolicy,projectPane,runtimeHostSessionIds,selectedArchive,selectedSessionArchiving,selection,sessionData,setRuntimeBusy,setRuntimePageError,setRuntimeSourceOperationsSuspended,setRuntimeWorkState,setRuntimeToolbarControls,toolbar,visiblePageError}=useVibe64SessionPanel(props,emit);function closeEmptyHostConversation(){if(props.active&&props.purposeFilter!==`learning`)hostConversation?.close()}function selectLearningConversation({sessionId,attemptId,learnerId}={}){if(props.purposeFilter!==`learning`||learnerId!==sessionData.learningLearnerId.value)return false;const row=sessionData.availableSessions.value.find(value=>value.sessionId===sessionId);if(!row||row.purpose!==`learning`||row.learningAttemptId!==attemptId)return false;sessionData.selectSessionId(sessionId);return sessionData.selectedSessionId.value===sessionId}function showLearningPicker(){if(props.purposeFilter!==`learning`)return false;sessionData.selectSessionId(``);return sessionData.selectedSessionId.value===``}const learningSelection=computed(()=>{const row=sessionData.selectedSession.value;return props.purposeFilter===`learning`&&row?.purpose===`learning`&&row.learningAttemptId?Object.freeze({sessionId:row.sessionId,attemptId:row.learningAttemptId,learnerId:sessionData.learningLearnerId.value,projectSlug:row.projectSlug||``}):null});const learnerGestures=inject(VIBE64_TRAINING_LEARNER_GESTURE_KEY,null);const learningPracticeChoices=computed(()=>props.purposeFilter===`learning`&&sessionData.learningLearnerId.value?sessionData.availableSessions.value.filter(row=>row.purpose===`learning`&&row.noExercise===false&&row.projectSlug&&row.learningAttemptId&&row.archived!==true).map(row=>Object.freeze({sessionId:row.sessionId,attemptId:row.learningAttemptId,learnerId:sessionData.learningLearnerId.value,projectSlug:row.projectSlug})):[]);const learningWorkspaceAvailable=computed(()=>props.purposeFilter===`learning`&&sessionData.selectedSession.value?.noExercise===false&&Boolean(sessionData.selectedSession.value?.projectSlug));function selectLearningPracticeProject(choice,event){const actual=learningPracticeChoices.value.find(row=>[`sessionId`,`attemptId`,`learnerId`,`projectSlug`].every(key=>row[key]===choice?.[key]));if(!props.active||!actual)return false;const owner=learnerGestures?.value;const ticket=owner?.begin(event,`project-select`,{projectSlug:actual.projectSlug,sessionId:actual.sessionId});const selected=selectLearningConversation(actual);if(ticket){if(selected)owner.finish(ticket);else owner.discard(ticket)}return selected}__expose({selectLearningConversation,selectLearningPracticeProject,showLearningPicker,get learningSelection(){return learningSelection.value},get learningPracticeChoices(){return learningPracticeChoices.value},get learningWorkspaceAvailable(){return learningWorkspaceAvailable.value}});async function createSessionForEmptyState(assistantSelection={},options={}){const response=await toolbar.createSession?.(assistantSelection,options);if(response?.sessionId)focusCreatedVibe64SessionTab(response.sessionId);return response}const emptyToolbar=computed(()=>({projectContext:props.projectContext,...toolbar,createSession:createSessionForEmptyState}));const{bounds:chatColumnBounds,resizing:chatColumnResizing,resizeWithKeyboard:resizeChatColumnWithKeyboard,separator:chatColumnSeparator,startResize:startChatColumnResize,width:chatColumnWidth}=useVibe64ChatColumnResize();return(_ctx,_cache)=>{return openBlock(),createBlock(VSheet,{rounded:`lg`,class:normalizeClass([`studio-ai-sessions studio-ai-sessions--autopilot studio-screen__panel`,{"studio-ai-sessions--resizing":unref(chatColumnResizing),"studio-ai-sessions--unavailable":unref(sessionData).sessionList.unavailableItems.length>0}]),onPointermove:unref(sessionTooltip).trackPointer,onPointerleave:unref(sessionTooltip).resumeHover},{default:withCtx(()=>[createVNode(Transition,{name:`studio-ai-sessions-error`},{default:withCtx(()=>[unref(visiblePageError)?(openBlock(),createElementBlock(`div`,_hoisted_1$7,[createVNode(StudioErrorNotice_default,{title:`Session data could not refresh`,error:unref(pageError),compact:``,dismissible:``,onDismiss:unref(dismissPageError)},null,8,[`error`,`onDismiss`])])):createCommentVNode(``,true)]),_:1}),createVNode(Vibe64UnavailableSessions_default,{sessions:unref(sessionData).sessionList.unavailableItems,loading:unref(sessionData).sessionList.isLoading,onRecheck:unref(sessionData).refreshSessionData},null,8,[`sessions`,`loading`,`onRecheck`]),createVNode(Vibe64SessionArchiveDialog_default,{archive:unref(selectedArchive),"short-session-id":unref(sessionData).shortSessionId},null,8,[`archive`,`short-session-id`]),withDirectives(createBaseVNode(`div`,{ref_key:`chatColumnSeparator`,ref:chatColumnSeparator,class:normalizeClass([`studio-ai-sessions__chat-column-separator`,{"studio-ai-sessions__chat-column-separator--resizing":unref(chatColumnResizing)}]),"aria-label":`Resize chat`,"aria-orientation":`vertical`,"aria-valuemax":unref(chatColumnBounds).max,"aria-valuemin":unref(chatColumnBounds).min,"aria-valuenow":unref(chatColumnWidth),role:`separator`,tabindex:`0`,title:`Resize chat`,onKeydown:_cache[0]||(_cache[0]=(...args)=>unref(resizeChatColumnWithKeyboard)&&unref(resizeChatColumnWithKeyboard)(...args)),onPointerdown:_cache[1]||(_cache[1]=(...args)=>unref(startChatColumnResize)&&unref(startChatColumnResize)(...args))},null,42,_hoisted_2$7),[[vShow,!unref(chatCollapsed)]]),unref(emptyLayoutVisible)?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`studio-ai-sessions__empty-layout`,{"studio-ai-sessions__empty-layout--chat-collapsed":unref(chatCollapsed),"studio-ai-sessions__empty-layout--dashboard":unref(dashboardProjectActive)}]),"aria-hidden":unref(selectedSessionArchiving)?`true`:void 0,inert:unref(selectedSessionArchiving)},[createBaseVNode(`section`,_hoisted_4$6,[createBaseVNode(`div`,_hoisted_5$6,[createVNode(Vibe64SessionToolbar_default,{archive:unref(selectedArchive),compact:``,"create-attention":unref(emptyCreateAttention),"create-teleport-target":unref(selectedSessionArchiving)?``:props.createSessionTeleportTarget,"create-visible":!unref(emptyStateInitialLoading)&&unref(toolbar).createSessionVisible,"max-visible-sessions":3,"selected-session-id":unref(selection).selectedSessionId,"selection-archived":unref(selection).isArchived,toolbar:emptyToolbar.value},null,8,[`archive`,`create-attention`,`create-teleport-target`,`create-visible`,`selected-session-id`,`selection-archived`,`toolbar`])]),unref(hostConversation)?withDirectives((openBlock(),createBlock(Vibe64TemporaryAiWorkspace_default,{key:0,class:`studio-ai-sessions__empty-host-conversation`,active:props.active&&props.purposeFilter!==`learning`,onSelectMainChat:closeEmptyHostConversation},null,8,[`active`])),[[vShow,props.purposeFilter!==`learning`]]):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_6$5,[unref(emptyChatHintText)?(openBlock(),createElementBlock(`div`,_hoisted_7$5,toDisplayString(unref(emptyChatHintText)),1)):createCommentVNode(``,true)]),_cache[3]||(_cache[3]=createBaseVNode(`div`,{class:`studio-ai-sessions__empty-thinking studio-ai-sessions__empty-thinking--empty`,"aria-hidden":`true`},[createBaseVNode(`span`,{class:`studio-ai-sessions__empty-thinking-mark`}),createBaseVNode(`span`,null,`Thinking...`)],-1)),_cache[4]||(_cache[4]=createBaseVNode(`div`,{class:`studio-ai-sessions__empty-runtime-status`},null,-1)),_cache[5]||(_cache[5]=createBaseVNode(`div`,{class:`studio-ai-sessions__empty-composer`},null,-1))]),createBaseVNode(`section`,_hoisted_8$5,[unref(dashboardProjectActive)?(openBlock(),createElementBlock(`div`,_hoisted_9$5,[props.purposeFilter===`learning`?(openBlock(),createBlock(unref(TrainingPreviewPresentation_default),{key:0,active:props.active,"learning-pane-active":``,"workspace-active":false,"lessons-available":``,"app-available":false,"project-slug":``,"session-id":``},{lessons:withCtx(()=>[renderSlot(_ctx.$slots,`learning`,{dashboardContext:{...unref(emptyDashboardContext),sessionToolbar:unref(toolbar)}},void 0,true)]),_:3},8,[`active`])):renderSlot(_ctx.$slots,`dashboard`,{dashboardContext:{...unref(emptyDashboardContext),sessionToolbar:unref(toolbar)}},void 0,true,1)])):(openBlock(),createElementBlock(`div`,_hoisted_10$5,[createBaseVNode(`div`,_hoisted_11$5,[createBaseVNode(`p`,_hoisted_12$5,toDisplayString(unref(emptyPreviewTitleText)),1),unref(emptyPreviewDetailText)?(openBlock(),createElementBlock(`p`,_hoisted_13$5,toDisplayString(unref(emptyPreviewDetailText)),1)):createCommentVNode(``,true),unref(emptyStateInitialLoading)?(openBlock(),createElementBlock(`div`,_hoisted_14$5,[createVNode(VSkeletonLoader,{"aria-label":unref(emptyStateStatusText),class:`studio-ai-sessions__preview-empty-skeleton`,type:`button`},null,8,[`aria-label`])])):unref(toolbar).createSessionVisible?(openBlock(),createBlock(Vibe64CreateSessionButton_default,{key:2,"aria-label":`Create session`,"button-class":`studio-ai-sessions__preview-create-button`,"icon-only":false,label:`Create session`,toolbar:emptyToolbar.value},null,8,[`toolbar`])):createCommentVNode(``,true)])]))])],10,_hoisted_3$7)):createCommentVNode(``,true),withDirectives(createBaseVNode(`div`,{class:`studio-ai-sessions__runtime-stack`,"aria-hidden":unref(selectedSessionArchiving)?`true`:void 0,inert:unref(selectedSessionArchiving)},[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(runtimeHostSessionIds),runtimeSessionId=>{return withDirectives((openBlock(),createBlock(Vibe64SessionRuntimeHost_default,{key:runtimeSessionId,active:props.active&&runtimeSessionId===unref(selection).selectedSessionId,"session-data":unref(sessionData),"session-id":runtimeSessionId,"workspace-purpose":props.purposeFilter,"chat-collapsed":unref(chatCollapsed),"create-session-teleport-target":!unref(emptyLayoutVisible)&&!unref(selectedSessionArchiving)&&runtimeSessionId===unref(selection).selectedSessionId?props.createSessionTeleportTarget:``,"github-actor-teleport-target":runtimeSessionId===unref(selection).selectedSessionId?props.githubActorTeleportTarget:``,"project-context":props.projectContext,"preview-toolbar-teleport-target":runtimeSessionId===unref(selection).selectedSessionId?props.previewToolbarTeleportTarget:``,"prompt-hint-policy":unref(promptHintPolicy),"project-pane":unref(projectPane),"lessons-available":props.purposeFilter===`learning`,"learning-view":props.learningView,"toolbar-sessions":unref(toolbar).sessions,"refresh-repository-state":unref(toolbar).refreshRepositoryState,onBusyChange:unref(setRuntimeBusy),onChatAttention:unref(emitChatAttention),onExecutionAttention:_cache[2]||(_cache[2]=$event=>emit(`execution-attention`,$event)),onPageErrorChange:unref(setRuntimePageError),onSourceOperationsSuspensionChange:unref(setRuntimeSourceOperationsSuspended),onWorkStateChange:unref(setRuntimeWorkState),onToolbarControlsReady:unref(setRuntimeToolbarControls),onProjectAttention:unref(emitProjectAttention)},{dashboard:withCtx(dashboardSlotProps=>[renderSlot(_ctx.$slots,`dashboard`,{dashboardContext:{...dashboardSlotProps?.dashboardContext||{},sessionToolbar:unref(toolbar)}},void 0,true)]),learning:withCtx(learningSlotProps=>[renderSlot(_ctx.$slots,`learning`,{dashboardContext:{...learningSlotProps?.dashboardContext||{},sessionToolbar:unref(toolbar)}},void 0,true)]),_:3},8,[`active`,`session-data`,`session-id`,`workspace-purpose`,`chat-collapsed`,`create-session-teleport-target`,`github-actor-teleport-target`,`project-context`,`preview-toolbar-teleport-target`,`prompt-hint-policy`,`project-pane`,`lessons-available`,`learning-view`,`toolbar-sessions`,`refresh-repository-state`,`onBusyChange`,`onChatAttention`,`onPageErrorChange`,`onSourceOperationsSuspensionChange`,`onWorkStateChange`,`onToolbarControlsReady`,`onProjectAttention`])),[[vShow,runtimeSessionId===unref(selection).selectedSessionId]])}),128))],8,_hoisted_15$5),[[vShow,!unref(emptyLayoutVisible)&&unref(runtimeHostSessionIds).length>0]])]),_:3},8,[`class`,`onPointermove`,`onPointerleave`])}}};var Vibe64SessionPanel_default=_plugin_vue_export_helper_default(_sfc_main$7,[[`__scopeId`,`data-v-d20137a0`]]);var trainingIcons=Object.freeze({refresh:`M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z`,play:`M8,5.14V19.14L19,12.14L8,5.14Z`,plus:`M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z`,arrowRight:`M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z`,checkCircle:`M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41 10.59L10 14.17L17.59 6.58L19 8L10 17Z`,eye:`M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M12,4.5C17,4.5 21.27,7.61 23,12C21.27,16.39 17,19.5 12,19.5C7,19.5 2.73,16.39 1,12C2.73,7.61 7,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C15.76,17.5 19.17,15.36 20.82,12C19.17,8.64 15.76,6.5 12,6.5C8.24,6.5 4.83,8.64 3.18,12Z`,cancel:`M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z`,trophy:`M18 2C17.1 2 16 3 16 4H8C8 3 6.9 2 6 2H2V11C2 12 3 13 4 13H6.2C6.6 15 7.9 16.7 11 17V19.08C8 19.54 8 22 8 22H16C16 22 16 19.54 13 19.08V17C16.1 16.7 17.4 15 17.8 13H20C21 13 22 12 22 11V2H18M6 11H4V4H6V11M16 11.5C16 13.43 15.42 15 12 15C8.59 15 8 13.43 8 11.5V6H16V11.5M20 11H18V4H20V11Z`,history:`M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3`,school:`M12 3L1 9L5 11.18V17.18L12 21L19 17.18V11.18L21 10.09V17H23V9L12 3M18.82 9L12 12.72L5.18 9L12 5.28L18.82 9M17 16L12 18.72L7 16V12.27L12 15L17 12.27V16Z`,bookmark:`M17,18L12,15.82L7,18V5H17M17,3H7A2,2 0 0,0 5,5V21L12,18L19,21V5C19,3.89 18.1,3 17,3Z`,book:`M19 1L14 6V17L19 12.5V1M21 5V18.5C19.9 18.15 18.7 18 17.5 18C15.8 18 13.35 18.65 12 19.5V6C10.55 4.9 8.45 4.5 6.5 4.5C4.55 4.5 2.45 4.9 1 6V20.65C1 20.9 1.25 21.15 1.5 21.15C1.6 21.15 1.65 21.1 1.75 21.1C3.1 20.45 5.05 20 6.5 20C8.45 20 10.55 20.4 12 21.5C13.35 20.65 15.8 20 17.5 20C19.15 20 20.85 20.3 22.25 21.05C22.35 21.1 22.4 21.1 22.5 21.1C22.75 21.1 23 20.85 23 20.6V6C22.4 5.55 21.75 5.25 21 5M10 18.41C8.75 18.09 7.5 18 6.5 18C5.44 18 4.18 18.19 3 18.5V7.13C3.91 6.73 5.14 6.5 6.5 6.5C7.86 6.5 9.09 6.73 10 7.13V18.41Z`,chevronUp:`M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z`,chevronDown:`M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z`,path:`M18,15A3,3 0 0,1 21,18A3,3 0 0,1 18,21C16.69,21 15.58,20.17 15.17,19H14V17H15.17C15.58,15.83 16.69,15 18,15M18,17A1,1 0 0,0 17,18A1,1 0 0,0 18,19A1,1 0 0,0 19,18A1,1 0 0,0 18,17M18,8A1.43,1.43 0 0,0 19.43,6.57C19.43,5.78 18.79,5.14 18,5.14C17.21,5.14 16.57,5.78 16.57,6.57A1.43,1.43 0 0,0 18,8M18,2.57A4,4 0 0,1 22,6.57C22,9.56 18,14 18,14C18,14 14,9.56 14,6.57A4,4 0 0,1 18,2.57M8.83,17H10V19H8.83C8.42,20.17 7.31,21 6,21A3,3 0 0,1 3,18C3,16.69 3.83,15.58 5,15.17V14H7V15.17C7.85,15.47 8.53,16.15 8.83,17M6,17A1,1 0 0,0 5,18A1,1 0 0,0 6,19A1,1 0 0,0 7,18A1,1 0 0,0 6,17M6,3A3,3 0 0,1 9,6C9,7.31 8.17,8.42 7,8.83V10H5V8.83C3.83,8.42 3,7.31 3,6A3,3 0 0,1 6,3M6,5A1,1 0 0,0 5,6A1,1 0 0,0 6,7A1,1 0 0,0 7,6A1,1 0 0,0 6,5M11,19V17H13V19H11M7,13H5V11H7V13Z`,check:`M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z`,layers:`M12,18.54L19.37,12.8L21,14.07L12,21.07L3,14.07L4.62,12.81L12,18.54M12,16L3,9L12,2L21,9L12,16M12,4.53L6.26,9L12,13.47L17.74,9L12,4.53Z`,info:`M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z`,download:`M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z`,update:`M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z`,close:`M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z`});var _hoisted_1$6={class:`training-course-creator`,"aria-label":`New course`};var _hoisted_2$6={class:`tcc-header`};var _hoisted_3$6={class:`tcc-header__icon`,"aria-hidden":`true`};var _hoisted_4$5={class:`tcc-steps`};var _hoisted_5$5={class:`tcc-step__marker`,"aria-hidden":`true`};var _hoisted_6$4={class:`tcc-step__body`};var _hoisted_7$4={class:`tcc-step__marker`,"aria-hidden":`true`};var _hoisted_8$4={class:`tcc-step__body`};var _hoisted_9$4={key:0,class:`tcc-empty`,role:`status`};var _hoisted_10$4=[`disabled`];var _hoisted_11$4={class:`tcc-topics`};var _hoisted_12$4={key:0,class:`tcc-step tcc-step--done`};var _hoisted_13$4={class:`tcc-step__body`};var _hoisted_14$4={class:`training-course-creator__order`};var _hoisted_15$4={class:`tcc-order__index`,"aria-hidden":`true`};var _hoisted_16$4={class:`tcc-order__name`};var _hoisted_17$4={class:`tcc-order__moves`};var _hoisted_18$4={class:`tcc-actions`};var _sfc_main$6={__name:`TrainingCourseCreator`,props:{topics:{type:Array,required:true},busy:Boolean},emits:[`create`,`cancel`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const name=ref(``);const selected=ref([]);const key=topic=>JSON.stringify([topic.topicId,topic.release]);const chosen=computed(()=>selected.value.map(value=>props.topics.find(topic=>key(topic)===value)).filter(Boolean));const createEnabled=computed(()=>!props.busy&&name.value.trim().length>0&&name.value.trim().length<=120&&chosen.value.length>0);function toggle(topic,checked){const value=key(topic);selected.value=checked?[...selected.value.filter(item=>item!==value),value]:selected.value.filter(item=>item!==value)}function move(index,offset){const order=chosen.value.map(key);[order[index],order[index+offset]]=[order[index+offset],order[index]];selected.value=order}function requestCreate(){if(createEnabled.value)emit(`create`,{title:name.value.trim(),topics:chosen.value.map(({topicId,release})=>({topicId,release}))})}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$6,[createBaseVNode(`header`,_hoisted_2$6,[createBaseVNode(`span`,_hoisted_3$6,[createVNode(VIcon,{icon:unref(trainingIcons).path,size:`28`},null,8,[`icon`])]),_cache[2]||(_cache[2]=createBaseVNode(`div`,null,[createBaseVNode(`h3`,{id:`tcc-title`},`New course`),createBaseVNode(`p`,null,`Name the course and choose whole installed topics in the order to learn them. Lessons and their saved progress are shared with every course that contains them.`)],-1))]),createBaseVNode(`ol`,_hoisted_4$5,[createBaseVNode(`li`,{class:normalizeClass([`tcc-step`,{"tcc-step--done":name.value.trim().length>0}])},[createBaseVNode(`span`,_hoisted_5$5,[name.value.trim().length>0?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).check,size:`16`},null,8,[`icon`])):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`1`)],64))]),createBaseVNode(`div`,_hoisted_6$4,[_cache[3]||(_cache[3]=createBaseVNode(`p`,{class:`tcc-step__title`},`Name it`,-1)),createVNode(VTextField,{modelValue:name.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>name.value=$event),label:`Course name`,counter:`120`,maxlength:`120`,variant:`outlined`,rounded:`lg`,disabled:__props.busy},null,8,[`modelValue`,`disabled`])])],2),createBaseVNode(`li`,{class:normalizeClass([`tcc-step`,{"tcc-step--done":chosen.value.length>0}])},[createBaseVNode(`span`,_hoisted_7$4,[chosen.value.length>0?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).check,size:`16`},null,8,[`icon`])):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`2`)],64))]),createBaseVNode(`div`,_hoisted_8$4,[!__props.topics.length?(openBlock(),createElementBlock(`p`,_hoisted_9$4,`No topics from enabled released courses are installed. Ask the owner to install and enable a course first.`)):(openBlock(),createElementBlock(`fieldset`,{key:1,class:`training-course-creator__topics`,disabled:__props.busy},[_cache[4]||(_cache[4]=createBaseVNode(`legend`,{class:`tcc-step__title`},`Installed topics`,-1)),createBaseVNode(`div`,_hoisted_11$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.topics,topic=>{return openBlock(),createElementBlock(`div`,{key:key(topic),class:normalizeClass([`tcc-topic`,{"tcc-topic--on":selected.value.includes(key(topic))}])},[createVNode(VCheckbox,{"model-value":selected.value.includes(key(topic)),color:`primary`,density:`comfortable`,label:`${topic.title} · ${topic.release}`,"hide-details":``,"onUpdate:modelValue":$event=>toggle(topic,$event)},null,8,[`model-value`,`label`,`onUpdate:modelValue`])],2)}),128))])],8,_hoisted_10$4))])],2),chosen.value.length?(openBlock(),createElementBlock(`li`,_hoisted_12$4,[_cache[8]||(_cache[8]=createBaseVNode(`span`,{class:`tcc-step__marker`,"aria-hidden":`true`},`3`,-1)),createBaseVNode(`div`,_hoisted_13$4,[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`tcc-step__title`},`Topic order`,-1)),createBaseVNode(`ol`,_hoisted_14$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(chosen.value,(topic,index)=>{return openBlock(),createElementBlock(`li`,{key:key(topic)},[createBaseVNode(`span`,_hoisted_15$4,toDisplayString(index+1),1),createBaseVNode(`span`,_hoisted_16$4,toDisplayString(topic.title)+` · `+toDisplayString(topic.release),1),createBaseVNode(`span`,_hoisted_17$4,[createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).chevronUp,disabled:__props.busy||index===0,"aria-label":`Move ${topic.title} up`,onClick:$event=>move(index,-1)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Up`,-1)])]),_:1},8,[`prepend-icon`,`disabled`,`aria-label`,`onClick`]),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).chevronDown,disabled:__props.busy||index===chosen.value.length-1,"aria-label":`Move ${topic.title} down`,onClick:$event=>move(index,1)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Down`,-1)])]),_:1},8,[`prepend-icon`,`disabled`,`aria-label`,`onClick`])])])}),128))])])])):createCommentVNode(``,true)]),createBaseVNode(`footer`,_hoisted_18$4,[createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,disabled:__props.busy,onClick:_cache[1]||(_cache[1]=$event=>emit(`cancel`))},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:!createEnabled.value,onClick:requestCreate},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Create course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])])])}}};var TrainingCourseCreator_default=_plugin_vue_export_helper_default(_sfc_main$6,[[`__scopeId`,`data-v-c5c653a1`]]);function offered(course,lesson,canTryPreviews=false){return course.enabled&&(course.status===`released`||canTryPreviews)&&lesson.status===`published`}function previewCourse(course){return course.enabled&&course.status!==`released`}var previewNote=`Preview — the workspace owner can try it; it becomes startable when released.`;function lessonStatus(lesson,lessonProgress){const saved=lessonProgress.find(value=>value.lessonCode===lesson.code&&value.lessonHash===lesson.hash);if(saved?.completed)return`completed`;return saved&&(saved.open||saved.passed>0)?`in-progress`:`not-started`}function earlierCompletion(lesson,lessonProgress,attempts){const done=lessonProgress.filter(value=>value.lessonCode===lesson.code&&value.lessonHash!==lesson.hash&&value.completed);if(!done.length)return null;return{release:done.flatMap(value=>attempts.filter(attempt=>attempt?.pin?.lesson?.code===value.lessonCode&&attempt.pin.lesson.hash===value.lessonHash).map(attempt=>attempt.pin.course?.release)).filter(Boolean).at(-1)||``}}function courseProgress(course,lessonProgress=[],active=null,history=[],{canTryPreviews=false}={}){const attempts=[...history,...active?[active]:[]];const lessons=course.lessons.map(lesson=>{const status=lessonStatus(lesson,lessonProgress);const earlier=status===`completed`?null:earlierCompletion(lesson,lessonProgress,attempts);return{lesson,status,...earlier?{earlier}:{}}});const counted=lessons.some(value=>value.lesson.required)?lessons.filter(value=>value.lesson.required):lessons;return{lessons,topics:course.topics.map(topic=>({...topic,lessons:lessons.filter(value=>value.lesson.topicId===topic.topicId&&value.lesson.topicRelease===topic.release)})),completed:counted.filter(value=>value.status===`completed`).length,total:counted.length,activeHere:Boolean(active&&active.pin.course.courseId===course.courseId&&active.pin.course.release===course.release),next:lessons.find(value=>value.status!==`completed`&&offered(course,value.lesson,canTryPreviews))?.lesson||null}}var statusLabels=Object.freeze({completed:`Completed`,"in-progress":`In progress`,"not-started":`Not started`});function courseStatusLabel(course){return!course.enabled?`Disabled for new lessons`:course.status===`released`?`Enabled`:`Preview course`}function earlierCompletionLabel(earlier){return earlier?`Completed in ${earlier.release||`an earlier release`} · updated since`:``}function hashText(value){let hash=2166136261;for(const char of String(value)){hash^=char.codePointAt(0);hash=Math.imul(hash,16777619)}return hash>>>0}var patterns=Object.freeze([`waves`,`orbits`,`grid`,`peaks`]);function courseArt(courseId){const hash=hashText(courseId);const hue=hash%360;const shift=35+(hash>>>9)%50;return{id:`v64-course-art-${hash.toString(36)}`,pattern:patterns[(hash>>>3)%patterns.length],from:`hsl(${hue} 62% 38%)`,to:`hsl(${(hue+shift)%360} 70% 52%)`,accent:`hsl(${(hue+shift*2)%360} 90% 78%)`,seed:hash}}function courseMonogram(title){const words=String(title||``).split(/\s+[—–-]\s+/).pop().trim().split(/\s+/).filter(word=>/^[\p{L}\p{N}]/u.test(word));return(words.length>1?words[0][0]+words[1][0]:(words[0]||`?`).slice(0,2)).toUpperCase()}var _hoisted_1$5={class:`training-course-art`,"aria-hidden":`true`};var _hoisted_2$5={viewBox:`0 0 320 120`,preserveAspectRatio:`xMidYMid slice`,focusable:`false`};var _hoisted_3$5=[`id`];var _hoisted_4$4=[`stop-color`];var _hoisted_5$4=[`stop-color`];var _hoisted_6$3=[`id`];var _hoisted_7$3=[`stop-color`];var _hoisted_8$3=[`stop-color`];var _hoisted_9$3=[`fill`];var _hoisted_10$3=[`fill`];var _hoisted_11$3={key:0,fill:`none`,stroke:`#fff`,"stroke-linecap":`round`};var _hoisted_12$3=[`d`,`stroke-opacity`,`stroke-width`];var _hoisted_13$3={key:1,fill:`none`,stroke:`#fff`};var _hoisted_14$3=[`cx`,`cy`,`r`,`stroke-opacity`];var _hoisted_15$3=[`cx`,`cy`,`fill`];var _hoisted_16$3={key:2};var _hoisted_17$3=[`cx`,`cy`,`r`,`fill`,`fill-opacity`];var _hoisted_18$3={key:3,fill:`#fff`};var _hoisted_19$3=[`d`,`fill-opacity`];var _hoisted_20$3={key:4,class:`training-course-art__path`};var _hoisted_21$3=[`d`];var _hoisted_22$3=[`cx`,`cy`,`fill`,`stroke-opacity`];var _hoisted_23$3=[`d`,`stroke`];var _hoisted_24$2=[`cx`,`cy`];var _hoisted_25$2={class:`training-course-art__monogram`};var _sfc_main$5={__name:`TrainingCourseArt`,props:{courseId:{type:String,required:true},title:{type:String,default:``},statuses:{type:Array,default:()=>[]}},setup(__props){const props=__props;const art=computed(()=>courseArt(props.courseId));const monogram=computed(()=>courseMonogram(props.title));const rand=index=>(art.value.seed>>>index%24^index*2654435761)>>>0;const waves=computed(()=>[0,1,2].map(row=>{const y=34+row*30+rand(row)%10;const amp=8+rand(row+3)%10;return`M -10 ${y} C 60 ${y-amp}, 100 ${y+amp}, 170 ${y} S 280 ${y-amp}, 340 ${y}`}));const orbits=computed(()=>({cx:230+rand(1)%60,cy:20+rand(2)%50,radii:[26,52,80,110]}));const dots=computed(()=>{const list=[];for(let y=14;y<120;y+=18)for(let x=120;x<330;x+=18)list.push({x,y,on:rand(x*7+y)%7===0});return list});const peaks=computed(()=>[0,1,2].map(layer=>{const base=120;const step=70-layer*12;let d=`M -10 ${base}`;for(let x=-10,i=0;x<340;x+=step,i++)d+=` L ${x+step/2} ${50+layer*18+rand(layer*9+i)%26} L ${x+step} ${110+layer*4}`;return`${d} L 340 ${base} Z`}));const path=computed(()=>{const statuses=props.statuses.slice(0,12);const count=statuses.length;if(!count)return null;const start=108;const nodes=statuses.map((status,index)=>{return{x:count===1?204:start+192*index/(count-1),y:84-Math.sin(index/Math.max(1,count-1)*Math.PI)*26,status}});return{nodes,d:nodes.map((node,index)=>`${index?`L`:`M`} ${node.x.toFixed(1)} ${node.y.toFixed(1)}`).join(` `)}});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$5,[(openBlock(),createElementBlock(`svg`,_hoisted_2$5,[createBaseVNode(`defs`,null,[createBaseVNode(`linearGradient`,{id:`${art.value.id}-bg`,x1:`0`,y1:`0`,x2:`1`,y2:`1`},[createBaseVNode(`stop`,{offset:`0`,"stop-color":art.value.from},null,8,_hoisted_4$4),createBaseVNode(`stop`,{offset:`1`,"stop-color":art.value.to},null,8,_hoisted_5$4)],8,_hoisted_3$5),createBaseVNode(`radialGradient`,{id:`${art.value.id}-glow`,cx:`0.85`,cy:`0.1`,r:`0.7`},[createBaseVNode(`stop`,{offset:`0`,"stop-color":art.value.accent,"stop-opacity":`0.55`},null,8,_hoisted_7$3),createBaseVNode(`stop`,{offset:`1`,"stop-color":art.value.accent,"stop-opacity":`0`},null,8,_hoisted_8$3)],8,_hoisted_6$3)]),createBaseVNode(`rect`,{width:`320`,height:`120`,fill:`url(#${art.value.id}-bg)`},null,8,_hoisted_9$3),createBaseVNode(`rect`,{width:`320`,height:`120`,fill:`url(#${art.value.id}-glow)`},null,8,_hoisted_10$3),art.value.pattern===`waves`?(openBlock(),createElementBlock(`g`,_hoisted_11$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(waves.value,(d,index)=>{return openBlock(),createElementBlock(`path`,{key:index,d,"stroke-opacity":.14+index*.06,"stroke-width":10-index*3},null,8,_hoisted_12$3)}),128))])):art.value.pattern===`orbits`?(openBlock(),createElementBlock(`g`,_hoisted_13$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(orbits.value.radii,(r,index)=>{return openBlock(),createElementBlock(`circle`,{key:r,cx:orbits.value.cx,cy:orbits.value.cy,r,"stroke-opacity":.26-index*.05,"stroke-width":`2`},null,8,_hoisted_14$3)}),128)),createBaseVNode(`circle`,{cx:orbits.value.cx,cy:orbits.value.cy,r:`10`,fill:art.value.accent,"fill-opacity":`0.7`,stroke:`none`},null,8,_hoisted_15$3)])):art.value.pattern===`grid`?(openBlock(),createElementBlock(`g`,_hoisted_16$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(dots.value,dot=>{return openBlock(),createElementBlock(`circle`,{key:`${dot.x}-${dot.y}`,cx:dot.x,cy:dot.y,r:dot.on?3.2:1.6,fill:dot.on?art.value.accent:`#fff`,"fill-opacity":dot.on?.9:.28},null,8,_hoisted_17$3)}),128))])):(openBlock(),createElementBlock(`g`,_hoisted_18$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(peaks.value,(d,index)=>{return openBlock(),createElementBlock(`path`,{key:index,d,"fill-opacity":.08+index*.06},null,8,_hoisted_19$3)}),128))])),path.value?(openBlock(),createElementBlock(`g`,_hoisted_20$3,[createBaseVNode(`path`,{d:path.value.d,fill:`none`,stroke:`#fff`,"stroke-opacity":`0.55`,"stroke-width":`2.5`,"stroke-dasharray":`2 6`,"stroke-linecap":`round`},null,8,_hoisted_21$3),(openBlock(true),createElementBlock(Fragment,null,renderList(path.value.nodes,(node,index)=>{return openBlock(),createElementBlock(`g`,{key:index},[createBaseVNode(`circle`,{cx:node.x,cy:node.y,r:`7.5`,fill:node.status===`completed`?`#fff`:`rgba(0,0,0,0.18)`,stroke:`#fff`,"stroke-opacity":node.status===`not-started`?.6:1,"stroke-width":`2`},null,8,_hoisted_22$3),node.status===`completed`?(openBlock(),createElementBlock(`path`,{key:0,d:`M ${node.x-3.2} ${node.y} l 2.2 2.3 l 4.2 -4.6`,fill:`none`,stroke:art.value.from,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,8,_hoisted_23$3)):node.status===`in-progress`?(openBlock(),createElementBlock(`circle`,{key:1,cx:node.x,cy:node.y,r:`3`,fill:`#fff`},null,8,_hoisted_24$2)):createCommentVNode(``,true)])}),128))])):createCommentVNode(``,true)])),createBaseVNode(`span`,_hoisted_25$2,toDisplayString(monogram.value),1)])}}};var TrainingCourseArt_default=_plugin_vue_export_helper_default(_sfc_main$5,[[`__scopeId`,`data-v-a28d3001`]]);var _hoisted_1$4=[`aria-label`,`aria-valuemax`,`aria-valuenow`];var _hoisted_2$4=[`viewBox`];var _hoisted_3$4=[`cx`,`cy`,`r`,`stroke-width`];var _hoisted_4$3=[`cx`,`cy`,`r`,`stroke-width`,`stroke-dasharray`,`transform`];var _hoisted_5$3={class:`training-progress-ring__content`};var _sfc_main$4={__name:`TrainingProgressRing`,props:{value:{type:Number,default:0},max:{type:Number,default:0},size:{type:Number,default:72},stroke:{type:Number,default:8},label:{type:String,required:true}},setup(__props){const props=__props;const radius=computed(()=>(props.size-props.stroke)/2);const circumference=computed(()=>2*Math.PI*radius.value);const fraction=computed(()=>props.max>0?Math.min(1,Math.max(0,props.value/props.max)):0);const percent=computed(()=>Math.round(fraction.value*100));const gap=computed(()=>fraction.value>0&&fraction.value<1?props.stroke*1.5:0);const visible=computed(()=>Math.max(0,fraction.value*circumference.value-gap.value));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:`training-progress-ring`,role:`progressbar`,"aria-label":__props.label,"aria-valuemin":`0`,"aria-valuemax":__props.max,"aria-valuenow":Math.min(__props.value,__props.max),style:normalizeStyle({width:`${__props.size}px`,height:`${__props.size}px`})},[(openBlock(),createElementBlock(`svg`,{viewBox:`0 0 ${__props.size} ${__props.size}`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`circle`,{class:`training-progress-ring__track`,cx:__props.size/2,cy:__props.size/2,r:radius.value,fill:`none`,"stroke-width":__props.stroke},null,8,_hoisted_3$4),visible.value>0?(openBlock(),createElementBlock(`circle`,{key:0,class:`training-progress-ring__indicator`,cx:__props.size/2,cy:__props.size/2,r:radius.value,fill:`none`,"stroke-width":__props.stroke,"stroke-linecap":`round`,"stroke-dasharray":`${visible.value} ${circumference.value}`,transform:`rotate(-90 ${__props.size/2} ${__props.size/2})`},null,8,_hoisted_4$3)):createCommentVNode(``,true)],8,_hoisted_2$4)),createBaseVNode(`span`,_hoisted_5$3,[renderSlot(_ctx.$slots,`default`,{},()=>[createTextVNode(toDisplayString(percent.value)+`%`,1)],true)])],12,_hoisted_1$4)}}};var TrainingProgressRing_default=_plugin_vue_export_helper_default(_sfc_main$4,[[`__scopeId`,`data-v-8c0b2060`]]);var _hoisted_1$3=[`aria-label`];var _hoisted_2$3={class:`training-course-page__back`};var _hoisted_3$3={class:`training-course-page__hero-body`};var _hoisted_4$2={class:`training-course-page__hero-text`};var _hoisted_5$2={class:`training-course-page__title`};var _hoisted_6$2={class:`training-course-page__meta`};var _hoisted_7$2={class:`training-course-page__chip`};var _hoisted_8$2={class:`training-course-page__chip`};var _hoisted_9$2={class:`training-course-page__count`};var _hoisted_10$2={class:`training-course-page__ring-value`};var _hoisted_11$2={class:`training-course-page__next-text`};var _hoisted_12$2={class:`training-course-page__next-title`};var _hoisted_13$2={key:2,class:`training-course-page__next-text`};var _hoisted_14$2={key:3,class:`training-course-page__next-title training-course-page__preview-note`};var _hoisted_15$2={key:4,class:`training-course-page__next-title`};var _hoisted_16$2={class:`training-course-page__topics`};var _hoisted_17$2={class:`training-course-page__topic-head`};var _hoisted_18$2={class:`training-course-page__topic-index`,"aria-hidden":`true`};var _hoisted_19$2={class:`training-course-page__topic-text`};var _hoisted_20$2=[`aria-label`];var _hoisted_21$2={key:0,class:`training-course-page__empty`};var _hoisted_22$2={class:`training-course-page__path`};var _hoisted_23$2={class:`training-course-page__node`,"aria-hidden":`true`};var _hoisted_24$1={key:0,viewBox:`0 0 24 24`};var _hoisted_25$1={key:1,viewBox:`0 0 24 24`};var _hoisted_26$1={key:2};var _hoisted_27$1={class:`training-course-page__card`};var _hoisted_28$1={class:`training-course-page__card-main`};var _hoisted_29$1={class:`training-course-page__lesson-title`};var _hoisted_30$1={class:`training-course-page__lesson-meta`};var _hoisted_31$1={key:0};var _hoisted_32$1={key:0,class:`training-course-page__earlier`};var _hoisted_33$1={class:`training-course-page__identity`};var _sfc_main$3={__name:`TrainingCoursePage`,props:{course:{type:Object,required:true},progress:{type:Object,required:true},startAllowed:Boolean,canTryPreviews:Boolean,resumeAllowed:Boolean},emits:[`back`,`start`,`resume`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const complete=computed(()=>Boolean(props.progress.total&&props.progress.completed===props.progress.total));const availability=computed(()=>courseStatusLabel(props.course));const preview=computed(()=>previewCourse(props.course));const isNext=lesson=>Boolean(props.progress.next&&props.progress.next.code===lesson.code&&props.progress.next.hash===lesson.hash);const path=computed(()=>{let step=0;return props.progress.topics.map((topic,index)=>({topic,index:index+1,done:topic.lessons.filter(value=>value.status===`completed`).length,lessons:topic.lessons.map(value=>({...value,step:++step,next:isNext(value.lesson)}))}))});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`training-course-page`,"aria-label":`Course ${__props.course.title}`},[createBaseVNode(`div`,_hoisted_2$3,[createVNode(VBtn,{variant:`text`,"min-height":`48`,class:`training-course-page__back-btn`,onClick:_cache[0]||(_cache[0]=$event=>emit(`back`))},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createBaseVNode(`svg`,{class:`training-course-page__back-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M15.4 7.4 14 6l-6 6 6 6 1.4-1.4L10.8 12z`})],-1),createTextVNode(` Back to courses `,-1)])]),_:1})]),createBaseVNode(`header`,{class:normalizeClass([`training-course-page__hero`,{"is-complete":complete.value}])},[createVNode(TrainingCourseArt_default,{class:`training-course-page__cover`,"course-id":__props.course.courseId,title:__props.course.title,statuses:__props.progress.lessons.map(value=>value.status)},null,8,[`course-id`,`title`,`statuses`]),createBaseVNode(`div`,_hoisted_3$3,[createBaseVNode(`div`,_hoisted_4$2,[_cache[4]||(_cache[4]=createBaseVNode(`p`,{class:`training-course-page__eyebrow`},`Course`,-1)),createBaseVNode(`h3`,_hoisted_5$2,toDisplayString(__props.course.title),1),createBaseVNode(`div`,_hoisted_6$2,[createBaseVNode(`span`,_hoisted_7$2,[createBaseVNode(`code`,null,toDisplayString(__props.course.courseId)+` · `+toDisplayString(__props.course.release),1)]),createBaseVNode(`span`,{class:normalizeClass([`training-course-page__chip`,{"is-muted":!__props.course.enabled||__props.course.status!==`released`}])},toDisplayString(availability.value),3),createBaseVNode(`span`,_hoisted_8$2,toDisplayString(__props.progress.topics.length)+` `+toDisplayString(__props.progress.topics.length===1?`topic`:`topics`),1)]),createBaseVNode(`p`,_hoisted_9$2,toDisplayString(__props.progress.completed)+` of `+toDisplayString(__props.progress.total)+` lessons complete`,1)]),createVNode(TrainingProgressRing_default,{class:`training-course-page__ring`,value:__props.progress.completed,max:__props.progress.total,size:88,stroke:9,label:`${__props.progress.completed} of ${__props.progress.total} lessons complete`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_10$2,[createBaseVNode(`strong`,null,toDisplayString(__props.progress.completed),1),createTextVNode(`/`+toDisplayString(__props.progress.total),1)])]),_:1},8,[`value`,`max`,`label`])])],2),createBaseVNode(`div`,{class:normalizeClass([`training-course-page__next`,{"is-complete":complete.value}])},[__props.progress.activeHere?(openBlock(),createElementBlock(Fragment,{key:0},[_cache[6]||(_cache[6]=createBaseVNode(`div`,{class:`training-course-page__next-text`},[createBaseVNode(`p`,{class:`training-course-page__next-label`},`Lesson in progress`),createBaseVNode(`p`,{class:`training-course-page__next-title`},`Pick up where you left off.`)],-1)),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,rounded:`pill`,disabled:!__props.resumeAllowed,onClick:_cache[1]||(_cache[1]=$event=>emit(`resume`))},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Continue`,-1)])]),_:1},8,[`disabled`])],64)):__props.progress.next?(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`div`,_hoisted_11$2,[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`training-course-page__next-label`},`Up next`,-1)),createBaseVNode(`p`,_hoisted_12$2,toDisplayString(__props.progress.next.title)+` · `+toDisplayString(__props.progress.next.code),1)]),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,rounded:`pill`,disabled:!__props.startAllowed,onClick:_cache[2]||(_cache[2]=$event=>emit(`start`,__props.progress.next))},{default:withCtx(()=>[createTextVNode(toDisplayString(preview.value?`Try preview`:`Start next lesson`),1)]),_:1},8,[`disabled`])],64)):complete.value?(openBlock(),createElementBlock(`div`,_hoisted_13$2,[..._cache[8]||(_cache[8]=[createBaseVNode(`p`,{class:`training-course-page__next-label`},`All lessons done`,-1),createBaseVNode(`p`,{class:`training-course-page__next-title`},`Course complete.`,-1)])])):preview.value&&!__props.canTryPreviews?(openBlock(),createElementBlock(`p`,_hoisted_14$2,toDisplayString(unref(previewNote)),1)):(openBlock(),createElementBlock(`p`,_hoisted_15$2,`No lesson in this course can be started here.`))],2),createBaseVNode(`ol`,_hoisted_16$2,[(openBlock(true),createElementBlock(Fragment,null,renderList(path.value,({topic,index,done,lessons})=>{return openBlock(),createElementBlock(`li`,{key:JSON.stringify([topic.topicId,topic.release]),class:`training-course-page__topic`},[createBaseVNode(`div`,_hoisted_17$2,[createBaseVNode(`span`,_hoisted_18$2,toDisplayString(index),1),createBaseVNode(`div`,_hoisted_19$2,[createBaseVNode(`h4`,null,toDisplayString(topic.title),1),createBaseVNode(`p`,null,toDisplayString(topic.topicId)+` · `+toDisplayString(topic.release),1)]),lessons.length?(openBlock(),createElementBlock(`span`,{key:0,class:`training-course-page__topic-done`,"aria-label":`${done} of ${lessons.length} lessons completed in this topic`},toDisplayString(done)+`/`+toDisplayString(lessons.length),9,_hoisted_20$2)):createCommentVNode(``,true)]),!lessons.length?(openBlock(),createElementBlock(`p`,_hoisted_21$2,`This topic has no displayed lesson choices.`)):createCommentVNode(``,true),createBaseVNode(`ol`,_hoisted_22$2,[(openBlock(true),createElementBlock(Fragment,null,renderList(lessons,({lesson,status,step,next,earlier})=>{return openBlock(),createElementBlock(`li`,{key:JSON.stringify([lesson.code,lesson.hash]),class:normalizeClass([`training-course-page__lesson`,[`is-${status}`,{"is-next":next&&!__props.progress.activeHere}]])},[createBaseVNode(`span`,_hoisted_23$2,[status===`completed`?(openBlock(),createElementBlock(`svg`,_hoisted_24$1,[..._cache[9]||(_cache[9]=[createBaseVNode(`path`,{d:`M9.5 16.2 5.3 12l-1.4 1.4 5.6 5.6 11-11-1.4-1.4z`},null,-1)])])):status===`in-progress`?(openBlock(),createElementBlock(`svg`,_hoisted_25$1,[..._cache[10]||(_cache[10]=[createBaseVNode(`path`,{d:`M8 5.5v13l10.5-6.5z`},null,-1)])])):(openBlock(),createElementBlock(`span`,_hoisted_26$1,toDisplayString(step),1))]),createBaseVNode(`div`,_hoisted_27$1,[createBaseVNode(`div`,_hoisted_28$1,[createBaseVNode(`strong`,_hoisted_29$1,toDisplayString(lesson.title)+` · `+toDisplayString(lesson.code),1),createBaseVNode(`p`,_hoisted_30$1,[createBaseVNode(`span`,{class:normalizeClass([`training-course-page__status`,`is-${status}`])},toDisplayString(unref(statusLabels)[status]),3),_cache[11]||(_cache[11]=createBaseVNode(`span`,{"aria-hidden":`true`},` · `,-1)),createBaseVNode(`span`,null,toDisplayString(lesson.status===`published`?`Published`:`Draft — unavailable for new lessons`),1),!lesson.required?(openBlock(),createElementBlock(`span`,_hoisted_31$1,` · Optional`)):createCommentVNode(``,true)]),earlier?(openBlock(),createElementBlock(`p`,_hoisted_32$1,toDisplayString(unref(earlierCompletionLabel)(earlier)),1)):createCommentVNode(``,true),createBaseVNode(`details`,_hoisted_33$1,[_cache[12]||(_cache[12]=createBaseVNode(`summary`,null,`Lesson identity`,-1)),createBaseVNode(`code`,null,toDisplayString(lesson.hash),1)])]),unref(offered)(__props.course,lesson,__props.canTryPreviews)&&!__props.progress.activeHere?(openBlock(),createBlock(VBtn,{key:0,variant:next?`tonal`:`text`,color:`primary`,"min-height":`48`,rounded:`pill`,class:`training-course-page__start`,disabled:!__props.startAllowed,onClick:$event=>emit(`start`,lesson)},{default:withCtx(()=>[createTextVNode(toDisplayString(preview.value?`Try preview`:`Start lesson`),1)]),_:1},8,[`variant`,`disabled`,`onClick`])):createCommentVNode(``,true)])],2)}),128))])])}),128))])],8,_hoisted_1$3)}}};var TrainingCoursePage_default=_plugin_vue_export_helper_default(_sfc_main$3,[[`__scopeId`,`data-v-36fe7d2b`]]);var _hoisted_1$2=[`aria-busy`];var _hoisted_2$2={class:`tcc__head`};var _hoisted_3$2={class:`tcc__eyebrow`};var _hoisted_4$1={key:0,class:`tcc__loading`,role:`status`};var _hoisted_5$1={key:2,class:`tcc__note`,role:`status`};var _hoisted_6$1={key:3,class:`tcc__note`,role:`status`};var _hoisted_7$1=[`aria-label`];var _hoisted_8$1={class:`tcc__topic-title`};var _hoisted_9$1={key:0,class:`tcc__empty`};var _hoisted_10$1={class:`tcc__list`};var _hoisted_11$1=[`data-course`];var _hoisted_12$1={class:`tcc__course-main`};var _hoisted_13$1={class:`tcc__title`};var _hoisted_14$1={class:`tcc__chips`};var _hoisted_15$1={class:`tcc__chip`};var _hoisted_16$1={class:`tcc__chip`};var _hoisted_17$1={key:0,class:`tcc__chip tcc__chip--update`};var _hoisted_18$1={key:0,class:`tcc__detail`};var _hoisted_19$1={key:1,class:`tcc__detail`};var _hoisted_20$1={key:2,class:`tcc__detail`};var _hoisted_21$1={key:3,class:`tcc__progress`,role:`status`};var _hoisted_22$1={key:4,class:`tcc__failure`,role:`alert`};var _hoisted_23$1={class:`tcc__actions`};var _sfc_main$2={__name:`TrainingCourseCatalogue`,props:{availableResult:{type:Object,default:null},availableLoading:Boolean,availableError:{type:String,default:``},installState:{type:Object,default:null},busy:Boolean},emits:[`install`,`view`,`refresh`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const text=value=>typeof value===`string`&&value.length>0;const ready=computed(()=>props.availableResult?.ok===true&&props.availableResult.available===true&&Array.isArray(props.availableResult.domains)&&Array.isArray(props.availableResult.courses));const courses=computed(()=>ready.value?props.availableResult.courses.filter(course=>text(course?.courseId)&&text(course.release)&&text(course.title)):[]);const topics=computed(()=>{if(!ready.value)return[];const known=new Set(props.availableResult.domains.map(domain=>domain.domainId));const groups=props.availableResult.domains.map(domain=>({id:domain.domainId,title:domain.title,courses:courses.value.filter(course=>course.domainId===domain.domainId)}));const other=courses.value.filter(course=>!known.has(course.domainId));return other.length?[...groups,{id:``,title:`Other courses`,courses:other}]:groups});const key=course=>`${course.courseId}@${course.release}`;const plural=(count,word)=>`${count} ${word}${count===1?``:`s`}`;const stateOf=course=>props.installState&&props.installState.courseId===course.courseId&&props.installState.release===course.release?props.installState:null;function progressText(course){const progress=course.installing;if(!progress)return`Downloading and verifying the course…`;if(progress.phase===`queued`)return`Waiting for another course installation to finish…`;if(progress.phase===`catalogue`)return`Reading the official catalogue…`;if(progress.phase===`topic`)return`Downloading and verifying topic ${Math.min(progress.topicsDone+1,progress.topicsTotal)} of ${progress.topicsTotal}…`;if(progress.phase===`enable`)return`Enabling the course…`;return`Installing…`}const installedLabel={enabled:`Installed`,disabled:`Disabled by the owner`,conflict:`Conflicting copy installed`,"not-installed":`Not installed`};const installedTone={enabled:`enabled`,disabled:`disabled`,conflict:`disabled`,"not-installed":`neutral`};const installable=course=>course.installed===`not-installed`;function install(course){if(props.busy||!installable(course))return;emit(`install`,{courseId:course.courseId,release:course.release})}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`tcc training-course-catalogue`,"aria-labelledby":`tcc-heading`,"aria-busy":__props.availableLoading},[createBaseVNode(`header`,_hoisted_2$2,[createBaseVNode(`div`,null,[createBaseVNode(`p`,_hoisted_3$2,[createVNode(VIcon,{icon:unref(trainingIcons).download,size:`18`},null,8,[`icon`]),_cache[1]||(_cache[1]=createTextVNode(` Course catalogue`,-1))]),_cache[2]||(_cache[2]=createBaseVNode(`h3`,{id:`tcc-heading`},`Install a course`,-1)),_cache[3]||(_cache[3]=createBaseVNode(`p`,{class:`tcc__intro`},`Courses from the official Vibe64 catalogue, grouped by topic. Installing downloads and verifies the course on this server; it does not start a lesson.`,-1))])]),__props.availableLoading&&!ready.value?(openBlock(),createElementBlock(`div`,_hoisted_4$1,[createVNode(VProgressCircular,{indeterminate:``,size:`20`,width:`2`,color:`primary`}),_cache[4]||(_cache[4]=createBaseVNode(`span`,null,`Reading the course catalogue…`,-1))])):__props.availableError?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,"min-height":`40`,disabled:__props.busy,onClick:_cache[0]||(_cache[0]=$event=>emit(`refresh`))},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`disabled`])]),default:withCtx(()=>[createTextVNode(toDisplayString(__props.availableError)+` `,1)]),_:1})):__props.availableResult&&!ready.value?(openBlock(),createElementBlock(`p`,_hoisted_5$1,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(__props.availableResult.error||`The course catalogue is not available in this installation.`),1)])):ready.value&&!courses.value.length?(openBlock(),createElementBlock(`p`,_hoisted_6$1,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[6]||(_cache[6]=createBaseVNode(`span`,null,`The catalogue has no courses yet.`,-1))])):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(topics.value,topic=>{return openBlock(),createElementBlock(`section`,{key:topic.id||`other`,class:`tcc__topic`,"aria-label":`Topic ${topic.title}`},[createBaseVNode(`h4`,_hoisted_8$1,[createVNode(VIcon,{icon:unref(trainingIcons).layers,size:`20`},null,8,[`icon`]),createTextVNode(toDisplayString(topic.title),1)]),!topic.courses.length?(openBlock(),createElementBlock(`p`,_hoisted_9$1,`No courses in this topic yet.`)):createCommentVNode(``,true),createBaseVNode(`ul`,_hoisted_10$1,[(openBlock(true),createElementBlock(Fragment,null,renderList(topic.courses,course=>{return openBlock(),createElementBlock(`li`,{key:key(course),class:`tcc__course`,"data-course":key(course)},[createBaseVNode(`div`,_hoisted_12$1,[createBaseVNode(`strong`,_hoisted_13$1,toDisplayString(course.title),1),createBaseVNode(`p`,_hoisted_14$1,[createBaseVNode(`span`,_hoisted_15$1,[createBaseVNode(`code`,null,toDisplayString(course.release),1)]),createBaseVNode(`span`,{class:normalizeClass([`tcc__chip`,course.status===`released`?`tcc__chip--enabled`:`tcc__chip--preview`])},toDisplayString(course.status===`released`?`Released`:`Preview`),3),createBaseVNode(`span`,_hoisted_16$1,toDisplayString(plural(course.lessonCount,`lesson`)),1),createBaseVNode(`span`,{class:normalizeClass([`tcc__chip`,`tcc__chip--${installedTone[course.installed]||`neutral`}`])},toDisplayString(installedLabel[course.installed]||course.installed),3),course.updateFrom?(openBlock(),createElementBlock(`span`,_hoisted_17$1,[createVNode(VIcon,{icon:unref(trainingIcons).update,size:`14`},null,8,[`icon`]),createTextVNode(`Update available: `+toDisplayString(course.release),1)])):createCommentVNode(``,true)]),course.updateFrom?(openBlock(),createElementBlock(`p`,_hoisted_18$1,`You have `+toDisplayString(course.updateFrom)+`. Updating keeps your saved lessons and progress.`,1)):createCommentVNode(``,true),course.status!==`released`?(openBlock(),createElementBlock(`p`,_hoisted_19$1,`Preview course: it can be installed; until it is released, only the workspace owner can try its lessons from Courses.`)):createCommentVNode(``,true),course.installed===`disabled`?(openBlock(),createElementBlock(`p`,_hoisted_20$1,`Ask the owner to enable this release again.`)):createCommentVNode(``,true),stateOf(course)?.phase===`installing`?(openBlock(),createElementBlock(`p`,_hoisted_21$1,[createVNode(VProgressCircular,{indeterminate:``,size:`18`,width:`2`,color:`primary`}),createBaseVNode(`span`,null,toDisplayString(progressText(course)),1)])):stateOf(course)?.phase===`failed`?(openBlock(),createElementBlock(`p`,_hoisted_22$1,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`18`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(stateOf(course).message),1)])):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_23$1,[course.installed===`enabled`?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,rounded:`pill`,"min-height":`48`,"append-icon":unref(trainingIcons).arrowRight,onClick:$event=>emit(`view`,{courseId:course.courseId,release:course.release})},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`View course`,-1)])]),_:1},8,[`append-icon`,`onClick`])):installable(course)?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:course.updateFrom?`flat`:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":course.updateFrom?unref(trainingIcons).update:unref(trainingIcons).download,loading:stateOf(course)?.phase===`installing`,disabled:__props.busy,onClick:$event=>install(course)},{default:withCtx(()=>[createTextVNode(toDisplayString(stateOf(course)?.phase===`failed`?course.updateFrom?`Retry update`:`Retry install`:course.updateFrom?`Update`:`Install`),1)]),_:2},1032,[`variant`,`prepend-icon`,`loading`,`disabled`,`onClick`])):createCommentVNode(``,true)])],8,_hoisted_11$1)}),128))])],8,_hoisted_7$1)}),128))],8,_hoisted_1$2)}}};var TrainingCourseCatalogue_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-ce747b72`]]);var _hoisted_1$1=[`aria-busy`];var _hoisted_2$1={class:`tlp-hero`};var _hoisted_3$1={class:`tlp-hero__text`};var _hoisted_4={class:`tlp-eyebrow`};var _hoisted_5={key:0,class:`tlp-hero__meta`};var _hoisted_6={key:0,class:`tlp-skeleton tlp-skeleton--saved`,role:`status`,"aria-label":`Loading saved lesson`};var _hoisted_7={key:2,class:`tlp-note`,role:`status`};var _hoisted_8={key:3,class:`tlp-saved training-lesson-picker__saved`,"aria-labelledby":`tlp-saved-heading`};var _hoisted_9={class:`tlp-saved__ring-value`};var _hoisted_10={key:1,class:`tlp-saved__badge`,"aria-hidden":`true`};var _hoisted_11={class:`tlp-saved__body`};var _hoisted_12={id:`tlp-saved-heading`,class:`tlp-eyebrow tlp-eyebrow--learning`};var _hoisted_13={class:`tlp-saved__title`};var _hoisted_14={class:`tlp-saved__meta`};var _hoisted_15={key:0,class:`tlp-saved__status`};var _hoisted_16={key:1,class:`tlp-saved__status`};var _hoisted_17={key:2,class:`tlp-note tlp-note--warn`};var _hoisted_18={key:3,class:`tlp-note`};var _hoisted_19={class:`tlp-saved__actions`};var _hoisted_20={class:`tlp-identity`};var _hoisted_21={key:4,class:`tlp-grid`,role:`status`,"aria-label":`Loading installed courses`};var _hoisted_22={key:6,class:`tlp-empty`,role:`status`};var _hoisted_23={key:7,class:`tlp-empty`,role:`status`};var _hoisted_24={key:0};var _hoisted_25={key:1};var _hoisted_26={key:0,class:`tlp-grid training-lesson-picker__courses`};var _hoisted_27=[`aria-label`];var _hoisted_28={class:`tlp-card__cover`};var _hoisted_29={class:`tlp-card__chips`};var _hoisted_30={key:0,class:`tlp-chip tlp-chip--learning`};var _hoisted_31={key:1,class:`tlp-chip tlp-chip--success`};var _hoisted_32={key:2,class:`tlp-chip tlp-chip--learning`};var _hoisted_33={class:`tlp-card__body`};var _hoisted_34={class:`tlp-card__title`};var _hoisted_35={class:`tlp-card__id`};var _hoisted_36={class:`tlp-card__facts`};var _hoisted_37={class:`tlp-card__progress`};var _hoisted_38={class:`tlp-card__count`};var _hoisted_39={key:0,class:`tlp-card__next`};var _hoisted_40={key:1,class:`tlp-card__next tlp-card__preview-note`};var _hoisted_41={class:`tlp-card__actions`};var _hoisted_42={class:`tlp-new__icon`,"aria-hidden":`true`};var _hoisted_43={key:2};var _hoisted_44={key:10,class:`training-lesson-picker__start`};var _hoisted_45={key:0,class:`tlp-note`};var _hoisted_46={key:1,class:`tlp-note tlp-note--progress`,role:`status`};var _hoisted_47={key:2,class:`tlp-note tlp-note--warn`};var _hoisted_48={key:3,class:`tlp-note`};var _hoisted_49={key:11,class:`tlp-history training-lesson-picker__history`};var _sfc_main$1={__name:`TrainingLessonPicker`,props:{catalogueResult:{type:Object,default:null},learningResult:{type:Object,default:null},catalogueLoading:Boolean,learningLoading:Boolean,catalogueError:{type:String,default:``},learningError:{type:String,default:``},busy:Boolean,canStart:Boolean,canResume:Boolean,createCourse:{type:Function,default:null},starting:Boolean,startUnconfirmed:Boolean,availableResult:{type:Object,default:null},availableLoading:Boolean,availableError:{type:String,default:``},installState:{type:Object,default:null}},emits:[`refresh`,`start`,`resume`,`install`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const selectionId=ref(``);const text=value=>typeof value===`string`&&value.length>0;const revision=value=>Number.isSafeInteger(value)&&value>=0;const lessonTitlesMissing=computed(()=>Array.isArray(props.catalogueResult?.courses)&&props.catalogueResult.courses.some(course=>Array.isArray(course?.lessons)&&course.lessons.some(lesson=>!text(lesson?.title))));const catalogueInvalid=computed(()=>{const result=props.catalogueResult;return result?.ok===true&&result.available===true&&(!revision(result.revision)||!Array.isArray(result.courses)||result.courses.some(course=>!text(course?.courseId)||!text(course.release)||!text(course.title)||typeof course.enabled!==`boolean`||!text(course.status)||!Array.isArray(course.lessons)||!Array.isArray(course.topics)||course.topics.some(topic=>!text(topic?.topicId)||!text(topic.release)||!text(topic.title))||course.lessons.some(lesson=>!text(lesson?.code)||!text(lesson.hash)||!text(lesson.topicId)||!text(lesson.topicRelease)||!text(lesson.status)||!text(lesson.title))))});const courses=computed(()=>!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.available===true?props.catalogueResult.courses:[]);function choiceId(course,lesson){return JSON.stringify([course.courseId,course.release,lesson.code,lesson.hash,lesson.topicId,lesson.topicRelease])}const choices=computed(()=>courses.value.flatMap(course=>course.lessons.map(lesson=>({course,lesson,id:choiceId(course,lesson)}))));const selected=computed(()=>choices.value.find(choice=>choice.id===selectionId.value)||null);watch(choices,values=>{if(!props.catalogueLoading&&!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.available===true&&!values.some(value=>value.id===selectionId.value))selectionId.value=``},{immediate:true});function hasDisplayPin(attempt){return text(attempt?.attemptId)&&text(attempt.pin?.course?.courseId)&&text(attempt.pin.course.release)&&text(attempt.pin?.topic?.topicId)&&text(attempt.pin.topic.release)&&text(attempt.pin.topic.commit)&&text(attempt.pin?.lesson?.code)&&text(attempt.pin.lesson.hash)}const learningInvalid=computed(()=>{const result=props.learningResult;if(result?.ok!==true||result.available!==true)return false;if(!revision(result.revision)||!Object.hasOwn(result,`active`)||result.active!==null&&(!hasDisplayPin(result.active)||result.active.ended)||!Array.isArray(result.history)||result.history.some(attempt=>!hasDisplayPin(attempt)||!attempt.ended))return true;if(result.lessonProgress!==void 0&&(!Array.isArray(result.lessonProgress)||result.lessonProgress.some(value=>!text(value?.lessonCode)||!text(value.lessonHash)||!revision(value.required)||!revision(value.passed)||value.passed>value.required||typeof value.completed!==`boolean`||typeof value.open!==`boolean`)))return true;const completion=result.completion;return completion!=null&&(!result.active||!revision(completion.required)||!revision(completion.passed)||completion.passed>completion.required||typeof completion.completed!==`boolean`||completion.lessonCode!==result.active.pin.lesson.code||completion.lessonHash!==result.active.pin.lesson.hash)});const learningReady=computed(()=>!props.learningLoading&&!props.learningError&&!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true);const savedAttempt=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.active:null);const history=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.history:[]);const completion=computed(()=>savedAttempt.value?props.learningResult.completion:null);const startPossible=computed(()=>Boolean(props.canStart&&!props.starting&&!props.startUnconfirmed&&!props.busy&&!props.catalogueLoading&&!props.catalogueError&&learningReady.value&&!savedAttempt.value));const canTryPreviews=computed(()=>!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.canTryPreviews===true);const startEnabled=computed(()=>startPossible.value&&selected.value&&offered(selected.value.course,selected.value.lesson,canTryPreviews.value));const resumeEnabled=computed(()=>props.canResume&&!props.busy&&learningReady.value&&savedAttempt.value&&!savedAttempt.value.ended);function requestStart(){if(!startEnabled.value)return;const{course,lesson}=selected.value;emit(`start`,{courseId:course.courseId,release:course.release,lessonCode:lesson.code,expectedRevision:props.learningResult.revision})}function requestResume(){if(resumeEnabled.value)emit(`resume`,{attemptId:savedAttempt.value.attemptId})}function startLesson(course,lesson){selectionId.value=choiceId(course,lesson);requestStart()}const courseKey=course=>JSON.stringify([course.courseId,course.release]);const lessonProgress=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.lessonProgress||[]:[]);const releaseOrder=(left,right)=>{const a=left.split(`.`).map(Number),b=right.split(`.`).map(Number);return a[0]-b[0]||a[1]-b[1]||a[2]-b[2]};const superseded=course=>!course.enabled&&courses.value.some(other=>other.courseId===course.courseId&&other.enabled&&releaseOrder(other.release,course.release)>0);const summaries=computed(()=>courses.value.map(course=>({course,key:courseKey(course),progress:courseProgress(course,lessonProgress.value,savedAttempt.value,history.value,{canTryPreviews:canTryPreviews.value})})).filter(summary=>!superseded(summary.course)||summary.progress.activeHere));const availableCourses=computed(()=>props.availableResult?.ok===true&&Array.isArray(props.availableResult.courses)?props.availableResult.courses:[]);const updateFor=course=>availableCourses.value.find(value=>value.courseId===course.courseId&&value.updateFrom===course.release&&value.installed===`not-installed`)||null;const showCatalogue=computed(()=>Boolean(props.availableResult||props.availableLoading||props.availableError));function requestInstall(selection){if(!props.busy)emit(`install`,selection)}function viewInstalled({courseId,release}){openCourseKey.value=courseKey({courseId,release})}const openCourseKey=ref(``);const openCourse=computed(()=>summaries.value.find(summary=>summary.key===openCourseKey.value)||null);watch(summaries,values=>{if(!props.catalogueLoading&&openCourseKey.value&&!values.some(value=>value.key===openCourseKey.value))openCourseKey.value=``});const creating=ref(false);const canCreateCourses=computed(()=>typeof props.createCourse===`function`&&!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.canCreateCourses===true);const availableTopics=computed(()=>[...new Map(courses.value.filter(course=>course.enabled&&course.status===`released`).flatMap(course=>course.topics).map(topic=>[JSON.stringify([topic.topicId,topic.release]),topic])).values()]);async function requestCreateCourse(input){if(!canCreateCourses.value||props.busy)return;const result=await props.createCourse({...input,expectedRevision:props.catalogueResult.revision});if(result?.ok!==true||!result.course)return;creating.value=false;openCourseKey.value=courseKey(result.course)}const savedPlace=computed(()=>{const pin=savedAttempt.value?.pin;if(!pin)return null;const course=courses.value.find(value=>value.courseId===pin.course.courseId&&value.release===pin.course.release);const lesson=course?.lessons.find(value=>value.code===pin.lesson.code&&value.hash===pin.lesson.hash);return{courseTitle:course?.title||``,lessonTitle:lesson?.title||``}});const statusTone=course=>!course.enabled?`disabled`:course.status===`released`?`enabled`:`preview`;const statusIcon={enabled:trainingIcons.checkCircle,preview:trainingIcons.eye,disabled:trainingIcons.cancel};const uniqueLessonCount=computed(()=>new Set(choices.value.map(({lesson})=>`${lesson.code}\n${lesson.hash}`)).size);const plural=(count,word)=>`${count} ${word}${count===1?``:`s`}`;return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:normalizeClass([`training-lesson-picker`,{"training-lesson-picker--course-open":openCourse.value}]),"aria-label":`Courses`,"aria-busy":__props.catalogueLoading||__props.learningLoading},[createBaseVNode(`header`,_hoisted_2$1,[_cache[11]||(_cache[11]=createBaseVNode(`svg`,{class:`tlp-hero__art`,viewBox:`0 0 240 160`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`circle`,{cx:`188`,cy:`34`,r:`58`,class:`tlp-hero__sun`}),createBaseVNode(`path`,{d:`M18 132 C 62 132, 64 92, 104 92 S 150 52, 196 52`,class:`tlp-hero__trail`}),createBaseVNode(`circle`,{cx:`18`,cy:`132`,r:`9`,class:`tlp-hero__stop tlp-hero__stop--done`}),createBaseVNode(`circle`,{cx:`104`,cy:`92`,r:`9`,class:`tlp-hero__stop tlp-hero__stop--done`}),createBaseVNode(`circle`,{cx:`196`,cy:`52`,r:`11`,class:`tlp-hero__stop`}),createBaseVNode(`path`,{d:`M190 52 l4.5 4.5 l8 -9`,class:`tlp-hero__tick`})],-1)),createBaseVNode(`div`,_hoisted_3$1,[createBaseVNode(`p`,_hoisted_4,[createVNode(VIcon,{icon:unref(trainingIcons).school,size:`18`},null,8,[`icon`]),_cache[7]||(_cache[7]=createTextVNode(` Learning`,-1))]),_cache[8]||(_cache[8]=createBaseVNode(`h2`,null,`Courses`,-1)),_cache[9]||(_cache[9]=createBaseVNode(`p`,null,`Choose a course to see its lessons and your progress, or resume your saved lesson.`,-1)),courses.value.length?(openBlock(),createElementBlock(`p`,_hoisted_5,toDisplayString(plural(courses.value.length,`course`))+` · `+toDisplayString(plural(uniqueLessonCount.value,`lesson`))+` installed `,1)):createCommentVNode(``,true)]),createVNode(VBtn,{class:`tlp-hero__refresh`,variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).refresh,disabled:__props.busy||__props.catalogueLoading||__props.learningLoading,onClick:_cache[0]||(_cache[0]=$event=>emit(`refresh`))},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Refresh courses`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])]),__props.learningLoading&&!savedAttempt.value?(openBlock(),createElementBlock(`div`,_hoisted_6,[..._cache[12]||(_cache[12]=[createStaticVNode(`<span class="tlp-shimmer tlp-shimmer--ring" data-v-e0ab4c87></span><span class="tlp-skeleton__lines" data-v-e0ab4c87><span class="tlp-shimmer" style="width:40%;" data-v-e0ab4c87></span><span class="tlp-shimmer" style="width:70%;" data-v-e0ab4c87></span><span class="tlp-shimmer" style="width:55%;" data-v-e0ab4c87></span></span>`,2)])])):createCommentVNode(``,true),__props.learningError||learningInvalid.value?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.learningError||`Saved learning could not be displayed. Refresh before requesting a lesson; no progress was changed.`),1)]),_:1})):!__props.learningLoading&&(!__props.learningResult||__props.learningResult.ok!==true||__props.learningResult.available!==true)?(openBlock(),createElementBlock(`p`,_hoisted_7,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(__props.learningResult?.error||`Saved learning is not available yet. No lesson has been started here.`),1)])):createCommentVNode(``,true),savedAttempt.value?(openBlock(),createElementBlock(`article`,_hoisted_8,[_cache[19]||(_cache[19]=createBaseVNode(`div`,{class:`tlp-saved__glow`,"aria-hidden":`true`},null,-1)),completion.value?(openBlock(),createBlock(TrainingProgressRing_default,{key:0,class:`tlp-saved__ring`,value:completion.value.passed,max:completion.value.required,size:96,stroke:10,label:`${completion.value.passed} of ${completion.value.required} required assessments passed`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_9,[createBaseVNode(`strong`,null,toDisplayString(completion.value.passed),1),createTextVNode(`/`+toDisplayString(completion.value.required),1)])]),_:1},8,[`value`,`max`,`label`])):(openBlock(),createElementBlock(`div`,_hoisted_10,[createVNode(VIcon,{icon:unref(trainingIcons).bookmark,size:`36`},null,8,[`icon`])])),createBaseVNode(`div`,_hoisted_11,[createBaseVNode(`p`,_hoisted_12,`Saved lesson · `+toDisplayString(savedAttempt.value.pin.lesson.code),1),createBaseVNode(`h3`,_hoisted_13,toDisplayString(savedPlace.value.lessonTitle||`Continue where you left off`),1),createBaseVNode(`p`,_hoisted_14,[savedPlace.value.courseTitle?(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(toDisplayString(savedPlace.value.courseTitle)+` · `,1)],64)):createCommentVNode(``,true),createTextVNode(toDisplayString(savedAttempt.value.pin.course.courseId)+` · `+toDisplayString(savedAttempt.value.pin.course.release),1)]),completion.value?(openBlock(),createElementBlock(`p`,_hoisted_15,[completion.value.completed?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).checkCircle,size:`18`,color:`success`},null,8,[`icon`])):createCommentVNode(``,true),createTextVNode(` `+toDisplayString(completion.value.passed)+` of `+toDisplayString(completion.value.required)+` required assessments passed. `+toDisplayString(completion.value.completed?`Required assessments complete.`:`Continue the remaining assessments.`),1)])):(openBlock(),createElementBlock(`p`,_hoisted_16,`Saved attempt retained. Completion has not been reported.`)),__props.learningResult.activeSummaryCurrent===false?(openBlock(),createElementBlock(`p`,_hoisted_17,`The saved summary needs reconciliation. Resume rechecks this same attempt; reading it does not repair it.`)):createCommentVNode(``,true),!__props.canResume?(openBlock(),createElementBlock(`p`,_hoisted_18,`Lesson resume is unavailable in this installation. Your saved attempt remains visible.`)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_19,[createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,size:`large`,"min-height":`48`,"prepend-icon":unref(trainingIcons).play,disabled:!resumeEnabled.value,onClick:requestResume},{default:withCtx(()=>[..._cache[13]||(_cache[13]=[createTextVNode(`Resume saved lesson`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])]),createBaseVNode(`details`,_hoisted_20,[createBaseVNode(`summary`,null,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`18`},null,8,[`icon`]),_cache[14]||(_cache[14]=createBaseVNode(`span`,null,`Saved lesson identity`,-1)),createVNode(VIcon,{class:`tlp-chevron`,icon:unref(trainingIcons).chevronDown,size:`18`},null,8,[`icon`])]),createBaseVNode(`dl`,null,[_cache[15]||(_cache[15]=createBaseVNode(`dt`,null,`Topic`,-1)),createBaseVNode(`dd`,null,toDisplayString(savedAttempt.value.pin.topic.topicId)+` · `+toDisplayString(savedAttempt.value.pin.topic.release),1),_cache[16]||(_cache[16]=createBaseVNode(`dt`,null,`Commit`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.pin.topic.commit),1)]),_cache[17]||(_cache[17]=createBaseVNode(`dt`,null,`Lesson hash`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.pin.lesson.hash),1)]),_cache[18]||(_cache[18]=createBaseVNode(`dt`,null,`Attempt`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.attemptId),1)])])])])])):createCommentVNode(``,true),__props.catalogueLoading&&!courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_21,[(openBlock(),createElementBlock(Fragment,null,renderList(3,index=>{return createBaseVNode(`div`,{key:index,class:`tlp-skeleton tlp-skeleton--card`},[..._cache[20]||(_cache[20]=[createStaticVNode(`<span class="tlp-shimmer tlp-shimmer--art" data-v-e0ab4c87></span><span class="tlp-skeleton__lines" data-v-e0ab4c87><span class="tlp-shimmer" style="width:65%;height:18px;" data-v-e0ab4c87></span><span class="tlp-shimmer" style="width:45%;" data-v-e0ab4c87></span><span class="tlp-shimmer" style="width:80%;" data-v-e0ab4c87></span></span>`,2)])])}),64))])):createCommentVNode(``,true),__props.catalogueError||catalogueInvalid.value?(openBlock(),createBlock(VAlert,{key:5,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.catalogueError||(lessonTitlesMissing.value?`Lesson titles are unavailable. Refresh courses; your saved lesson and history remain retained.`:`Installed courses could not be displayed. Refresh or ask the owner to restore the exact content; nothing was installed or enabled.`)),1)]),_:1})):!__props.catalogueLoading&&(!__props.catalogueResult||__props.catalogueResult.ok!==true||__props.catalogueResult.available!==true)?(openBlock(),createElementBlock(`div`,_hoisted_22,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`32`,class:`tlp-empty__icon`},null,8,[`icon`]),createBaseVNode(`p`,null,toDisplayString(__props.catalogueResult?.error||`Installed courses are not available yet.`),1)])):!__props.catalogueLoading&&courses.value.length===0?(openBlock(),createElementBlock(`div`,_hoisted_23,[_cache[21]||(_cache[21]=createBaseVNode(`svg`,{class:`tlp-empty__art`,viewBox:`0 0 120 80`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`rect`,{x:`10`,y:`66`,width:`100`,height:`6`,rx:`3`,class:`tlp-empty__shelf`}),createBaseVNode(`rect`,{x:`24`,y:`30`,width:`16`,height:`36`,rx:`3`,class:`tlp-empty__book`}),createBaseVNode(`rect`,{x:`44`,y:`22`,width:`14`,height:`44`,rx:`3`,class:`tlp-empty__book tlp-empty__book--alt`}),createBaseVNode(`rect`,{x:`70`,y:`40`,width:`16`,height:`26`,rx:`3`,class:`tlp-empty__book tlp-empty__book--ghost`,transform:`rotate(-12 78 53)`})],-1)),showCatalogue.value?(openBlock(),createElementBlock(`p`,_hoisted_24,`No courses are installed yet. Choose a course in the catalogue below and select Install.`)):(openBlock(),createElementBlock(`p`,_hoisted_25,`No courses are installed. Ask the owner to install and enable a course; this page cannot install one.`))])):createCommentVNode(``,true),openCourse.value?(openBlock(),createBlock(TrainingCoursePage_default,{key:8,course:openCourse.value.course,progress:openCourse.value.progress,"start-allowed":startPossible.value,"can-try-previews":canTryPreviews.value,"resume-allowed":!!resumeEnabled.value,onBack:_cache[1]||(_cache[1]=$event=>openCourseKey.value=``),onStart:_cache[2]||(_cache[2]=$event=>startLesson(openCourse.value.course,$event)),onResume:requestResume},null,8,[`course`,`progress`,`start-allowed`,`can-try-previews`,`resume-allowed`])):(openBlock(),createElementBlock(Fragment,{key:9},[courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_26,[(openBlock(true),createElementBlock(Fragment,null,renderList(summaries.value,({course,key,progress},index)=>{return openBlock(),createElementBlock(`article`,{key,class:normalizeClass([`tlp-card`,{"tlp-card--active":progress.activeHere,"tlp-card--off":statusTone(course)!==`enabled`}]),style:normalizeStyle({"--tlp-index":index}),"aria-label":course.title},[createBaseVNode(`div`,_hoisted_28,[createVNode(TrainingCourseArt_default,{"course-id":course.courseId,title:course.title,statuses:progress.lessons.map(value=>value.status)},null,8,[`course-id`,`title`,`statuses`]),createBaseVNode(`div`,_hoisted_29,[progress.activeHere?(openBlock(),createElementBlock(`span`,_hoisted_30,[createVNode(VIcon,{icon:unref(trainingIcons).bookmark,size:`14`},null,8,[`icon`]),_cache[22]||(_cache[22]=createTextVNode(`Saved lesson`,-1))])):progress.total&&progress.completed===progress.total?(openBlock(),createElementBlock(`span`,_hoisted_31,[createVNode(VIcon,{icon:unref(trainingIcons).trophy,size:`14`},null,8,[`icon`]),_cache[23]||(_cache[23]=createTextVNode(`Course complete`,-1))])):createCommentVNode(``,true),createBaseVNode(`span`,{class:normalizeClass([`tlp-chip`,`tlp-chip--${statusTone(course)}`])},[createVNode(VIcon,{icon:statusIcon[statusTone(course)],size:`14`},null,8,[`icon`]),createTextVNode(toDisplayString(unref(courseStatusLabel)(course)),1)],2),updateFor(course)?(openBlock(),createElementBlock(`span`,_hoisted_32,[createVNode(VIcon,{icon:unref(trainingIcons).update,size:`14`},null,8,[`icon`]),createTextVNode(`Update available: `+toDisplayString(updateFor(course).release),1)])):createCommentVNode(``,true)])]),createBaseVNode(`div`,_hoisted_33,[createBaseVNode(`h3`,_hoisted_34,toDisplayString(course.title),1),createBaseVNode(`p`,_hoisted_35,[createBaseVNode(`code`,null,toDisplayString(course.courseId)+` · `+toDisplayString(course.release),1)]),createBaseVNode(`p`,_hoisted_36,[createBaseVNode(`span`,null,[createVNode(VIcon,{icon:unref(trainingIcons).layers,size:`16`},null,8,[`icon`]),createTextVNode(toDisplayString(plural(course.topics.length,`topic`)),1)]),createBaseVNode(`span`,null,[createVNode(VIcon,{icon:unref(trainingIcons).book,size:`16`},null,8,[`icon`]),createTextVNode(toDisplayString(plural(course.lessons.length,`lesson`)),1)])]),createBaseVNode(`div`,_hoisted_37,[createVNode(TrainingProgressRing_default,{value:progress.completed,max:progress.total,size:48,stroke:5,label:`${course.title}: ${progress.completed} of ${progress.total} lessons complete`},null,8,[`value`,`max`,`label`]),createBaseVNode(`div`,null,[createBaseVNode(`p`,_hoisted_38,toDisplayString(progress.completed)+` of `+toDisplayString(progress.total)+` lessons complete`,1),progress.next&&!progress.activeHere?(openBlock(),createElementBlock(`p`,_hoisted_39,`Next: `+toDisplayString(progress.next.title),1)):unref(previewCourse)(course)&&!canTryPreviews.value&&!progress.activeHere?(openBlock(),createElementBlock(`p`,_hoisted_40,toDisplayString(unref(previewNote)),1)):createCommentVNode(``,true)])])]),createBaseVNode(`div`,_hoisted_41,[progress.activeHere?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).play,disabled:!resumeEnabled.value,onClick:requestResume},{default:withCtx(()=>[..._cache[24]||(_cache[24]=[createTextVNode(`Continue`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):progress.next?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).play,disabled:!startPossible.value,onClick:$event=>startLesson(course,progress.next)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(previewCourse)(course)?`Try preview`:`Start`),1)]),_:2},1032,[`prepend-icon`,`disabled`,`onClick`])):createCommentVNode(``,true),updateFor(course)?(openBlock(),createBlock(VBtn,{key:2,variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).update,loading:__props.installState?.phase===`installing`&&__props.installState.courseId===course.courseId,disabled:__props.busy,onClick:$event=>requestInstall({courseId:course.courseId,release:updateFor(course).release})},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(`Update`,-1)])]),_:1},8,[`prepend-icon`,`loading`,`disabled`,`onClick`])):createCommentVNode(``,true),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"append-icon":unref(trainingIcons).arrowRight,onClick:$event=>openCourseKey.value=key},{default:withCtx(()=>[..._cache[26]||(_cache[26]=[createTextVNode(`View course`,-1)])]),_:1},8,[`append-icon`,`onClick`])])],14,_hoisted_27)}),128)),canCreateCourses.value&&!creating.value?(openBlock(),createElementBlock(`div`,{key:0,class:`tlp-new`,style:normalizeStyle({"--tlp-index":summaries.value.length})},[createBaseVNode(`span`,_hoisted_42,[createVNode(VIcon,{icon:unref(trainingIcons).path,size:`28`},null,8,[`icon`])]),_cache[28]||(_cache[28]=createBaseVNode(`p`,null,`Combine installed topics into a course of your own.`,-1)),createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:__props.busy||__props.catalogueLoading,onClick:_cache[3]||(_cache[3]=$event=>creating.value=true)},{default:withCtx(()=>[..._cache[27]||(_cache[27]=[createTextVNode(`New course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])],4)):createCommentVNode(``,true)])):createCommentVNode(``,true),creating.value&&canCreateCourses.value?(openBlock(),createBlock(TrainingCourseCreator_default,{key:1,topics:availableTopics.value,busy:__props.busy,onCreate:requestCreateCourse,onCancel:_cache[4]||(_cache[4]=$event=>creating.value=false)},null,8,[`topics`,`busy`])):canCreateCourses.value&&!courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_43,[createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:__props.busy||__props.catalogueLoading,onClick:_cache[5]||(_cache[5]=$event=>creating.value=true)},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`New course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])])):createCommentVNode(``,true),showCatalogue.value&&!creating.value?(openBlock(),createBlock(TrainingCourseCatalogue_default,{key:3,"available-result":__props.availableResult,"available-loading":__props.availableLoading,"available-error":__props.availableError,"install-state":__props.installState,busy:__props.busy,onInstall:requestInstall,onView:viewInstalled,onRefresh:_cache[6]||(_cache[6]=$event=>emit(`refresh`))},null,8,[`available-result`,`available-loading`,`available-error`,`install-state`,`busy`])):createCommentVNode(``,true)],64)),courses.value.length&&(savedAttempt.value||__props.starting||__props.startUnconfirmed||!__props.canStart)?(openBlock(),createElementBlock(`div`,_hoisted_44,[savedAttempt.value?(openBlock(),createElementBlock(`p`,_hoisted_45,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[30]||(_cache[30]=createBaseVNode(`span`,null,`Resume your saved lesson. Starting a different lesson requires explicitly ending that attempt first; its history remains retained.`,-1))])):__props.starting?(openBlock(),createElementBlock(`p`,_hoisted_46,[createVNode(VProgressCircular,{indeterminate:``,size:`20`,width:`2`,color:`primary`}),_cache[31]||(_cache[31]=createBaseVNode(`span`,null,`Starting the selected lesson and preparing its practice project. Its teacher conversation opens when this finishes.`,-1))])):__props.startUnconfirmed?(openBlock(),createElementBlock(`p`,_hoisted_47,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[32]||(_cache[32]=createBaseVNode(`span`,null,`The last lesson start was not confirmed. Use Retry lesson start to repeat that same request.`,-1))])):!__props.canStart?(openBlock(),createElementBlock(`p`,_hoisted_48,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[33]||(_cache[33]=createBaseVNode(`span`,null,`Starting lessons is unavailable in this installation.`,-1))])):createCommentVNode(``,true)])):createCommentVNode(``,true),history.value.length?(openBlock(),createElementBlock(`details`,_hoisted_49,[createBaseVNode(`summary`,null,[createVNode(VIcon,{icon:unref(trainingIcons).history,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,`Saved lesson history (`+toDisplayString(history.value.length)+`)`,1),createVNode(VIcon,{class:`tlp-chevron`,icon:unref(trainingIcons).chevronDown,size:`18`},null,8,[`icon`])]),createBaseVNode(`ol`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(history.value,attempt=>{return openBlock(),createElementBlock(`li`,{key:attempt.attemptId},[createBaseVNode(`strong`,null,toDisplayString(attempt.pin.lesson.code),1),createTextVNode(` · `+toDisplayString(attempt.pin.course.courseId)+` · `+toDisplayString(attempt.pin.course.release)+` `,1),createBaseVNode(`p`,null,[_cache[34]||(_cache[34]=createTextVNode(`Ended attempt · `,-1)),createBaseVNode(`code`,null,toDisplayString(attempt.attemptId),1)]),createBaseVNode(`p`,null,[createTextVNode(`Topic `+toDisplayString(attempt.pin.topic.topicId)+` · `+toDisplayString(attempt.pin.topic.release)+` · `,1),createBaseVNode(`code`,null,toDisplayString(attempt.pin.topic.commit),1)]),createBaseVNode(`p`,null,[_cache[35]||(_cache[35]=createTextVNode(`Lesson hash · `,-1)),createBaseVNode(`code`,null,toDisplayString(attempt.pin.lesson.hash),1)])])}),128))])])):createCommentVNode(``,true)],10,_hoisted_1$1)}}};var TrainingLessonPicker_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-e0ab4c87`]]);var _hoisted_1={class:`vibe64-learning-launcher`};var _hoisted_2=[`aria-busy`];var _hoisted_3={key:3};var _sfc_main={__name:`Vibe64LearningLessonLauncher`,props:{learning:{type:Object,required:true}},setup(__props){const props=__props;const route=useRoute();const error=ref(``);const errorLearner=ref(``);const courses=computed(()=>toValue(props.learning.coursesResource.data));const progress=computed(()=>toValue(props.learning.learningResource.data));const busy=computed(()=>toValue(props.learning.busy));const retry=computed(()=>toValue(props.learning.startRetry));const starting=computed(()=>toValue(props.learning.starting)===true);const trial=computed(()=>toValue(props.learning.savedAuthorPreview));const installState=computed(()=>toValue(props.learning.installState)||null);const trialResource=computed(()=>props.learning.authorPreviewResource);const trialEnabled=computed(()=>toValue(props.learning.authorPreviewEnabled)===true);const errorVisible=computed(()=>Boolean(errorLearner.value&&errorLearner.value===toValue(props.learning.learnerId)&&toValue(props.learning.learningMode)));const canRequest=computed(()=>Boolean(toValue(props.learning.learnerId)&&toValue(props.learning.learningMode)));let feedbackGeneration=0;watch(()=>[toValue(props.learning.learnerId),toValue(props.learning.learningMode),route.fullPath,trialEnabled.value],()=>{feedbackGeneration+=1;error.value=``;errorLearner.value=``},{flush:`sync`});async function request(operation){const owner=props.learning;const learner=toValue(owner.learnerId);const target=route.fullPath;const generation=feedbackGeneration;error.value=``;errorLearner.value=learner;try{return await operation(owner)}catch(cause){if(props.learning===owner&&generation===feedbackGeneration&&learner===toValue(owner.learnerId)&&target===route.fullPath)error.value=String(cause?.message||`The lesson request was not confirmed. Read saved progress before trying again.`);return null}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1,[error.value&&errorVisible.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,class:`vibe64-learning-launcher__error`},{default:withCtx(()=>[createTextVNode(toDisplayString(error.value),1)]),_:1})):createCommentVNode(``,true),retry.value?(openBlock(),createBlock(VBtn,{key:1,class:`vibe64-learning-launcher__retry`,variant:`tonal`,rounded:`pill`,"min-height":`48`,disabled:busy.value||!canRequest.value,onClick:_cache[0]||(_cache[0]=$event=>request(owner=>owner.retryStart()))},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(` Retry lesson start `,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),trialEnabled.value&&trialResource.value?(openBlock(),createElementBlock(`section`,{key:2,class:`vibe64-learning-launcher__trial`,"aria-label":`Saved author trial`,"aria-busy":toValue(trialResource.value.isLoading)},[_cache[9]||(_cache[9]=createBaseVNode(`p`,{class:`vibe64-learning-launcher__trial-eyebrow`},`Authoring`,-1)),_cache[10]||(_cache[10]=createBaseVNode(`h2`,null,`Author trial`,-1)),_cache[11]||(_cache[11]=createBaseVNode(`p`,null,`This isolated snapshot is separate from your published lesson progress.`,-1)),toValue(trialResource.value.isLoading)&&!trial.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`list-item-two-line, actions`,"aria-label":`Loading saved author trial`})):createCommentVNode(``,true),toValue(trialResource.value.loadError)?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(toValue(trialResource.value.loadError))+` Refresh courses before reopening the trial. `,1)]),_:1})):createCommentVNode(``,true),trial.value?(openBlock(),createElementBlock(Fragment,{key:2},[createBaseVNode(`p`,null,toDisplayString(trial.value.pin.lesson.code)+` · `+toDisplayString(trial.value.pin.topic.release),1),createBaseVNode(`details`,null,[_cache[7]||(_cache[7]=createBaseVNode(`summary`,null,`Saved trial identity`,-1)),createBaseVNode(`code`,null,toDisplayString(trial.value.pin.topic.commit),1)]),createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,"data-test":`resume-author-trial`,disabled:busy.value||!canRequest.value||toValue(trialResource.value.isLoading)||!!toValue(trialResource.value.loadError),onClick:_cache[1]||(_cache[1]=$event=>request(owner=>owner.resumeAuthorPreview(trial.value.attemptId)))},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(` Resume author trial `,-1)])]),_:1},8,[`disabled`])],64)):!toValue(trialResource.value.isLoading)&&!toValue(trialResource.value.loadError)?(openBlock(),createElementBlock(`p`,_hoisted_3,` Ask Colleague to admit the exact clean committed lesson snapshot from your authoring session first. `)):createCommentVNode(``,true)],8,_hoisted_2)):createCommentVNode(``,true),createVNode(unref(TrainingLessonPicker_default),{"catalogue-result":courses.value,"learning-result":progress.value,"catalogue-loading":toValue(__props.learning.coursesResource.isLoading),"learning-loading":toValue(__props.learning.learningResource.isLoading),"catalogue-error":toValue(__props.learning.coursesResource.loadError),"learning-error":toValue(__props.learning.learningResource.loadError),busy:busy.value,"can-start":canRequest.value,"can-resume":canRequest.value,"create-course":input=>request(owner=>owner.createCourse(input)),"available-result":toValue(__props.learning.availableResource?.data),"available-loading":toValue(__props.learning.availableResource?.isLoading)===true,"available-error":toValue(__props.learning.availableResource?.loadError)||``,"install-state":installState.value,starting:starting.value,"start-unconfirmed":Boolean(retry.value),onRefresh:_cache[2]||(_cache[2]=$event=>request(owner=>owner.refresh())),onStart:_cache[3]||(_cache[3]=$event=>request(owner=>owner.startLesson($event))),onResume:_cache[4]||(_cache[4]=$event=>request(owner=>owner.resumeLesson($event.attemptId))),onInstall:_cache[5]||(_cache[5]=$event=>request(owner=>owner.installCourse($event)))},null,8,[`catalogue-result`,`learning-result`,`catalogue-loading`,`learning-loading`,`catalogue-error`,`learning-error`,`busy`,`can-start`,`can-resume`,`create-course`,`available-result`,`available-loading`,`available-error`,`install-state`,`starting`,`start-unconfirmed`]),_cache[12]||(_cache[12]=createBaseVNode(`p`,{class:`vibe64-learning-launcher__status`,role:`status`},[createBaseVNode(`svg`,{viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M11 9h2V7h-2m1 13a8 8 0 1 1 0-16 8 8 0 0 1 0 16m0-18a10 10 0 1 0 0 20 10 10 0 0 0 0-20m-1 15h2v-6h-2v6Z`})]),createTextVNode(` You can switch back to Working without closing your lesson. `)],-1))])}}};var Vibe64LearningLessonLauncher_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-bf008497`]]);var TRAINING_PATH=`/api/vibe64/training`;function useVibe64LearningMode({onConversationOpened=null,authorPreview=false}={}){const route=useRoute();const router=useRouter();const viewer=inject(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const actorKey=computed(()=>String(toValue(viewer)?.actorKey||``));const learningMode=computed(()=>route.query.mode===`learning`);const learningView=computed(()=>route.query.learningView===`learning`?`learning`:`workspace`);const purposeFilter=computed(()=>learningMode.value?`learning`:`working`);let generation=0;let disposed=false;watch(()=>[actorKey.value,route.fullPath,learningMode.value],()=>{generation+=1},{flush:`sync`});const removeModeGuard=typeof router?.beforeEach===`function`?router.beforeEach((to,from)=>{if(from.query?.mode!==`learning`||Object.hasOwn(to.query||{},`mode`)||to.path===from.path)return true;const slug=projectSlugFromPathname(from.path);if(!slug||projectSlugFromPathname(to.path)!==slug)return true;return{path:to.path,hash:to.hash,query:{...to.query,mode:`learning`,...from.query.learningView?{learningView:from.query.learningView}:{}}}}):null;onScopeDispose(()=>{disposed=true;generation+=1;removeModeGuard?.()});function readResource(name,enabled=null){const client=getHttpWebClient();const original=useEndpointResource({path:`${TRAINING_PATH}/${name}`,queryKey:computed(()=>[`vibe64`,`training`,name,actorKey.value||`signed-out`]),enabled:computed(()=>Boolean(actorKey.value)&&(!enabled||toValue(enabled)===true)),client:{async request(path,options){return{reader:actorKey.value,value:await client.request(path,options)}}},queryOptions:{retry:false},fallbackLoadError:`The saved lessons could not be read. Refresh to try again.`});const data=computed(()=>{const status=Number(original.query.error.value?.statusCode||original.query.error.value?.status||0);const result=original.data.value;return actorKey.value&&(!enabled||toValue(enabled)===true)&&status!==401&&status!==403&&result?.reader===actorKey.value?result.value:null});async function refetch(options){if(!actorKey.value||disposed||enabled&&toValue(enabled)!==true)return null;const reader=actorKey.value;return{...await original.query.refetch(options),data:reader===actorKey.value&&!disposed?data.value:null}}return Object.freeze({...original,data,query:{...original.query,data,refetch},reload:()=>refetch()})}const coursesResource=readResource(`courses`);const learningResource=readResource(`learning`);const availableResource=readResource(`available`,learningMode);const authorPreviewEnabled=computed(()=>toValue(authorPreview)===true);const authorPreviewResource=authorPreview===false?null:readResource(`author-preview`,authorPreviewEnabled);watch(learningMode,(active,previous)=>{if(active&&!previous)refresh()});const savedAuthorPreview=computed(()=>{const result=authorPreviewResource?.data.value;return result?.ok===true&&result.available===true&&result.authorPreview===true&&!result.active?.ended?result.active||null:null});const learnerId=computed(()=>learningResource.data.value?.ok===true&&learningResource.data.value?.available===true&&typeof learningResource.data.value.learnerId===`string`?learningResource.data.value.learnerId:``);const busy=ref(false);const pendingStart=shallowRef(null);const starting=ref(false);const startRetry=computed(()=>!starting.value&&pendingStart.value?.actor===actorKey.value?pendingStart.value.input:null);const command=useCommand({ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,access:`never`,apiSuffix:`/vibe64/training`,placementSource:`vibe64.training.learning-mode`,suppressSuccessMessage:true,buildRawPayload:(_model,{context})=>context.body,buildCommandOptions:(_model,{context})=>({method:`POST`,path:context.path}),fallbackRunError:`The lesson request was not confirmed. Retry the same request before starting another lesson.`});async function setLearningMode(value){const query={...route.query};if(value)query.mode=`learning`;else{delete query.mode;delete query.learningView}return router.replace({path:route.path,hash:route.hash,query})}async function setLearningView(value){if(!learningMode.value||![`workspace`,`learning`].includes(value))throw new Error(`Open Learning mode before changing its workspace view.`);return router.replace({path:route.path,hash:route.hash,query:{...route.query,learningView:value}})}function capture(){if(disposed||!actorKey.value||!learningMode.value||!learnerId.value)throw new Error(`Open Learning mode and read your saved lessons before making a lesson request.`);return Object.freeze({actor:actorKey.value,learnerId:learnerId.value,generation})}const current=scope=>!disposed&&scope.actor===actorKey.value&&scope.learnerId===learnerId.value&&scope.generation===generation&&learningMode.value&&(!scope.authorPreviewAttemptId||authorPreviewEnabled.value&&savedAuthorPreview.value?.attemptId===scope.authorPreviewAttemptId&&!authorPreviewResource.loadError.value);async function refresh(){if(!actorKey.value||disposed)return null;return Promise.all([coursesResource.reload(),learningResource.reload(),availableResource.reload(),...authorPreviewResource?[authorPreviewResource.reload()]:[]])}async function prepare(path,body,scope,{openConversation=true,attemptId=``}={}){const result=await command.run({path,body});if(!result||result.ok!==true||result.available!==true)throw new Error(`The lesson request did not return a confirmed saved attempt. Retry the same request.`);const admitted=result.attempt?.ended?result.attempt:result.active;if(!admitted?.attemptId||attemptId&&admitted.attemptId!==attemptId)throw new Error(`The lesson response did not confirm the requested attempt.`);let conversation=null;if(openConversation&&!admitted.ended&¤t(scope)){conversation=await command.run({path:`/api/learning/${encodeURIComponent(admitted.attemptId)}/vibe64/sessions`,body:{}});if(conversation?.ok!==true||!conversation?.sessionId)throw new Error(`The saved lesson conversation was not confirmed. Resume this exact attempt to open it again.`)}if(current(scope)){await learningResource.reload();if(scope.authorPreviewAttemptId)await authorPreviewResource.reload();if(conversation&¤t(scope))onConversationOpened?.({attemptId:admitted.attemptId,sessionId:conversation.sessionId,learnerId:scope.learnerId})}return{result,attemptId:admitted.attemptId,learnerId:scope.learnerId,sessionId:conversation?.sessionId||``,ended:Boolean(admitted.ended),current:current(scope)}}async function startLesson(selection,options={}){if(busy.value)return null;const scope=capture();const input=Object.freeze({courseId:selection.courseId,release:selection.release,lessonCode:selection.lessonCode,expectedRevision:selection.expectedRevision});let request=pendingStart.value;if(request?.actor===scope.actor){if(!Object.keys(input).every(key=>input[key]===request.input[key]))throw new Error(`A previous start was not confirmed. Retry that same lesson request first.`)}else{request=Object.freeze({actor:scope.actor,input,requestId:globalThis.crypto.randomUUID()});pendingStart.value=request}busy.value=true;starting.value=true;try{const outcome=await prepare(`${TRAINING_PATH}/lessons/start`,{...request.input,requestId:request.requestId},scope,options);if(pendingStart.value===request)pendingStart.value=null;return{...outcome,requestId:request.requestId}}finally{busy.value=false;starting.value=false}}function retryStart(options={}){if(!startRetry.value)throw new Error(`There is no unconfirmed lesson start for this account.`);return startLesson(startRetry.value,options)}async function resumeLesson(attemptId,options={}){if(busy.value)return null;const scope=capture();busy.value=true;try{return await prepare(`${TRAINING_PATH}/attempts/${encodeURIComponent(attemptId)}/resume`,{},scope,{...options,attemptId})}finally{busy.value=false}}async function createCourse({title,topics,expectedRevision}={}){if(busy.value)return null;capture();busy.value=true;try{const result=await command.run({path:`${TRAINING_PATH}/courses`,body:{title,topics,expectedRevision}});if(result?.ok!==true||!result.course?.courseId)throw new Error(result?.error||`The new course was not confirmed. Refresh courses before trying again.`);await coursesResource.reload();return result}finally{busy.value=false}}const installRecord=shallowRef(null);const installState=computed(()=>installRecord.value?.actor===actorKey.value?installRecord.value:null);async function installCourse({courseId,release}={}){if(busy.value)return null;const scope=capture();const target=Object.freeze({actor:scope.actor,courseId,release});busy.value=true;installRecord.value=Object.freeze({...target,phase:`installing`,message:``});const poll=setInterval(()=>{availableResource.reload()},1500);try{const result=await command.run({path:`${TRAINING_PATH}/courses/install`,body:{courseId,release}});if(result?.ok!==true||result.course?.courseId!==courseId||result.course.release!==release)throw new Error(result?.error||`The course installation was not confirmed. Refresh courses, then retry.`);if(installRecord.value?.courseId===courseId&&installRecord.value.release===release)installRecord.value=null;await Promise.all([coursesResource.reload(),availableResource.reload()]);return result}catch(cause){if(current(scope))installRecord.value=Object.freeze({...target,phase:`failed`,message:String(cause?.message||`The course installation was not confirmed. Refresh courses, then retry.`)});return null}finally{clearInterval(poll);busy.value=false}}async function resumeAuthorPreview(attemptId,options={}){if(busy.value)return null;const scope=Object.freeze({...capture(),authorPreviewAttemptId:attemptId});if(!attemptId||!current(scope))throw new Error(`Read this owner's exact saved author trial before reopening it.`);busy.value=true;try{return await prepare(`${TRAINING_PATH}/attempts/${encodeURIComponent(attemptId)}/resume`,{},scope,{...options,attemptId})}finally{busy.value=false}}return Object.freeze({learningMode,learningView,purposeFilter,setLearningMode,setLearningView,coursesResource,learningResource,availableResource,installState,installCourse,learnerId,busy,starting,startRetry,refresh,startLesson,retryStart,resumeLesson,createCourse,authorPreviewEnabled,authorPreviewResource,savedAuthorPreview,resumeAuthorPreview})}export{guideElementVisible as a,Vibe64LearningPracticeProjectSelector_default as c,projectSelectionGateQueryKey as d,StudioAppShellLayout_default as f,clearTrainingGuide as i,Vibe64AuthSettingsButton_default as l,VIBE64_RESOURCE_RECOVERY_KEY as m,Vibe64LearningLessonLauncher_default as n,registerTrainingGuideOverlay as o,vibe64OutputTerminalWebSocketUrl as p,Vibe64SessionPanel_default as r,trainingGuide as s,useVibe64LearningMode as t,ProjectSelectionGate_default as u};
|