vibe64 0.1.37 → 0.1.39
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/upgrade-state.js +3930 -3912
- package/dist/assets/{GithubBrowserTabs-BykoCFfz.js → GithubBrowserTabs-C2NO5l8g.js} +1 -1
- package/dist/assets/{Vibe64AuthSettingsButton-CIwtchKm.js → Vibe64AuthSettingsButton-fY4ZiIFF.js} +1 -1
- package/dist/assets/{Vibe64DashboardShell-DXVDJUAY.js → Vibe64DashboardShell-BSq7uXEW.js} +1 -1
- package/dist/assets/{Vibe64DatabaseWorkspace-Ca8IHSRq.js → Vibe64DatabaseWorkspace-CEml9BWn.js} +1 -1
- package/dist/assets/{Vibe64OutputControls-DngQNTTt.js → Vibe64OutputControls-_zhGX9ne.js} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-BfsZozSJ.js → Vibe64RepositoryWorkspace-obZFXkoG.js} +1 -1
- package/dist/assets/{Vibe64SessionFiles-n87RqqY6.js → Vibe64SessionFiles-CQzs6fee.js} +1 -1
- package/dist/assets/{_sessionId_-B_TTRB4c.js → _sessionId_-CKkGH3Rx.js} +1 -1
- package/dist/assets/{_slug_-DsqilUs_.js → _slug_-BclonbST.js} +7 -7
- package/dist/assets/{_slug_-Buxpw0T4.css → _slug_-CZ1bxO9C.css} +1 -1
- package/dist/assets/{access-tl4ht_d8.js → access-WlhPvPgy.js} +1 -1
- package/dist/assets/{app-DT4_MliP.js → app-BNP_n_Tt.js} +1 -1
- package/dist/assets/{changes-DZWHZguL.js → changes-CHJjrZAc.js} +1 -1
- package/dist/assets/{dashboard-iREwhGqv.js → dashboard-CuutW8iv.js} +1 -1
- package/dist/assets/{definitions-CNu5E87y.js → definitions-BrMvu6yV.js} +1 -1
- package/dist/assets/{env-D5KpTEw7.js → env-D3KQGvRe.js} +1 -1
- package/dist/assets/{history-DVURy45X.js → history-1_NU8azF.js} +1 -1
- package/dist/assets/{index-GBRpNZLy.js → index-dNxr4Lg9.js} +4 -4
- package/dist/assets/{integrations-Dy5jIiJ5.js → integrations-BMzWQQpa.js} +1 -1
- package/dist/assets/{issues-lh7R775d.js → issues-Bywux4s7.js} +1 -1
- package/dist/assets/{learning-_O1PEaam.js → learning-Bdi3XRS7.js} +1 -1
- package/dist/assets/{pull-requests-ByE-Dvk7.js → pull-requests-ncmKT3sS.js} +1 -1
- package/dist/assets/{repository-BUfUAyS9.js → repository-BL_2bgzC.js} +1 -1
- package/dist/assets/{settings-CzhIcn9K.js → settings-1rpuL7eR.js} +1 -1
- package/dist/assets/{useArchivedVibe64Sessions-CLHJOyeW.js → useArchivedVibe64Sessions-_LB2XxEa.js} +1 -1
- package/dist/assets/{useVibe64ConversationLog-B4JgmxUf.js → useVibe64ConversationLog-BqUI0S5n.js} +1 -1
- package/dist/assets/{useVibe64SessionData-YhhE_5pC.js → useVibe64SessionData-B686lToN.js} +1 -1
- package/dist/assets/{useVibe64SessionSelection-CuZCzAcY.js → useVibe64SessionSelection-BzL1y_Vq.js} +1 -1
- package/dist/assets/{vibe64SessionFocus-Cz5Vq1re.js → vibe64SessionFocus-CqZNTvYF.js} +1 -1
- package/dist/index.html +1 -1
- package/docs/colleague-usage/learning-environment.md +1 -2
- package/docs/colleague-usage/lesson-step-bar.md +15 -16
- package/docs/colleague-usage/project-language-tools.md +7 -2
- package/docs/training-content.md +2 -1
- package/node_modules/@local/vibe64-genesis/src/server/index.js +47 -46
- package/package.json +3 -3
- package/server.bundle.mjs +23990 -23879
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Gn as withKeys,Kn as withModifiers,h as VIcon}from"./ripple-BVltMmyV.js";import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,_ as createBaseVNode,b as createElementBlock,bt as renderList,g as computed,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,v as createBlock,vn as ref,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{J as useQueryClient,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{c as projectSlugFromRoute,o as projectAppPath}from"./useRealtimeEvent-Bwapstla.js";import{t as VSelect}from"./VSelect-DL3HaA5m.js";import{c as VListItemTitle,n as VList,s as VListItem}from"./VMenu-C_x18lwb.js";import{t as VChip}from"./VChip-CcI-Oo2J.js";import{t as VTextField}from"./VTextField-BR2eZeFT.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-DmMMIScP.js";import{$n as mdiSourceBranch,En as mdiOpenInNew,In as mdiPlus,Vn as mdiRefresh,W as mdiCloseCircleOutline,er as mdiSourceBranchSync,j as mdiCheck,nr as mdiSourceMerge,rr as mdiSourcePull,v as mdiArrowRight,yn as mdiMagnify}from"./mdi-CG9pWOSj.js";import{i as VBtnToggle,t as VBtn}from"./VBtn-B2MBK2DL.js";import{t as VAlert}from"./VAlert-P256xaE0.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{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{t as VSkeletonLoader}from"./VSkeletonLoader-CttxM1tw.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{_ as parseLongTextReviewBlocks,g as LongTextPreviewBlocks_default}from"./conversation-B90ERX9h.js";import{t as useUiFeedback}from"./useUiFeedback-BPBF_0bp.js";import{a as vibe64SessionPullRequest}from"./vibe64SessionViewModel-DR4tOlGM.js";import{t as Vibe64DashboardBackButton_default}from"./Vibe64DashboardBackButton-BH_8j_VR.js";import{n as githubProjectRepositoryName,t as githubProjectAvailable}from"./vibe64GithubProject-CdFrbVHp.js";import{i as Vibe64CreatePullRequestDialog_default,n as Vibe64AssistantSessionDialog_default,t as focusCreatedVibe64SessionTab}from"./vibe64SessionFocus-Cz5Vq1re.js";import{t as _sfc_main$3}from"./GithubBrowserTabs-BykoCFfz.js";var _hoisted_1$1={key:0,role:`status`,class:`text-body-medium ma-0`};var _hoisted_2$1={class:`d-flex flex-wrap ga-2 text-body-small`};var _hoisted_3$1={key:0,class:`text-body-medium ma-0`};var _hoisted_4$1={class:`d-flex flex-wrap ga-2`};var _hoisted_5$1={class:`text-wrap`};var _hoisted_6$1={class:`text-wrap`};var _hoisted_7$1={key:1,class:`text-body-small ma-0`};var _hoisted_8$1={key:2,class:`text-body-medium ma-0`};var _hoisted_9$1={key:3,class:`text-body-medium ma-0`};var _hoisted_10$1={class:`text-body-medium ma-0`};var _hoisted_11$1={key:0,class:`text-body-medium ma-0`};var _hoisted_12$1={key:1,class:`text-body-medium ma-0`};var _hoisted_13$1={key:1,class:`text-body-small ma-0`};var _hoisted_14$1=[`href`];var _sfc_main$2={__name:`GithubPullRequestActions`,props:{pullRequest:{type:Object,required:true},apiPath:{type:String,required:true},disabled:Boolean},emits:[`changed`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const feedback=useUiFeedback({source:`vibe64.pullRequests.actions`});const confirmation=ref(null);const pending=ref(false);const mergeMethod=ref(``);const notice=ref(``);const updatingHead=ref(``);const failed=ref(false);const methodLabels={merge:`Create a merge commit`,squash:`Squash and merge`,rebase:`Rebase and merge`};const checksLabel=computed(()=>({SUCCESS:`Checks passed`,FAILURE:`Some checks failed`,ERROR:`Checks reported an error`,PENDING:`Checks are running`,EXPECTED:`Waiting for checks`})[props.pullRequest.checksState]||`No checks reported`);const reviewLabel=computed(()=>({APPROVED:`Reviews approved`,CHANGES_REQUESTED:`Changes requested`,REVIEW_REQUIRED:`Reviews required`})[props.pullRequest.reviewDecision]||``);const path=computed(()=>confirmation.value?.path||props.apiPath);const command=useEndpointResource({path,enabled:false,queryKey:computed(()=>[`vibe64.pullRequestAction`,path.value]),mutationOptions:{retry:false}});const actionDisabled=computed(()=>props.disabled||pending.value||!props.pullRequest.review);watch(()=>props.apiPath,()=>{confirmation.value=null;notice.value=``;updatingHead.value=``;failed.value=false});watch(()=>[props.pullRequest.headRefOid,props.pullRequest.state],([head,state])=>{if(state!==`OPEN`){notice.value=``;updatingHead.value=``}else if(updatingHead.value&&head&&head!==updatingHead.value){notice.value=`New commits are available. Update your session to load them.`;updatingHead.value=``}});function open(operation){const pr=props.pullRequest;if(actionDisabled.value||pr.actions?.[operation]!==``)return;mergeMethod.value=pr.mergeMethods[0]||``;const head=`${pr.review.headRepository}:${pr.review.headBranch}`;const base=`${pr.review.repository}:${pr.review.baseBranch}`;confirmation.value={operation,path:`${props.apiPath}/${operation}`,apiPath:props.apiPath,review:{...pr.review},url:pr.url,methods:pr.mergeMethods,from:operation===`update-branch`?base:head,to:operation===`update-branch`?head:base,title:operation===`ready`?`Ready for review?`:operation===`update-branch`?`Update branch from ${pr.baseRefName}?`:`Merge into ${pr.baseRefName}?`};failed.value=false}async function submit(){const reviewed=confirmation.value;if(!reviewed||pending.value||props.disabled)return;pending.value=true;failed.value=false;try{const result=await command.save({review:reviewed.review,...reviewed.operation===`merge`?{mergeMethod:mergeMethod.value}:{}},{method:`POST`,path:reviewed.path});if(props.apiPath===reviewed.apiPath){notice.value=result.pending?result.message:``;updatingHead.value=result.pending?reviewed.review.headCommit:``;confirmation.value=null}feedback.success(`PR #${reviewed.review.number}: ${result.message}`);emit(`changed`,{apiPath:reviewed.apiPath,operation:reviewed.operation})}catch(error){if(props.apiPath===reviewed.apiPath)failed.value=true;feedback.error(error,`The result could not be confirmed. Refresh this pull request before trying again.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VSheet,{rounded:`xl`,border:``,class:`pa-5 d-flex flex-column ga-3 pr-actions`},{default:withCtx(()=>[notice.value?(openBlock(),createElementBlock(`p`,_hoisted_1$1,toDisplayString(notice.value),1)):createCommentVNode(``,true),__props.pullRequest.state===`OPEN`?(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`div`,_hoisted_2$1,[createVNode(VChip,{size:`small`,color:[`FAILURE`,`ERROR`].includes(__props.pullRequest.checksState)?`warning`:void 0},{default:withCtx(()=>[createTextVNode(toDisplayString(checksLabel.value),1)]),_:1},8,[`color`]),reviewLabel.value?(openBlock(),createBlock(VChip,{key:0,size:`small`},{default:withCtx(()=>[createTextVNode(toDisplayString(reviewLabel.value),1)]),_:1})):createCommentVNode(``,true)]),__props.pullRequest.actions?.merge?(openBlock(),createElementBlock(`p`,_hoisted_3$1,toDisplayString(__props.pullRequest.actions.merge),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$1,[__props.pullRequest.isDraft?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`tonal`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiCheck),disabled:actionDisabled.value||Boolean(__props.pullRequest.actions?.ready),onClick:_cache[0]||(_cache[0]=$event=>open(`ready`))},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createBaseVNode(`span`,{class:`text-wrap`},`Ready for review`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),__props.pullRequest.actions?.[`update-branch`]===``?(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiSourceBranchSync),disabled:actionDisabled.value,onClick:_cache[1]||(_cache[1]=$event=>open(`update-branch`))},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_5$1,`Update branch from `+toDisplayString(__props.pullRequest.baseRefName),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),!__props.pullRequest.isDraft?(openBlock(),createBlock(VBtn,{key:2,color:`primary`,variant:`flat`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiSourceMerge),disabled:actionDisabled.value||Boolean(__props.pullRequest.actions?.merge),onClick:_cache[2]||(_cache[2]=$event=>open(`merge`))},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_6$1,`Merge into `+toDisplayString(__props.pullRequest.baseRefName),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true)]),__props.pullRequest.isDraft&&__props.pullRequest.actions?.ready?(openBlock(),createElementBlock(`p`,_hoisted_7$1,toDisplayString(__props.pullRequest.actions.ready),1)):createCommentVNode(``,true)],64)):__props.pullRequest.state===`MERGED`&&!notice.value?(openBlock(),createElementBlock(`p`,_hoisted_8$1,` Merged into `+toDisplayString(__props.pullRequest.baseRefName)+`. Archive your session when you have finished with it. `,1)):!notice.value?(openBlock(),createElementBlock(`p`,_hoisted_9$1,`This pull request is closed.`)):createCommentVNode(``,true)]),_:1}),createVNode(VDialog,{"model-value":Boolean(confirmation.value),"max-width":`36rem`,scrollable:``,persistent:pending.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>!$event&&!pending.value&&(confirmation.value=null))},{default:withCtx(()=>[confirmation.value?(openBlock(),createBlock(VCard,{key:0,rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[createTextVNode(toDisplayString(confirmation.value.title),1)]),_:1}),createVNode(VCardText,{class:`d-flex flex-column ga-3 pr-confirmation`},{default:withCtx(()=>[createBaseVNode(`p`,_hoisted_10$1,toDisplayString(confirmation.value.from)+` → `+toDisplayString(confirmation.value.to),1),confirmation.value.operation===`ready`?(openBlock(),createElementBlock(`p`,_hoisted_11$1,`Mark this draft ready so reviewers can review it.`)):confirmation.value.operation===`update-branch`?(openBlock(),createElementBlock(`p`,_hoisted_12$1,` Merge `+toDisplayString(confirmation.value.review.baseBranch)+` into `+toDisplayString(confirmation.value.review.headBranch)+` on GitHub. Then use Update session to load those changes into your session. `,1)):(openBlock(),createElementBlock(Fragment,{key:2},[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`text-body-medium ma-0`},`Merge the commits already on GitHub. Save any session work you want included first.`,-1)),confirmation.value.methods.length>1?(openBlock(),createBlock(VSelect,{key:0,modelValue:mergeMethod.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>mergeMethod.value=$event),label:`Merge method`,variant:`outlined`,"hide-details":``,items:confirmation.value.methods.map(value=>({title:methodLabels[value],value})),disabled:pending.value},null,8,[`modelValue`,`items`,`disabled`])):(openBlock(),createElementBlock(`p`,_hoisted_13$1,toDisplayString(methodLabels[mergeMethod.value]),1))],64)),failed.value?(openBlock(),createBlock(VAlert,{key:3,type:`warning`,variant:`tonal`},{default:withCtx(()=>[_cache[8]||(_cache[8]=createTextVNode(` This action was not confirmed. Close this dialog and refresh, or view the pull request on GitHub, before trying again. `,-1)),createBaseVNode(`a`,{href:confirmation.value.url,target:`_blank`,rel:`noopener noreferrer`},`View on GitHub`,8,_hoisted_14$1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`pa-4 flex-wrap`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:pending.value,height:`48`,onClick:_cache[4]||(_cache[4]=$event=>confirmation.value=null)},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,height:`48`,disabled:pending.value||__props.disabled||failed.value,"aria-busy":pending.value,onClick:submit},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?`Working…`:confirmation.value.operation===`ready`?`Ready for review`:confirmation.value.operation===`merge`?`Merge pull request`:`Update branch`),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`,`persistent`])],64)}}};var GithubPullRequestActions_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-5aa628de`]]);var _hoisted_1={class:`pull-requests d-flex flex-column ga-2`};var _hoisted_2={class:`d-flex align-center flex-wrap ga-2`};var _hoisted_3={class:`d-flex justify-space-between px-2 text-label-large text-medium-emphasis`};var _hoisted_4={class:`d-flex flex-wrap ga-2 text-body-small text-medium-emphasis mt-1`};var _hoisted_5={class:`pull-requests__branch`};var _hoisted_6={class:`d-flex justify-end ga-2`};var _hoisted_7={class:`px-2`};var _hoisted_8={class:`d-flex align-center flex-wrap ga-2 mb-3`};var _hoisted_9={class:`text-body-medium text-medium-emphasis`};var _hoisted_10={class:`text-headline-small mb-3`};var _hoisted_11={class:`d-flex flex-wrap ga-3 text-body-small text-medium-emphasis`};var _hoisted_12={class:`text-success`};var _hoisted_13={class:`text-error`};var _hoisted_14={class:`d-flex align-start ga-3`};var _hoisted_15={class:`pull-requests__branch`};var _hoisted_16={class:`text-body-medium mt-1`};var _hoisted_17={class:`text-body-small text-medium-emphasis mt-1`};var _hoisted_18={key:0,class:`text-body-medium ma-0`};var _hoisted_19={key:1,class:`text-body-medium ma-0`};var _hoisted_20={key:2,class:`text-body-medium ma-0`};var _hoisted_21={class:`d-flex flex-wrap ga-2`};var _hoisted_22={key:1,class:`text-body-medium text-medium-emphasis ma-0`};var _sfc_main$1={__name:`GithubPullRequestsPanel`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){const props=__props;const route=useRoute();const router=useRouter();const queryClient=useQueryClient();const projectSlug=computed(()=>projectSlugFromRoute(route));const repository=computed(()=>githubProjectRepositoryName(props.dashboardContext.projectContext));const available=computed(()=>githubProjectAvailable(props.dashboardContext.projectContext));const active=computed(()=>available.value&&props.dashboardContext.active!==false);const number=computed(()=>/^\d+$/u.test(String(route.query.pr||``))?String(route.query.pr):``);const state=computed(()=>[`open`,`closed`,`merged`,`all`].includes(route.query.prState)?route.query.prState:`open`);const search=ref(String(route.query.prSearch||``));watch(()=>route.query.prSearch,value=>{search.value=String(value||``)});const basePath=computed(()=>scopedDevelopmentApiUrl(`/api/vibe64/pull-requests`,projectSlug.value));const listQuery=computed(()=>({state:state.value,search:String(route.query.prSearch||``),...route.query.prCursor?{cursor:route.query.prCursor}:{}}));const list=useEndpointResource({path:basePath,readQuery:listQuery,queryKey:computed(()=>[`vibe64.pullRequests`,basePath.value,listQuery.value]),enabled:computed(()=>active.value&&!number.value),queryOptions:{retry:false},fallbackLoadError:`Pull requests could not load.`});const detail=useEndpointResource({path:computed(()=>`${basePath.value}/${number.value}`),queryKey:computed(()=>[`vibe64.pullRequest`,basePath.value,number.value]),enabled:computed(()=>active.value&&Boolean(number.value)),queryOptions:{retry:false},fallbackLoadError:`This pull request could not load.`});const resource=computed(()=>number.value?detail:list);const pr=computed(()=>detail.data.value?.pullRequest);const description=computed(()=>parseLongTextReviewBlocks(pr.value?.body||``));const assistantDialog=ref(false);const createDialog=ref(false);const selectedSource=computed(()=>vibe64SessionPullRequest(props.dashboardContext.session));const createAvailable=computed(()=>Boolean(props.dashboardContext.sessionId)&&!selectedSource.value?.number);const toolbar=computed(()=>({...props.dashboardContext.sessionToolbar,repositoryBranchSelectionDisabled:true,createSession:(selection,options={})=>props.dashboardContext.sessionToolbar?.createSession?.(selection,{...options,pullRequestNumber:Number(number.value)})}));watch(()=>route.query.createPullRequest,value=>{if(value&&createAvailable.value)createDialog.value=true},{immediate:true});function navigate(query){return router.push({query:{...route.query,...query}})}function filter(nextState=state.value){return navigate({prState:nextState,prSearch:String(search.value||``).trim()||void 0,prCursor:void 0,pr:void 0})}function status(item){if(item.state===`MERGED`)return`Merged`;if(item.state===`CLOSED`)return`Closed`;return item.isDraft?`Draft`:`Open`}function color(item){if(item.state===`MERGED`)return`primary`;if(item.state===`CLOSED`)return`error`;return item.isDraft?void 0:`success`}function icon(item){if(item.state===`MERGED`)return mdiSourceMerge;return item.state===`CLOSED`?mdiCloseCircleOutline:mdiSourcePull}function date(value){return value?new Date(value).toLocaleDateString(void 0,{month:`short`,day:`numeric`}):``}async function created(response){if(!response?.sessionId)return;await router.push(projectAppPath(projectSlug.value,`/dashboard/changes`));focusCreatedVibe64SessionTab(response.sessionId)}async function published(source){await list.reload();await navigate({pr:String(source.number),createPullRequest:void 0});await detail.reload()}async function actionFinished({apiPath}){await queryClient.invalidateQueries({queryKey:[`vibe64.pullRequests`,apiPath.replace(/\/\d+$/u,``)]});if(apiPath!==`${basePath.value}/${number.value}`)return;await detail.reload();props.dashboardContext.refreshSessionWork?.()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[createBaseVNode(`div`,_hoisted_2,[createVNode(Vibe64DashboardBackButton_default,{to:available.value&&number.value?void 0:unref(projectAppPath)(projectSlug.value,`/dashboard/env`),onClick:_cache[0]||(_cache[0]=$event=>available.value&&number.value&&navigate({pr:void 0}))},{default:withCtx(()=>[createTextVNode(toDisplayString(available.value&&number.value?`All pull requests`:`Back to dashboard`),1)]),_:1},8,[`to`]),createVNode(VSpacer),available.value?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiRefresh),variant:`text`,size:`small`,height:`48`,disabled:resource.value.isFetching.value,onClick:_cache[1]||(_cache[1]=$event=>resource.value.reload())},{default:withCtx(()=>[createTextVNode(toDisplayString(resource.value.isFetching.value?`Refreshing…`:`Refresh`),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),available.value&&createAvailable.value?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`tonal`,rounded:`pill`,size:`small`,height:`48`,"prepend-icon":unref(mdiPlus),disabled:__props.dashboardContext.sourceOperationsSuspended,onClick:_cache[2]||(_cache[2]=$event=>createDialog.value=true)},{default:withCtx(()=>[..._cache[15]||(_cache[15]=[createTextVNode(` Create from session `,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true)]),!available.value?(openBlock(),createBlock(VAlert,{key:0,type:`info`,variant:`tonal`},{default:withCtx(()=>[..._cache[16]||(_cache[16]=[createTextVNode(`Pull requests are available only for GitHub projects.`,-1)])]),_:1})):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(_sfc_main$3),!number.value?(openBlock(),createElementBlock(`form`,{key:0,class:`d-flex flex-wrap align-center ga-3`,onSubmit:_cache[8]||(_cache[8]=withModifiers($event=>filter(),[`prevent`]))},[createVNode(VBtnToggle,{"model-value":state.value,mandatory:``,divided:``,rounded:`pill`,color:`primary`,variant:`outlined`,"aria-label":`Pull request state`,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>filter($event))},{default:withCtx(()=>[(openBlock(),createElementBlock(Fragment,null,renderList([`open`,`closed`,`merged`,`all`],value=>{return createVNode(VBtn,{key:value,value,height:`48`},{default:withCtx(()=>[createTextVNode(toDisplayString(value[0].toUpperCase()+value.slice(1)),1)]),_:2},1032,[`value`])}),64))]),_:1},8,[`model-value`]),createVNode(VTextField,{modelValue:search.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>search.value=$event),class:`pull-requests__search`,label:`Search pull requests`,"prepend-inner-icon":unref(mdiMagnify),variant:`outlined`,rounded:`pill`,"hide-details":``,maxlength:`200`,clearable:``,onKeydown:_cache[6]||(_cache[6]=withKeys(withModifiers($event=>filter(),[`prevent`]),[`enter`])),"onClick:clear":_cache[7]||(_cache[7]=$event=>{search.value=``;filter()})},{"append-inner":withCtx(()=>[createVNode(VBtn,{icon:unref(mdiArrowRight),variant:`text`,size:`48`,"aria-label":`Search pull requests`,onClick:_cache[4]||(_cache[4]=$event=>filter())},null,8,[`icon`])]),_:1},8,[`modelValue`,`prepend-inner-icon`])],32)):createCommentVNode(``,true),resource.value.isInitialLoading.value?(openBlock(),createBlock(VSheet,{key:1,rounded:`xl`,border:``,class:`pa-4`,"aria-label":`Loading pull requests`,"aria-busy":`true`},{default:withCtx(()=>[(openBlock(),createElementBlock(Fragment,null,renderList(4,index=>{return createVNode(VSkeletonLoader,{key:index,type:number.value?`paragraph`:`list-item-two-line`},null,8,[`type`])}),64))]),_:1})):resource.value.loadError.value?(openBlock(),createBlock(VAlert,{key:2,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,onClick:_cache[9]||(_cache[9]=$event=>resource.value.reload())},{default:withCtx(()=>[..._cache[17]||(_cache[17]=[createTextVNode(`Retry`,-1)])]),_:1})]),default:withCtx(()=>[createTextVNode(toDisplayString(resource.value.loadError.value)+` `,1)]),_:1})):!number.value?(openBlock(),createElementBlock(Fragment,{key:3},[createBaseVNode(`div`,_hoisted_3,[createBaseVNode(`span`,null,toDisplayString(unref(list).data.value?.total||0)+` pull requests`,1),_cache[18]||(_cache[18]=createBaseVNode(`span`,null,`Recently updated`,-1))]),unref(list).data.value?.pullRequests?.length?(openBlock(),createBlock(VList,{key:0,class:`pa-0`,density:`compact`,rounded:`xl`,border:``,slim:``,"aria-label":`GitHub pull requests`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(list).data.value.pullRequests,(item,index)=>{return openBlock(),createElementBlock(Fragment,{key:item.number},[index?(openBlock(),createBlock(VDivider,{key:0})):createCommentVNode(``,true),createVNode(VListItem,{class:`py-2`,active:false,to:{query:{..._ctx.$route.query,pr:String(item.number)}}},{prepend:withCtx(()=>[createVNode(VIcon,{icon:icon(item),color:color(item)},null,8,[`icon`,`color`])]),default:withCtx(()=>[createVNode(VListItemTitle,{class:`text-title-medium text-wrap`},{default:withCtx(()=>[createTextVNode(toDisplayString(item.title),1)]),_:2},1024),createBaseVNode(`div`,_hoisted_4,[createBaseVNode(`span`,null,`#`+toDisplayString(item.number)+` · `+toDisplayString(status(item))+` · `+toDisplayString(item.author?.login)+` · `+toDisplayString(date(item.updatedAt)),1),createBaseVNode(`span`,_hoisted_5,toDisplayString(item.headRefName)+` → `+toDisplayString(item.baseRefName),1)])]),_:2},1032,[`to`])],64)}),128))]),_:1})):(openBlock(),createBlock(VSheet,{key:1,rounded:`xl`,color:`surface-light`,class:`pa-8 text-center`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiSourcePull),size:`40`,class:`mb-3`},null,8,[`icon`]),_cache[19]||(_cache[19]=createBaseVNode(`h2`,{class:`text-title-large mb-2`},`No pull requests here`,-1)),_cache[20]||(_cache[20]=createBaseVNode(`p`,{class:`text-body-medium text-medium-emphasis`},`Try another filter, or turn your session into a pull request.`,-1))]),_:1})),createBaseVNode(`div`,_hoisted_6,[_ctx.$route.query.prCursor?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,onClick:_cache[10]||(_cache[10]=$event=>navigate({prCursor:void 0}))},{default:withCtx(()=>[..._cache[21]||(_cache[21]=[createTextVNode(`First page`,-1)])]),_:1})):createCommentVNode(``,true),unref(list).data.value?.pageInfo?.hasNextPage?(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,height:`48`,"append-icon":unref(mdiArrowRight),onClick:_cache[11]||(_cache[11]=$event=>navigate({prCursor:unref(list).data.value.pageInfo.endCursor}))},{default:withCtx(()=>[..._cache[22]||(_cache[22]=[createTextVNode(` Next page `,-1)])]),_:1},8,[`append-icon`])):createCommentVNode(``,true)])],64)):pr.value?(openBlock(),createElementBlock(Fragment,{key:4},[createBaseVNode(`div`,_hoisted_7,[createBaseVNode(`div`,_hoisted_8,[createVNode(VChip,{color:color(pr.value),"prepend-icon":icon(pr.value),variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(status(pr.value)),1)]),_:1},8,[`color`,`prepend-icon`]),createBaseVNode(`span`,_hoisted_9,`#`+toDisplayString(pr.value.number)+` · `+toDisplayString(pr.value.author?.login),1)]),createBaseVNode(`h2`,_hoisted_10,toDisplayString(pr.value.title),1),createBaseVNode(`div`,_hoisted_11,[createBaseVNode(`span`,null,toDisplayString(pr.value.changedFiles)+` files changed`,1),createBaseVNode(`span`,_hoisted_12,`+`+toDisplayString(pr.value.additions),1),createBaseVNode(`span`,_hoisted_13,`−`+toDisplayString(pr.value.deletions),1)])]),createVNode(VSheet,{rounded:`xl`,color:`surface-light`,class:`pa-5 d-flex flex-column ga-4`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_14,[createVNode(VIcon,{icon:unref(mdiSourceBranch),color:`primary`,class:`mt-1`},null,8,[`icon`]),createBaseVNode(`div`,_hoisted_15,[_cache[23]||(_cache[23]=createBaseVNode(`div`,{class:`text-label-large`},`Session source · Save destination`,-1)),createBaseVNode(`div`,_hoisted_16,toDisplayString(pr.value.headRepository?.nameWithOwner||`Deleted repository`)+`:`+toDisplayString(pr.value.headRefName),1),createBaseVNode(`div`,_hoisted_17,`Proposed into `+toDisplayString(repository.value)+`:`+toDisplayString(pr.value.baseRefName),1)])]),pr.value.state===`OPEN`?(openBlock(),createElementBlock(`p`,_hoisted_18,`Open an isolated session with this PR’s changes and description. Save publishes further work to its source branch.`)):createCommentVNode(``,true),pr.value.state===`OPEN`&&pr.value.unavailableReason?(openBlock(),createElementBlock(`p`,_hoisted_19,toDisplayString(pr.value.unavailableReason),1)):pr.value.state===`OPEN`&&!toolbar.value.canCreateSession?(openBlock(),createElementBlock(`p`,_hoisted_20,toDisplayString(toolbar.value.createSessionTitle),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_21,[pr.value.state===`OPEN`?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,rounded:`pill`,height:`48`,"prepend-icon":unref(mdiSourcePull),disabled:Boolean(pr.value.unavailableReason)||!toolbar.value.canCreateSession||toolbar.value.createSessionRunning,onClick:_cache[12]||(_cache[12]=$event=>assistantDialog.value=true)},{default:withCtx(()=>[..._cache[24]||(_cache[24]=[createTextVNode(` Open as session `,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{href:pr.value.url,target:`_blank`,rel:`noopener noreferrer`,variant:`text`,height:`48`,"append-icon":unref(mdiOpenInNew)},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(`View on GitHub`,-1)])]),_:1},8,[`href`,`append-icon`])])]),_:1}),createVNode(GithubPullRequestActions_default,{"pull-request":pr.value,"api-path":`${basePath.value}/${number.value}`,disabled:unref(detail).isFetching.value,onChanged:actionFinished},null,8,[`pull-request`,`api-path`,`disabled`]),createVNode(VSheet,{rounded:`xl`,border:``,class:`pa-5 pull-requests__description`},{default:withCtx(()=>[_cache[26]||(_cache[26]=createBaseVNode(`h3`,{class:`text-title-medium mb-4`},`Description`,-1)),pr.value.body?(openBlock(),createBlock(unref(LongTextPreviewBlocks_default),{key:0,blocks:description.value},null,8,[`blocks`])):(openBlock(),createElementBlock(`p`,_hoisted_22,`No description provided.`))]),_:1})],64)):createCommentVNode(``,true)],64)),available.value&&assistantDialog.value?(openBlock(),createBlock(Vibe64AssistantSessionDialog_default,{key:2,modelValue:assistantDialog.value,"onUpdate:modelValue":_cache[13]||(_cache[13]=$event=>assistantDialog.value=$event),toolbar:toolbar.value,onCreated:created},null,8,[`modelValue`,`toolbar`])):createCommentVNode(``,true),available.value?(openBlock(),createBlock(Vibe64CreatePullRequestDialog_default,{key:3,modelValue:createDialog.value,"onUpdate:modelValue":_cache[14]||(_cache[14]=$event=>createDialog.value=$event),"dashboard-context":__props.dashboardContext,onCreated:published},null,8,[`modelValue`,`dashboard-context`])):createCommentVNode(``,true)])}}};var GithubPullRequestsPanel_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-df1c2c8b`]]);var _sfc_main={__name:`index`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(GithubPullRequestsPanel_default,{"dashboard-context":__props.dashboardContext},null,8,[`dashboard-context`])}}};export{_sfc_main as default};
|
|
1
|
+
import{Gn as withKeys,Kn as withModifiers,h as VIcon}from"./ripple-BVltMmyV.js";import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,_ as createBaseVNode,b as createElementBlock,bt as renderList,g as computed,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,v as createBlock,vn as ref,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{J as useQueryClient,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{c as projectSlugFromRoute,o as projectAppPath}from"./useRealtimeEvent-Bwapstla.js";import{t as VSelect}from"./VSelect-DL3HaA5m.js";import{c as VListItemTitle,n as VList,s as VListItem}from"./VMenu-C_x18lwb.js";import{t as VChip}from"./VChip-CcI-Oo2J.js";import{t as VTextField}from"./VTextField-BR2eZeFT.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-DmMMIScP.js";import{$n as mdiSourceBranch,En as mdiOpenInNew,In as mdiPlus,Vn as mdiRefresh,W as mdiCloseCircleOutline,er as mdiSourceBranchSync,j as mdiCheck,nr as mdiSourceMerge,rr as mdiSourcePull,v as mdiArrowRight,yn as mdiMagnify}from"./mdi-CG9pWOSj.js";import{i as VBtnToggle,t as VBtn}from"./VBtn-B2MBK2DL.js";import{t as VAlert}from"./VAlert-P256xaE0.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{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{t as VSkeletonLoader}from"./VSkeletonLoader-CttxM1tw.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{_ as parseLongTextReviewBlocks,g as LongTextPreviewBlocks_default}from"./conversation-B90ERX9h.js";import{t as useUiFeedback}from"./useUiFeedback-BPBF_0bp.js";import{a as vibe64SessionPullRequest}from"./vibe64SessionViewModel-DR4tOlGM.js";import{t as Vibe64DashboardBackButton_default}from"./Vibe64DashboardBackButton-BH_8j_VR.js";import{n as githubProjectRepositoryName,t as githubProjectAvailable}from"./vibe64GithubProject-CdFrbVHp.js";import{i as Vibe64CreatePullRequestDialog_default,n as Vibe64AssistantSessionDialog_default,t as focusCreatedVibe64SessionTab}from"./vibe64SessionFocus-CqZNTvYF.js";import{t as _sfc_main$3}from"./GithubBrowserTabs-C2NO5l8g.js";var _hoisted_1$1={key:0,role:`status`,class:`text-body-medium ma-0`};var _hoisted_2$1={class:`d-flex flex-wrap ga-2 text-body-small`};var _hoisted_3$1={key:0,class:`text-body-medium ma-0`};var _hoisted_4$1={class:`d-flex flex-wrap ga-2`};var _hoisted_5$1={class:`text-wrap`};var _hoisted_6$1={class:`text-wrap`};var _hoisted_7$1={key:1,class:`text-body-small ma-0`};var _hoisted_8$1={key:2,class:`text-body-medium ma-0`};var _hoisted_9$1={key:3,class:`text-body-medium ma-0`};var _hoisted_10$1={class:`text-body-medium ma-0`};var _hoisted_11$1={key:0,class:`text-body-medium ma-0`};var _hoisted_12$1={key:1,class:`text-body-medium ma-0`};var _hoisted_13$1={key:1,class:`text-body-small ma-0`};var _hoisted_14$1=[`href`];var _sfc_main$2={__name:`GithubPullRequestActions`,props:{pullRequest:{type:Object,required:true},apiPath:{type:String,required:true},disabled:Boolean},emits:[`changed`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const feedback=useUiFeedback({source:`vibe64.pullRequests.actions`});const confirmation=ref(null);const pending=ref(false);const mergeMethod=ref(``);const notice=ref(``);const updatingHead=ref(``);const failed=ref(false);const methodLabels={merge:`Create a merge commit`,squash:`Squash and merge`,rebase:`Rebase and merge`};const checksLabel=computed(()=>({SUCCESS:`Checks passed`,FAILURE:`Some checks failed`,ERROR:`Checks reported an error`,PENDING:`Checks are running`,EXPECTED:`Waiting for checks`})[props.pullRequest.checksState]||`No checks reported`);const reviewLabel=computed(()=>({APPROVED:`Reviews approved`,CHANGES_REQUESTED:`Changes requested`,REVIEW_REQUIRED:`Reviews required`})[props.pullRequest.reviewDecision]||``);const path=computed(()=>confirmation.value?.path||props.apiPath);const command=useEndpointResource({path,enabled:false,queryKey:computed(()=>[`vibe64.pullRequestAction`,path.value]),mutationOptions:{retry:false}});const actionDisabled=computed(()=>props.disabled||pending.value||!props.pullRequest.review);watch(()=>props.apiPath,()=>{confirmation.value=null;notice.value=``;updatingHead.value=``;failed.value=false});watch(()=>[props.pullRequest.headRefOid,props.pullRequest.state],([head,state])=>{if(state!==`OPEN`){notice.value=``;updatingHead.value=``}else if(updatingHead.value&&head&&head!==updatingHead.value){notice.value=`New commits are available. Update your session to load them.`;updatingHead.value=``}});function open(operation){const pr=props.pullRequest;if(actionDisabled.value||pr.actions?.[operation]!==``)return;mergeMethod.value=pr.mergeMethods[0]||``;const head=`${pr.review.headRepository}:${pr.review.headBranch}`;const base=`${pr.review.repository}:${pr.review.baseBranch}`;confirmation.value={operation,path:`${props.apiPath}/${operation}`,apiPath:props.apiPath,review:{...pr.review},url:pr.url,methods:pr.mergeMethods,from:operation===`update-branch`?base:head,to:operation===`update-branch`?head:base,title:operation===`ready`?`Ready for review?`:operation===`update-branch`?`Update branch from ${pr.baseRefName}?`:`Merge into ${pr.baseRefName}?`};failed.value=false}async function submit(){const reviewed=confirmation.value;if(!reviewed||pending.value||props.disabled)return;pending.value=true;failed.value=false;try{const result=await command.save({review:reviewed.review,...reviewed.operation===`merge`?{mergeMethod:mergeMethod.value}:{}},{method:`POST`,path:reviewed.path});if(props.apiPath===reviewed.apiPath){notice.value=result.pending?result.message:``;updatingHead.value=result.pending?reviewed.review.headCommit:``;confirmation.value=null}feedback.success(`PR #${reviewed.review.number}: ${result.message}`);emit(`changed`,{apiPath:reviewed.apiPath,operation:reviewed.operation})}catch(error){if(props.apiPath===reviewed.apiPath)failed.value=true;feedback.error(error,`The result could not be confirmed. Refresh this pull request before trying again.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VSheet,{rounded:`xl`,border:``,class:`pa-5 d-flex flex-column ga-3 pr-actions`},{default:withCtx(()=>[notice.value?(openBlock(),createElementBlock(`p`,_hoisted_1$1,toDisplayString(notice.value),1)):createCommentVNode(``,true),__props.pullRequest.state===`OPEN`?(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`div`,_hoisted_2$1,[createVNode(VChip,{size:`small`,color:[`FAILURE`,`ERROR`].includes(__props.pullRequest.checksState)?`warning`:void 0},{default:withCtx(()=>[createTextVNode(toDisplayString(checksLabel.value),1)]),_:1},8,[`color`]),reviewLabel.value?(openBlock(),createBlock(VChip,{key:0,size:`small`},{default:withCtx(()=>[createTextVNode(toDisplayString(reviewLabel.value),1)]),_:1})):createCommentVNode(``,true)]),__props.pullRequest.actions?.merge?(openBlock(),createElementBlock(`p`,_hoisted_3$1,toDisplayString(__props.pullRequest.actions.merge),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_4$1,[__props.pullRequest.isDraft?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`tonal`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiCheck),disabled:actionDisabled.value||Boolean(__props.pullRequest.actions?.ready),onClick:_cache[0]||(_cache[0]=$event=>open(`ready`))},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createBaseVNode(`span`,{class:`text-wrap`},`Ready for review`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),__props.pullRequest.actions?.[`update-branch`]===``?(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiSourceBranchSync),disabled:actionDisabled.value,onClick:_cache[1]||(_cache[1]=$event=>open(`update-branch`))},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_5$1,`Update branch from `+toDisplayString(__props.pullRequest.baseRefName),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),!__props.pullRequest.isDraft?(openBlock(),createBlock(VBtn,{key:2,color:`primary`,variant:`flat`,"min-height":`48`,height:`auto`,"max-width":`100%`,"prepend-icon":unref(mdiSourceMerge),disabled:actionDisabled.value||Boolean(__props.pullRequest.actions?.merge),onClick:_cache[2]||(_cache[2]=$event=>open(`merge`))},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_6$1,`Merge into `+toDisplayString(__props.pullRequest.baseRefName),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true)]),__props.pullRequest.isDraft&&__props.pullRequest.actions?.ready?(openBlock(),createElementBlock(`p`,_hoisted_7$1,toDisplayString(__props.pullRequest.actions.ready),1)):createCommentVNode(``,true)],64)):__props.pullRequest.state===`MERGED`&&!notice.value?(openBlock(),createElementBlock(`p`,_hoisted_8$1,` Merged into `+toDisplayString(__props.pullRequest.baseRefName)+`. Archive your session when you have finished with it. `,1)):!notice.value?(openBlock(),createElementBlock(`p`,_hoisted_9$1,`This pull request is closed.`)):createCommentVNode(``,true)]),_:1}),createVNode(VDialog,{"model-value":Boolean(confirmation.value),"max-width":`36rem`,scrollable:``,persistent:pending.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>!$event&&!pending.value&&(confirmation.value=null))},{default:withCtx(()=>[confirmation.value?(openBlock(),createBlock(VCard,{key:0,rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[createTextVNode(toDisplayString(confirmation.value.title),1)]),_:1}),createVNode(VCardText,{class:`d-flex flex-column ga-3 pr-confirmation`},{default:withCtx(()=>[createBaseVNode(`p`,_hoisted_10$1,toDisplayString(confirmation.value.from)+` → `+toDisplayString(confirmation.value.to),1),confirmation.value.operation===`ready`?(openBlock(),createElementBlock(`p`,_hoisted_11$1,`Mark this draft ready so reviewers can review it.`)):confirmation.value.operation===`update-branch`?(openBlock(),createElementBlock(`p`,_hoisted_12$1,` Merge `+toDisplayString(confirmation.value.review.baseBranch)+` into `+toDisplayString(confirmation.value.review.headBranch)+` on GitHub. Then use Update session to load those changes into your session. `,1)):(openBlock(),createElementBlock(Fragment,{key:2},[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`text-body-medium ma-0`},`Merge the commits already on GitHub. Save any session work you want included first.`,-1)),confirmation.value.methods.length>1?(openBlock(),createBlock(VSelect,{key:0,modelValue:mergeMethod.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>mergeMethod.value=$event),label:`Merge method`,variant:`outlined`,"hide-details":``,items:confirmation.value.methods.map(value=>({title:methodLabels[value],value})),disabled:pending.value},null,8,[`modelValue`,`items`,`disabled`])):(openBlock(),createElementBlock(`p`,_hoisted_13$1,toDisplayString(methodLabels[mergeMethod.value]),1))],64)),failed.value?(openBlock(),createBlock(VAlert,{key:3,type:`warning`,variant:`tonal`},{default:withCtx(()=>[_cache[8]||(_cache[8]=createTextVNode(` This action was not confirmed. Close this dialog and refresh, or view the pull request on GitHub, before trying again. `,-1)),createBaseVNode(`a`,{href:confirmation.value.url,target:`_blank`,rel:`noopener noreferrer`},`View on GitHub`,8,_hoisted_14$1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`pa-4 flex-wrap`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{disabled:pending.value,height:`48`,onClick:_cache[4]||(_cache[4]=$event=>confirmation.value=null)},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,height:`48`,disabled:pending.value||__props.disabled||failed.value,"aria-busy":pending.value,onClick:submit},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?`Working…`:confirmation.value.operation===`ready`?`Ready for review`:confirmation.value.operation===`merge`?`Merge pull request`:`Update branch`),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`,`persistent`])],64)}}};var GithubPullRequestActions_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-5aa628de`]]);var _hoisted_1={class:`pull-requests d-flex flex-column ga-2`};var _hoisted_2={class:`d-flex align-center flex-wrap ga-2`};var _hoisted_3={class:`d-flex justify-space-between px-2 text-label-large text-medium-emphasis`};var _hoisted_4={class:`d-flex flex-wrap ga-2 text-body-small text-medium-emphasis mt-1`};var _hoisted_5={class:`pull-requests__branch`};var _hoisted_6={class:`d-flex justify-end ga-2`};var _hoisted_7={class:`px-2`};var _hoisted_8={class:`d-flex align-center flex-wrap ga-2 mb-3`};var _hoisted_9={class:`text-body-medium text-medium-emphasis`};var _hoisted_10={class:`text-headline-small mb-3`};var _hoisted_11={class:`d-flex flex-wrap ga-3 text-body-small text-medium-emphasis`};var _hoisted_12={class:`text-success`};var _hoisted_13={class:`text-error`};var _hoisted_14={class:`d-flex align-start ga-3`};var _hoisted_15={class:`pull-requests__branch`};var _hoisted_16={class:`text-body-medium mt-1`};var _hoisted_17={class:`text-body-small text-medium-emphasis mt-1`};var _hoisted_18={key:0,class:`text-body-medium ma-0`};var _hoisted_19={key:1,class:`text-body-medium ma-0`};var _hoisted_20={key:2,class:`text-body-medium ma-0`};var _hoisted_21={class:`d-flex flex-wrap ga-2`};var _hoisted_22={key:1,class:`text-body-medium text-medium-emphasis ma-0`};var _sfc_main$1={__name:`GithubPullRequestsPanel`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){const props=__props;const route=useRoute();const router=useRouter();const queryClient=useQueryClient();const projectSlug=computed(()=>projectSlugFromRoute(route));const repository=computed(()=>githubProjectRepositoryName(props.dashboardContext.projectContext));const available=computed(()=>githubProjectAvailable(props.dashboardContext.projectContext));const active=computed(()=>available.value&&props.dashboardContext.active!==false);const number=computed(()=>/^\d+$/u.test(String(route.query.pr||``))?String(route.query.pr):``);const state=computed(()=>[`open`,`closed`,`merged`,`all`].includes(route.query.prState)?route.query.prState:`open`);const search=ref(String(route.query.prSearch||``));watch(()=>route.query.prSearch,value=>{search.value=String(value||``)});const basePath=computed(()=>scopedDevelopmentApiUrl(`/api/vibe64/pull-requests`,projectSlug.value));const listQuery=computed(()=>({state:state.value,search:String(route.query.prSearch||``),...route.query.prCursor?{cursor:route.query.prCursor}:{}}));const list=useEndpointResource({path:basePath,readQuery:listQuery,queryKey:computed(()=>[`vibe64.pullRequests`,basePath.value,listQuery.value]),enabled:computed(()=>active.value&&!number.value),queryOptions:{retry:false},fallbackLoadError:`Pull requests could not load.`});const detail=useEndpointResource({path:computed(()=>`${basePath.value}/${number.value}`),queryKey:computed(()=>[`vibe64.pullRequest`,basePath.value,number.value]),enabled:computed(()=>active.value&&Boolean(number.value)),queryOptions:{retry:false},fallbackLoadError:`This pull request could not load.`});const resource=computed(()=>number.value?detail:list);const pr=computed(()=>detail.data.value?.pullRequest);const description=computed(()=>parseLongTextReviewBlocks(pr.value?.body||``));const assistantDialog=ref(false);const createDialog=ref(false);const selectedSource=computed(()=>vibe64SessionPullRequest(props.dashboardContext.session));const createAvailable=computed(()=>Boolean(props.dashboardContext.sessionId)&&!selectedSource.value?.number);const toolbar=computed(()=>({...props.dashboardContext.sessionToolbar,repositoryBranchSelectionDisabled:true,createSession:(selection,options={})=>props.dashboardContext.sessionToolbar?.createSession?.(selection,{...options,pullRequestNumber:Number(number.value)})}));watch(()=>route.query.createPullRequest,value=>{if(value&&createAvailable.value)createDialog.value=true},{immediate:true});function navigate(query){return router.push({query:{...route.query,...query}})}function filter(nextState=state.value){return navigate({prState:nextState,prSearch:String(search.value||``).trim()||void 0,prCursor:void 0,pr:void 0})}function status(item){if(item.state===`MERGED`)return`Merged`;if(item.state===`CLOSED`)return`Closed`;return item.isDraft?`Draft`:`Open`}function color(item){if(item.state===`MERGED`)return`primary`;if(item.state===`CLOSED`)return`error`;return item.isDraft?void 0:`success`}function icon(item){if(item.state===`MERGED`)return mdiSourceMerge;return item.state===`CLOSED`?mdiCloseCircleOutline:mdiSourcePull}function date(value){return value?new Date(value).toLocaleDateString(void 0,{month:`short`,day:`numeric`}):``}async function created(response){if(!response?.sessionId)return;await router.push(projectAppPath(projectSlug.value,`/dashboard/changes`));focusCreatedVibe64SessionTab(response.sessionId)}async function published(source){await list.reload();await navigate({pr:String(source.number),createPullRequest:void 0});await detail.reload()}async function actionFinished({apiPath}){await queryClient.invalidateQueries({queryKey:[`vibe64.pullRequests`,apiPath.replace(/\/\d+$/u,``)]});if(apiPath!==`${basePath.value}/${number.value}`)return;await detail.reload();props.dashboardContext.refreshSessionWork?.()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[createBaseVNode(`div`,_hoisted_2,[createVNode(Vibe64DashboardBackButton_default,{to:available.value&&number.value?void 0:unref(projectAppPath)(projectSlug.value,`/dashboard/env`),onClick:_cache[0]||(_cache[0]=$event=>available.value&&number.value&&navigate({pr:void 0}))},{default:withCtx(()=>[createTextVNode(toDisplayString(available.value&&number.value?`All pull requests`:`Back to dashboard`),1)]),_:1},8,[`to`]),createVNode(VSpacer),available.value?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiRefresh),variant:`text`,size:`small`,height:`48`,disabled:resource.value.isFetching.value,onClick:_cache[1]||(_cache[1]=$event=>resource.value.reload())},{default:withCtx(()=>[createTextVNode(toDisplayString(resource.value.isFetching.value?`Refreshing…`:`Refresh`),1)]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),available.value&&createAvailable.value?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`tonal`,rounded:`pill`,size:`small`,height:`48`,"prepend-icon":unref(mdiPlus),disabled:__props.dashboardContext.sourceOperationsSuspended,onClick:_cache[2]||(_cache[2]=$event=>createDialog.value=true)},{default:withCtx(()=>[..._cache[15]||(_cache[15]=[createTextVNode(` Create from session `,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true)]),!available.value?(openBlock(),createBlock(VAlert,{key:0,type:`info`,variant:`tonal`},{default:withCtx(()=>[..._cache[16]||(_cache[16]=[createTextVNode(`Pull requests are available only for GitHub projects.`,-1)])]),_:1})):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(_sfc_main$3),!number.value?(openBlock(),createElementBlock(`form`,{key:0,class:`d-flex flex-wrap align-center ga-3`,onSubmit:_cache[8]||(_cache[8]=withModifiers($event=>filter(),[`prevent`]))},[createVNode(VBtnToggle,{"model-value":state.value,mandatory:``,divided:``,rounded:`pill`,color:`primary`,variant:`outlined`,"aria-label":`Pull request state`,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>filter($event))},{default:withCtx(()=>[(openBlock(),createElementBlock(Fragment,null,renderList([`open`,`closed`,`merged`,`all`],value=>{return createVNode(VBtn,{key:value,value,height:`48`},{default:withCtx(()=>[createTextVNode(toDisplayString(value[0].toUpperCase()+value.slice(1)),1)]),_:2},1032,[`value`])}),64))]),_:1},8,[`model-value`]),createVNode(VTextField,{modelValue:search.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>search.value=$event),class:`pull-requests__search`,label:`Search pull requests`,"prepend-inner-icon":unref(mdiMagnify),variant:`outlined`,rounded:`pill`,"hide-details":``,maxlength:`200`,clearable:``,onKeydown:_cache[6]||(_cache[6]=withKeys(withModifiers($event=>filter(),[`prevent`]),[`enter`])),"onClick:clear":_cache[7]||(_cache[7]=$event=>{search.value=``;filter()})},{"append-inner":withCtx(()=>[createVNode(VBtn,{icon:unref(mdiArrowRight),variant:`text`,size:`48`,"aria-label":`Search pull requests`,onClick:_cache[4]||(_cache[4]=$event=>filter())},null,8,[`icon`])]),_:1},8,[`modelValue`,`prepend-inner-icon`])],32)):createCommentVNode(``,true),resource.value.isInitialLoading.value?(openBlock(),createBlock(VSheet,{key:1,rounded:`xl`,border:``,class:`pa-4`,"aria-label":`Loading pull requests`,"aria-busy":`true`},{default:withCtx(()=>[(openBlock(),createElementBlock(Fragment,null,renderList(4,index=>{return createVNode(VSkeletonLoader,{key:index,type:number.value?`paragraph`:`list-item-two-line`},null,8,[`type`])}),64))]),_:1})):resource.value.loadError.value?(openBlock(),createBlock(VAlert,{key:2,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,onClick:_cache[9]||(_cache[9]=$event=>resource.value.reload())},{default:withCtx(()=>[..._cache[17]||(_cache[17]=[createTextVNode(`Retry`,-1)])]),_:1})]),default:withCtx(()=>[createTextVNode(toDisplayString(resource.value.loadError.value)+` `,1)]),_:1})):!number.value?(openBlock(),createElementBlock(Fragment,{key:3},[createBaseVNode(`div`,_hoisted_3,[createBaseVNode(`span`,null,toDisplayString(unref(list).data.value?.total||0)+` pull requests`,1),_cache[18]||(_cache[18]=createBaseVNode(`span`,null,`Recently updated`,-1))]),unref(list).data.value?.pullRequests?.length?(openBlock(),createBlock(VList,{key:0,class:`pa-0`,density:`compact`,rounded:`xl`,border:``,slim:``,"aria-label":`GitHub pull requests`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(list).data.value.pullRequests,(item,index)=>{return openBlock(),createElementBlock(Fragment,{key:item.number},[index?(openBlock(),createBlock(VDivider,{key:0})):createCommentVNode(``,true),createVNode(VListItem,{class:`py-2`,active:false,to:{query:{..._ctx.$route.query,pr:String(item.number)}}},{prepend:withCtx(()=>[createVNode(VIcon,{icon:icon(item),color:color(item)},null,8,[`icon`,`color`])]),default:withCtx(()=>[createVNode(VListItemTitle,{class:`text-title-medium text-wrap`},{default:withCtx(()=>[createTextVNode(toDisplayString(item.title),1)]),_:2},1024),createBaseVNode(`div`,_hoisted_4,[createBaseVNode(`span`,null,`#`+toDisplayString(item.number)+` · `+toDisplayString(status(item))+` · `+toDisplayString(item.author?.login)+` · `+toDisplayString(date(item.updatedAt)),1),createBaseVNode(`span`,_hoisted_5,toDisplayString(item.headRefName)+` → `+toDisplayString(item.baseRefName),1)])]),_:2},1032,[`to`])],64)}),128))]),_:1})):(openBlock(),createBlock(VSheet,{key:1,rounded:`xl`,color:`surface-light`,class:`pa-8 text-center`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiSourcePull),size:`40`,class:`mb-3`},null,8,[`icon`]),_cache[19]||(_cache[19]=createBaseVNode(`h2`,{class:`text-title-large mb-2`},`No pull requests here`,-1)),_cache[20]||(_cache[20]=createBaseVNode(`p`,{class:`text-body-medium text-medium-emphasis`},`Try another filter, or turn your session into a pull request.`,-1))]),_:1})),createBaseVNode(`div`,_hoisted_6,[_ctx.$route.query.prCursor?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,onClick:_cache[10]||(_cache[10]=$event=>navigate({prCursor:void 0}))},{default:withCtx(()=>[..._cache[21]||(_cache[21]=[createTextVNode(`First page`,-1)])]),_:1})):createCommentVNode(``,true),unref(list).data.value?.pageInfo?.hasNextPage?(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,height:`48`,"append-icon":unref(mdiArrowRight),onClick:_cache[11]||(_cache[11]=$event=>navigate({prCursor:unref(list).data.value.pageInfo.endCursor}))},{default:withCtx(()=>[..._cache[22]||(_cache[22]=[createTextVNode(` Next page `,-1)])]),_:1},8,[`append-icon`])):createCommentVNode(``,true)])],64)):pr.value?(openBlock(),createElementBlock(Fragment,{key:4},[createBaseVNode(`div`,_hoisted_7,[createBaseVNode(`div`,_hoisted_8,[createVNode(VChip,{color:color(pr.value),"prepend-icon":icon(pr.value),variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(status(pr.value)),1)]),_:1},8,[`color`,`prepend-icon`]),createBaseVNode(`span`,_hoisted_9,`#`+toDisplayString(pr.value.number)+` · `+toDisplayString(pr.value.author?.login),1)]),createBaseVNode(`h2`,_hoisted_10,toDisplayString(pr.value.title),1),createBaseVNode(`div`,_hoisted_11,[createBaseVNode(`span`,null,toDisplayString(pr.value.changedFiles)+` files changed`,1),createBaseVNode(`span`,_hoisted_12,`+`+toDisplayString(pr.value.additions),1),createBaseVNode(`span`,_hoisted_13,`−`+toDisplayString(pr.value.deletions),1)])]),createVNode(VSheet,{rounded:`xl`,color:`surface-light`,class:`pa-5 d-flex flex-column ga-4`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_14,[createVNode(VIcon,{icon:unref(mdiSourceBranch),color:`primary`,class:`mt-1`},null,8,[`icon`]),createBaseVNode(`div`,_hoisted_15,[_cache[23]||(_cache[23]=createBaseVNode(`div`,{class:`text-label-large`},`Session source · Save destination`,-1)),createBaseVNode(`div`,_hoisted_16,toDisplayString(pr.value.headRepository?.nameWithOwner||`Deleted repository`)+`:`+toDisplayString(pr.value.headRefName),1),createBaseVNode(`div`,_hoisted_17,`Proposed into `+toDisplayString(repository.value)+`:`+toDisplayString(pr.value.baseRefName),1)])]),pr.value.state===`OPEN`?(openBlock(),createElementBlock(`p`,_hoisted_18,`Open an isolated session with this PR’s changes and description. Save publishes further work to its source branch.`)):createCommentVNode(``,true),pr.value.state===`OPEN`&&pr.value.unavailableReason?(openBlock(),createElementBlock(`p`,_hoisted_19,toDisplayString(pr.value.unavailableReason),1)):pr.value.state===`OPEN`&&!toolbar.value.canCreateSession?(openBlock(),createElementBlock(`p`,_hoisted_20,toDisplayString(toolbar.value.createSessionTitle),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_21,[pr.value.state===`OPEN`?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,rounded:`pill`,height:`48`,"prepend-icon":unref(mdiSourcePull),disabled:Boolean(pr.value.unavailableReason)||!toolbar.value.canCreateSession||toolbar.value.createSessionRunning,onClick:_cache[12]||(_cache[12]=$event=>assistantDialog.value=true)},{default:withCtx(()=>[..._cache[24]||(_cache[24]=[createTextVNode(` Open as session `,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{href:pr.value.url,target:`_blank`,rel:`noopener noreferrer`,variant:`text`,height:`48`,"append-icon":unref(mdiOpenInNew)},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(`View on GitHub`,-1)])]),_:1},8,[`href`,`append-icon`])])]),_:1}),createVNode(GithubPullRequestActions_default,{"pull-request":pr.value,"api-path":`${basePath.value}/${number.value}`,disabled:unref(detail).isFetching.value,onChanged:actionFinished},null,8,[`pull-request`,`api-path`,`disabled`]),createVNode(VSheet,{rounded:`xl`,border:``,class:`pa-5 pull-requests__description`},{default:withCtx(()=>[_cache[26]||(_cache[26]=createBaseVNode(`h3`,{class:`text-title-medium mb-4`},`Description`,-1)),pr.value.body?(openBlock(),createBlock(unref(LongTextPreviewBlocks_default),{key:0,blocks:description.value},null,8,[`blocks`])):(openBlock(),createElementBlock(`p`,_hoisted_22,`No description provided.`))]),_:1})],64)):createCommentVNode(``,true)],64)),available.value&&assistantDialog.value?(openBlock(),createBlock(Vibe64AssistantSessionDialog_default,{key:2,modelValue:assistantDialog.value,"onUpdate:modelValue":_cache[13]||(_cache[13]=$event=>assistantDialog.value=$event),toolbar:toolbar.value,onCreated:created},null,8,[`modelValue`,`toolbar`])):createCommentVNode(``,true),available.value?(openBlock(),createBlock(Vibe64CreatePullRequestDialog_default,{key:3,modelValue:createDialog.value,"onUpdate:modelValue":_cache[14]||(_cache[14]=$event=>createDialog.value=$event),"dashboard-context":__props.dashboardContext,onCreated:published},null,8,[`modelValue`,`dashboard-context`])):createCommentVNode(``,true)])}}};var GithubPullRequestsPanel_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-df1c2c8b`]]);var _sfc_main={__name:`index`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(GithubPullRequestsPanel_default,{"dashboard-context":__props.dashboardContext},null,8,[`dashboard-context`])}}};export{_sfc_main as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{mt as openBlock,v as createBlock,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{t as Vibe64RepositoryWorkspace_default}from"./Vibe64RepositoryWorkspace-
|
|
1
|
+
import{mt as openBlock,v as createBlock,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{t as Vibe64RepositoryWorkspace_default}from"./Vibe64RepositoryWorkspace-obZFXkoG.js";var _sfc_main={__name:`index`,props:{dashboardContext:{default:()=>({}),type:Object}},setup(__props){return(_ctx,_cache)=>{return __props.dashboardContext.active!==false?(openBlock(),createBlock(Vibe64RepositoryWorkspace_default,{key:0,"dashboard-context":__props.dashboardContext,view:`history`},null,8,[`dashboard-context`])):createCommentVNode(``,true)}}};export{_sfc_main as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,_ as createBaseVNode,b as createElementBlock,bt as renderList,g as computed,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,v as createBlock,vn as ref,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-Bwapstla.js";import{t as VSelect}from"./VSelect-DL3HaA5m.js";import{t as VTextField}from"./VTextField-BR2eZeFT.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-DmMMIScP.js";import{t as VBtn}from"./VBtn-B2MBK2DL.js";import{t as VAlert}from"./VAlert-P256xaE0.js";import{t as VCheckbox}from"./VCheckbox-C7A1ZW4D.js";import{n as VRadio,t as VRadioGroup}from"./VRadioGroup-CUu2-KIP.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{t as useCommand}from"./useCommand-Bqxb-naz.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{D as VIBE64_SESSION_CHANGED_EVENT,x as requestVibe64AccountConnectionsDialog}from"./index-GBRpNZLy.js";import{C as engineeringSettingsQueryKey,D as projectSettingsQueryKey,S as VIBE64_PROMPT_HINTS_SETTINGS_API_SUFFIX,f as VIBE64_COLLABORATION_API_SUFFIX,h as VIBE64_ENGINEERING_API_SUFFIX,l as PROJECT_SETTINGS_ENDPOINT,m as VIBE64_DEVELOPMENT_DATABASE_API_SUFFIX,n as DEVELOPMENT_DATABASE_ENDPOINT,r as ENGINEERING_ENDPOINT,t as COLLABORATION_ENDPOINT,u as PROMPT_HINTS_SETTINGS_ENDPOINT,y as VIBE64_PROJECT_CHANGED_EVENT}from"./studioGateApi-DcCqiD9V.js";import{t as Vibe64AsyncModuleState_default}from"./Vibe64AsyncModuleState-Do9EqX3S.js";import{t as sessionListRealtimeShouldRefresh}from"./useVibe64SessionData-YhhE_5pC.js";var CONNECTED_CUSTOM_PACKAGE_TYPE=`custom`;var CONNECTED_PACKAGE_TYPES=Object.freeze([Object.freeze({value:`npm`,label:`npm (Node.js)`}),Object.freeze({value:`composer`,label:`Composer (PHP)`}),Object.freeze({value:`pip`,label:`pip (Python)`}),Object.freeze({value:`bundler`,label:`Bundler (Ruby)`}),Object.freeze({value:`gomod`,label:`Go modules`}),Object.freeze({value:`cargo`,label:`Cargo (Rust)`}),Object.freeze({value:`maven`,label:`Maven`}),Object.freeze({value:`gradle`,label:`Gradle`}),Object.freeze({value:`nuget`,label:`NuGet (.NET)`}),Object.freeze({value:CONNECTED_CUSTOM_PACKAGE_TYPE,label:`custom`})]);var CONNECTED_PACKAGE_TYPE_VALUES=Object.freeze(CONNECTED_PACKAGE_TYPES.map(type=>type.value));function connectedPackageTypeUsesScript(type){return type===CONNECTED_CUSTOM_PACKAGE_TYPE}var _hoisted_1$2={class:`project-settings__section`,"aria-labelledby":`connected-projects-title`};var _hoisted_2$1={class:`project-settings__content text-body-medium`};var _hoisted_3$1={key:0};var _hoisted_4$1={key:0};var _hoisted_5$1=[`disabled`];var _hoisted_6$1={class:`text-label-large`};var _hoisted_7$1={key:2};var _hoisted_8$1={class:`connection-actions`};var _sfc_main$2={__name:`ConnectedProjectsSettings`,props:{projectSlug:{type:String,required:true},state:{type:Object,default:()=>({})}},emits:[`saved`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const draft=ref([]);const baseline=ref(`[]`);const revision=ref(``);const saving=ref(false);const changed=computed(()=>JSON.stringify(draft.value)!==baseline.value);const stale=computed(()=>props.state.available&&revision.value!==props.state.revision);const relationships=[{label:`Dependency — a library or tool`,value:`dependency`},{label:`Composition — source assembled into this project`,value:`composition`}];const packageTypes=[{label:`Stack default`,value:``},...CONNECTED_PACKAGE_TYPES];function scriptAllowed(entry){return!entry.type||connectedPackageTypeUsesScript(entry.type)}function setPackageType(entry,value){if(value)entry.type=value;else delete entry.type;if(!scriptAllowed(entry))delete entry.script}function setScript(entry,value){if(value)entry.script=value;else delete entry.script}function resetDraft(){draft.value=(props.state.projects||[]).map(entry=>({...entry}));baseline.value=JSON.stringify(draft.value);revision.value=props.state.revision||``}let sourceIdentity=``;watch(()=>[props.projectSlug,props.state],()=>{if(!props.state.source)return;const identity=JSON.stringify([props.projectSlug,props.state.source]);if(identity!==sourceIdentity||!changed.value)resetDraft();sourceIdentity=identity},{immediate:true});const saveCommand=useCommand({access:`never`,apiSuffix:`/vibe64/settings/connections`,buildCommandOptions:()=>({method:`PUT`,path:scopedDevelopmentApiUrl(`/api/vibe64/settings/connections`,props.projectSlug)}),buildRawPayload:(_model,{context})=>context,fallbackRunError:`Connected projects could not be saved.`,messages:{error:`Connected projects could not be saved.`,success:`Connected projects saved in source.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.project.connections.save`,surfaceId:`app`,writeMethod:`PUT`});async function save(){if(saving.value||stale.value||!props.state.canEdit)return;saving.value=true;try{if(!await saveCommand.run({projects:draft.value.map(entry=>({...entry})),revision:revision.value,sessionId:props.state.source?.sessionId||``}))return;baseline.value=JSON.stringify(draft.value);emit(`saved`)}catch{}finally{saving.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$2,[_cache[6]||(_cache[6]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`connected-projects-title`,class:`text-title-medium font-weight-bold`},`Connected projects`),createBaseVNode(`p`,null,`Libraries and source projects you contribute to from this project.`),createBaseVNode(`p`,null,[createTextVNode(`Saved in this source checkout’s `),createBaseVNode(`code`,null,`vibe64.connections.json`),createTextVNode(`. Changes follow normal project Save.`)])],-1)),createBaseVNode(`div`,_hoisted_2$1,[!__props.state.available?(openBlock(),createElementBlock(`p`,_hoisted_3$1,toDisplayString(__props.state.unavailableReason||`Select a session to configure connected projects.`),1)):(openBlock(),createElementBlock(Fragment,{key:1},[!__props.state.exists?(openBlock(),createElementBlock(`p`,_hoisted_4$1,`No connection file yet. Add projects below, then save the list.`)):createCommentVNode(``,true),stale.value?(openBlock(),createBlock(VAlert,{key:1,type:`warning`,variant:`tonal`},{default:withCtx(()=>[_cache[2]||(_cache[2]=createTextVNode(` The saved list changed while you were editing. Reload the saved list and review your changes before saving. `,-1)),createVNode(VBtn,{variant:`text`,onClick:resetDraft},{default:withCtx(()=>[..._cache[1]||(_cache[1]=[createTextVNode(`Reload saved list`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(draft.value,(entry,index)=>{return openBlock(),createElementBlock(`fieldset`,{key:index,class:`connection-entry`,disabled:!__props.state.canEdit||saving.value},[createBaseVNode(`legend`,_hoisted_6$1,`Connected project `+toDisplayString(index+1),1),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.name,"onUpdate:modelValue":$event=>entry.name=$event,label:`Name`,maxlength:`100`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.repository,"onUpdate:modelValue":$event=>entry.repository=$event,label:`GitHub repository URL`,placeholder:`https://github.com/owner/repository`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VSelect,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.relationship,"onUpdate:modelValue":$event=>entry.relationship=$event,label:`Relationship`,items:relationships,"item-title":`label`,"item-value":`value`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VSelect,{disabled:!__props.state.canEdit||saving.value,"model-value":entry.type||``,"onUpdate:modelValue":$event=>setPackageType(entry,$event),label:`Package type`,items:packageTypes,"item-title":`label`,"item-value":`value`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`model-value`,`onUpdate:modelValue`]),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value||!scriptAllowed(entry),"model-value":entry.script||``,"onUpdate:modelValue":$event=>setScript(entry,$event),label:`Preparation script (project-relative)`,placeholder:`tooling/prepare-native-worker.mjs`,maxlength:`1024`,hint:`Required for custom. Relative to this project's root; Stack declares the runtime.`,"persistent-hint":``,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`model-value`,`onUpdate:modelValue`]),createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value,variant:`text`,"aria-label":`Remove ${entry.name||`connected project`}`,onClick:$event=>draft.value.splice(index,1)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Remove`,-1)])]),_:1},8,[`disabled`,`aria-label`,`onClick`])],8,_hoisted_5$1)}),128)),__props.state.exists&&!draft.value.length?(openBlock(),createElementBlock(`p`,_hoisted_7$1,`No connected projects.`)):createCommentVNode(``,true),_cache[5]||(_cache[5]=createBaseVNode(`p`,{class:`text-body-small`},`Removing a connection preserves its existing contributions and pending work.`,-1)),createBaseVNode(`div`,_hoisted_8$1,[createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value||draft.value.length>=64,variant:`outlined`,onClick:_cache[0]||(_cache[0]=$event=>draft.value.push({name:``,repository:``,relationship:`dependency`}))},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Add project`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value||stale.value||!changed.value&&__props.state.exists,color:`primary`,variant:`flat`,onClick:save},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Saving…`:`Save connected projects`),1)]),_:1},8,[`disabled`])])],64))])])}}};var ConnectedProjectsSettings_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-f2a13772`]]);var _hoisted_1$1={class:`project-settings`};var _hoisted_2={class:`project-settings__header`};var _hoisted_3={class:`project-settings__section`,"aria-labelledby":`engineering-approach-title`};var _hoisted_4={class:`project-settings__section-copy text-body-medium`};var _hoisted_5={key:0,class:`project-settings__scope text-label-medium`};var _hoisted_6={key:0,class:`project-settings__content text-body-medium`};var _hoisted_7={class:`project-settings__engineering-field`};var _hoisted_8={class:`project-settings__action text-body-small`};var _hoisted_9={key:1,class:`project-settings__action text-body-small`};var _hoisted_10={class:`project-settings__section`,"aria-labelledby":`development-database-title`};var _hoisted_11={class:`project-settings__section-copy text-body-medium`};var _hoisted_12={key:0};var _hoisted_13={key:1};var _hoisted_14={key:0,class:`project-settings__content text-body-medium`};var _hoisted_15={class:`project-settings__option`};var _hoisted_16={key:0,id:`development-database-session-reason`,class:`project-settings__option-support text-body-small`};var _hoisted_17={class:`project-settings__option`};var _hoisted_18={key:0,id:`development-database-project-reason`,class:`project-settings__option-support text-body-small`};var _hoisted_19={key:0,class:`project-settings__action text-body-small`};var _hoisted_20={class:`project-settings__action text-body-small`};var _hoisted_21={key:0};var _hoisted_22={key:1};var _hoisted_23={class:`project-settings__section`,"aria-labelledby":`ai-behaviour-title`};var _hoisted_24={class:`project-settings__section-copy text-body-medium`};var _hoisted_25={class:`project-settings__scope text-label-medium`};var _hoisted_26={class:`project-settings__content text-body-medium`};var _hoisted_27={class:`project-settings__ai-fields`};var _hoisted_28={class:`project-settings__action text-body-small`};var _hoisted_29={key:0};var _hoisted_30={key:1};var _hoisted_31={key:2};var _hoisted_32={class:`project-settings__section`,"aria-labelledby":`prompt-suggestions-title`};var _hoisted_33={class:`project-settings__content text-body-medium`};var _hoisted_34={class:`project-settings__action text-body-small`};var _hoisted_35={key:0,class:`project-settings__section`,"aria-labelledby":`repository-workflow-title`};var _hoisted_36={class:`project-settings__content text-body-medium`};var _hoisted_37={class:`project-settings__action text-body-small`};var _sfc_main$1={__name:`ProjectSettingsPanel`,setup(__props){const projectSlug=useVibe64ProjectSlug();const route=useRoute();const router=useRouter();const scopeDraft=ref(`session`);const sharedSessionsDraft=ref(false);const collaborationDraft=ref(normalizeCollaborationDraft());const savedCollaboration=ref(normalizeCollaborationDraft());const promptHintsDraft=ref(true);const savedPromptHints=ref(true);const requirePullRequest=ref(false);const engineeringProfileDraft=ref(``);const savedEngineeringProfile=ref(``);const routeSessionId=computed(()=>String(route.query.sessionId||``).trim());const resource=useEndpointResource({fallbackLoadError:`Project settings could not load.`,path:computed(()=>scopedDevelopmentApiUrl(PROJECT_SETTINGS_ENDPOINT,projectSlug.value)),queryKey:computed(()=>projectSettingsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,routeSessionId.value)),readQuery:computed(()=>routeSessionId.value?{sessionId:routeSessionId.value}:{}),refreshOnPull:true,requestRecoveryLabel:`Project settings`});const engineeringResource=useEndpointResource({fallbackLoadError:`Engineering approach could not load.`,path:computed(()=>scopedDevelopmentApiUrl(ENGINEERING_ENDPOINT,projectSlug.value)),queryKey:computed(()=>engineeringSettingsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,routeSessionId.value)),readQuery:computed(()=>routeSessionId.value?{sessionId:routeSessionId.value}:{}),realtime:{event:VIBE64_PROJECT_CHANGED_EVENT,matches:()=>!engineeringSaveCommand.isRunning},refreshOnPull:true,requestRecoveryLabel:`Engineering approach`});const databaseSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_DEVELOPMENT_DATABASE_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:DEVELOPMENT_DATABASE_ENDPOINT}),buildRawPayload:(_model,{context})=>({scope:context.scope,allowSharedDatabaseSessions:context.allowSharedDatabaseSessions}),fallbackRunError:`Development database choice could not be saved.`,messages:{error:`Development database choice could not be saved.`,success:`Development database choice saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.development-database.scope.save`,surfaceId:`app`,writeMethod:`PUT`});const collaborationSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_COLLABORATION_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:COLLABORATION_ENDPOINT}),buildRawPayload:(_model,{context})=>({...context.collaboration,...context.sessionId?{sessionId:context.sessionId}:{}}),fallbackRunError:`Collaboration guidance could not be saved.`,messages:{error:`Collaboration guidance could not be saved.`,success:`Collaboration guidance saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.collaboration.save`,surfaceId:`app`,writeMethod:`PUT`});const promptHintsSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_PROMPT_HINTS_SETTINGS_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:PROMPT_HINTS_SETTINGS_ENDPOINT}),buildRawPayload:(_model,{context})=>({promptHints:context.promptHints}),fallbackRunError:`Prompt suggestions could not be saved.`,messages:{error:`Prompt suggestions could not be saved.`,success:`Prompt suggestions saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.prompt-hints.save`,surfaceId:`app`,writeMethod:`PUT`});const repositoryWorkflowCommand=useCommand({access:`never`,apiSuffix:`/vibe64/repository/workflow`,buildCommandOptions:()=>({method:`PUT`,path:scopedDevelopmentApiUrl(`/api/vibe64/repository/workflow`,projectSlug.value)}),buildRawPayload:(_model,{context})=>({requirePullRequest:context.requirePullRequest}),fallbackRunError:`Repository workflow could not be saved.`,messages:{error:`Repository workflow could not be saved.`,success:`Repository workflow saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.repository.workflow`,surfaceId:`app`,writeMethod:`PUT`});const repositoryWorkflow=computed(()=>resource.data.value?.repositoryWorkflow||{});watch(()=>repositoryWorkflow.value.requirePullRequest,value=>{requirePullRequest.value=value===true},{immediate:true});async function saveRepositoryWorkflow(){await repositoryWorkflowCommand.run({requirePullRequest:requirePullRequest.value});await resource.reload()}const engineeringSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_ENGINEERING_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:ENGINEERING_ENDPOINT}),buildRawPayload:(_model,{context})=>({profile:context.profile,...context.sessionId?{sessionId:context.sessionId}:{}}),fallbackRunError:`Engineering approach could not be saved.`,messages:{error:`Engineering approach could not be saved.`,success:`Engineering approach saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.engineering.profile.save`,surfaceId:`app`,writeMethod:`PUT`});const developmentDatabase=computed(()=>resource.data.value?.developmentDatabase||{});const managed=computed(()=>developmentDatabase.value.managed===true);const canChange=computed(()=>developmentDatabase.value.canChange===true);const disabledReason=computed(()=>String(developmentDatabase.value.disabledReason||``));const sessionScopeOption=computed(()=>developmentDatabase.value.options?.session||{});const projectScopeOption=computed(()=>developmentDatabase.value.options?.project||{});const sessionScopeAvailable=computed(()=>sessionScopeOption.value.available===true);const projectScopeAvailable=computed(()=>projectScopeOption.value.available===true);const sessionScopeReason=computed(()=>String(sessionScopeOption.value.disabledReason||``));const projectScopeReason=computed(()=>String(projectScopeOption.value.disabledReason||``));const scopeDraftAvailable=computed(()=>scopeDraft.value===`project`?projectScopeAvailable.value:sessionScopeAvailable.value);const collaboration=computed(()=>resource.data.value?.collaboration||{});const collaborationAvailable=computed(()=>collaboration.value.available===true);const collaborationCanEdit=computed(()=>collaboration.value.canEdit===true);const collaborationSourceLabel=computed(()=>collaboration.value.source?.rootKind===`session-source`?`This session's project source`:`This project source`);const collaborationUnavailableReason=computed(()=>String(collaboration.value.unavailableReason||`Collaboration guidance is not available for this source.`));const toneOptions=computed(()=>collaborationOptions(`tone`));const responseLengthOptions=computed(()=>collaborationOptions(`responseLength`));const experienceOptions=computed(()=>collaborationOptions(`experience`));const explanationStyleOptions=computed(()=>collaborationOptions(`explanationStyle`));const promptHints=computed(()=>resource.data.value?.promptHints||{});const promptHintsCanEdit=computed(()=>promptHints.value.canEdit===true);const engineering=computed(()=>engineeringResource.data.value?.engineering||{});const engineeringAvailable=computed(()=>engineering.value.available===true);const engineeringProfiles=computed(()=>Array.isArray(engineering.value.profiles)?engineering.value.profiles:[]);const engineeringSourceLabel=computed(()=>engineering.value.source?.rootKind===`session-source`?`This session's project source`:`This project source`);const engineeringUnavailableReason=computed(()=>String(engineering.value.unavailableReason||`An engineering profile is not available for this source.`));const selectedEngineeringDescription=computed(()=>String(engineeringProfiles.value.find(profile=>profile.id===engineeringProfileDraft.value)?.description||``));const engineeringStatusText=computed(()=>engineering.value.status===`defaulted`?`The focused default is active. Saving records the choice in genesis/engineering.md.`:`This choice is stored in genesis/engineering.md and follows the source.`);const loading=computed(()=>resource.isLoading.value===true||engineeringResource.isLoading.value===true);const initialLoading=computed(()=>loading.value&&(!resource.data.value||!engineeringResource.data.value));const loadError=computed(()=>String(resource.loadError.value||engineeringResource.loadError.value||``));const databaseSaving=computed(()=>databaseSaveCommand.isRunning===true);const collaborationSaving=ref(false);const promptHintsSaving=computed(()=>promptHintsSaveCommand.isRunning===true);const engineeringSaving=ref(false);const databaseChanged=computed(()=>managed.value&&(scopeDraft.value!==developmentDatabase.value.scope||sharedSessionsDraft.value!==(developmentDatabase.value.allowSharedDatabaseSessions===true)));const databaseSaveAllowed=computed(()=>scopeDraft.value===developmentDatabase.value.scope||canChange.value&&scopeDraftAvailable.value);const collaborationChanged=computed(()=>JSON.stringify(collaborationDraft.value)!==JSON.stringify(savedCollaboration.value));const promptHintsChanged=computed(()=>promptHintsDraft.value!==savedPromptHints.value);const engineeringChanged=computed(()=>engineeringAvailable.value&&Boolean(engineeringProfileDraft.value)&&engineeringProfileDraft.value!==savedEngineeringProfile.value);watch(()=>developmentDatabase.value.allowSharedDatabaseSessions,value=>{sharedSessionsDraft.value=value===true},{immediate:true});watch(()=>developmentDatabase.value.scope,scope=>{if([`project`,`session`].includes(scope))scopeDraft.value=scope},{immediate:true});let collaborationSource=null;watch([projectSlug,collaboration],([slug,value])=>{if(!value.source)return;const sourceChanged=!collaborationSource||collaborationSource.projectSlug!==slug||collaborationSource.rootKind!==value.source.rootKind||collaborationSource.sessionId!==value.source.sessionId;const next=normalizeCollaborationDraft(value);if(sourceChanged||!collaborationChanged.value)collaborationDraft.value=next;savedCollaboration.value={...next};collaborationSource={projectSlug:slug,...value.source}},{immediate:true});watch(()=>promptHints.value.enabled,value=>{const enabled=value!==false;if(!promptHintsChanged.value)promptHintsDraft.value=enabled;savedPromptHints.value=enabled},{immediate:true});let engineeringSource=null;watch([projectSlug,engineering],([slug,value])=>{if(!value.source)return;const sourceChanged=!engineeringSource||engineeringSource.projectSlug!==slug||engineeringSource.rootKind!==value.source.rootKind||engineeringSource.sessionId!==value.source.sessionId;const profile=String(value.profile?.id||``).trim();if(sourceChanged||engineeringProfileDraft.value===savedEngineeringProfile.value)engineeringProfileDraft.value=profile;savedEngineeringProfile.value=profile;engineeringSource={projectSlug:slug,...value.source};const sourceSessionId=String(value.source?.sessionId||``).trim();if(!routeSessionId.value&&sourceSessionId)router.replace({query:{...route.query,sessionId:sourceSessionId}})},{immediate:true});useRealtimeEvent({event:VIBE64_SESSION_CHANGED_EVENT,matches:sessionListRealtimeShouldRefresh,onEvent(){resource.reload();engineeringResource.reload()}});async function refresh(){await Promise.all([resource.reload(),engineeringResource.reload()])}function collaborationOptions(field=``){const choices=collaboration.value.choices?.[field];return(Array.isArray(choices)?choices:[]).flatMap(choice=>{const value=String(choice?.id||``).trim();const label=String(choice?.name||``).trim();return value&&label?[{label,value}]:[]})}function normalizeCollaborationDraft(value={}){return{tone:String(value?.tone||``),responseLength:String(value?.responseLength||``),experience:String(value?.experience||``),explanationStyle:String(value?.explanationStyle||``),requirements:String(value?.requirements||``)}}async function saveDatabase(){if(!databaseChanged.value||!databaseSaveAllowed.value||databaseSaving.value)return;await databaseSaveCommand.run({scope:scopeDraft.value,allowSharedDatabaseSessions:sharedSessionsDraft.value});await resource.reload()}async function saveCollaboration(){if(!collaborationChanged.value||!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value)return;collaborationSaving.value=true;try{try{await collaborationSaveCommand.run({collaboration:normalizeCollaborationDraft(collaborationDraft.value),sessionId:routeSessionId.value||String(collaboration.value.source?.sessionId||``).trim()})}catch{return}await resource.reload()}finally{collaborationSaving.value=false}}async function savePromptHints(){if(!promptHintsChanged.value||!promptHintsCanEdit.value||promptHintsSaving.value)return;await promptHintsSaveCommand.run({promptHints:promptHintsDraft.value});await resource.reload()}async function saveEngineeringProfile(){if(!engineeringChanged.value||engineeringSaving.value)return;engineeringSaving.value=true;try{await engineeringSaveCommand.run({profile:engineeringProfileDraft.value,sessionId:routeSessionId.value||String(engineering.value.source?.sessionId||``).trim()})}catch{}finally{try{await engineeringResource.reload()}finally{engineeringSaving.value=false}}}function openPersonalSettings(){requestVibe64AccountConnectionsDialog({refresh:false,section:`profile`})}function reloadPage(){if(typeof window!==`undefined`)window.location.reload()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$1,[createBaseVNode(`header`,_hoisted_2,[_cache[11]||(_cache[11]=createBaseVNode(`div`,null,[createBaseVNode(`h1`,{class:`text-headline-small font-weight-bold ma-0`},`Project settings`),createBaseVNode(`p`,{class:`text-body-medium`},`Choose how you and your AI work on this project.`)],-1)),createVNode(VBtn,{class:`project-settings__refresh`,disabled:loading.value,height:`48`,type:`button`,variant:`text`,onClick:refresh},{default:withCtx(()=>[createTextVNode(toDisplayString(loading.value?`Refreshing…`:`Refresh`),1)]),_:1},8,[`disabled`])]),initialLoading.value||loadError.value?(openBlock(),createBlock(Vibe64AsyncModuleState_default,{key:0,label:`Project settings`,loading:loading.value,message:loadError.value||`Loading project settings.`,"min-height":`12rem`,onReload:reloadPage,onRetry:refresh},null,8,[`loading`,`message`])):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(ConnectedProjectsSettings_default,{"project-slug":unref(projectSlug),state:unref(resource).data.value?.connectedProjects,onSaved:_cache[0]||(_cache[0]=$event=>unref(resource).reload())},null,8,[`project-slug`,`state`]),createBaseVNode(`section`,_hoisted_3,[createBaseVNode(`div`,_hoisted_4,[engineeringAvailable.value?(openBlock(),createElementBlock(`p`,_hoisted_5,toDisplayString(engineeringSourceLabel.value),1)):createCommentVNode(``,true),_cache[12]||(_cache[12]=createBaseVNode(`h2`,{id:`engineering-approach-title`,class:`text-title-medium font-weight-bold`},`Engineering approach`,-1)),_cache[13]||(_cache[13]=createBaseVNode(`p`,null,` Choose how cautiously the AI changes your software. Every profile keeps changes simple and asks before adding necessary complexity. `,-1))]),engineeringAvailable.value?(openBlock(),createElementBlock(`div`,_hoisted_6,[createBaseVNode(`div`,_hoisted_7,[createVNode(VSelect,{modelValue:engineeringProfileDraft.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>engineeringProfileDraft.value=$event),disabled:engineeringSaving.value,density:`comfortable`,"hide-details":`auto`,hint:selectedEngineeringDescription.value,"item-title":`name`,"item-value":`id`,items:engineeringProfiles.value,label:`Engineering profile`,"persistent-hint":``,variant:`outlined`},null,8,[`modelValue`,`disabled`,`hint`,`items`])]),createBaseVNode(`div`,_hoisted_8,[createBaseVNode(`p`,null,toDisplayString(engineeringStatusText.value),1),createVNode(VBtn,{disabled:!engineeringChanged.value||engineeringSaving.value,color:engineeringChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveEngineeringProfile},{default:withCtx(()=>[createTextVNode(toDisplayString(engineeringSaving.value?`Saving…`:`Save engineering approach`),1)]),_:1},8,[`disabled`,`color`])])])):(openBlock(),createElementBlock(`div`,_hoisted_9,[createBaseVNode(`p`,null,toDisplayString(engineeringUnavailableReason.value),1)]))]),createBaseVNode(`section`,_hoisted_10,[createBaseVNode(`div`,_hoisted_11,[_cache[14]||(_cache[14]=createBaseVNode(`h2`,{id:`development-database-title`,class:`text-title-medium font-weight-bold`},`Development database`,-1)),managed.value?(openBlock(),createElementBlock(`p`,_hoisted_12,` Share development data across sessions or keep a separate database for each. `)):(openBlock(),createElementBlock(`p`,_hoisted_13,` This Vibe64 installation does not manage development databases. The application receives its database connection through the project Env configuration. `))]),managed.value?(openBlock(),createElementBlock(`div`,_hoisted_14,[createVNode(VRadioGroup,{modelValue:scopeDraft.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>scopeDraft.value=$event),"aria-labelledby":`development-database-title`,class:`project-settings__options`,disabled:databaseSaving.value,"hide-details":``},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_15,[createVNode(VRadio,{class:`py-1`,"aria-describedby":sessionScopeReason.value?`development-database-session-reason`:void 0,disabled:!sessionScopeAvailable.value,label:`A separate database for each session`,value:`session`},null,8,[`aria-describedby`,`disabled`]),sessionScopeReason.value?(openBlock(),createElementBlock(`p`,_hoisted_16,toDisplayString(sessionScopeReason.value),1)):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_17,[createVNode(VRadio,{class:`py-1`,"aria-describedby":projectScopeReason.value?`development-database-project-reason`:void 0,disabled:!projectScopeAvailable.value,label:`One database shared by this project`,value:`project`},null,8,[`aria-describedby`,`disabled`]),projectScopeReason.value?(openBlock(),createElementBlock(`p`,_hoisted_18,toDisplayString(projectScopeReason.value),1)):createCommentVNode(``,true)])]),_:1},8,[`modelValue`,`disabled`]),scopeDraft.value===`project`?(openBlock(),createElementBlock(`div`,_hoisted_19,[createVNode(VCheckbox,{modelValue:sharedSessionsDraft.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>sharedSessionsDraft.value=$event),label:`Allow multiple sessions with this shared database`,disabled:databaseSaving.value,"hide-details":``},null,8,[`modelValue`,`disabled`]),_cache[15]||(_cache[15]=createBaseVNode(`p`,null,`All sessions will share the same database.`,-1))])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_20,[disabledReason.value?(openBlock(),createElementBlock(`p`,_hoisted_21,toDisplayString(disabledReason.value),1)):scopeDraft.value===`project`?(openBlock(),createElementBlock(`p`,_hoisted_22,` Data and schema changes will be visible to every project session and remain after a session is archived. `)):createCommentVNode(``,true),createVNode(VBtn,{disabled:!databaseChanged.value||!databaseSaveAllowed.value||databaseSaving.value,color:databaseChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveDatabase},{default:withCtx(()=>[createTextVNode(toDisplayString(databaseSaving.value?`Saving…`:`Save database choice`),1)]),_:1},8,[`disabled`,`color`])])])):createCommentVNode(``,true)]),createBaseVNode(`section`,_hoisted_23,[createBaseVNode(`div`,_hoisted_24,[createBaseVNode(`p`,_hoisted_25,toDisplayString(collaborationSourceLabel.value),1),_cache[17]||(_cache[17]=createBaseVNode(`h2`,{id:`ai-behaviour-title`,class:`text-title-medium font-weight-bold`},`AI behaviour`,-1)),_cache[18]||(_cache[18]=createBaseVNode(`p`,null,` Set the tone, level of detail and project requirements for your conversations. These choices follow your project source. `,-1)),createVNode(VBtn,{class:`project-settings__account-link`,height:`48`,type:`button`,variant:`text`,onClick:openPersonalSettings},{default:withCtx(()=>[..._cache[16]||(_cache[16]=[createTextVNode(` Set your Vibe64 name `,-1)])]),_:1})]),createBaseVNode(`div`,_hoisted_26,[createBaseVNode(`div`,_hoisted_27,[createVNode(VSelect,{modelValue:collaborationDraft.value.tone,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>collaborationDraft.value.tone=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:toneOptions.value,label:`Tone`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.responseLength,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>collaborationDraft.value.responseLength=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:responseLengthOptions.value,label:`Response length`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.experience,"onUpdate:modelValue":_cache[6]||(_cache[6]=$event=>collaborationDraft.value.experience=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:experienceOptions.value,label:`Experience level`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.explanationStyle,"onUpdate:modelValue":_cache[7]||(_cache[7]=$event=>collaborationDraft.value.explanationStyle=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:explanationStyleOptions.value,label:`Explanation style`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VTextarea,{modelValue:collaborationDraft.value.requirements,"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>collaborationDraft.value.requirements=$event),class:`project-settings__ai-note`,disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,"auto-grow":``,density:`comfortable`,"hide-details":``,label:`Project requirements (optional)`,placeholder:`For example: use Australian English.`,rows:`6`,"max-rows":`18`,variant:`outlined`},null,8,[`modelValue`,`disabled`])]),createBaseVNode(`div`,_hoisted_28,[!collaborationAvailable.value?(openBlock(),createElementBlock(`p`,_hoisted_29,toDisplayString(collaborationUnavailableReason.value),1)):!collaborationCanEdit.value?(openBlock(),createElementBlock(`p`,_hoisted_30,` Only the project owner can change these controls in Settings. Anyone who can edit this source can change genesis/collaboration.md directly. `)):(openBlock(),createElementBlock(`p`,_hoisted_31,` Applies when a conversation next starts or refreshes its context. Existing history and instructions in an active Codex conversation stay as they are. `)),createVNode(VBtn,{disabled:!collaborationChanged.value||!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,color:collaborationChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveCollaboration},{default:withCtx(()=>[createTextVNode(toDisplayString(collaborationSaving.value?`Saving…`:`Save collaboration`),1)]),_:1},8,[`disabled`,`color`])])])]),createBaseVNode(`section`,_hoisted_32,[_cache[19]||(_cache[19]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`prompt-suggestions-title`,class:`text-title-medium font-weight-bold`},`Prompt suggestions`),createBaseVNode(`p`,null,`Get ideas for what to ask next. This Vibe64 setting does not change your AI's instructions.`)],-1)),createBaseVNode(`div`,_hoisted_33,[createVNode(VSwitch,{modelValue:promptHintsDraft.value,"onUpdate:modelValue":_cache[9]||(_cache[9]=$event=>promptHintsDraft.value=$event),class:`project-settings__ai-hints`,color:`primary`,disabled:!promptHintsCanEdit.value||promptHintsSaving.value,"hide-details":``,label:`Suggest useful next prompts`},null,8,[`modelValue`,`disabled`]),createBaseVNode(`div`,_hoisted_34,[createVNode(VBtn,{disabled:!promptHintsChanged.value||!promptHintsCanEdit.value||promptHintsSaving.value,color:promptHintsChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:savePromptHints},{default:withCtx(()=>[createTextVNode(toDisplayString(promptHintsSaving.value?`Saving…`:`Save prompt suggestions`),1)]),_:1},8,[`disabled`,`color`])])])]),repositoryWorkflow.value.available?(openBlock(),createElementBlock(`section`,_hoisted_35,[_cache[22]||(_cache[22]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`repository-workflow-title`,class:`text-title-medium font-weight-bold`},`Git workflow`),createBaseVNode(`p`,null,`Choose how Vibe64 publishes changes to this repository.`)],-1)),createBaseVNode(`div`,_hoisted_36,[createVNode(VRadioGroup,{modelValue:requirePullRequest.value,"onUpdate:modelValue":_cache[10]||(_cache[10]=$event=>requirePullRequest.value=$event),label:`GitHub save workflow`,color:`primary`,"hide-details":``,disabled:!repositoryWorkflow.value.canEdit||unref(repositoryWorkflowCommand).isRunning},{default:withCtx(()=>[createVNode(VRadio,{label:`Allow direct commits and pushes`,value:false,class:`py-1`}),createVNode(VRadio,{label:`Require pull requests`,value:true,class:`py-1`})]),_:1},8,[`modelValue`,`disabled`]),_cache[20]||(_cache[20]=createBaseVNode(`p`,null,`GitHub branch rules still apply. Requiring pull requests makes Create draft PR the main Save action until a session is attached to a PR.`,-1)),_cache[21]||(_cache[21]=createBaseVNode(`p`,null,`This setting controls Vibe64's Save actions. GitHub rules control pushes from terminals and other tools.`,-1)),createBaseVNode(`div`,_hoisted_37,[createVNode(VBtn,{color:requirePullRequest.value!==repositoryWorkflow.value.requirePullRequest?`primary`:void 0,height:`48`,variant:`flat`,disabled:!repositoryWorkflow.value.canEdit||unref(repositoryWorkflowCommand).isRunning||requirePullRequest.value===repositoryWorkflow.value.requirePullRequest,onClick:saveRepositoryWorkflow},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(repositoryWorkflowCommand).isRunning?`Saving…`:`Save repository workflow`),1)]),_:1},8,[`color`,`disabled`])])])])):createCommentVNode(``,true)],64))])}}};var ProjectSettingsPanel_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-362d4729`]]);var _hoisted_1={class:`vibe64-dashboard-page`};var _sfc_main={__name:`index`,setup(__props){return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[createVNode(ProjectSettingsPanel_default)])}}};var settings_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-d998a641`]]);export{settings_default as default};
|
|
1
|
+
import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,_ as createBaseVNode,b as createElementBlock,bt as renderList,g as computed,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,v as createBlock,vn as ref,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{n as useRealtimeEvent}from"./useRealtimeEvent-Bwapstla.js";import{t as VSelect}from"./VSelect-DL3HaA5m.js";import{t as VTextField}from"./VTextField-BR2eZeFT.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-DmMMIScP.js";import{t as VBtn}from"./VBtn-B2MBK2DL.js";import{t as VAlert}from"./VAlert-P256xaE0.js";import{t as VCheckbox}from"./VCheckbox-C7A1ZW4D.js";import{n as VRadio,t as VRadioGroup}from"./VRadioGroup-CUu2-KIP.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{t as useCommand}from"./useCommand-Bqxb-naz.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{D as VIBE64_SESSION_CHANGED_EVENT,x as requestVibe64AccountConnectionsDialog}from"./index-dNxr4Lg9.js";import{C as engineeringSettingsQueryKey,D as projectSettingsQueryKey,S as VIBE64_PROMPT_HINTS_SETTINGS_API_SUFFIX,f as VIBE64_COLLABORATION_API_SUFFIX,h as VIBE64_ENGINEERING_API_SUFFIX,l as PROJECT_SETTINGS_ENDPOINT,m as VIBE64_DEVELOPMENT_DATABASE_API_SUFFIX,n as DEVELOPMENT_DATABASE_ENDPOINT,r as ENGINEERING_ENDPOINT,t as COLLABORATION_ENDPOINT,u as PROMPT_HINTS_SETTINGS_ENDPOINT,y as VIBE64_PROJECT_CHANGED_EVENT}from"./studioGateApi-DcCqiD9V.js";import{t as Vibe64AsyncModuleState_default}from"./Vibe64AsyncModuleState-Do9EqX3S.js";import{t as sessionListRealtimeShouldRefresh}from"./useVibe64SessionData-B686lToN.js";var CONNECTED_CUSTOM_PACKAGE_TYPE=`custom`;var CONNECTED_PACKAGE_TYPES=Object.freeze([Object.freeze({value:`npm`,label:`npm (Node.js)`}),Object.freeze({value:`composer`,label:`Composer (PHP)`}),Object.freeze({value:`pip`,label:`pip (Python)`}),Object.freeze({value:`bundler`,label:`Bundler (Ruby)`}),Object.freeze({value:`gomod`,label:`Go modules`}),Object.freeze({value:`cargo`,label:`Cargo (Rust)`}),Object.freeze({value:`maven`,label:`Maven`}),Object.freeze({value:`gradle`,label:`Gradle`}),Object.freeze({value:`nuget`,label:`NuGet (.NET)`}),Object.freeze({value:CONNECTED_CUSTOM_PACKAGE_TYPE,label:`custom`})]);var CONNECTED_PACKAGE_TYPE_VALUES=Object.freeze(CONNECTED_PACKAGE_TYPES.map(type=>type.value));function connectedPackageTypeUsesScript(type){return type===CONNECTED_CUSTOM_PACKAGE_TYPE}var _hoisted_1$2={class:`project-settings__section`,"aria-labelledby":`connected-projects-title`};var _hoisted_2$1={class:`project-settings__content text-body-medium`};var _hoisted_3$1={key:0};var _hoisted_4$1={key:0};var _hoisted_5$1=[`disabled`];var _hoisted_6$1={class:`text-label-large`};var _hoisted_7$1={key:2};var _hoisted_8$1={class:`connection-actions`};var _sfc_main$2={__name:`ConnectedProjectsSettings`,props:{projectSlug:{type:String,required:true},state:{type:Object,default:()=>({})}},emits:[`saved`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const draft=ref([]);const baseline=ref(`[]`);const revision=ref(``);const saving=ref(false);const changed=computed(()=>JSON.stringify(draft.value)!==baseline.value);const stale=computed(()=>props.state.available&&revision.value!==props.state.revision);const relationships=[{label:`Dependency — a library or tool`,value:`dependency`},{label:`Composition — source assembled into this project`,value:`composition`}];const packageTypes=[{label:`Stack default`,value:``},...CONNECTED_PACKAGE_TYPES];function scriptAllowed(entry){return!entry.type||connectedPackageTypeUsesScript(entry.type)}function setPackageType(entry,value){if(value)entry.type=value;else delete entry.type;if(!scriptAllowed(entry))delete entry.script}function setScript(entry,value){if(value)entry.script=value;else delete entry.script}function resetDraft(){draft.value=(props.state.projects||[]).map(entry=>({...entry}));baseline.value=JSON.stringify(draft.value);revision.value=props.state.revision||``}let sourceIdentity=``;watch(()=>[props.projectSlug,props.state],()=>{if(!props.state.source)return;const identity=JSON.stringify([props.projectSlug,props.state.source]);if(identity!==sourceIdentity||!changed.value)resetDraft();sourceIdentity=identity},{immediate:true});const saveCommand=useCommand({access:`never`,apiSuffix:`/vibe64/settings/connections`,buildCommandOptions:()=>({method:`PUT`,path:scopedDevelopmentApiUrl(`/api/vibe64/settings/connections`,props.projectSlug)}),buildRawPayload:(_model,{context})=>context,fallbackRunError:`Connected projects could not be saved.`,messages:{error:`Connected projects could not be saved.`,success:`Connected projects saved in source.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.project.connections.save`,surfaceId:`app`,writeMethod:`PUT`});async function save(){if(saving.value||stale.value||!props.state.canEdit)return;saving.value=true;try{if(!await saveCommand.run({projects:draft.value.map(entry=>({...entry})),revision:revision.value,sessionId:props.state.source?.sessionId||``}))return;baseline.value=JSON.stringify(draft.value);emit(`saved`)}catch{}finally{saving.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$2,[_cache[6]||(_cache[6]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`connected-projects-title`,class:`text-title-medium font-weight-bold`},`Connected projects`),createBaseVNode(`p`,null,`Libraries and source projects you contribute to from this project.`),createBaseVNode(`p`,null,[createTextVNode(`Saved in this source checkout’s `),createBaseVNode(`code`,null,`vibe64.connections.json`),createTextVNode(`. Changes follow normal project Save.`)])],-1)),createBaseVNode(`div`,_hoisted_2$1,[!__props.state.available?(openBlock(),createElementBlock(`p`,_hoisted_3$1,toDisplayString(__props.state.unavailableReason||`Select a session to configure connected projects.`),1)):(openBlock(),createElementBlock(Fragment,{key:1},[!__props.state.exists?(openBlock(),createElementBlock(`p`,_hoisted_4$1,`No connection file yet. Add projects below, then save the list.`)):createCommentVNode(``,true),stale.value?(openBlock(),createBlock(VAlert,{key:1,type:`warning`,variant:`tonal`},{default:withCtx(()=>[_cache[2]||(_cache[2]=createTextVNode(` The saved list changed while you were editing. Reload the saved list and review your changes before saving. `,-1)),createVNode(VBtn,{variant:`text`,onClick:resetDraft},{default:withCtx(()=>[..._cache[1]||(_cache[1]=[createTextVNode(`Reload saved list`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(draft.value,(entry,index)=>{return openBlock(),createElementBlock(`fieldset`,{key:index,class:`connection-entry`,disabled:!__props.state.canEdit||saving.value},[createBaseVNode(`legend`,_hoisted_6$1,`Connected project `+toDisplayString(index+1),1),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.name,"onUpdate:modelValue":$event=>entry.name=$event,label:`Name`,maxlength:`100`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.repository,"onUpdate:modelValue":$event=>entry.repository=$event,label:`GitHub repository URL`,placeholder:`https://github.com/owner/repository`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VSelect,{disabled:!__props.state.canEdit||saving.value,modelValue:entry.relationship,"onUpdate:modelValue":$event=>entry.relationship=$event,label:`Relationship`,items:relationships,"item-title":`label`,"item-value":`value`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`modelValue`,`onUpdate:modelValue`]),createVNode(VSelect,{disabled:!__props.state.canEdit||saving.value,"model-value":entry.type||``,"onUpdate:modelValue":$event=>setPackageType(entry,$event),label:`Package type`,items:packageTypes,"item-title":`label`,"item-value":`value`,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`model-value`,`onUpdate:modelValue`]),createVNode(VTextField,{disabled:!__props.state.canEdit||saving.value||!scriptAllowed(entry),"model-value":entry.script||``,"onUpdate:modelValue":$event=>setScript(entry,$event),label:`Preparation script (project-relative)`,placeholder:`tooling/prepare-native-worker.mjs`,maxlength:`1024`,hint:`Required for custom. Relative to this project's root; Stack declares the runtime.`,"persistent-hint":``,variant:`outlined`,"hide-details":`auto`},null,8,[`disabled`,`model-value`,`onUpdate:modelValue`]),createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value,variant:`text`,"aria-label":`Remove ${entry.name||`connected project`}`,onClick:$event=>draft.value.splice(index,1)},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Remove`,-1)])]),_:1},8,[`disabled`,`aria-label`,`onClick`])],8,_hoisted_5$1)}),128)),__props.state.exists&&!draft.value.length?(openBlock(),createElementBlock(`p`,_hoisted_7$1,`No connected projects.`)):createCommentVNode(``,true),_cache[5]||(_cache[5]=createBaseVNode(`p`,{class:`text-body-small`},`Removing a connection preserves its existing contributions and pending work.`,-1)),createBaseVNode(`div`,_hoisted_8$1,[createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value||draft.value.length>=64,variant:`outlined`,onClick:_cache[0]||(_cache[0]=$event=>draft.value.push({name:``,repository:``,relationship:`dependency`}))},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Add project`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:!__props.state.canEdit||saving.value||stale.value||!changed.value&&__props.state.exists,color:`primary`,variant:`flat`,onClick:save},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Saving…`:`Save connected projects`),1)]),_:1},8,[`disabled`])])],64))])])}}};var ConnectedProjectsSettings_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-f2a13772`]]);var _hoisted_1$1={class:`project-settings`};var _hoisted_2={class:`project-settings__header`};var _hoisted_3={class:`project-settings__section`,"aria-labelledby":`engineering-approach-title`};var _hoisted_4={class:`project-settings__section-copy text-body-medium`};var _hoisted_5={key:0,class:`project-settings__scope text-label-medium`};var _hoisted_6={key:0,class:`project-settings__content text-body-medium`};var _hoisted_7={class:`project-settings__engineering-field`};var _hoisted_8={class:`project-settings__action text-body-small`};var _hoisted_9={key:1,class:`project-settings__action text-body-small`};var _hoisted_10={class:`project-settings__section`,"aria-labelledby":`development-database-title`};var _hoisted_11={class:`project-settings__section-copy text-body-medium`};var _hoisted_12={key:0};var _hoisted_13={key:1};var _hoisted_14={key:0,class:`project-settings__content text-body-medium`};var _hoisted_15={class:`project-settings__option`};var _hoisted_16={key:0,id:`development-database-session-reason`,class:`project-settings__option-support text-body-small`};var _hoisted_17={class:`project-settings__option`};var _hoisted_18={key:0,id:`development-database-project-reason`,class:`project-settings__option-support text-body-small`};var _hoisted_19={key:0,class:`project-settings__action text-body-small`};var _hoisted_20={class:`project-settings__action text-body-small`};var _hoisted_21={key:0};var _hoisted_22={key:1};var _hoisted_23={class:`project-settings__section`,"aria-labelledby":`ai-behaviour-title`};var _hoisted_24={class:`project-settings__section-copy text-body-medium`};var _hoisted_25={class:`project-settings__scope text-label-medium`};var _hoisted_26={class:`project-settings__content text-body-medium`};var _hoisted_27={class:`project-settings__ai-fields`};var _hoisted_28={class:`project-settings__action text-body-small`};var _hoisted_29={key:0};var _hoisted_30={key:1};var _hoisted_31={key:2};var _hoisted_32={class:`project-settings__section`,"aria-labelledby":`prompt-suggestions-title`};var _hoisted_33={class:`project-settings__content text-body-medium`};var _hoisted_34={class:`project-settings__action text-body-small`};var _hoisted_35={key:0,class:`project-settings__section`,"aria-labelledby":`repository-workflow-title`};var _hoisted_36={class:`project-settings__content text-body-medium`};var _hoisted_37={class:`project-settings__action text-body-small`};var _sfc_main$1={__name:`ProjectSettingsPanel`,setup(__props){const projectSlug=useVibe64ProjectSlug();const route=useRoute();const router=useRouter();const scopeDraft=ref(`session`);const sharedSessionsDraft=ref(false);const collaborationDraft=ref(normalizeCollaborationDraft());const savedCollaboration=ref(normalizeCollaborationDraft());const promptHintsDraft=ref(true);const savedPromptHints=ref(true);const requirePullRequest=ref(false);const engineeringProfileDraft=ref(``);const savedEngineeringProfile=ref(``);const routeSessionId=computed(()=>String(route.query.sessionId||``).trim());const resource=useEndpointResource({fallbackLoadError:`Project settings could not load.`,path:computed(()=>scopedDevelopmentApiUrl(PROJECT_SETTINGS_ENDPOINT,projectSlug.value)),queryKey:computed(()=>projectSettingsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,routeSessionId.value)),readQuery:computed(()=>routeSessionId.value?{sessionId:routeSessionId.value}:{}),refreshOnPull:true,requestRecoveryLabel:`Project settings`});const engineeringResource=useEndpointResource({fallbackLoadError:`Engineering approach could not load.`,path:computed(()=>scopedDevelopmentApiUrl(ENGINEERING_ENDPOINT,projectSlug.value)),queryKey:computed(()=>engineeringSettingsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value,routeSessionId.value)),readQuery:computed(()=>routeSessionId.value?{sessionId:routeSessionId.value}:{}),realtime:{event:VIBE64_PROJECT_CHANGED_EVENT,matches:()=>!engineeringSaveCommand.isRunning},refreshOnPull:true,requestRecoveryLabel:`Engineering approach`});const databaseSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_DEVELOPMENT_DATABASE_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:DEVELOPMENT_DATABASE_ENDPOINT}),buildRawPayload:(_model,{context})=>({scope:context.scope,allowSharedDatabaseSessions:context.allowSharedDatabaseSessions}),fallbackRunError:`Development database choice could not be saved.`,messages:{error:`Development database choice could not be saved.`,success:`Development database choice saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.development-database.scope.save`,surfaceId:`app`,writeMethod:`PUT`});const collaborationSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_COLLABORATION_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:COLLABORATION_ENDPOINT}),buildRawPayload:(_model,{context})=>({...context.collaboration,...context.sessionId?{sessionId:context.sessionId}:{}}),fallbackRunError:`Collaboration guidance could not be saved.`,messages:{error:`Collaboration guidance could not be saved.`,success:`Collaboration guidance saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.collaboration.save`,surfaceId:`app`,writeMethod:`PUT`});const promptHintsSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_PROMPT_HINTS_SETTINGS_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:PROMPT_HINTS_SETTINGS_ENDPOINT}),buildRawPayload:(_model,{context})=>({promptHints:context.promptHints}),fallbackRunError:`Prompt suggestions could not be saved.`,messages:{error:`Prompt suggestions could not be saved.`,success:`Prompt suggestions saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.prompt-hints.save`,surfaceId:`app`,writeMethod:`PUT`});const repositoryWorkflowCommand=useCommand({access:`never`,apiSuffix:`/vibe64/repository/workflow`,buildCommandOptions:()=>({method:`PUT`,path:scopedDevelopmentApiUrl(`/api/vibe64/repository/workflow`,projectSlug.value)}),buildRawPayload:(_model,{context})=>({requirePullRequest:context.requirePullRequest}),fallbackRunError:`Repository workflow could not be saved.`,messages:{error:`Repository workflow could not be saved.`,success:`Repository workflow saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.repository.workflow`,surfaceId:`app`,writeMethod:`PUT`});const repositoryWorkflow=computed(()=>resource.data.value?.repositoryWorkflow||{});watch(()=>repositoryWorkflow.value.requirePullRequest,value=>{requirePullRequest.value=value===true},{immediate:true});async function saveRepositoryWorkflow(){await repositoryWorkflowCommand.run({requirePullRequest:requirePullRequest.value});await resource.reload()}const engineeringSaveCommand=useCommand({access:`never`,apiSuffix:VIBE64_ENGINEERING_API_SUFFIX,buildCommandOptions:()=>({method:`PUT`,path:ENGINEERING_ENDPOINT}),buildRawPayload:(_model,{context})=>({profile:context.profile,...context.sessionId?{sessionId:context.sessionId}:{}}),fallbackRunError:`Engineering approach could not be saved.`,messages:{error:`Engineering approach could not be saved.`,success:`Engineering approach saved.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.engineering.profile.save`,surfaceId:`app`,writeMethod:`PUT`});const developmentDatabase=computed(()=>resource.data.value?.developmentDatabase||{});const managed=computed(()=>developmentDatabase.value.managed===true);const canChange=computed(()=>developmentDatabase.value.canChange===true);const disabledReason=computed(()=>String(developmentDatabase.value.disabledReason||``));const sessionScopeOption=computed(()=>developmentDatabase.value.options?.session||{});const projectScopeOption=computed(()=>developmentDatabase.value.options?.project||{});const sessionScopeAvailable=computed(()=>sessionScopeOption.value.available===true);const projectScopeAvailable=computed(()=>projectScopeOption.value.available===true);const sessionScopeReason=computed(()=>String(sessionScopeOption.value.disabledReason||``));const projectScopeReason=computed(()=>String(projectScopeOption.value.disabledReason||``));const scopeDraftAvailable=computed(()=>scopeDraft.value===`project`?projectScopeAvailable.value:sessionScopeAvailable.value);const collaboration=computed(()=>resource.data.value?.collaboration||{});const collaborationAvailable=computed(()=>collaboration.value.available===true);const collaborationCanEdit=computed(()=>collaboration.value.canEdit===true);const collaborationSourceLabel=computed(()=>collaboration.value.source?.rootKind===`session-source`?`This session's project source`:`This project source`);const collaborationUnavailableReason=computed(()=>String(collaboration.value.unavailableReason||`Collaboration guidance is not available for this source.`));const toneOptions=computed(()=>collaborationOptions(`tone`));const responseLengthOptions=computed(()=>collaborationOptions(`responseLength`));const experienceOptions=computed(()=>collaborationOptions(`experience`));const explanationStyleOptions=computed(()=>collaborationOptions(`explanationStyle`));const promptHints=computed(()=>resource.data.value?.promptHints||{});const promptHintsCanEdit=computed(()=>promptHints.value.canEdit===true);const engineering=computed(()=>engineeringResource.data.value?.engineering||{});const engineeringAvailable=computed(()=>engineering.value.available===true);const engineeringProfiles=computed(()=>Array.isArray(engineering.value.profiles)?engineering.value.profiles:[]);const engineeringSourceLabel=computed(()=>engineering.value.source?.rootKind===`session-source`?`This session's project source`:`This project source`);const engineeringUnavailableReason=computed(()=>String(engineering.value.unavailableReason||`An engineering profile is not available for this source.`));const selectedEngineeringDescription=computed(()=>String(engineeringProfiles.value.find(profile=>profile.id===engineeringProfileDraft.value)?.description||``));const engineeringStatusText=computed(()=>engineering.value.status===`defaulted`?`The focused default is active. Saving records the choice in genesis/engineering.md.`:`This choice is stored in genesis/engineering.md and follows the source.`);const loading=computed(()=>resource.isLoading.value===true||engineeringResource.isLoading.value===true);const initialLoading=computed(()=>loading.value&&(!resource.data.value||!engineeringResource.data.value));const loadError=computed(()=>String(resource.loadError.value||engineeringResource.loadError.value||``));const databaseSaving=computed(()=>databaseSaveCommand.isRunning===true);const collaborationSaving=ref(false);const promptHintsSaving=computed(()=>promptHintsSaveCommand.isRunning===true);const engineeringSaving=ref(false);const databaseChanged=computed(()=>managed.value&&(scopeDraft.value!==developmentDatabase.value.scope||sharedSessionsDraft.value!==(developmentDatabase.value.allowSharedDatabaseSessions===true)));const databaseSaveAllowed=computed(()=>scopeDraft.value===developmentDatabase.value.scope||canChange.value&&scopeDraftAvailable.value);const collaborationChanged=computed(()=>JSON.stringify(collaborationDraft.value)!==JSON.stringify(savedCollaboration.value));const promptHintsChanged=computed(()=>promptHintsDraft.value!==savedPromptHints.value);const engineeringChanged=computed(()=>engineeringAvailable.value&&Boolean(engineeringProfileDraft.value)&&engineeringProfileDraft.value!==savedEngineeringProfile.value);watch(()=>developmentDatabase.value.allowSharedDatabaseSessions,value=>{sharedSessionsDraft.value=value===true},{immediate:true});watch(()=>developmentDatabase.value.scope,scope=>{if([`project`,`session`].includes(scope))scopeDraft.value=scope},{immediate:true});let collaborationSource=null;watch([projectSlug,collaboration],([slug,value])=>{if(!value.source)return;const sourceChanged=!collaborationSource||collaborationSource.projectSlug!==slug||collaborationSource.rootKind!==value.source.rootKind||collaborationSource.sessionId!==value.source.sessionId;const next=normalizeCollaborationDraft(value);if(sourceChanged||!collaborationChanged.value)collaborationDraft.value=next;savedCollaboration.value={...next};collaborationSource={projectSlug:slug,...value.source}},{immediate:true});watch(()=>promptHints.value.enabled,value=>{const enabled=value!==false;if(!promptHintsChanged.value)promptHintsDraft.value=enabled;savedPromptHints.value=enabled},{immediate:true});let engineeringSource=null;watch([projectSlug,engineering],([slug,value])=>{if(!value.source)return;const sourceChanged=!engineeringSource||engineeringSource.projectSlug!==slug||engineeringSource.rootKind!==value.source.rootKind||engineeringSource.sessionId!==value.source.sessionId;const profile=String(value.profile?.id||``).trim();if(sourceChanged||engineeringProfileDraft.value===savedEngineeringProfile.value)engineeringProfileDraft.value=profile;savedEngineeringProfile.value=profile;engineeringSource={projectSlug:slug,...value.source};const sourceSessionId=String(value.source?.sessionId||``).trim();if(!routeSessionId.value&&sourceSessionId)router.replace({query:{...route.query,sessionId:sourceSessionId}})},{immediate:true});useRealtimeEvent({event:VIBE64_SESSION_CHANGED_EVENT,matches:sessionListRealtimeShouldRefresh,onEvent(){resource.reload();engineeringResource.reload()}});async function refresh(){await Promise.all([resource.reload(),engineeringResource.reload()])}function collaborationOptions(field=``){const choices=collaboration.value.choices?.[field];return(Array.isArray(choices)?choices:[]).flatMap(choice=>{const value=String(choice?.id||``).trim();const label=String(choice?.name||``).trim();return value&&label?[{label,value}]:[]})}function normalizeCollaborationDraft(value={}){return{tone:String(value?.tone||``),responseLength:String(value?.responseLength||``),experience:String(value?.experience||``),explanationStyle:String(value?.explanationStyle||``),requirements:String(value?.requirements||``)}}async function saveDatabase(){if(!databaseChanged.value||!databaseSaveAllowed.value||databaseSaving.value)return;await databaseSaveCommand.run({scope:scopeDraft.value,allowSharedDatabaseSessions:sharedSessionsDraft.value});await resource.reload()}async function saveCollaboration(){if(!collaborationChanged.value||!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value)return;collaborationSaving.value=true;try{try{await collaborationSaveCommand.run({collaboration:normalizeCollaborationDraft(collaborationDraft.value),sessionId:routeSessionId.value||String(collaboration.value.source?.sessionId||``).trim()})}catch{return}await resource.reload()}finally{collaborationSaving.value=false}}async function savePromptHints(){if(!promptHintsChanged.value||!promptHintsCanEdit.value||promptHintsSaving.value)return;await promptHintsSaveCommand.run({promptHints:promptHintsDraft.value});await resource.reload()}async function saveEngineeringProfile(){if(!engineeringChanged.value||engineeringSaving.value)return;engineeringSaving.value=true;try{await engineeringSaveCommand.run({profile:engineeringProfileDraft.value,sessionId:routeSessionId.value||String(engineering.value.source?.sessionId||``).trim()})}catch{}finally{try{await engineeringResource.reload()}finally{engineeringSaving.value=false}}}function openPersonalSettings(){requestVibe64AccountConnectionsDialog({refresh:false,section:`profile`})}function reloadPage(){if(typeof window!==`undefined`)window.location.reload()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$1,[createBaseVNode(`header`,_hoisted_2,[_cache[11]||(_cache[11]=createBaseVNode(`div`,null,[createBaseVNode(`h1`,{class:`text-headline-small font-weight-bold ma-0`},`Project settings`),createBaseVNode(`p`,{class:`text-body-medium`},`Choose how you and your AI work on this project.`)],-1)),createVNode(VBtn,{class:`project-settings__refresh`,disabled:loading.value,height:`48`,type:`button`,variant:`text`,onClick:refresh},{default:withCtx(()=>[createTextVNode(toDisplayString(loading.value?`Refreshing…`:`Refresh`),1)]),_:1},8,[`disabled`])]),initialLoading.value||loadError.value?(openBlock(),createBlock(Vibe64AsyncModuleState_default,{key:0,label:`Project settings`,loading:loading.value,message:loadError.value||`Loading project settings.`,"min-height":`12rem`,onReload:reloadPage,onRetry:refresh},null,8,[`loading`,`message`])):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(ConnectedProjectsSettings_default,{"project-slug":unref(projectSlug),state:unref(resource).data.value?.connectedProjects,onSaved:_cache[0]||(_cache[0]=$event=>unref(resource).reload())},null,8,[`project-slug`,`state`]),createBaseVNode(`section`,_hoisted_3,[createBaseVNode(`div`,_hoisted_4,[engineeringAvailable.value?(openBlock(),createElementBlock(`p`,_hoisted_5,toDisplayString(engineeringSourceLabel.value),1)):createCommentVNode(``,true),_cache[12]||(_cache[12]=createBaseVNode(`h2`,{id:`engineering-approach-title`,class:`text-title-medium font-weight-bold`},`Engineering approach`,-1)),_cache[13]||(_cache[13]=createBaseVNode(`p`,null,` Choose how cautiously the AI changes your software. Every profile keeps changes simple and asks before adding necessary complexity. `,-1))]),engineeringAvailable.value?(openBlock(),createElementBlock(`div`,_hoisted_6,[createBaseVNode(`div`,_hoisted_7,[createVNode(VSelect,{modelValue:engineeringProfileDraft.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>engineeringProfileDraft.value=$event),disabled:engineeringSaving.value,density:`comfortable`,"hide-details":`auto`,hint:selectedEngineeringDescription.value,"item-title":`name`,"item-value":`id`,items:engineeringProfiles.value,label:`Engineering profile`,"persistent-hint":``,variant:`outlined`},null,8,[`modelValue`,`disabled`,`hint`,`items`])]),createBaseVNode(`div`,_hoisted_8,[createBaseVNode(`p`,null,toDisplayString(engineeringStatusText.value),1),createVNode(VBtn,{disabled:!engineeringChanged.value||engineeringSaving.value,color:engineeringChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveEngineeringProfile},{default:withCtx(()=>[createTextVNode(toDisplayString(engineeringSaving.value?`Saving…`:`Save engineering approach`),1)]),_:1},8,[`disabled`,`color`])])])):(openBlock(),createElementBlock(`div`,_hoisted_9,[createBaseVNode(`p`,null,toDisplayString(engineeringUnavailableReason.value),1)]))]),createBaseVNode(`section`,_hoisted_10,[createBaseVNode(`div`,_hoisted_11,[_cache[14]||(_cache[14]=createBaseVNode(`h2`,{id:`development-database-title`,class:`text-title-medium font-weight-bold`},`Development database`,-1)),managed.value?(openBlock(),createElementBlock(`p`,_hoisted_12,` Share development data across sessions or keep a separate database for each. `)):(openBlock(),createElementBlock(`p`,_hoisted_13,` This Vibe64 installation does not manage development databases. The application receives its database connection through the project Env configuration. `))]),managed.value?(openBlock(),createElementBlock(`div`,_hoisted_14,[createVNode(VRadioGroup,{modelValue:scopeDraft.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>scopeDraft.value=$event),"aria-labelledby":`development-database-title`,class:`project-settings__options`,disabled:databaseSaving.value,"hide-details":``},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_15,[createVNode(VRadio,{class:`py-1`,"aria-describedby":sessionScopeReason.value?`development-database-session-reason`:void 0,disabled:!sessionScopeAvailable.value,label:`A separate database for each session`,value:`session`},null,8,[`aria-describedby`,`disabled`]),sessionScopeReason.value?(openBlock(),createElementBlock(`p`,_hoisted_16,toDisplayString(sessionScopeReason.value),1)):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_17,[createVNode(VRadio,{class:`py-1`,"aria-describedby":projectScopeReason.value?`development-database-project-reason`:void 0,disabled:!projectScopeAvailable.value,label:`One database shared by this project`,value:`project`},null,8,[`aria-describedby`,`disabled`]),projectScopeReason.value?(openBlock(),createElementBlock(`p`,_hoisted_18,toDisplayString(projectScopeReason.value),1)):createCommentVNode(``,true)])]),_:1},8,[`modelValue`,`disabled`]),scopeDraft.value===`project`?(openBlock(),createElementBlock(`div`,_hoisted_19,[createVNode(VCheckbox,{modelValue:sharedSessionsDraft.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>sharedSessionsDraft.value=$event),label:`Allow multiple sessions with this shared database`,disabled:databaseSaving.value,"hide-details":``},null,8,[`modelValue`,`disabled`]),_cache[15]||(_cache[15]=createBaseVNode(`p`,null,`All sessions will share the same database.`,-1))])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_20,[disabledReason.value?(openBlock(),createElementBlock(`p`,_hoisted_21,toDisplayString(disabledReason.value),1)):scopeDraft.value===`project`?(openBlock(),createElementBlock(`p`,_hoisted_22,` Data and schema changes will be visible to every project session and remain after a session is archived. `)):createCommentVNode(``,true),createVNode(VBtn,{disabled:!databaseChanged.value||!databaseSaveAllowed.value||databaseSaving.value,color:databaseChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveDatabase},{default:withCtx(()=>[createTextVNode(toDisplayString(databaseSaving.value?`Saving…`:`Save database choice`),1)]),_:1},8,[`disabled`,`color`])])])):createCommentVNode(``,true)]),createBaseVNode(`section`,_hoisted_23,[createBaseVNode(`div`,_hoisted_24,[createBaseVNode(`p`,_hoisted_25,toDisplayString(collaborationSourceLabel.value),1),_cache[17]||(_cache[17]=createBaseVNode(`h2`,{id:`ai-behaviour-title`,class:`text-title-medium font-weight-bold`},`AI behaviour`,-1)),_cache[18]||(_cache[18]=createBaseVNode(`p`,null,` Set the tone, level of detail and project requirements for your conversations. These choices follow your project source. `,-1)),createVNode(VBtn,{class:`project-settings__account-link`,height:`48`,type:`button`,variant:`text`,onClick:openPersonalSettings},{default:withCtx(()=>[..._cache[16]||(_cache[16]=[createTextVNode(` Set your Vibe64 name `,-1)])]),_:1})]),createBaseVNode(`div`,_hoisted_26,[createBaseVNode(`div`,_hoisted_27,[createVNode(VSelect,{modelValue:collaborationDraft.value.tone,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>collaborationDraft.value.tone=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:toneOptions.value,label:`Tone`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.responseLength,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>collaborationDraft.value.responseLength=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:responseLengthOptions.value,label:`Response length`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.experience,"onUpdate:modelValue":_cache[6]||(_cache[6]=$event=>collaborationDraft.value.experience=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:experienceOptions.value,label:`Experience level`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VSelect,{modelValue:collaborationDraft.value.explanationStyle,"onUpdate:modelValue":_cache[7]||(_cache[7]=$event=>collaborationDraft.value.explanationStyle=$event),disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,density:`comfortable`,"hide-details":``,"item-title":`label`,"item-value":`value`,items:explanationStyleOptions.value,label:`Explanation style`,variant:`outlined`},null,8,[`modelValue`,`disabled`,`items`]),createVNode(VTextarea,{modelValue:collaborationDraft.value.requirements,"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>collaborationDraft.value.requirements=$event),class:`project-settings__ai-note`,disabled:!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,"auto-grow":``,density:`comfortable`,"hide-details":``,label:`Project requirements (optional)`,placeholder:`For example: use Australian English.`,rows:`6`,"max-rows":`18`,variant:`outlined`},null,8,[`modelValue`,`disabled`])]),createBaseVNode(`div`,_hoisted_28,[!collaborationAvailable.value?(openBlock(),createElementBlock(`p`,_hoisted_29,toDisplayString(collaborationUnavailableReason.value),1)):!collaborationCanEdit.value?(openBlock(),createElementBlock(`p`,_hoisted_30,` Only the project owner can change these controls in Settings. Anyone who can edit this source can change genesis/collaboration.md directly. `)):(openBlock(),createElementBlock(`p`,_hoisted_31,` Applies when a conversation next starts or refreshes its context. Existing history and instructions in an active Codex conversation stay as they are. `)),createVNode(VBtn,{disabled:!collaborationChanged.value||!collaborationAvailable.value||!collaborationCanEdit.value||collaborationSaving.value,color:collaborationChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:saveCollaboration},{default:withCtx(()=>[createTextVNode(toDisplayString(collaborationSaving.value?`Saving…`:`Save collaboration`),1)]),_:1},8,[`disabled`,`color`])])])]),createBaseVNode(`section`,_hoisted_32,[_cache[19]||(_cache[19]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`prompt-suggestions-title`,class:`text-title-medium font-weight-bold`},`Prompt suggestions`),createBaseVNode(`p`,null,`Get ideas for what to ask next. This Vibe64 setting does not change your AI's instructions.`)],-1)),createBaseVNode(`div`,_hoisted_33,[createVNode(VSwitch,{modelValue:promptHintsDraft.value,"onUpdate:modelValue":_cache[9]||(_cache[9]=$event=>promptHintsDraft.value=$event),class:`project-settings__ai-hints`,color:`primary`,disabled:!promptHintsCanEdit.value||promptHintsSaving.value,"hide-details":``,label:`Suggest useful next prompts`},null,8,[`modelValue`,`disabled`]),createBaseVNode(`div`,_hoisted_34,[createVNode(VBtn,{disabled:!promptHintsChanged.value||!promptHintsCanEdit.value||promptHintsSaving.value,color:promptHintsChanged.value?`primary`:void 0,height:`48`,type:`button`,variant:`flat`,onClick:savePromptHints},{default:withCtx(()=>[createTextVNode(toDisplayString(promptHintsSaving.value?`Saving…`:`Save prompt suggestions`),1)]),_:1},8,[`disabled`,`color`])])])]),repositoryWorkflow.value.available?(openBlock(),createElementBlock(`section`,_hoisted_35,[_cache[22]||(_cache[22]=createBaseVNode(`div`,{class:`project-settings__section-copy text-body-medium`},[createBaseVNode(`h2`,{id:`repository-workflow-title`,class:`text-title-medium font-weight-bold`},`Git workflow`),createBaseVNode(`p`,null,`Choose how Vibe64 publishes changes to this repository.`)],-1)),createBaseVNode(`div`,_hoisted_36,[createVNode(VRadioGroup,{modelValue:requirePullRequest.value,"onUpdate:modelValue":_cache[10]||(_cache[10]=$event=>requirePullRequest.value=$event),label:`GitHub save workflow`,color:`primary`,"hide-details":``,disabled:!repositoryWorkflow.value.canEdit||unref(repositoryWorkflowCommand).isRunning},{default:withCtx(()=>[createVNode(VRadio,{label:`Allow direct commits and pushes`,value:false,class:`py-1`}),createVNode(VRadio,{label:`Require pull requests`,value:true,class:`py-1`})]),_:1},8,[`modelValue`,`disabled`]),_cache[20]||(_cache[20]=createBaseVNode(`p`,null,`GitHub branch rules still apply. Requiring pull requests makes Create draft PR the main Save action until a session is attached to a PR.`,-1)),_cache[21]||(_cache[21]=createBaseVNode(`p`,null,`This setting controls Vibe64's Save actions. GitHub rules control pushes from terminals and other tools.`,-1)),createBaseVNode(`div`,_hoisted_37,[createVNode(VBtn,{color:requirePullRequest.value!==repositoryWorkflow.value.requirePullRequest?`primary`:void 0,height:`48`,variant:`flat`,disabled:!repositoryWorkflow.value.canEdit||unref(repositoryWorkflowCommand).isRunning||requirePullRequest.value===repositoryWorkflow.value.requirePullRequest,onClick:saveRepositoryWorkflow},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(repositoryWorkflowCommand).isRunning?`Saving…`:`Save repository workflow`),1)]),_:1},8,[`color`,`disabled`])])])])):createCommentVNode(``,true)],64))])}}};var ProjectSettingsPanel_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-362d4729`]]);var _hoisted_1={class:`vibe64-dashboard-page`};var _sfc_main={__name:`index`,setup(__props){return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1,[createVNode(ProjectSettingsPanel_default)])}}};var settings_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-d998a641`]]);export{settings_default as default};
|
package/dist/assets/{useArchivedVibe64Sessions-CLHJOyeW.js → useArchivedVibe64Sessions-_LB2XxEa.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Ht as watch,g as computed,hn as proxyRefs}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{o as projectAppPath}from"./useRealtimeEvent-Bwapstla.js";import{$n as mdiSourceBranch,Tt as mdiFileDocumentOutline,Vn as mdiRefresh,h as mdiArchiveOutline,tr as mdiSourceCommit,yt as mdiEyeOutline}from"./mdi-CG9pWOSj.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{$ as vibe64SessionPath,E as VIBE64_SESSIONS_API_SUFFIX,it as vibe64SessionsQueryKey,rt as vibe64SessionQueryKey,w as VIBE64_ARCHIVED_SESSIONS_API_SUFFIX}from"./index-
|
|
1
|
+
import{Ht as watch,g as computed,hn as proxyRefs}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{o as projectAppPath}from"./useRealtimeEvent-Bwapstla.js";import{$n as mdiSourceBranch,Tt as mdiFileDocumentOutline,Vn as mdiRefresh,h as mdiArchiveOutline,tr as mdiSourceCommit,yt as mdiEyeOutline}from"./mdi-CG9pWOSj.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{$ as vibe64SessionPath,E as VIBE64_SESSIONS_API_SUFFIX,it as vibe64SessionsQueryKey,rt as vibe64SessionQueryKey,w as VIBE64_ARCHIVED_SESSIONS_API_SUFFIX}from"./index-dNxr4Lg9.js";import{n as enrichVibe64SessionForDisplay}from"./vibe64SessionPanelModel-DDorOuiL.js";import{c as vibe64SessionStatusLabel,r as shortVibe64SessionId,s as vibe64SessionStatusColor}from"./vibe64SessionViewModel-DR4tOlGM.js";import{t as useVibe64ConversationLog}from"./useVibe64ConversationLog-BqUI0S5n.js";var archivedVibe64SessionsEmits=[`loading-changed`];var archivedAtFormatter=new Intl.DateTimeFormat(void 0,{dateStyle:`medium`,timeStyle:`short`});var archivedVibe64SessionsProps={description:{default:``,type:String},emptyText:{default:``,type:String},emptyTitle:{default:`No sessions`,type:String},showRefresh:{default:true,type:Boolean},title:{default:``,type:String}};function useArchivedVibe64Sessions(emit){const paths=usePaths();const projectSlug=useVibe64ProjectSlug();const sessionsApiPath=computed(()=>paths.api(VIBE64_ARCHIVED_SESSIONS_API_SUFFIX,{surface:`app`}));const sessionListResource=useEndpointResource({fallbackLoadError:`Archived sessions could not be loaded.`,path:sessionsApiPath,queryKey:computed(()=>[...vibe64SessionsQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value),`archived`]),requestRecoveryLabel:`Archived sessions`});const loading=computed(()=>Boolean(sessionListResource.isLoading.value));const error=computed(()=>String(sessionListResource.loadError.value||``));const sessions=computed(()=>{const payload=sessionListResource.data.value;return(Array.isArray(payload?.sessions)?payload.sessions:[]).map(enrichVibe64SessionForDisplay).filter(sessionIsInArchive)});watch(loading,isLoading=>{emit(`loading-changed`,isLoading)},{immediate:true});return{archiveIcon:mdiArchiveOutline,unavailableSessions:computed(()=>sessionListResource.data.value?.unavailableSessions||[]),error,loadSessions,loading,formatArchivedAt,mdiEyeOutline,mdiRefresh,mdiSourceBranch,sessionRoute,sessions,shortSessionId,statusColor,statusLabel};function sessionIsInArchive(session={}){return String(session.status||``)===`archived`}async function loadSessions(){await sessionListResource.reload()}function sessionRoute(session={}){return archivedSessionDetailRoute({projectSlug:projectSlug.value,sessionId:session.sessionId})}}function useArchivedVibe64SessionDetail(){const route=useRoute();const paths=usePaths();const projectSlug=useVibe64ProjectSlug(route);const sessionId=computed(()=>firstRouteParam(route.params.sessionId));const sessionsApiPath=computed(()=>paths.api(VIBE64_SESSIONS_API_SUFFIX,{surface:`app`}));const sessionPath=computed(()=>sessionId.value?vibe64SessionPath(sessionsApiPath.value,sessionId.value):``);const sessionResource=useEndpointResource({enabled:computed(()=>Boolean(sessionId.value)),fallbackLoadError:`Archived session could not be loaded.`,path:sessionPath,queryKey:computed(()=>[...vibe64SessionQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,projectSlug.value),`archive-detail`,sessionId.value]),readQuery:computed(()=>projectSlug.value?{projectSlug:projectSlug.value}:null),requestRecoveryLabel:`Archived session`});const session=computed(()=>{const payload=sessionResource.data.value;if(!payload||typeof payload!==`object`||Array.isArray(payload))return null;if(String(payload.sessionId||``).trim()!==sessionId.value)return null;const enrichedSession=enrichVibe64SessionForDisplay(payload);return String(enrichedSession.status||``)===`archived`?enrichedSession:null});return{backTo:computed(()=>({path:`${projectAppPath(projectSlug.value)}/dashboard/history`})),conversationLog:proxyRefs(useVibe64ConversationLog({active:computed(()=>Boolean(session.value)),session})),error:computed(()=>String(sessionResource.loadError.value||``)),loading:computed(()=>Boolean(sessionResource.isLoading.value||sessionResource.isInitialLoading?.value)),mdiRefresh,reload:sessionResource.reload,session,sessionId,sessionsApiPath,projectSlug}}function shortSessionId(sessionId){return shortVibe64SessionId(sessionId)}function statusLabel(status){return vibe64SessionStatusLabel(status)}function statusColor(status){return vibe64SessionStatusColor(status)}function formatArchivedAt(value=``){const date=new Date(String(value||``));return Number.isNaN(date.getTime())?`time unavailable`:archivedAtFormatter.format(date)}function archivedSessionDetailRoute({projectSlug=``,sessionId=``}={}){return{path:`${projectAppPath(projectSlug)}/dashboard/history/${encodeURIComponent(String(sessionId||``).trim())}`}}function firstRouteParam(value){return String(Array.isArray(value)?value[0]:value||``).trim()}function metadataValue(session={},name=``){return String(session.metadata?.[name]||``).trim()}function archiveFactRows(session={}){return[{icon:mdiSourceBranch,label:`Branch`,value:session.branch||metadataValue(session,`source_recovery_branch`)},{icon:mdiSourceCommit,label:`Head`,value:metadataValue(session,`source_recovery_head`)||metadataValue(session,`base_commit`)},{icon:mdiFileDocumentOutline,label:`Saved patch`,value:metadataValue(session,`source_recovery_patch_artifact`)||`No saved patch`},{icon:mdiFileDocumentOutline,label:`Untracked files`,value:metadataValue(session,`source_recovery_untracked_artifact`)||`No saved untracked archive`}].filter(row=>row.value)}export{useArchivedVibe64SessionDetail as a,shortSessionId as i,archivedVibe64SessionsEmits as n,useArchivedVibe64Sessions as o,archivedVibe64SessionsProps as r,archiveFactRows as t};
|
package/dist/assets/{useVibe64ConversationLog-B4JgmxUf.js → useVibe64ConversationLog-BqUI0S5n.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Ht as watch,g as computed,pn as onScopeDispose,vn as ref,xn as shallowRef}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{J as useQueryClient,T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{n as useRealtimeEvent,p as getHttpWebClient,r as useRealtimeSocket}from"./useRealtimeEvent-Bwapstla.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{o as normalizeVibe64ConversationAttachments}from"./shared-DpMvYJO3.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{$ as vibe64SessionPath,At as normalizeConversationLogPagination,D as VIBE64_SESSION_CHANGED_EVENT,Dt as conversationLogReadQuery,E as VIBE64_SESSIONS_API_SUFFIX,Et as normalizeConversationTurn$1,L as vibe64ConversationLogPath,Mt as mergeConversationStream,Ot as mergeConversationLogPages,Q as vibe64SessionEventMatchesScope,R as vibe64ConversationLogQueryKey,Tt as normalizeConversationMessage$1,kt as normalizeConversationLogPage,wt as applyConversationLogPatch$1,y as readRefOrGetterValue}from"./index-GBRpNZLy.js";import{a as vibe64SessionDebugError,o as vibe64SessionDebugLog}from"./vibe64SessionPanelModel-DDorOuiL.js";import{t as connectorDefinitions}from"./definitions-CNu5E87y.js";var CONVERSATION_LOG_REALTIME_REASONS=new Set([`project-message-changed`,`conversation-rewound`,`session-assistant-selection-updated`,`assistant-stream`,`integration-setup-skipped`,`integration-setup-completed`,`assistant-response-bundle`,`codex-app-server-agent-result`,`codex-app-server-agent-result-invalid`,`codex-app-server-agent-result-missing`,`codex-app-server-agent-result-provider-failed`,`codex-app-server-commentary`,`codex-app-server-final-assistant-message`,`codex-app-server-live-progress`,`codex-app-server-reasoning-summary`,`codex-app-server-terminal-assistant-message`,`codex-app-server-terminal-thinking-message`,`codex-app-server-terminal-user-message`,`codex-turn-outcome`,`codex-app-server-message-delivered`,`opencode-credential-failure`,`opencode-provider-failure`,`opencode-server-assistant-message`,`opencode-server-message-delivered`,`opencode-server-reasoning`,`opencode-server-tool`,`opencode-server-turn-idle`,`claude-stream-turn-idle`,`claude-stream-message`,`claude-stream-message-delivered`,`session-agent-message-cancelled`,`session-agent-message-accepted`,`session-agent-message-delivered`,`session-agent-message-failed`]);function normalizeConversationMessage(message={}){return normalizeConversationMessage$1(message,{normalizeAttachments:normalizeVibe64ConversationAttachments})}function normalizeConversationTurn(turn={},index=0){const normalized=normalizeConversationTurn$1(turn,index,{normalizeAttachments:normalizeVibe64ConversationAttachments});return normalized&&{...normalized,...isRecord(turn.integrationSetup)?{integrationSetup:turn.integrationSetup}:{}}}function isRecord(value){return Boolean(value&&typeof value===`object`&&!Array.isArray(value))}function normalizeConversationLog(payload={},options={}){return conversationTurnsWithPending((Array.isArray(payload?.conversationLog)?payload.conversationLog:[]).map((turn,index)=>normalizeConversationTurn(turn,index)).filter(Boolean),options.pending)}function conversationTurnsWithPending(turns,pending){const pendingTurnIndex=pending===true?turns.length-1:-1;return turns.map((turn,index)=>{if(index===pendingTurnIndex&&turn.user&&!turn.assistant)return{...turn,pending:true};return turn})}function conversationLogRealtimePatch(payload={}){const reason=String(payload?.reason||``).trim();const patch=isRecord(payload?.conversationLogPatch)?payload.conversationLogPatch:null;if(![`assistant-response-bundle`,`codex-app-server-commentary`,`codex-app-server-final-assistant-message`,`codex-app-server-reasoning-summary`,`codex-app-server-live-progress`,`codex-app-server-terminal-assistant-message`,`codex-app-server-terminal-thinking-message`,`codex-app-server-terminal-user-message`,`codex-app-server-message-delivered`,`opencode-credential-failure`,`opencode-provider-failure`,`opencode-server-assistant-message`,`opencode-server-message-delivered`,`opencode-server-reasoning`,`opencode-server-tool`].includes(reason)||patch?.type!==`upsert-turn`||!isRecord(patch.turn))return null;const assistant=normalizeConversationMessage(patch.turn.assistant);const commentary=Array.isArray(patch.turn.commentary)?patch.turn.commentary.map(normalizeConversationMessage).filter(Boolean):[];const thinking=Array.isArray(patch.turn.thinking)?patch.turn.thinking.map(normalizeConversationMessage).filter(Boolean):[];if([`codex-app-server-reasoning-summary`,`codex-app-server-live-progress`].includes(reason)&&(!thinking.length||assistant))return null;if(reason===`codex-app-server-commentary`&&(!commentary.length||assistant))return null;if([`assistant-response-bundle`,`codex-app-server-final-assistant-message`].includes(reason)&&!assistant)return null;return{turn:patch.turn,type:`upsert-turn`}}function applyConversationLogPatch(payload={},patch=null,options={}){return applyConversationLogPatch$1(payload,patch,{...options,normalizeAttachments:normalizeVibe64ConversationAttachments})}function sessionIsAwaitingCodex(session={}){return(session&&typeof session===`object`&&!Array.isArray(session)?session:{}).agentSession?.turn?.active===true}function conversationLogRealtimeShouldRefresh({payload={}}={},sessionId=``){const normalizedSessionId=String(sessionId||``).trim();const changedSessionId=String(payload.sessionId||payload.entityId||``).trim();if(!normalizedSessionId||changedSessionId!==normalizedSessionId)return false;const reason=String(payload.reason||``).trim();return Boolean(payload.conversationStream)||!reason||CONVERSATION_LOG_REALTIME_REASONS.has(reason)}function conversationLogRecoveryStateKey(session={}){const source=session&&typeof session===`object`&&!Array.isArray(session)?session:{};return[source.sessionId,source.status,source.revision,source.updatedAt,source.agentSession?.turn?.active?`active`:`idle`,source.agentSession?.turn?.id].map(value=>String(value||``).trim()).join(`|`)}function conversationLogCompletedTurnKey(session={}){const source=isRecord(session)?session:{};const turn=isRecord(source.agentSession?.turn)?source.agentSession.turn:{};const sessionId=String(source.sessionId||``).trim();const turnId=String(turn.id||``).trim();const revision=Number(source.revision);if(!sessionId||!turnId||turn.active!==false||!Number.isSafeInteger(revision)||revision<0)return``;return`${sessionId}|${revision}|${turnId}`}function useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog,httpClient}){const integrationActionPending=shallowRef(null);const integrationActionError=ref(null);const integrationConnections=shallowRef({});function connectIntegrationRequest(request={}){return runIntegrationRequestAction(request,`connect`)}function checkIntegrationRequest(request={}){return runIntegrationRequestAction(request,`status`)}function cancelIntegrationRequest(request={}){return runIntegrationRequestAction(request,`cancel`)}function skipIntegrationRequest(request={}){return runIntegrationRequestAction(request,`skip`)}function resumeIntegrationRequest(request={}){return runIntegrationRequestAction(request,`resume`)}async function runIntegrationRequestAction(request,action){const turn=turns.value.find(entry=>entry.turnId===request.turnId);if(!enabled.value||request.sessionId!==sessionId.value||integrationActionPending.value||turn?.integrationSetup?.outcome!==(action===`resume`?`completed`:`pending`)||turn.integrationSetup.requestId!==request.requestId)return false;const selection={sessionId:sessionId.value,turnId:request.turnId,requestId:request.requestId};integrationActionPending.value=selection;integrationActionError.value=null;try{if([`connect`,`cancel`,`status`].includes(action)){const path=vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integrations`);const config=await httpClient.request(path);if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false;const integrationId=turn.integrationSetup.integrationId;const integration=config?.configuration?.integrations?.[integrationId];if(!integration)throw new Error(`Choose Configure to set up this integration first.`);if(connectorDefinitions.some(provider=>provider.id===integration.provider&&(provider.configurationOnly||provider.configurationOnlyForSettings?.(integration?.settings||{})))){integrationConnections.value={...integrationConnections.value,[selection.requestId]:{status:`configuration-only`}};return true}if(integration.accountMode===`per-user`)throw new Error(`Each app user connects their account inside the application. Choose Configure for setup instructions.`);const endpoint=`${path}/${encodeURIComponent(integrationId)}/setup`;const previous=integrationConnections.value[selection.requestId];if(action===`cancel`&&!previous?.attemptId)return false;let connection=await httpClient.request(endpoint,{method:`POST`,body:{operation:action,...action===`cancel`?{attemptId:previous.attemptId}:{setupRequest:{turnId:selection.turnId,requestId:selection.requestId,configurationHash:config.baseHash}}}});if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false;if(action===`cancel`){connection=await httpClient.request(endpoint,{method:`POST`,body:{operation:`status`}});if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false}integrationConnections.value={...integrationConnections.value,[selection.requestId]:connection};if(connection.integrationSetup?.outcome===`completed`&&connection.integrationSetup.continuation?.status!==`accepted`){const resumed=await httpClient.request(vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integration-setup/resume`),{method:`POST`,body:{turnId:selection.turnId,requestId:selection.requestId}});if(resumed?.ok!==true)throw new Error(resumed?.error||`Assistant continuation is not yet confirmed.`)}if(integrationActionPending.value===selection&&sessionId.value===selection.sessionId)await reloadConversationLog();return true}const result=await httpClient.request(vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integration-setup/${action}`),{method:`POST`,body:{turnId:selection.turnId,requestId:selection.requestId}});if(result?.ok!==true)throw new Error(result?.error||`Could not update integration setup.`);if(integrationActionPending.value===selection&&sessionId.value===selection.sessionId)await reloadConversationLog();return true}catch(error){if(sessionId.value===selection.sessionId&&integrationActionPending.value===selection){integrationActionError.value={turnId:selection.turnId,message:String(error?.message||`Could not update integration setup.`)};if(action===`resume`||action===`connect`||action===`status`)await reloadConversationLog()}return false}finally{if(sessionId.value===selection.sessionId&&integrationActionPending.value===selection)integrationActionPending.value=null}}onScopeDispose(()=>{integrationActionPending.value=null});watch([sessionId,projectSlug],()=>{integrationActionPending.value=null;integrationActionError.value=null;integrationConnections.value={}});return{integrationConnections,connectIntegrationRequest,checkIntegrationRequest,cancelIntegrationRequest,integrationActionPending,integrationActionError,skipIntegrationRequest,resumeIntegrationRequest}}function useVibe64ConversationLog({active=true,projectSlug:projectSlugInput,sessionsApiPath:sessionsApiPathInput,session,conversation=null}={}){const paths=usePaths();const httpClient=getHttpWebClient();const projectSlug=projectSlugInput===void 0?useVibe64ProjectSlug():computed(()=>readRefOrGetterValue(projectSlugInput));const currentSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>String(currentSession.value?.sessionId||``).trim());const enabled=computed(()=>Boolean(readRefOrGetterValue(active)!==false&&sessionId.value));const sessionsApiPath=computed(()=>readRefOrGetterValue(sessionsApiPathInput)||paths.api(`/vibe64/sessions`,{surface:`app`}));if(conversation){const turns=computed(()=>conversationTurnsWithPending(conversation.turns.value,sessionIsAwaitingCodex(currentSession.value)));const integrationActions=useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog:conversation.reload,httpClient});let realtimeCompletionKey=``;const realtime=useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>([`session-assistant-selection-updated`,`integration-setup-skipped`,`integration-setup-completed`].includes(context?.payload?.reason)||conversationLogCompletedTurnKey(context?.payload))&&conversationLogRealtimeShouldRefresh(context,sessionId.value)&&vibe64SessionEventMatchesScope(context?.payload,{projectSlug:projectSlug.value}),onEvent:({payload={}}={})=>{realtimeCompletionKey=conversationLogCompletedTurnKey(payload)||realtimeCompletionKey;return payload.reason===`session-assistant-selection-updated`?conversation.reload({resubscribe:true}):conversation.reload()}});watch(()=>conversationLogCompletedTurnKey(currentSession.value),key=>{if(!enabled.value||!key)return;if(key===realtimeCompletionKey){realtimeCompletionKey=``;return}conversation.reload()?.catch(()=>{})},{flush:`post`});return{...integrationActions,turns,error:conversation.error,errorReloadable:computed(()=>conversation.accessDenied?.value===false),hasMoreBefore:conversation.hasMoreBefore,loadMore:conversation.loadMore,loadMoreError:conversation.loadMoreError,loading:conversation.loading,initializing:computed(()=>!conversation.snapshot.value&&conversation.loading.value),loadingMore:conversation.loadingMore,reload:conversation.reload,realtime,visible:computed(()=>Boolean(conversation.loading.value||conversation.error.value||turns.value.length))}}const queryClient=useQueryClient();const olderPages=ref([]);const loadingMore=ref(false);const loadMoreError=ref(``);const queryKey=computed(()=>[...vibe64ConversationLogQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)]);const conversationLogPath=computed(()=>sessionId.value?vibe64ConversationLogPath(sessionsApiPath.value,sessionId.value):``);const pendingReads=new Set;const resource=useEndpointResource({enabled,fallbackLoadError:`Conversation history could not be loaded.`,path:conversationLogPath,queryKey,queryOptions:{async queryFn({signal}){const read={sessionId:sessionId.value,projectSlug:projectSlug.value,patches:[]};pendingReads.add(read);try{let payload=await httpClient.request(conversationLogPath.value,{method:`GET`,query:conversationLogReadQuery(),signal});for(const patch of read.patches)payload=applyConversationLogPatch(payload,patch,{limit:10});return payload}finally{pendingReads.delete(read)}},placeholderData:previousData=>previousData,refetchOnMount:false,refetchOnWindowFocus:false},readMethod:`GET`,refreshOnPull:true,requestRecoveryLabel:`Conversation history`,realtime:null});let reloadInFlight=null;let reloadQueued=false;let recoveredErrorKey=``;let realtimeCompletionKey=``;const conversationStream=shallowRef(null);function receiveConversationStream(snapshot){if(snapshot&&(!conversationStream.value||snapshot.revision>=conversationStream.value.revision))conversationStream.value=snapshot}watch(()=>resource.data.value,data=>receiveConversationStream(data?.conversationStream),{immediate:true});async function reloadConversationLog(){if(reloadInFlight){reloadQueued=true;vibe64SessionDebugLog(`client.conversationLog.reload.join`,{sessionId:sessionId.value});return reloadInFlight}olderPages.value=[];loadMoreError.value=``;vibe64SessionDebugLog(`client.conversationLog.reload.start`,{sessionId:sessionId.value});reloadInFlight=resource.reload();try{const result=await reloadInFlight;vibe64SessionDebugLog(`client.conversationLog.reload.done`,{sessionId:sessionId.value});return result}finally{reloadInFlight=null;if(reloadQueued){reloadQueued=false;reloadConversationLog()}}}const realtimeSocket=useRealtimeSocket({required:false});const reconcileConversationAfterRealtimeConnect=()=>{if(enabled.value){conversationStream.value=null;reloadConversationLog().catch(()=>{})}};realtimeSocket.on(`connect`,reconcileConversationAfterRealtimeConnect);onScopeDispose(()=>{realtimeSocket.off(`connect`,reconcileConversationAfterRealtimeConnect)});function applyRealtimeConversationLogPatch(payload={}){const patch=conversationLogRealtimePatch(payload);if(!patch)return false;const key=queryKey.value;const currentPayload=queryClient.getQueryData(key);const nextPayload=applyConversationLogPatch(currentPayload,patch,{limit:10});if(!nextPayload){vibe64SessionDebugLog(`client.conversationLog.patch.miss`,{hasCurrentPayload:Boolean(currentPayload),patchType:String(patch?.type||``),sessionId:sessionId.value});return false}for(const read of pendingReads)if(read.sessionId===sessionId.value&&read.projectSlug===projectSlug.value)read.patches.push(patch);queryClient.setQueryData(key,nextPayload);vibe64SessionDebugLog(`client.conversationLog.patch.done`,{patchType:String(patch.type||``),sessionId:sessionId.value,turnId:String(patch.turn?.turnId||``)});return true}const realtime=useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>conversationLogRealtimeShouldRefresh(context,sessionId.value),onEvent:({payload={}}={})=>{receiveConversationStream(payload.conversationStream);realtimeCompletionKey=conversationLogCompletedTurnKey(payload)||realtimeCompletionKey;vibe64SessionDebugLog(`client.conversationLog.realtime`,{hasPatch:Boolean(conversationLogRealtimePatch(payload)),reason:String(payload.reason||``),sessionId:sessionId.value});if(applyRealtimeConversationLogPatch(payload))return null;if(payload.reason===`assistant-stream`)return null;return reloadConversationLog()}});const recoveryStateKey=computed(()=>conversationLogRecoveryStateKey(currentSession.value));const completedTurnKey=computed(()=>conversationLogCompletedTurnKey(currentSession.value));watch(completedTurnKey,key=>{if(!enabled.value||!key)return;if(key===realtimeCompletionKey){realtimeCompletionKey=``;return}vibe64SessionDebugLog(`client.conversationLog.completion.reconcile`,{completedTurnKey:key,sessionId:sessionId.value});reloadConversationLog().catch(()=>{})},{flush:`post`});const recoveryErrorKey=computed(()=>[enabled.value?`enabled`:`disabled`,sessionId.value,recoveryStateKey.value,resource.loadError.value].join(`|`));watch(recoveryErrorKey,()=>{const loadError=String(resource.loadError.value||``).trim();if(!enabled.value||!loadError){recoveredErrorKey=``;return}const key=recoveryErrorKey.value;if(recoveredErrorKey===key)return;recoveredErrorKey=key;vibe64SessionDebugLog(`client.conversationLog.recover.start`,{error:loadError,recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value});reloadConversationLog().then(()=>{vibe64SessionDebugLog(`client.conversationLog.recover.done`,{recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value})}).catch(error=>{vibe64SessionDebugLog(`client.conversationLog.recover.error`,{error:vibe64SessionDebugError(error),recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value})})},{flush:`post`});const latestPage=computed(()=>normalizeConversationLogPage(resource.data.value||{}));const loadedPages=computed(()=>[...olderPages.value,latestPage.value]);const oldestLoadedPage=computed(()=>olderPages.value[0]||latestPage.value);const hasMoreBefore=computed(()=>Boolean(normalizeConversationLogPagination(oldestLoadedPage.value?.pagination).hasMoreBefore));const turns=computed(()=>{const savedTurns=normalizeConversationLog(mergeConversationLogPages(loadedPages.value),{pending:sessionIsAwaitingCodex(currentSession.value)});return mergeConversationStream(savedTurns,conversationStream.value)});const visible=computed(()=>Boolean(resource.isLoading.value||resource.loadError.value||turns.value.length));async function loadMoreConversationLog({complete}={}){const finish=result=>{if(typeof complete===`function`)complete(result)};const pagination=normalizeConversationLogPagination(oldestLoadedPage.value?.pagination);const beforeTurnId=pagination.nextBeforeTurnId||pagination.oldestTurnId||String(turns.value[0]?.turnId||``).trim();if(!enabled.value||!conversationLogPath.value||!hasMoreBefore.value||loadingMore.value||!beforeTurnId){finish({changed:false,loaded:false});return false}loadingMore.value=true;loadMoreError.value=``;vibe64SessionDebugLog(`client.conversationLog.loadMore.start`,{beforeTurnId,sessionId:sessionId.value});try{const page=await httpClient.request(conversationLogPath.value,{method:`GET`,query:conversationLogReadQuery({beforeTurnId,limit:10})});const previousOldestTurnId=String(turns.value[0]?.turnId||``).trim();const previousMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);olderPages.value=[normalizeConversationLogPage(page),...olderPages.value];const nextOldestTurnId=String(turns.value[0]?.turnId||``).trim();const nextMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);const changed=Boolean(nextOldestTurnId&&(nextOldestTurnId!==previousOldestTurnId||nextMessageCount!==previousMessageCount));vibe64SessionDebugLog(`client.conversationLog.loadMore.done`,{beforeTurnId,sessionId:sessionId.value,turnCount:Array.isArray(page?.conversationLog)?page.conversationLog.length:0});finish({changed,loaded:true});return true}catch(error){loadMoreError.value=String(error?.message||error||`Older conversation history could not be loaded.`);vibe64SessionDebugLog(`client.conversationLog.loadMore.error`,{beforeTurnId,error:vibe64SessionDebugError(error),sessionId:sessionId.value});finish({changed:false,loaded:false});return false}finally{loadingMore.value=false}}const integrationActions=useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog,httpClient});watch([sessionId,projectSlug],()=>{conversationStream.value=null;olderPages.value=[];loadMoreError.value=``});return{...integrationActions,error:resource.loadError,hasMoreBefore,loadMore:loadMoreConversationLog,loadMoreError,loading:resource.isLoading,initializing:resource.isInitialLoading,loadingMore,reload:reloadConversationLog,realtime,turns,visible}}export{useVibe64ConversationLog as t};
|
|
1
|
+
import{Ht as watch,g as computed,pn as onScopeDispose,vn as ref,xn as shallowRef}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{J as useQueryClient,T as ROUTE_VISIBILITY_PUBLIC,t as useEndpointResource}from"./useEndpointResource-DWoQ2keu.js";import{n as useRealtimeEvent,p as getHttpWebClient,r as useRealtimeSocket}from"./useRealtimeEvent-Bwapstla.js";import{t as usePaths}from"./usePaths-Db88-HOm.js";import{o as normalizeVibe64ConversationAttachments}from"./shared-DpMvYJO3.js";import{t as useVibe64ProjectSlug}from"./useVibe64ProjectScope-Bp1ImZlz.js";import{$ as vibe64SessionPath,At as normalizeConversationLogPagination,D as VIBE64_SESSION_CHANGED_EVENT,Dt as conversationLogReadQuery,E as VIBE64_SESSIONS_API_SUFFIX,Et as normalizeConversationTurn$1,L as vibe64ConversationLogPath,Mt as mergeConversationStream,Ot as mergeConversationLogPages,Q as vibe64SessionEventMatchesScope,R as vibe64ConversationLogQueryKey,Tt as normalizeConversationMessage$1,kt as normalizeConversationLogPage,wt as applyConversationLogPatch$1,y as readRefOrGetterValue}from"./index-dNxr4Lg9.js";import{a as vibe64SessionDebugError,o as vibe64SessionDebugLog}from"./vibe64SessionPanelModel-DDorOuiL.js";import{t as connectorDefinitions}from"./definitions-BrMvu6yV.js";var CONVERSATION_LOG_REALTIME_REASONS=new Set([`project-message-changed`,`conversation-rewound`,`session-assistant-selection-updated`,`assistant-stream`,`integration-setup-skipped`,`integration-setup-completed`,`assistant-response-bundle`,`codex-app-server-agent-result`,`codex-app-server-agent-result-invalid`,`codex-app-server-agent-result-missing`,`codex-app-server-agent-result-provider-failed`,`codex-app-server-commentary`,`codex-app-server-final-assistant-message`,`codex-app-server-live-progress`,`codex-app-server-reasoning-summary`,`codex-app-server-terminal-assistant-message`,`codex-app-server-terminal-thinking-message`,`codex-app-server-terminal-user-message`,`codex-turn-outcome`,`codex-app-server-message-delivered`,`opencode-credential-failure`,`opencode-provider-failure`,`opencode-server-assistant-message`,`opencode-server-message-delivered`,`opencode-server-reasoning`,`opencode-server-tool`,`opencode-server-turn-idle`,`claude-stream-turn-idle`,`claude-stream-message`,`claude-stream-message-delivered`,`session-agent-message-cancelled`,`session-agent-message-accepted`,`session-agent-message-delivered`,`session-agent-message-failed`]);function normalizeConversationMessage(message={}){return normalizeConversationMessage$1(message,{normalizeAttachments:normalizeVibe64ConversationAttachments})}function normalizeConversationTurn(turn={},index=0){const normalized=normalizeConversationTurn$1(turn,index,{normalizeAttachments:normalizeVibe64ConversationAttachments});return normalized&&{...normalized,...isRecord(turn.integrationSetup)?{integrationSetup:turn.integrationSetup}:{}}}function isRecord(value){return Boolean(value&&typeof value===`object`&&!Array.isArray(value))}function normalizeConversationLog(payload={},options={}){return conversationTurnsWithPending((Array.isArray(payload?.conversationLog)?payload.conversationLog:[]).map((turn,index)=>normalizeConversationTurn(turn,index)).filter(Boolean),options.pending)}function conversationTurnsWithPending(turns,pending){const pendingTurnIndex=pending===true?turns.length-1:-1;return turns.map((turn,index)=>{if(index===pendingTurnIndex&&turn.user&&!turn.assistant)return{...turn,pending:true};return turn})}function conversationLogRealtimePatch(payload={}){const reason=String(payload?.reason||``).trim();const patch=isRecord(payload?.conversationLogPatch)?payload.conversationLogPatch:null;if(![`assistant-response-bundle`,`codex-app-server-commentary`,`codex-app-server-final-assistant-message`,`codex-app-server-reasoning-summary`,`codex-app-server-live-progress`,`codex-app-server-terminal-assistant-message`,`codex-app-server-terminal-thinking-message`,`codex-app-server-terminal-user-message`,`codex-app-server-message-delivered`,`opencode-credential-failure`,`opencode-provider-failure`,`opencode-server-assistant-message`,`opencode-server-message-delivered`,`opencode-server-reasoning`,`opencode-server-tool`].includes(reason)||patch?.type!==`upsert-turn`||!isRecord(patch.turn))return null;const assistant=normalizeConversationMessage(patch.turn.assistant);const commentary=Array.isArray(patch.turn.commentary)?patch.turn.commentary.map(normalizeConversationMessage).filter(Boolean):[];const thinking=Array.isArray(patch.turn.thinking)?patch.turn.thinking.map(normalizeConversationMessage).filter(Boolean):[];if([`codex-app-server-reasoning-summary`,`codex-app-server-live-progress`].includes(reason)&&(!thinking.length||assistant))return null;if(reason===`codex-app-server-commentary`&&(!commentary.length||assistant))return null;if([`assistant-response-bundle`,`codex-app-server-final-assistant-message`].includes(reason)&&!assistant)return null;return{turn:patch.turn,type:`upsert-turn`}}function applyConversationLogPatch(payload={},patch=null,options={}){return applyConversationLogPatch$1(payload,patch,{...options,normalizeAttachments:normalizeVibe64ConversationAttachments})}function sessionIsAwaitingCodex(session={}){return(session&&typeof session===`object`&&!Array.isArray(session)?session:{}).agentSession?.turn?.active===true}function conversationLogRealtimeShouldRefresh({payload={}}={},sessionId=``){const normalizedSessionId=String(sessionId||``).trim();const changedSessionId=String(payload.sessionId||payload.entityId||``).trim();if(!normalizedSessionId||changedSessionId!==normalizedSessionId)return false;const reason=String(payload.reason||``).trim();return Boolean(payload.conversationStream)||!reason||CONVERSATION_LOG_REALTIME_REASONS.has(reason)}function conversationLogRecoveryStateKey(session={}){const source=session&&typeof session===`object`&&!Array.isArray(session)?session:{};return[source.sessionId,source.status,source.revision,source.updatedAt,source.agentSession?.turn?.active?`active`:`idle`,source.agentSession?.turn?.id].map(value=>String(value||``).trim()).join(`|`)}function conversationLogCompletedTurnKey(session={}){const source=isRecord(session)?session:{};const turn=isRecord(source.agentSession?.turn)?source.agentSession.turn:{};const sessionId=String(source.sessionId||``).trim();const turnId=String(turn.id||``).trim();const revision=Number(source.revision);if(!sessionId||!turnId||turn.active!==false||!Number.isSafeInteger(revision)||revision<0)return``;return`${sessionId}|${revision}|${turnId}`}function useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog,httpClient}){const integrationActionPending=shallowRef(null);const integrationActionError=ref(null);const integrationConnections=shallowRef({});function connectIntegrationRequest(request={}){return runIntegrationRequestAction(request,`connect`)}function checkIntegrationRequest(request={}){return runIntegrationRequestAction(request,`status`)}function cancelIntegrationRequest(request={}){return runIntegrationRequestAction(request,`cancel`)}function skipIntegrationRequest(request={}){return runIntegrationRequestAction(request,`skip`)}function resumeIntegrationRequest(request={}){return runIntegrationRequestAction(request,`resume`)}async function runIntegrationRequestAction(request,action){const turn=turns.value.find(entry=>entry.turnId===request.turnId);if(!enabled.value||request.sessionId!==sessionId.value||integrationActionPending.value||turn?.integrationSetup?.outcome!==(action===`resume`?`completed`:`pending`)||turn.integrationSetup.requestId!==request.requestId)return false;const selection={sessionId:sessionId.value,turnId:request.turnId,requestId:request.requestId};integrationActionPending.value=selection;integrationActionError.value=null;try{if([`connect`,`cancel`,`status`].includes(action)){const path=vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integrations`);const config=await httpClient.request(path);if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false;const integrationId=turn.integrationSetup.integrationId;const integration=config?.configuration?.integrations?.[integrationId];if(!integration)throw new Error(`Choose Configure to set up this integration first.`);if(connectorDefinitions.some(provider=>provider.id===integration.provider&&(provider.configurationOnly||provider.configurationOnlyForSettings?.(integration?.settings||{})))){integrationConnections.value={...integrationConnections.value,[selection.requestId]:{status:`configuration-only`}};return true}if(integration.accountMode===`per-user`)throw new Error(`Each app user connects their account inside the application. Choose Configure for setup instructions.`);const endpoint=`${path}/${encodeURIComponent(integrationId)}/setup`;const previous=integrationConnections.value[selection.requestId];if(action===`cancel`&&!previous?.attemptId)return false;let connection=await httpClient.request(endpoint,{method:`POST`,body:{operation:action,...action===`cancel`?{attemptId:previous.attemptId}:{setupRequest:{turnId:selection.turnId,requestId:selection.requestId,configurationHash:config.baseHash}}}});if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false;if(action===`cancel`){connection=await httpClient.request(endpoint,{method:`POST`,body:{operation:`status`}});if(integrationActionPending.value!==selection||sessionId.value!==selection.sessionId)return false}integrationConnections.value={...integrationConnections.value,[selection.requestId]:connection};if(connection.integrationSetup?.outcome===`completed`&&connection.integrationSetup.continuation?.status!==`accepted`){const resumed=await httpClient.request(vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integration-setup/resume`),{method:`POST`,body:{turnId:selection.turnId,requestId:selection.requestId}});if(resumed?.ok!==true)throw new Error(resumed?.error||`Assistant continuation is not yet confirmed.`)}if(integrationActionPending.value===selection&&sessionId.value===selection.sessionId)await reloadConversationLog();return true}const result=await httpClient.request(vibe64SessionPath(sessionsApiPath.value,selection.sessionId,`/integration-setup/${action}`),{method:`POST`,body:{turnId:selection.turnId,requestId:selection.requestId}});if(result?.ok!==true)throw new Error(result?.error||`Could not update integration setup.`);if(integrationActionPending.value===selection&&sessionId.value===selection.sessionId)await reloadConversationLog();return true}catch(error){if(sessionId.value===selection.sessionId&&integrationActionPending.value===selection){integrationActionError.value={turnId:selection.turnId,message:String(error?.message||`Could not update integration setup.`)};if(action===`resume`||action===`connect`||action===`status`)await reloadConversationLog()}return false}finally{if(sessionId.value===selection.sessionId&&integrationActionPending.value===selection)integrationActionPending.value=null}}onScopeDispose(()=>{integrationActionPending.value=null});watch([sessionId,projectSlug],()=>{integrationActionPending.value=null;integrationActionError.value=null;integrationConnections.value={}});return{integrationConnections,connectIntegrationRequest,checkIntegrationRequest,cancelIntegrationRequest,integrationActionPending,integrationActionError,skipIntegrationRequest,resumeIntegrationRequest}}function useVibe64ConversationLog({active=true,projectSlug:projectSlugInput,sessionsApiPath:sessionsApiPathInput,session,conversation=null}={}){const paths=usePaths();const httpClient=getHttpWebClient();const projectSlug=projectSlugInput===void 0?useVibe64ProjectSlug():computed(()=>readRefOrGetterValue(projectSlugInput));const currentSession=computed(()=>readRefOrGetterValue(session)||null);const sessionId=computed(()=>String(currentSession.value?.sessionId||``).trim());const enabled=computed(()=>Boolean(readRefOrGetterValue(active)!==false&&sessionId.value));const sessionsApiPath=computed(()=>readRefOrGetterValue(sessionsApiPathInput)||paths.api(`/vibe64/sessions`,{surface:`app`}));if(conversation){const turns=computed(()=>conversationTurnsWithPending(conversation.turns.value,sessionIsAwaitingCodex(currentSession.value)));const integrationActions=useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog:conversation.reload,httpClient});let realtimeCompletionKey=``;const realtime=useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>([`session-assistant-selection-updated`,`integration-setup-skipped`,`integration-setup-completed`].includes(context?.payload?.reason)||conversationLogCompletedTurnKey(context?.payload))&&conversationLogRealtimeShouldRefresh(context,sessionId.value)&&vibe64SessionEventMatchesScope(context?.payload,{projectSlug:projectSlug.value}),onEvent:({payload={}}={})=>{realtimeCompletionKey=conversationLogCompletedTurnKey(payload)||realtimeCompletionKey;return payload.reason===`session-assistant-selection-updated`?conversation.reload({resubscribe:true}):conversation.reload()}});watch(()=>conversationLogCompletedTurnKey(currentSession.value),key=>{if(!enabled.value||!key)return;if(key===realtimeCompletionKey){realtimeCompletionKey=``;return}conversation.reload()?.catch(()=>{})},{flush:`post`});return{...integrationActions,turns,error:conversation.error,errorReloadable:computed(()=>conversation.accessDenied?.value===false),hasMoreBefore:conversation.hasMoreBefore,loadMore:conversation.loadMore,loadMoreError:conversation.loadMoreError,loading:conversation.loading,initializing:computed(()=>!conversation.snapshot.value&&conversation.loading.value),loadingMore:conversation.loadingMore,reload:conversation.reload,realtime,visible:computed(()=>Boolean(conversation.loading.value||conversation.error.value||turns.value.length))}}const queryClient=useQueryClient();const olderPages=ref([]);const loadingMore=ref(false);const loadMoreError=ref(``);const queryKey=computed(()=>[...vibe64ConversationLogQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,sessionId.value,projectSlug.value)]);const conversationLogPath=computed(()=>sessionId.value?vibe64ConversationLogPath(sessionsApiPath.value,sessionId.value):``);const pendingReads=new Set;const resource=useEndpointResource({enabled,fallbackLoadError:`Conversation history could not be loaded.`,path:conversationLogPath,queryKey,queryOptions:{async queryFn({signal}){const read={sessionId:sessionId.value,projectSlug:projectSlug.value,patches:[]};pendingReads.add(read);try{let payload=await httpClient.request(conversationLogPath.value,{method:`GET`,query:conversationLogReadQuery(),signal});for(const patch of read.patches)payload=applyConversationLogPatch(payload,patch,{limit:10});return payload}finally{pendingReads.delete(read)}},placeholderData:previousData=>previousData,refetchOnMount:false,refetchOnWindowFocus:false},readMethod:`GET`,refreshOnPull:true,requestRecoveryLabel:`Conversation history`,realtime:null});let reloadInFlight=null;let reloadQueued=false;let recoveredErrorKey=``;let realtimeCompletionKey=``;const conversationStream=shallowRef(null);function receiveConversationStream(snapshot){if(snapshot&&(!conversationStream.value||snapshot.revision>=conversationStream.value.revision))conversationStream.value=snapshot}watch(()=>resource.data.value,data=>receiveConversationStream(data?.conversationStream),{immediate:true});async function reloadConversationLog(){if(reloadInFlight){reloadQueued=true;vibe64SessionDebugLog(`client.conversationLog.reload.join`,{sessionId:sessionId.value});return reloadInFlight}olderPages.value=[];loadMoreError.value=``;vibe64SessionDebugLog(`client.conversationLog.reload.start`,{sessionId:sessionId.value});reloadInFlight=resource.reload();try{const result=await reloadInFlight;vibe64SessionDebugLog(`client.conversationLog.reload.done`,{sessionId:sessionId.value});return result}finally{reloadInFlight=null;if(reloadQueued){reloadQueued=false;reloadConversationLog()}}}const realtimeSocket=useRealtimeSocket({required:false});const reconcileConversationAfterRealtimeConnect=()=>{if(enabled.value){conversationStream.value=null;reloadConversationLog().catch(()=>{})}};realtimeSocket.on(`connect`,reconcileConversationAfterRealtimeConnect);onScopeDispose(()=>{realtimeSocket.off(`connect`,reconcileConversationAfterRealtimeConnect)});function applyRealtimeConversationLogPatch(payload={}){const patch=conversationLogRealtimePatch(payload);if(!patch)return false;const key=queryKey.value;const currentPayload=queryClient.getQueryData(key);const nextPayload=applyConversationLogPatch(currentPayload,patch,{limit:10});if(!nextPayload){vibe64SessionDebugLog(`client.conversationLog.patch.miss`,{hasCurrentPayload:Boolean(currentPayload),patchType:String(patch?.type||``),sessionId:sessionId.value});return false}for(const read of pendingReads)if(read.sessionId===sessionId.value&&read.projectSlug===projectSlug.value)read.patches.push(patch);queryClient.setQueryData(key,nextPayload);vibe64SessionDebugLog(`client.conversationLog.patch.done`,{patchType:String(patch.type||``),sessionId:sessionId.value,turnId:String(patch.turn?.turnId||``)});return true}const realtime=useRealtimeEvent({enabled,event:VIBE64_SESSION_CHANGED_EVENT,matches:context=>conversationLogRealtimeShouldRefresh(context,sessionId.value),onEvent:({payload={}}={})=>{receiveConversationStream(payload.conversationStream);realtimeCompletionKey=conversationLogCompletedTurnKey(payload)||realtimeCompletionKey;vibe64SessionDebugLog(`client.conversationLog.realtime`,{hasPatch:Boolean(conversationLogRealtimePatch(payload)),reason:String(payload.reason||``),sessionId:sessionId.value});if(applyRealtimeConversationLogPatch(payload))return null;if(payload.reason===`assistant-stream`)return null;return reloadConversationLog()}});const recoveryStateKey=computed(()=>conversationLogRecoveryStateKey(currentSession.value));const completedTurnKey=computed(()=>conversationLogCompletedTurnKey(currentSession.value));watch(completedTurnKey,key=>{if(!enabled.value||!key)return;if(key===realtimeCompletionKey){realtimeCompletionKey=``;return}vibe64SessionDebugLog(`client.conversationLog.completion.reconcile`,{completedTurnKey:key,sessionId:sessionId.value});reloadConversationLog().catch(()=>{})},{flush:`post`});const recoveryErrorKey=computed(()=>[enabled.value?`enabled`:`disabled`,sessionId.value,recoveryStateKey.value,resource.loadError.value].join(`|`));watch(recoveryErrorKey,()=>{const loadError=String(resource.loadError.value||``).trim();if(!enabled.value||!loadError){recoveredErrorKey=``;return}const key=recoveryErrorKey.value;if(recoveredErrorKey===key)return;recoveredErrorKey=key;vibe64SessionDebugLog(`client.conversationLog.recover.start`,{error:loadError,recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value});reloadConversationLog().then(()=>{vibe64SessionDebugLog(`client.conversationLog.recover.done`,{recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value})}).catch(error=>{vibe64SessionDebugLog(`client.conversationLog.recover.error`,{error:vibe64SessionDebugError(error),recoveryStateKey:recoveryStateKey.value,sessionId:sessionId.value})})},{flush:`post`});const latestPage=computed(()=>normalizeConversationLogPage(resource.data.value||{}));const loadedPages=computed(()=>[...olderPages.value,latestPage.value]);const oldestLoadedPage=computed(()=>olderPages.value[0]||latestPage.value);const hasMoreBefore=computed(()=>Boolean(normalizeConversationLogPagination(oldestLoadedPage.value?.pagination).hasMoreBefore));const turns=computed(()=>{const savedTurns=normalizeConversationLog(mergeConversationLogPages(loadedPages.value),{pending:sessionIsAwaitingCodex(currentSession.value)});return mergeConversationStream(savedTurns,conversationStream.value)});const visible=computed(()=>Boolean(resource.isLoading.value||resource.loadError.value||turns.value.length));async function loadMoreConversationLog({complete}={}){const finish=result=>{if(typeof complete===`function`)complete(result)};const pagination=normalizeConversationLogPagination(oldestLoadedPage.value?.pagination);const beforeTurnId=pagination.nextBeforeTurnId||pagination.oldestTurnId||String(turns.value[0]?.turnId||``).trim();if(!enabled.value||!conversationLogPath.value||!hasMoreBefore.value||loadingMore.value||!beforeTurnId){finish({changed:false,loaded:false});return false}loadingMore.value=true;loadMoreError.value=``;vibe64SessionDebugLog(`client.conversationLog.loadMore.start`,{beforeTurnId,sessionId:sessionId.value});try{const page=await httpClient.request(conversationLogPath.value,{method:`GET`,query:conversationLogReadQuery({beforeTurnId,limit:10})});const previousOldestTurnId=String(turns.value[0]?.turnId||``).trim();const previousMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);olderPages.value=[normalizeConversationLogPage(page),...olderPages.value];const nextOldestTurnId=String(turns.value[0]?.turnId||``).trim();const nextMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);const changed=Boolean(nextOldestTurnId&&(nextOldestTurnId!==previousOldestTurnId||nextMessageCount!==previousMessageCount));vibe64SessionDebugLog(`client.conversationLog.loadMore.done`,{beforeTurnId,sessionId:sessionId.value,turnCount:Array.isArray(page?.conversationLog)?page.conversationLog.length:0});finish({changed,loaded:true});return true}catch(error){loadMoreError.value=String(error?.message||error||`Older conversation history could not be loaded.`);vibe64SessionDebugLog(`client.conversationLog.loadMore.error`,{beforeTurnId,error:vibe64SessionDebugError(error),sessionId:sessionId.value});finish({changed:false,loaded:false});return false}finally{loadingMore.value=false}}const integrationActions=useConversationIntegrationActions({turns,enabled,sessionId,projectSlug,sessionsApiPath,reloadConversationLog,httpClient});watch([sessionId,projectSlug],()=>{conversationStream.value=null;olderPages.value=[];loadMoreError.value=``});return{...integrationActions,error:resource.loadError,hasMoreBefore,loadMore:loadMoreConversationLog,loadMoreError,loading:resource.isLoading,initializing:resource.isInitialLoading,loadingMore,reload:reloadConversationLog,realtime,turns,visible}}export{useVibe64ConversationLog as t};
|