vibe64 0.1.47 → 0.1.49

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.
Files changed (150) hide show
  1. package/bin/run.js +1734 -1687
  2. package/bin/server.js +75 -75
  3. package/bin/upgrade-state.js +4539 -4471
  4. package/dist/assets/GithubBrowserTabs-BwpiRS2u.js +1 -0
  5. package/dist/assets/{LocalDatabaseServer-6VzPWZxG.js → LocalDatabaseServer-u_Ky7bNS.js} +1 -1
  6. package/dist/assets/{Vibe64AuthSettingsButton-TLwqAxDo.js → Vibe64AuthSettingsButton-BCwswT1G.js} +1 -1
  7. package/dist/assets/{Vibe64DashboardShell-B4dQ-oHD.js → Vibe64DashboardShell-CWlgrR2B.js} +1 -1
  8. package/dist/assets/{Vibe64DatabaseWorkspace-Bh5WIPOj.js → Vibe64DatabaseWorkspace-Dhs8_H0P.js} +1 -1
  9. package/dist/assets/Vibe64OutputControls-Dn548CZa.js +8 -0
  10. package/dist/assets/{Vibe64RepositoryWorkspace-idDg94lc.js → Vibe64RepositoryWorkspace-C-8S4JUF.js} +1 -1
  11. package/dist/assets/{Vibe64SessionFiles-Z9zxosyl.js → Vibe64SessionFiles-Cx6J7DDN.js} +2 -3
  12. package/dist/assets/{Vibe64UiStoryboardView-CrCDWMdR.js → Vibe64UiStoryboardView-DHyhJiWS.js} +1 -1
  13. package/dist/assets/{Vibe64UnavailableSessions-TqsxvGSf.js → Vibe64UnavailableSessions-Da4RxIhA.js} +1 -1
  14. package/dist/assets/{_sessionId_-7F1VGOou.js → _sessionId_-DCpgDPSI.js} +1 -1
  15. package/dist/assets/_slug_-BbEWp01a.js +25 -0
  16. package/dist/assets/{_slug_-B16mTWjj.css → _slug_-DerKOisL.css} +1 -1
  17. package/dist/assets/{access-Cx9RH95J.js → access-D4di2sCr.js} +1 -1
  18. package/dist/assets/{app-DPx4KKOa.js → app-Adr9Iz8p.js} +1 -1
  19. package/dist/assets/asyncModuleRecovery-DJsn5NrL.js +1 -0
  20. package/dist/assets/{changes-DYsuQLFW.js → changes-3Dd1O8Lu.js} +1 -1
  21. package/dist/assets/client-BAXHGUOC.js +1 -0
  22. package/dist/assets/{client-BYsDPxR3.js → client-CCZIu6yc.js} +1 -1
  23. package/dist/assets/{conversation-3ln-WnbL.css → conversation-CSDHdGDb.css} +1 -1
  24. package/dist/assets/conversation-DG9lp25w.js +8 -0
  25. package/dist/assets/conversation-ErAO1CmH.js +13 -0
  26. package/dist/assets/{dashboard-CWswAbYP.js → dashboard-0tCzDYCX.js} +1 -1
  27. package/dist/assets/english-definitions-DeiQ-jTT.js +1 -0
  28. package/dist/assets/env-DsyQ2MFX.js +1 -0
  29. package/dist/assets/{health-C0f6s-G1.js → health-DyTXU-nb.js} +1 -1
  30. package/dist/assets/{history-BQjETNB9.js → history-BXGAdPMI.js} +1 -1
  31. package/dist/assets/{incoming-COpY201m.js → incoming-yajkdGBY.js} +1 -1
  32. package/dist/assets/{index-MWACm8Pp.css → index-B-dukXUB.css} +1 -1
  33. package/dist/assets/index-CGz4Yow6.js +136 -0
  34. package/dist/assets/{integrations-BBkvNRHu.js → integrations-BMrXET36.js} +10 -2
  35. package/dist/assets/issues-kc1XBZCK.js +1 -0
  36. package/dist/assets/{learning-B8_wHoe1.js → learning-CIE5ghYv.js} +1 -1
  37. package/dist/assets/linkPath-Ch9eft18.js +1 -0
  38. package/dist/assets/{placement-DXvgK433.js → placement-BNmlke_j.js} +1 -1
  39. package/dist/assets/placement-DYM3JJ-F.js +1 -0
  40. package/dist/assets/publish-DTh6amqi.js +3 -0
  41. package/dist/assets/pull-requests-CbfGSSIh.js +1 -0
  42. package/dist/assets/{repository-BNPt7UWc.js → repository-BstMh-bG.js} +1 -1
  43. package/dist/assets/settings-Bf8C6dls.js +1 -0
  44. package/dist/assets/{studioGateApi-BVdclhPL.js → studioGateApi-mkX1eOTX.js} +1 -1
  45. package/dist/assets/{studioUrls-CGKCbM_d.js → studioUrls-B0-GdWh8.js} +1 -1
  46. package/dist/assets/useArchivedVibe64Sessions-DIOpfUxD.js +1 -0
  47. package/dist/assets/useCommand-CVuya6vG.js +1 -0
  48. package/dist/assets/useEndpointResource-7-YDfAxX.js +1 -0
  49. package/dist/assets/usePaths-Y6UuQxmI.js +1 -0
  50. package/dist/assets/{useUiFeedback-B51xtCAK.js → useUiFeedback-Bd3rao6E.js} +1 -1
  51. package/dist/assets/useVibe64ConversationLog-ChJOU2SD.js +1 -0
  52. package/dist/assets/{useVibe64DatabaseTools-BE_yXZFn.js → useVibe64DatabaseTools-DKV-TeNJ.js} +1 -1
  53. package/dist/assets/{useVibe64ProjectScope-D7b8n1gx.js → useVibe64ProjectScope-DXjsKKhl.js} +1 -1
  54. package/dist/assets/useVibe64SessionData-BkIHUrP5.js +1 -0
  55. package/dist/assets/useVibe64SessionSelection-N8wX5oqo.js +1 -0
  56. package/dist/assets/{useVibe64SystemGraph-CDDcsye4.js → useVibe64SystemGraph-Db_eD-X8.js} +1 -1
  57. package/dist/assets/{useVibe64Terminal-Zr3Mig2L.js → useVibe64Terminal-B9EWJ9Ba.js} +2 -2
  58. package/dist/assets/vibe64ProjectScope.local-l5_-E6pq.js +1 -0
  59. package/dist/assets/vibe64RepositoryRealtime-CHT4-6VN.js +1 -0
  60. package/dist/assets/vibe64SessionFocus-CS6Ex53G.js +1 -0
  61. package/dist/assets/vibe64SessionFocus-CSm4YJQD.css +1 -0
  62. package/dist/assets/vibe64SessionRequestConfig-xIx-5jxQ.js +1 -0
  63. package/dist/index.html +26 -22
  64. package/docs/colleague-usage/ai-accounts.md +6 -2
  65. package/docs/colleague-usage/ai-balance-and-allowance.md +15 -2
  66. package/docs/colleague-usage/coding-agent-failures.md +2 -1
  67. package/docs/colleague-usage/coding-agent-goals.md +8 -3
  68. package/docs/colleague-usage/coding-agents.md +16 -0
  69. package/docs/colleague-usage/github-work.md +14 -0
  70. package/docs/colleague-usage/preview-browser-checks.md +5 -3
  71. package/docs/colleague-usage/project-setup.md +6 -3
  72. package/docs/colleague-usage/running-vibe64-on-your-computer.md +3 -1
  73. package/docs/colleague-usage/sessions.md +35 -7
  74. package/docs/colleague-usage/starter-apps.md +3 -0
  75. package/docs/colleague-usage/temporary-chat-context.md +2 -1
  76. package/docs/colleague-usage/temporary-chats.md +17 -5
  77. package/node_modules/@jskit-ai/assistant-core/CHANGELOG.md +539 -0
  78. package/node_modules/@jskit-ai/assistant-core/locales/en.json +383 -0
  79. package/node_modules/@jskit-ai/assistant-core/package.json +3 -2
  80. package/node_modules/@jskit-ai/assistant-runtime/CHANGELOG.md +138 -0
  81. package/node_modules/@jskit-ai/assistant-runtime/README.md +2 -1
  82. package/node_modules/@jskit-ai/assistant-runtime/locales/en.json +137 -0
  83. package/node_modules/@jskit-ai/assistant-runtime/package.json +3 -2
  84. package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/assistantConfigRepository.js +223 -203
  85. package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/conversationsRepository.js +286 -266
  86. package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/messagesRepository.js +270 -250
  87. package/node_modules/@jskit-ai/assistant-voice/locales/en.json +182 -0
  88. package/node_modules/@jskit-ai/assistant-voice/package.json +3 -2
  89. package/node_modules/@jskit-ai/connector-google-calendar/CHANGELOG.md +83 -0
  90. package/node_modules/@jskit-ai/connector-google-calendar/locales/en.json +91 -0
  91. package/node_modules/@jskit-ai/connector-google-calendar/package.json +4 -3
  92. package/node_modules/@jskit-ai/connectors-catalog/CHANGELOG.md +1722 -0
  93. package/node_modules/@jskit-ai/connectors-catalog/README.md +11 -0
  94. package/node_modules/@jskit-ai/connectors-catalog/locales/en.json +3139 -0
  95. package/node_modules/@jskit-ai/connectors-catalog/package.json +5 -4
  96. package/node_modules/@jskit-ai/connectors-core/CHANGELOG.md +183 -0
  97. package/node_modules/@jskit-ai/connectors-core/locales/en.json +92 -0
  98. package/node_modules/@jskit-ai/connectors-core/package.json +3 -2
  99. package/node_modules/@jskit-ai/http-runtime/CHANGELOG.md +31 -0
  100. package/node_modules/@jskit-ai/http-runtime/locales/en.json +14 -0
  101. package/node_modules/@jskit-ai/http-runtime/package.json +3 -2
  102. package/node_modules/@jskit-ai/kernel/CHANGELOG.md +182 -0
  103. package/node_modules/@jskit-ai/kernel/locales/en.json +94 -0
  104. package/node_modules/@jskit-ai/kernel/package.json +6 -2
  105. package/node_modules/@jskit-ai/payments-core/CHANGELOG.md +128 -0
  106. package/node_modules/@jskit-ai/payments-core/locales/en.json +77 -0
  107. package/node_modules/@jskit-ai/payments-core/package.json +3 -2
  108. package/node_modules/@jskit-ai/realtime/CHANGELOG.md +20 -0
  109. package/node_modules/@jskit-ai/realtime/locales/en.json +14 -0
  110. package/node_modules/@jskit-ai/realtime/package.json +3 -2
  111. package/node_modules/@jskit-ai/resource-core/package.json +1 -1
  112. package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
  113. package/node_modules/@jskit-ai/uploads-runtime/CHANGELOG.md +35 -0
  114. package/node_modules/@jskit-ai/uploads-runtime/locales/en.json +15 -0
  115. package/node_modules/@jskit-ai/uploads-runtime/package.json +3 -2
  116. package/node_modules/@local/vibe64-execution/src/host/execHelper.js +49 -48
  117. package/node_modules/@local/vibe64-execution/src/server/gitTurnCheckpointCommand.js +1327 -0
  118. package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +430 -390
  119. package/node_modules/@local/vibe64-genesis/src/server/index.js +45 -45
  120. package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +119 -119
  121. package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +57 -57
  122. package/node_modules/@local/vibe64-sessions/package.json +2 -1
  123. package/node_modules/@local/vibe64-terminals/src/server/opencodeSessionEnvironmentPlugin.js +195 -175
  124. package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1385 -1362
  125. package/package.json +15 -15
  126. package/server.bundle.mjs +44206 -42825
  127. package/dist/assets/GithubBrowserTabs-D-Z3TlA8.js +0 -1
  128. package/dist/assets/Vibe64OutputControls-DtybwgL3.js +0 -8
  129. package/dist/assets/_slug_-Bq84T_Iv.js +0 -24
  130. package/dist/assets/conversation-Bn7wpATa.js +0 -2
  131. package/dist/assets/conversation-CNcCrV-R.js +0 -16
  132. package/dist/assets/definitions-CEbi4qae.js +0 -1
  133. package/dist/assets/env-X7EOFLtl.js +0 -1
  134. package/dist/assets/index-CBo1BEk6.js +0 -138
  135. package/dist/assets/issues-BiSiUd5o.js +0 -1
  136. package/dist/assets/placement-B5T1LR7m.js +0 -1
  137. package/dist/assets/publish-CeLZE2AG.js +0 -3
  138. package/dist/assets/pull-requests-pTdQOT7i.js +0 -1
  139. package/dist/assets/settings-lecRzZ-r.js +0 -1
  140. package/dist/assets/useArchivedVibe64Sessions-DHYRnyJD.js +0 -1
  141. package/dist/assets/useCommand-Epd2yHhQ.js +0 -1
  142. package/dist/assets/useEndpointResource-DBRQISI_.js +0 -1
  143. package/dist/assets/usePaths-DdAnjVDj.js +0 -1
  144. package/dist/assets/useVibe64ConversationLog-DboM3tYN.js +0 -1
  145. package/dist/assets/useVibe64SessionData-CreWtQAO.js +0 -1
  146. package/dist/assets/useVibe64SessionSelection-CDaX4uwY.js +0 -1
  147. package/dist/assets/vibe64ProjectScope.local-BxTBYuRg.js +0 -1
  148. package/dist/assets/vibe64RepositoryRealtime-C-J0I5jY.js +0 -1
  149. package/dist/assets/vibe64SessionFocus-DSW5Irm6.css +0 -1
  150. package/dist/assets/vibe64SessionFocus-DzqbVq60.js +0 -1
@@ -0,0 +1 @@
1
+ import{D as createVNode,E as createTextVNode,Ht as watch,On as unref,Pt as useId,St as resolveComponent,_ as createBaseVNode,b as createElementBlock,bt as renderList,et as mergeProps,g as computed,gn as reactive,mt as openBlock,o as Fragment,qt as withCtx,tr as toDisplayString,tt as nextTick,un as isRef,v as createBlock,vn as ref,xn as shallowRef,xt as renderSlot,y as createCommentVNode}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{_ as VIcon,cr as withKeys,lr as withModifiers,t as VAvatar}from"./VAvatar-H2hyOWlB.js";import{t as useEndpointResource,tt as useQueryClient}from"./useEndpointResource-7-YDfAxX.js";import{_ as useRouter,g as useRoute}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{o as projectSlugFromRoute,r as projectAppPath}from"./vibe64ProjectScope.local-l5_-E6pq.js";import{t as VOverlay}from"./VOverlay-Bi97WKy3.js";import{c as VListItemTitle,l as VListItemSubtitle,n as VList,s as VListItem}from"./VMenu-DnhVIMrr.js";import{t as VChip}from"./VChip-Uixfx461.js";import{g as VCheckboxBtn,t as VTextField}from"./VTextField-CnkGeXaT.js";import{r as scopedDevelopmentApiUrl}from"./studioUrls-B0-GdWh8.js";import{C as mdiArrowRight,Jn as mdiPlus,L as mdiCheck,Rn as mdiOpenInNew,Un as mdiPencilOutline,X as mdiClose,Zn as mdiRecordCircleOutline,er as mdiRefresh,kn as mdiMagnify,on as mdiLabelOutline,ot as mdiCommentOutline,rr as mdiRestore}from"./mdi-X9prU-DG.js";import{i as VBtnToggle,t as VBtn}from"./VBtn-Sj5jAuOx.js";import{t as VAlert}from"./VAlert-7_VM9EUm.js";import{t as VAutocomplete}from"./VAutocomplete-Ck14ZtUL.js";import{t as VDivider}from"./VDivider-AUQb_N9d.js";import{t as VSheet}from"./VSheet-CMhyReNa.js";import{t as VDialog}from"./VDialog-Drp3yzSH.js";import{i as VCardTitle,n as VCardText,o as VCardActions,t as VCard}from"./VCard-DExT9Cji.js";import{t as VSpacer}from"./VSpacer-BSTt0_VA.js";import{t as VSkeletonLoader}from"./VSkeletonLoader-pc4bBTxv.js";import{t as VTextarea}from"./VTextarea-wqoRFl1K.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{t as useUiFeedback}from"./useUiFeedback-Bd3rao6E.js";import{n as vibe64RealtimeOriginPayload}from"./vibe64BrowserTabOrigin-SF9E31vi.js";import{_ as GithubMarkdown_default}from"./index-CGz4Yow6.js";import{t as Vibe64DashboardBackButton_default}from"./Vibe64DashboardBackButton-CE9ig_nO.js";import{a as githubProjectRepositoryName,i as githubProjectAvailable,n as githubIssueLabelsPath,o as invalidateGithubIssueQueries,r as githubIssueMentionsPath,t as GITHUB_BODY_MAX_LENGTH}from"./vibe64GithubProject-Bct-bzKq.js";import{t as _sfc_main$8}from"./GithubBrowserTabs-BwpiRS2u.js";var drafts=reactive(new Map);var submittedComments=reactive(new Map);function useVibe64Issues(context){const route=useRoute();const router=useRouter();const queryClient=useQueryClient();const feedback=useUiFeedback({source:`vibe64.issues`});const projectSlug=computed(()=>projectSlugFromRoute(route));const repository=computed(()=>githubProjectRepositoryName(context.value.projectContext));const available=computed(()=>githubProjectAvailable(context.value.projectContext));const active=computed(()=>available.value&&context.value.active!==false);const basePath=computed(()=>scopedDevelopmentApiUrl(`/api/vibe64/issues`,projectSlug.value));const state=computed(()=>[`open`,`closed`,`all`].includes(route.query.issueState)?route.query.issueState:`open`);const search=computed(()=>typeof route.query.issueSearch===`string`?route.query.issueSearch:``);const searchDraft=ref(search.value);watch(search,value=>{searchDraft.value=value});const selectedLabels=computed(()=>{const labels=route.query.issueLabel;return(Array.isArray(labels)?labels:[labels]).filter(label=>typeof label===`string`&&label.trim())});const number=computed(()=>/^\d+$/u.test(String(route.query.issue||``))?String(route.query.issue):``);const commentCursor=ref(``);watch([basePath,number],()=>{commentCursor.value=``});const listQuery=computed(()=>({state:state.value,search:search.value,labels:selectedLabels.value,...route.query.issueCursor?{cursor:route.query.issueCursor}:{}}));const listKey=computed(()=>[`vibe64.issues`,basePath.value,listQuery.value]);const list=useEndpointResource({path:basePath,readQuery:listQuery,queryKey:listKey,enabled:computed(()=>active.value&&!number.value),queryOptions:{retry:false},requestRecoveryLabel:`GitHub issues`,fallbackLoadError:`Issues could not load.`});const labelsPath=computed(()=>githubIssueLabelsPath(basePath.value));const labelCatalog=useEndpointResource({path:labelsPath,queryKey:computed(()=>[`vibe64.issueLabels`,labelsPath.value]),enabled:computed(()=>active.value&&!number.value),queryOptions:{retry:false},fallbackLoadError:`Labels could not load.`});const detailPath=computed(()=>`${basePath.value}/${number.value}`);const detail=useEndpointResource({path:detailPath,readQuery:computed(()=>commentCursor.value?{cursor:commentCursor.value}:{}),queryKey:computed(()=>[`vibe64.issue`,detailPath.value,commentCursor.value]),enabled:computed(()=>active.value&&Boolean(number.value)),queryOptions:{retry:false},requestRecoveryLabel:`GitHub issue`,fallbackLoadError:`This issue could not load.`});const issue=computed(()=>detail.data.value?.issue||null);const draft=computed({get:()=>drafts.get(detailPath.value)||``,set:value=>value?drafts.set(detailPath.value,value):drafts.delete(detailPath.value)});const stateRequestPath=ref(``);const localComments=computed(()=>submittedComments.get(detailPath.value)||[]);const savedComments=computed(()=>issue.value?.comments?.nodes||[]);const savedCommentIds=computed(()=>new Set(savedComments.value.map(comment=>comment.id)));const comments=computed(()=>[...savedComments.value,...localComments.value.filter(comment=>!savedCommentIds.value.has(comment.id)&&(comment.delivery!==`sent`||!commentCursor.value))]);const commentCount=computed(()=>(issue.value?.comments?.totalCount||0)+comments.value.length-savedComments.value.length);const pending=computed(()=>{if(stateRequestPath.value===detailPath.value)return`state`;return localComments.value.some(comment=>comment.delivery===`sending`)?`comment`:``});watch([detail.data,detailPath,commentCursor],()=>{if(commentCursor.value||issue.value?.number!==Number(number.value))return;const remaining=localComments.value.filter(comment=>comment.delivery!==`sent`||!savedCommentIds.value.has(comment.id));if(remaining.length)submittedComments.set(detailPath.value,remaining);else submittedComments.delete(detailPath.value)},{immediate:true});function navigate(changes){return router.push({query:{...route.query,...changes}})}function filter(nextState=state.value,nextLabels=selectedLabels.value){return navigate({issueState:nextState,issueSearch:String(searchDraft.value||``).trim()||void 0,issueLabel:nextLabels?.length?nextLabels:void 0,issueCursor:void 0,issue:void 0})}function filterLabel(label){searchDraft.value=`label:${/[\s"\\]/u.test(label)?JSON.stringify(label):label}`;return filter(state.value,[])}function issueUpdated({number:issueNumber,basePath:requestBasePath}){return invalidateGithubIssueQueries(queryClient,requestBasePath,`${requestBasePath}/${issueNumber}`)}async function issueSaved({number:issueNumber,basePath:requestBasePath}){await issueUpdated({number:issueNumber,basePath:requestBasePath});if(basePath.value===requestBasePath)await navigate({issue:String(issueNumber)})}async function mutate(kind){if(pending.value||issue.value?.number!==Number(number.value)||!active.value)return;const requestBasePath=basePath.value;const requestPath=detailPath.value;if(kind===`comment`){const submitted=draft.value;if(!submitted.trim()||submitted.length>65536)return;const comment=reactive({id:crypto.randomUUID(),body:submitted,createdAt:new Date().toISOString(),author:{login:`You`},delivery:`sending`,error:``});submittedComments.set(requestPath,[...localComments.value,comment]);drafts.delete(requestPath);commentCursor.value=``;return sendComment(comment,requestBasePath,requestPath)}stateRequestPath.value=requestPath;try{await detail.save({state:issue.value.state===`OPEN`?`closed`:`open`},{path:requestPath,method:`PATCH`});if(detailPath.value===requestPath)commentCursor.value=``;feedback.success(`Issue updated.`);await invalidateGithubIssueQueries(queryClient,requestBasePath,requestPath)}catch(error){feedback.error(error,`Issue could not be updated.`)}finally{stateRequestPath.value=``}}async function sendComment(comment,requestBasePath,requestPath){comment.delivery=`sending`;comment.error=``;try{const result=await detail.save(vibe64RealtimeOriginPayload({body:comment.body}),{path:`${requestPath}/comments`,method:`POST`});Object.assign(comment,result.comment,{delivery:`sent`})}catch(error){comment.delivery=`failed`;feedback.error(error,`Comment could not be confirmed. Refresh before posting again.`);comment.error=feedback.message.value;return}feedback.success(`Comment added.`);try{await invalidateGithubIssueQueries(queryClient,requestBasePath,requestPath)}catch(error){feedback.error(error,`Comment added, but the conversation could not refresh.`)}}function retryComment(id){const comment=localComments.value.find(entry=>entry.id===id);if(pending.value||!active.value||comment?.delivery!==`failed`)return;commentCursor.value=``;return sendComment(comment,basePath.value,detailPath.value)}return{available,repository,projectSlug,basePath,list,detail,labelCatalog,issue,number,state,searchDraft,selectedLabels,draft,pending,comments,commentCount,commentCursor,navigate,filter,filterLabel,mutate,issueSaved,issueUpdated,retryComment}}var _hoisted_1$6={class:`github-label-name`};var _sfc_main$7={__name:`GithubLabelChip`,props:{label:{type:Object,required:true}},setup(__props){const props=__props;const color=computed(()=>/^[a-f\d]{6}$/iu.test(props.label.color||``)?`#${props.label.color}`:void 0);return(_ctx,_cache)=>{return openBlock(),createBlock(VChip,{color:color.value,title:__props.label.description||__props.label.name,"aria-label":__props.label.name,variant:`flat`,size:`small`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_1$6,toDisplayString(__props.label.name),1)]),_:1},8,[`color`,`title`,`aria-label`])}}};var GithubLabelChip_default=_plugin_vue_export_helper_default(_sfc_main$7,[[`__scopeId`,`data-v-9814070c`]]);var _hoisted_1$5={class:`d-flex align-center justify-space-between ga-3 pa-5 pb-2`};var _hoisted_2$4={class:`new-label__colours`};var _hoisted_3$3={class:`new-label__palette`};var _hoisted_4$2={class:`d-flex align-start ga-3`};var _hoisted_5$2=[`value`,`disabled`];var defaultColor=`0075ca`;var _sfc_main$6={__name:`GithubNewLabelButton`,props:{basePath:{type:String,required:true},labels:{type:Array,required:true},disabled:Boolean},emits:[`created`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const palette=[{name:`Red`,color:`d73a4a`},{name:`Orange`,color:`e9963a`},{name:`Yellow`,color:`f9d65c`},{name:`Green`,color:`4c956c`},{name:`Teal`,color:`008672`},{name:`Blue`,color:`0075ca`},{name:`Purple`,color:`8957e5`},{name:`Pink`,color:`db61a2`}];const open=ref(false);const name=ref(``);const color=ref(defaultColor);const pending=ref(false);const trimmedName=computed(()=>name.value.trim());const normalizedColor=computed(()=>color.value.trim().replace(/^#/u,``).toLowerCase());const validColor=computed(()=>/^[a-f\d]{6}$/u.test(normalizedColor.value));const nameError=computed(()=>{if(/\p{Cc}/u.test(name.value)||trimmedName.value.length>50)return`Use up to 50 characters, on one line.`;return props.labels.some(label=>label.name.toLowerCase()===trimmedName.value.toLowerCase())?`A label with this name already exists.`:``});const preview=computed(()=>({name:trimmedName.value||`Your label`,color:validColor.value?normalizedColor.value:defaultColor}));const canSubmit=computed(()=>!props.disabled&&!pending.value&&Boolean(trimmedName.value)&&!nameError.value&&validColor.value);const labelsPath=computed(()=>githubIssueLabelsPath(props.basePath));const resource=useEndpointResource({path:labelsPath,enabled:false,queryKey:computed(()=>[`vibe64.newLabel`,labelsPath.value])});const queryClient=useQueryClient();const feedback=useUiFeedback({source:`vibe64.issues.newLabel`});watch(open,value=>{if(!value)return;name.value=``;color.value=defaultColor});watch(()=>props.basePath,()=>{open.value=false});async function submit(){if(!canSubmit.value)return;const requestPath=labelsPath.value;pending.value=true;let result;try{result=await resource.save({name:trimmedName.value,color:normalizedColor.value},{path:requestPath,method:`POST`})}catch(error){feedback.error(error,`Label could not be created. Your choices have been kept.`);pending.value=false;return}const queryKey=[`vibe64.issueLabels`,requestPath];await queryClient.cancelQueries({queryKey});queryClient.setQueryData(queryKey,catalog=>{if(!catalog)return catalog;const createdName=result.label.name.toLowerCase();const labels=catalog.labels.filter(label=>label.name.toLowerCase()!==createdName);labels.push(result.label);labels.sort((a,b)=>a.name.localeCompare(b.name));return{...catalog,labels}});feedback.success(`Label created.`);if(requestPath===labelsPath.value){open.value=false;emit(`created`,result.label)}pending.value=false}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VBtn,{"prepend-icon":unref(mdiPlus),color:`primary`,variant:`text`,height:`48`,disabled:__props.disabled||pending.value,onClick:_cache[0]||(_cache[0]=$event=>open.value=true)},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`New label`,-1)])]),_:1},8,[`prepend-icon`,`disabled`]),createVNode(VDialog,{modelValue:open.value,"onUpdate:modelValue":_cache[6]||(_cache[6]=$event=>open.value=$event),"max-width":`30rem`,scrollable:``,persistent:pending.value,"aria-label":`New label`},{default:withCtx(()=>[createVNode(VCard,{tag:`form`,rounded:`xl`,onSubmit:withModifiers(submit,[`prevent`,`stop`])},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$5,[_cache[8]||(_cache[8]=createBaseVNode(`h2`,{class:`text-title-large`},`New label`,-1)),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,size:`48`,"aria-label":`Close new label`,disabled:pending.value,onClick:_cache[1]||(_cache[1]=$event=>open.value=false)},null,8,[`icon`,`disabled`])]),createVNode(VCardText,{class:`d-flex flex-column ga-4`},{default:withCtx(()=>[createVNode(VSheet,{color:`surface-light`,rounded:`lg`,class:`pa-4 d-flex flex-column align-center ga-2`},{default:withCtx(()=>[_cache[9]||(_cache[9]=createBaseVNode(`span`,{class:`text-label-small text-medium-emphasis`},`Preview`,-1)),createVNode(GithubLabelChip_default,{label:preview.value,class:`new-label__preview`},null,8,[`label`])]),_:1}),createVNode(VTextField,{modelValue:name.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>name.value=$event),label:`Label name`,placeholder:`e.g. Ready for review`,variant:`outlined`,maxlength:`50`,autofocus:``,disabled:pending.value,"error-messages":nameError.value,"hide-details":`auto`},null,8,[`modelValue`,`disabled`,`error-messages`]),createBaseVNode(`fieldset`,_hoisted_2$4,[_cache[10]||(_cache[10]=createBaseVNode(`legend`,{class:`text-label-large mb-2`},`Colour`,-1)),createBaseVNode(`div`,_hoisted_3$3,[(openBlock(),createElementBlock(Fragment,null,renderList(palette,swatch=>{return createVNode(VBtn,{key:swatch.color,color:`#${swatch.color}`,variant:`flat`,icon:``,size:`48`,"aria-label":swatch.name,"aria-pressed":normalizedColor.value===swatch.color,disabled:pending.value,onClick:$event=>color.value=swatch.color},{default:withCtx(()=>[normalizedColor.value===swatch.color?(openBlock(),createBlock(VIcon,{key:0,icon:unref(mdiCheck)},null,8,[`icon`])):createCommentVNode(``,true)]),_:2},1032,[`color`,`aria-label`,`aria-pressed`,`disabled`,`onClick`])}),64))])]),createBaseVNode(`div`,_hoisted_4$2,[createBaseVNode(`input`,{type:`color`,value:`#${preview.value.color}`,class:`new-label__custom`,"aria-label":`Custom colour`,title:`Choose a custom colour`,disabled:pending.value,onInput:_cache[3]||(_cache[3]=$event=>color.value=$event.target.value.slice(1))},null,40,_hoisted_5$2),createVNode(VTextField,{modelValue:color.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>color.value=$event),label:`Hex colour`,prefix:`#`,variant:`outlined`,density:`compact`,maxlength:`7`,disabled:pending.value,"error-messages":validColor.value?[]:`Use six characters: 0–9 or A–F.`,"hide-details":`auto`,autocomplete:`off`,spellcheck:`false`},null,8,[`modelValue`,`disabled`,`error-messages`])]),_cache[11]||(_cache[11]=createBaseVNode(`p`,{class:`text-body-small text-medium-emphasis ma-0`},`Available to all issues in this repository.`,-1))]),_:1}),createVNode(VCardActions,{class:`pa-5 pt-2`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value,onClick:_cache[5]||(_cache[5]=$event=>open.value=false)},{default:withCtx(()=>[..._cache[12]||(_cache[12]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{type:`submit`,color:`primary`,variant:`flat`,rounded:`pill`,height:`48`,disabled:!canSubmit.value,"aria-busy":pending.value},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?`Creating…`:`Create label`),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`])],64)}}};var GithubNewLabelButton_default=_plugin_vue_export_helper_default(_sfc_main$6,[[`__scopeId`,`data-v-82e5afdc`]]);var _hoisted_1$4={key:1,class:`text-body-medium pa-3 ma-0`,role:`status`};var _hoisted_2$3={key:2,class:`pa-3 text-body-small`,role:`status`};var _sfc_main$5=Object.assign({inheritAttrs:false},{__name:`GithubMentionTextarea`,props:{modelValue:{type:String,default:``},basePath:{type:String,required:true},issue:{type:Object,default:null},enabled:{type:Boolean,default:true},disabled:Boolean},emits:[`update:modelValue`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const field=ref(null);const mention=ref(null);const selected=ref(0);const listId=`github-mentions-${useId()}`;const path=computed(()=>githubIssueMentionsPath(props.basePath));const number=computed(()=>props.issue?.number||null);const catalog=useEndpointResource({path,readQuery:computed(()=>number.value?{number:number.value}:{}),queryKey:computed(()=>[`vibe64.issueMentions`,path.value,number.value]),enabled:computed(()=>props.enabled),queryOptions:{retry:false,staleTime:6e4},requestRecovery:false,fallbackLoadError:`Mention suggestions could not load. You can still type any @username.`});const people=computed(()=>{const users=new Map;for(const user of[props.issue?.author,...(props.issue?.comments?.nodes||[]).map(comment=>comment.author),...catalog.data.value?.users||[]])if(user?.login)users.set(user.login.toLowerCase(),user);return[...users.values()]});const suggestions=computed(()=>{const query=mention.value?.query.toLowerCase()||``;return people.value.filter(user=>user.login.toLowerCase().includes(query)||user.name?.toLowerCase().includes(query)).sort((a,b)=>{const aStartsWithQuery=a.login.toLowerCase().startsWith(query);const bStartsWithQuery=b.login.toLowerCase().startsWith(query);return Number(bStartsWithQuery)-Number(aStartsWithQuery)||a.login.localeCompare(b.login)}).slice(0,8)});const open=computed(()=>Boolean(mention.value)&&props.enabled&&!props.disabled);const warning=computed(()=>catalog.loadError.value||catalog.data.value?.warning||``);watch([path,number,()=>props.enabled,()=>props.disabled],()=>{mention.value=null});watch(suggestions,()=>{selected.value=0});function updateMention(event){const input=event.target;if(input.tagName!==`TEXTAREA`)return;if(event.isComposing||input.selectionStart!==input.selectionEnd){mention.value=null;return}const end=input.selectionStart;const match=input.value.slice(0,end).match(/(?:^|[\s([{])@([a-z\d-]*)$/iu);mention.value=match?{start:end-match[1].length-1,end,query:match[1]}:null}async function choose(user){if(!mention.value||!user||props.disabled)return;const input=field.value?.$el.querySelector(`textarea`);if(!input)return;const{start,end}=mention.value;const after=input.value.slice(end).replace(/^[a-z\d-]*/iu,``);const insertion=`@${user.login}${/^\s/u.test(after)?``:` `}`;const value=input.value.slice(0,start)+insertion+after;if(input.maxLength>=0&&value.length>input.maxLength)return;const caret=start+insertion.length+(after.startsWith(` `)?1:0);emit(`update:modelValue`,value);mention.value=null;await nextTick();input.focus();input.setSelectionRange(caret,caret)}async function onKeydown(event){if(!open.value||event.isComposing||event.keyCode===229)return;const moveSelection=suggestions.value.length>0&&[`ArrowDown`,`ArrowUp`].includes(event.key);const acceptSelection=suggestions.value.length>0&&(event.key===`Enter`||event.key===`Tab`&&!event.shiftKey);if(event.key!==`Escape`&&!moveSelection&&!acceptSelection)return;event.preventDefault();event.stopPropagation();if(event.key===`Escape`)mention.value=null;else if(moveSelection){selected.value=(selected.value+(event.key===`ArrowDown`?1:-1)+suggestions.value.length)%suggestions.value.length;await nextTick();document.getElementById(`${listId}-${selected.value}`)?.scrollIntoView({block:`nearest`})}else await choose(suggestions.value[selected.value])}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VTextarea,mergeProps({ref_key:`field`,ref:field},_ctx.$attrs,{"model-value":__props.modelValue,disabled:__props.disabled,hint:`Markdown supported · Type @ to mention someone`,"persistent-hint":``,"aria-autocomplete":`list`,"aria-expanded":open.value,"aria-controls":open.value?listId:void 0,"aria-activedescendant":open.value&&suggestions.value.length?`${listId}-${selected.value}`:void 0,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>emit(`update:modelValue`,$event)),onInput:updateMention,onClick:updateMention,onFocus:updateMention,onSelect:updateMention,onCompositionstart:_cache[1]||(_cache[1]=$event=>mention.value=null),onCompositionend:updateMention,onBlur:_cache[2]||(_cache[2]=$event=>mention.value=null),onKeydown,onKeyup:_cache[3]||(_cache[3]=$event=>[`ArrowLeft`,`ArrowRight`,`Home`,`End`].includes($event.key)&&updateMention($event))}),null,16,[`model-value`,`disabled`,`aria-expanded`,`aria-controls`,`aria-activedescendant`]),createVNode(VOverlay,{"model-value":open.value,target:field.value?.$el,"location-strategy":`connected`,location:`top start`,origin:`bottom start`,"scroll-strategy":`reposition`,scrim:false,"close-on-back":false,"capture-focus":false,"retain-focus":false,width:`360`,"max-width":`calc(100vw - 32px)`,"onUpdate:modelValue":_cache[7]||(_cache[7]=$event=>!$event&&(mention.value=null))},{default:withCtx(()=>[createVNode(VSheet,{rounded:`lg`,border:``,elevation:`3`,class:`overflow-y-auto`,"max-height":`320`},{default:withCtx(()=>[createVNode(VList,{id:listId,role:`listbox`,"aria-label":`Mention suggestions`,density:`compact`,class:`pa-1`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(suggestions.value,(user,index)=>{return openBlock(),createBlock(VListItem,{id:`${listId}-${index}`,key:user.login,tag:`button`,type:`button`,role:`option`,tabindex:`-1`,"aria-selected":index===selected.value,active:index===selected.value,title:`@${user.login}`,subtitle:user.name||void 0,"min-height":`48`,class:`w-100 text-left`,onPointerdown:_cache[4]||(_cache[4]=withModifiers(()=>{},[`prevent`])),onClick:$event=>choose(user)},null,8,[`id`,`aria-selected`,`active`,`title`,`subtitle`,`onClick`])}),128))]),_:1}),unref(catalog).isInitialLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`list-item`,height:`48`,"aria-label":`Loading mention suggestions`,"aria-busy":`true`})):!suggestions.value.length&&!warning.value?(openBlock(),createElementBlock(`p`,_hoisted_1$4,`No matching people`)):createCommentVNode(``,true),warning.value?(openBlock(),createElementBlock(`div`,_hoisted_2$3,[createTextVNode(toDisplayString(warning.value)+` `,1),createVNode(VBtn,{variant:`text`,height:`48`,disabled:unref(catalog).isFetching.value,onPointerdown:_cache[5]||(_cache[5]=withModifiers(()=>{},[`prevent`])),onClick:_cache[6]||(_cache[6]=$event=>unref(catalog).reload())},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`disabled`])])):createCommentVNode(``,true)]),_:1})]),_:1},8,[`model-value`,`target`])],64)}}});var _hoisted_1$3={class:`d-flex align-center justify-space-between ga-3 pa-5 pb-2`};var _hoisted_2$2={class:`d-flex align-center ga-3`};var _hoisted_3$2={class:`text-title-large`};var _hoisted_4$1={key:0,class:`text-body-medium ma-0`};var _hoisted_5$1={class:`d-flex flex-wrap justify-space-between ga-2`};var _sfc_main$4={__name:`GithubIssueEditorDialog`,props:{modelValue:Boolean,basePath:{type:String,required:true},issue:{type:Object,default:null},mode:{type:String,default:`create`}},emits:[`update:modelValue`,`saved`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const editing=computed(()=>props.mode!==`create`);const editingLabels=computed(()=>props.mode===`labels`);const heading=computed(()=>editingLabels.value?`Edit labels`:editing.value?`Edit issue`:`New issue`);const title=ref(``);const body=ref(``);const selectedLabels=ref([]);const pending=ref(false);const feedback=useUiFeedback({source:`vibe64.issues.editor`});const labelsPath=computed(()=>githubIssueLabelsPath(props.basePath));const catalog=useEndpointResource({path:labelsPath,queryKey:computed(()=>[`vibe64.issueLabels`,labelsPath.value]),enabled:computed(()=>props.modelValue&&props.mode!==`content`),queryOptions:{retry:false},fallbackLoadError:`Labels could not load.`});const labels=computed(()=>catalog.data.value?.labels||[]);const canSetLabels=computed(()=>{const permission=editing.value?`canEditLabels`:`canCreateWithLabels`;return catalog.data.value?.[permission]===true});const path=computed(()=>editing.value?`${props.basePath}/${props.issue.number}${editingLabels.value?`/labels`:``}`:props.basePath);const resource=useEndpointResource({path,queryKey:computed(()=>[`vibe64.issueEditor`,path.value]),enabled:false});const canSubmit=computed(()=>{if(pending.value||selectedLabels.value.length>100)return false;return editingLabels.value?canSetLabels.value:Boolean(title.value.trim())&&(!editing.value||props.issue.viewerCanUpdate)});const submitLabel=computed(()=>{if(pending.value)return editing.value?`Saving…`:`Creating…`;if(editingLabels.value)return`Save labels`;return editing.value?`Save issue`:`Create issue`});watch(()=>props.modelValue,open=>{if(!open)return;title.value=props.issue?.title||``;body.value=props.issue?.body||``;selectedLabels.value=props.issue?.labels?.nodes?.map(label=>label.name)||[]},{immediate:true});async function submit(){if(!canSubmit.value)return;const wasEditing=editing.value;const requestBasePath=props.basePath;pending.value=true;try{const payload=editingLabels.value?{labels:selectedLabels.value}:{title:title.value.trim(),body:body.value,...!wasEditing?{labels:selectedLabels.value}:{}};const result=await resource.save(payload,{method:wasEditing?`PUT`:`POST`});feedback.success(wasEditing?`Issue updated.`:`Issue created.`);emit(`saved`,{number:result.issue.number,basePath:requestBasePath});emit(`update:modelValue`,false)}catch(error){feedback.error(error,wasEditing?`Issue could not be updated. Your changes have been kept.`:`Issue creation could not be confirmed. Refresh the issue list before trying again.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"model-value":__props.modelValue,"max-width":`42rem`,scrollable:``,persistent:pending.value,"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>emit(`update:modelValue`,$event))},{default:withCtx(()=>[createVNode(VCard,{tag:`form`,rounded:`xl`,onSubmit:withModifiers(submit,[`prevent`])},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$3,[createBaseVNode(`div`,_hoisted_2$2,[createVNode(VIcon,{icon:editingLabels.value?unref(mdiLabelOutline):editing.value?unref(mdiPencilOutline):unref(mdiPlus),color:`primary`},null,8,[`icon`]),createBaseVNode(`h2`,_hoisted_3$2,toDisplayString(heading.value),1)]),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,size:`48`,"aria-label":`Close issue dialog`,disabled:pending.value,onClick:_cache[0]||(_cache[0]=$event=>emit(`update:modelValue`,false))},null,8,[`icon`,`disabled`])]),createVNode(VCardText,{class:`d-flex flex-column ga-4`},{default:withCtx(()=>[editingLabels.value?(openBlock(),createElementBlock(`p`,_hoisted_4$1,`#`+toDisplayString(__props.issue.number)+` · `+toDisplayString(__props.issue.title),1)):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(VTextField,{modelValue:title.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>title.value=$event),label:`Title`,variant:`outlined`,maxlength:`256`,disabled:pending.value,"hide-details":``,autofocus:``},null,8,[`modelValue`,`disabled`]),createVNode(_sfc_main$5,{modelValue:body.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>body.value=$event),label:`Description`,placeholder:`What needs to happen?`,variant:`outlined`,rows:`5`,"auto-grow":``,maxlength:unref(GITHUB_BODY_MAX_LENGTH),"base-path":__props.basePath,issue:__props.issue,enabled:__props.modelValue,disabled:pending.value},null,8,[`modelValue`,`maxlength`,`base-path`,`issue`,`enabled`,`disabled`])],64)),__props.mode!==`content`?(openBlock(),createElementBlock(Fragment,{key:2},[unref(catalog).isInitialLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`list-item-two-line,button`,"min-height":`152`,"aria-label":`Loading labels`,"aria-busy":`true`})):unref(catalog).loadError.value?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,onClick:_cache[3]||(_cache[3]=$event=>unref(catalog).reload())},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Retry`,-1)])]),_:1})]),default:withCtx(()=>[createTextVNode(toDisplayString(unref(catalog).loadError.value)+` `,1)]),_:1})):(openBlock(),createElementBlock(Fragment,{key:2},[createVNode(VAutocomplete,{modelValue:selectedLabels.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>selectedLabels.value=$event),items:labels.value,"item-title":`name`,"item-value":`name`,multiple:``,chips:``,"closable-chips":``,label:`Labels`,variant:`outlined`,disabled:pending.value||!canSetLabels.value,"menu-props":{maxHeight:320},"error-messages":selectedLabels.value.length>100?`Choose up to 100 labels.`:[],hint:canSetLabels.value?`Search and select repository labels.`:editing.value?`Your GitHub account cannot edit labels.`:`GitHub requires write access to set labels on a new issue.`,"persistent-hint":``,"no-data-text":`No matching labels`},{chip:withCtx(({props:chipProps,item})=>[createVNode(GithubLabelChip_default,mergeProps(chipProps,{label:item}),null,16,[`label`])]),item:withCtx(({props:itemProps,item})=>[createVNode(VListItem,mergeProps(itemProps,{"min-height":`48`}),{title:withCtx(()=>[createVNode(GithubLabelChip_default,{label:item},null,8,[`label`])]),subtitle:withCtx(()=>[createTextVNode(toDisplayString(item.description),1)]),_:2},1040)]),_:1},8,[`modelValue`,`items`,`disabled`,`error-messages`,`hint`]),createBaseVNode(`div`,_hoisted_5$1,[unref(catalog).data.value?.canCreateLabels?(openBlock(),createBlock(GithubNewLabelButton_default,{key:0,"base-path":__props.basePath,labels:labels.value,disabled:pending.value,onCreated:_cache[5]||(_cache[5]=$event=>selectedLabels.value=[...selectedLabels.value,$event.name])},null,8,[`base-path`,`labels`,`disabled`])):createCommentVNode(``,true),createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value||unref(catalog).isFetching.value,onClick:_cache[6]||(_cache[6]=$event=>unref(catalog).reload())},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Refresh labels`,-1)])]),_:1},8,[`disabled`])])],64))],64)):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`pa-5 pt-2`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value,onClick:_cache[7]||(_cache[7]=$event=>emit(`update:modelValue`,false))},{default:withCtx(()=>[..._cache[11]||(_cache[11]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{type:`submit`,color:`primary`,variant:`flat`,rounded:`pill`,height:`48`,disabled:!canSubmit.value,"aria-busy":pending.value},{default:withCtx(()=>[createTextVNode(toDisplayString(submitLabel.value),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])}}};var _hoisted_1$2={class:`d-flex flex-wrap justify-end ga-2`};var _sfc_main$3={__name:`GithubCommentEditor`,props:{comment:{type:Object,required:true},issue:{type:Object,required:true},basePath:{type:String,required:true}},emits:[`saved`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const editing=ref(false);const body=ref(``);const pending=ref(false);const feedback=useUiFeedback({source:`vibe64.issues.commentEditor`});const path=computed(()=>`${props.basePath}/${props.issue.number}/comments/${encodeURIComponent(props.comment.id)}`);const resource=useEndpointResource({path,enabled:false});const canSubmit=computed(()=>!pending.value&&Boolean(body.value.trim())&&body.value.length<=65536);function edit(){body.value=props.comment.body;editing.value=true}async function submit(){if(!canSubmit.value)return;const savedIssue={number:props.issue.number,basePath:props.basePath};pending.value=true;try{await resource.save({body:body.value},{method:`PATCH`});editing.value=false;feedback.success(`Comment updated.`);emit(`saved`,savedIssue)}catch(error){feedback.error(error,`Comment could not be updated. Your changes have been kept.`)}finally{pending.value=false}}return(_ctx,_cache)=>{return editing.value?(openBlock(),createElementBlock(`form`,{key:0,class:`d-flex flex-column ga-2`,onSubmit:withModifiers(submit,[`prevent`])},[createVNode(_sfc_main$5,{modelValue:body.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>body.value=$event),label:`Edit comment`,"base-path":__props.basePath,issue:__props.issue,disabled:pending.value,enabled:editing.value,variant:`outlined`,rows:`4`,"auto-grow":``,maxlength:unref(GITHUB_BODY_MAX_LENGTH)},null,8,[`modelValue`,`base-path`,`issue`,`disabled`,`enabled`,`maxlength`]),createBaseVNode(`div`,_hoisted_1$2,[createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value,onClick:_cache[1]||(_cache[1]=$event=>editing.value=false)},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{type:`submit`,color:`primary`,variant:`flat`,height:`48`,disabled:!canSubmit.value},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?`Saving…`:`Save comment`),1)]),_:1},8,[`disabled`])])],32)):(openBlock(),createElementBlock(Fragment,{key:1},[renderSlot(_ctx.$slots,`default`),__props.comment.viewerCanUpdate?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,onClick:edit},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Edit comment`,-1)])]),_:1})):createCommentVNode(``,true)],64))}}};var _hoisted_1$1={class:`text-body-medium ma-0`};var _hoisted_2$1={key:0,class:`d-flex justify-start`};var _hoisted_3$1={key:1,role:`status`};var _sfc_main$2={__name:`GithubBulkLabelsDialog`,props:{modelValue:Boolean,basePath:{type:String,required:true},numbers:{type:Array,required:true},labels:{type:Array,required:true},canCreateLabels:Boolean},emits:[`update:modelValue`,`applied`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const labelMode=ref(`add`);const selectedLabels=ref([]);const remaining=ref([]);const failures=ref([]);const pending=ref(false);const progress=ref(``);const feedback=useUiFeedback({source:`vibe64.issues.bulkLabels`});const queryClient=useQueryClient();const resource=useEndpointResource({path:computed(()=>props.basePath),enabled:false});const canSubmit=computed(()=>!pending.value&&selectedLabels.value.length>0&&selectedLabels.value.length<=100&&remaining.value.length>0);watch(()=>props.modelValue,open=>{if(!open)return;remaining.value=[...props.numbers];selectedLabels.value=[];labelMode.value=`add`;failures.value=[]},{immediate:true});async function submit(){if(!canSubmit.value)return;const requestBasePath=props.basePath;const numbers=[...remaining.value];const payload={labels:[...selectedLabels.value],labelMode:labelMode.value};failures.value=[];pending.value=true;for(const[index,number]of numbers.entries()){progress.value=`Updating ${index+1} of ${numbers.length}…`;const issuePath=`${requestBasePath}/${number}`;try{await resource.save(payload,{path:`${issuePath}/labels`,method:`PUT`})}catch(error){feedback.error(error,`Labels could not be updated for #${number}.`);failures.value.push({number,message:feedback.message.value});continue}remaining.value=remaining.value.filter(value=>value!==number);emit(`applied`,{number,basePath:requestBasePath});try{await invalidateGithubIssueQueries(queryClient,requestBasePath,issuePath)}catch(error){feedback.error(error,`Labels updated for #${number}, but the issue could not refresh.`)}}pending.value=false;if(!remaining.value.length){feedback.success(`Labels updated for ${numbers.length} ${numbers.length===1?`issue`:`issues`}.`);emit(`update:modelValue`,false)}}return(_ctx,_cache)=>{return openBlock(),createBlock(VDialog,{"model-value":__props.modelValue,"max-width":`36rem`,scrollable:``,persistent:pending.value,"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>emit(`update:modelValue`,$event))},{default:withCtx(()=>[createVNode(VCard,{tag:`form`,rounded:`xl`,onSubmit:withModifiers(submit,[`prevent`])},{default:withCtx(()=>[createVNode(VCardTitle,{class:`pa-5 pb-2`},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Bulk edit labels`,-1)])]),_:1}),createVNode(VCardText,{class:`d-flex flex-column ga-4`},{default:withCtx(()=>[createBaseVNode(`p`,_hoisted_1$1,toDisplayString(remaining.value.length)+` selected. Other labels will stay unchanged.`,1),createVNode(VBtnToggle,{modelValue:labelMode.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>labelMode.value=$event),mandatory:``,divided:``,rounded:`pill`,disabled:pending.value,"aria-label":`Label action`},{default:withCtx(()=>[createVNode(VBtn,{value:`add`,height:`48`},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Add labels`,-1)])]),_:1}),createVNode(VBtn,{value:`remove`,height:`48`},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Remove labels`,-1)])]),_:1})]),_:1},8,[`modelValue`,`disabled`]),createVNode(VAutocomplete,{modelValue:selectedLabels.value,"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>selectedLabels.value=$event),items:__props.labels,"item-title":`name`,"item-value":`name`,multiple:``,chips:``,"closable-chips":``,label:`Labels to change`,variant:`outlined`,disabled:pending.value,"menu-props":{maxHeight:320},"error-messages":selectedLabels.value.length>100?`Choose up to 100 labels.`:[],"no-data-text":`No matching labels`},{chip:withCtx(({props:chipProps,item})=>[createVNode(GithubLabelChip_default,mergeProps(chipProps,{label:item}),null,16,[`label`])]),item:withCtx(({props:itemProps,item})=>[createVNode(VListItem,mergeProps(itemProps,{"min-height":`48`}),{title:withCtx(()=>[createVNode(GithubLabelChip_default,{label:item},null,8,[`label`])]),_:2},1040)]),_:1},8,[`modelValue`,`items`,`disabled`,`error-messages`]),__props.canCreateLabels&&labelMode.value===`add`?(openBlock(),createElementBlock(`div`,_hoisted_2$1,[createVNode(GithubNewLabelButton_default,{"base-path":__props.basePath,labels:__props.labels,disabled:pending.value,onCreated:_cache[2]||(_cache[2]=$event=>selectedLabels.value=[...selectedLabels.value,$event.name])},null,8,[`base-path`,`labels`,`disabled`])])):createCommentVNode(``,true),failures.value.length?(openBlock(),createElementBlock(`div`,_hoisted_3$1,[_cache[8]||(_cache[8]=createBaseVNode(`p`,{class:`text-body-medium`},`Some issues could not be updated. Retry applies only to these issues:`,-1)),(openBlock(true),createElementBlock(Fragment,null,renderList(failures.value,failure=>{return openBlock(),createElementBlock(`p`,{key:failure.number,class:`text-body-small text-error`},`#`+toDisplayString(failure.number)+`: `+toDisplayString(failure.message),1)}),128))])):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`pa-5 pt-2 d-flex flex-wrap`},{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,height:`48`,disabled:pending.value,onClick:_cache[3]||(_cache[3]=$event=>emit(`update:modelValue`,false))},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{type:`submit`,color:`primary`,variant:`flat`,height:`48`,disabled:!canSubmit.value},{default:withCtx(()=>[createTextVNode(toDisplayString(pending.value?progress.value:failures.value.length?`Retry failed issues`:`Apply labels`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])}}};var _hoisted_1={class:`issues-panel d-flex flex-column ga-2`};var _hoisted_2={class:`issues-panel__toolbar d-flex flex-wrap align-center ga-2`};var _hoisted_3={class:`issues-panel__labels d-flex flex-wrap align-start ga-2`};var _hoisted_4={key:3,class:`d-flex justify-end`};var _hoisted_5={key:0,class:`text-body-small text-medium-emphasis ma-0`};var _hoisted_6={class:`d-flex align-center justify-space-between px-2 text-label-large text-medium-emphasis`};var _hoisted_7={key:1,class:`d-flex flex-wrap align-center ga-2`};var _hoisted_8={class:`text-label-large`,role:`status`};var _hoisted_9={class:`d-flex align-center`};var _hoisted_10={class:`d-flex flex-wrap align-center ga-1`};var _hoisted_11={key:0,class:`text-label-small`};var _hoisted_12=[`aria-label`];var _hoisted_13={class:`d-flex justify-space-between ga-2`};var _hoisted_14={class:`d-flex align-center flex-wrap ga-2 mb-3`};var _hoisted_15={class:`text-label-large text-medium-emphasis`};var _hoisted_16={class:`text-title-large mb-2 issues-panel__title`};var _hoisted_17={class:`text-body-small text-medium-emphasis mb-0`};var _hoisted_18={class:`d-flex align-center flex-wrap ga-2 mt-3`};var _hoisted_19={key:0,class:`text-body-small text-medium-emphasis`};var _hoisted_20={key:1,class:`text-body-medium text-medium-emphasis ma-0`};var _hoisted_21={class:`d-flex align-center justify-space-between flex-wrap ga-2 px-2`};var _hoisted_22={class:`text-title-medium`};var _hoisted_23={class:`text-medium-emphasis`};var _hoisted_24={class:`d-flex flex-wrap ga-2`};var _hoisted_25={key:1,class:`text-body-medium text-medium-emphasis px-2`};var _hoisted_26={class:`issues-panel__comment-body`};var _hoisted_27={class:`d-flex flex-wrap align-center ga-2 mb-2`};var _hoisted_28={class:`text-label-large`};var _hoisted_29=[`datetime`];var _hoisted_30={key:0,class:`d-flex flex-wrap align-center ga-2 mt-1`,"aria-live":`polite`};var _hoisted_31={key:0,class:`text-body-small text-medium-emphasis`};var _hoisted_32={class:`text-body-small text-error`};var _hoisted_33={key:0,class:`text-body-small text-medium-emphasis ma-0`};var _hoisted_34={class:`d-flex flex-wrap align-center justify-space-between ga-3`};var _sfc_main$1={__name:`GithubIssuesPanel`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){const props=__props;const{available,projectSlug,basePath,list,detail,labelCatalog,issue,number,state,searchDraft,selectedLabels,draft,pending,comments,commentCount,commentCursor,navigate,filter,filterLabel,mutate,issueSaved,issueUpdated,retryComment}=useVibe64Issues(computed(()=>props.dashboardContext));const route=useRoute();const bulkOpen=ref(false);const selectedNumbers=ref([]);const visibleNumbers=computed(()=>(list.data.value?.issues||[]).map(item=>item.number));const allSelected=computed(()=>visibleNumbers.value.length>0&&visibleNumbers.value.every(value=>selectedNumbers.value.includes(value)));watch(()=>[basePath.value,number.value,route.query.issueSearch,route.query.issueState,route.query.issueCursor,route.query.issueLabel],()=>{selectedNumbers.value=[];bulkOpen.value=false},{deep:true});function labelsApplied({number:issueNumber,basePath:requestBasePath}){if(basePath.value===requestBasePath)selectedNumbers.value=selectedNumbers.value.filter(value=>value!==issueNumber)}const editorOpen=ref(false);const editorMode=ref(`create`);const editorIssue=shallowRef(null);watch([basePath,number],()=>{editorOpen.value=false;editorIssue.value=null;editorMode.value=`create`});function openEditor(selectedIssue=null,mode=`create`){editorMode.value=mode;editorIssue.value=selectedIssue;editorOpen.value=true}const resource=computed(()=>number.value?detail:list);const canChangeState=computed(()=>issue.value?.state===`OPEN`?issue.value.viewerCanClose:issue.value?.viewerCanReopen);function date(value){return value?new Date(value).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`}):``}return(_ctx,_cache)=>{const _component_router_link=resolveComponent(`router-link`);return openBlock(),createElementBlock(`section`,_hoisted_1,[createBaseVNode(`div`,_hoisted_2,[createVNode(Vibe64DashboardBackButton_default,{to:unref(available)&&unref(number)?void 0:unref(projectAppPath)(unref(projectSlug),`/dashboard/env`),onClick:_cache[0]||(_cache[0]=$event=>unref(available)&&unref(number)&&unref(navigate)({issue:void 0}))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(available)&&unref(number)?`All issues`:`Back to dashboard`),1)]),_:1},8,[`to`]),createVNode(VSpacer),unref(available)?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiRefresh),variant:`text`,size:`small`,height:`48`,disabled:resource.value.isFetching.value||Boolean(unref(pending)),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),unref(available)?(openBlock(),createBlock(VBtn,{key:1,"prepend-icon":unref(mdiPlus),color:`primary`,variant:`tonal`,rounded:`pill`,size:`small`,height:`48`,onClick:_cache[2]||(_cache[2]=$event=>openEditor())},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`New issue`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true)]),!unref(available)?(openBlock(),createBlock(VAlert,{key:0,variant:`tonal`,type:`info`},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`Issues are available only for GitHub projects.`,-1)])]),_:1})):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(_sfc_main$8),!unref(number)?(openBlock(),createElementBlock(Fragment,{key:0},[createBaseVNode(`form`,{class:`d-flex flex-wrap align-center ga-3`,onSubmit:_cache[8]||(_cache[8]=withModifiers($event=>unref(filter)(),[`prevent`]))},[createVNode(VBtnToggle,{"model-value":unref(state),mandatory:``,divided:``,rounded:`pill`,color:`primary`,variant:`outlined`,"aria-label":`Issue state`,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>unref(filter)($event))},{default:withCtx(()=>[createVNode(VBtn,{value:`open`,height:`48`},{default:withCtx(()=>[..._cache[30]||(_cache[30]=[createTextVNode(`Open`,-1)])]),_:1}),createVNode(VBtn,{value:`closed`,height:`48`},{default:withCtx(()=>[..._cache[31]||(_cache[31]=[createTextVNode(`Closed`,-1)])]),_:1}),createVNode(VBtn,{value:`all`,height:`48`},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`All`,-1)])]),_:1})]),_:1},8,[`model-value`]),createVNode(VTextField,{modelValue:unref(searchDraft),"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>isRef(searchDraft)?searchDraft.value=$event:null),class:`issues-panel__search`,label:`Search issues`,placeholder:`Number, text, label:new or label:"some label"`,"prepend-inner-icon":unref(mdiMagnify),variant:`outlined`,rounded:`pill`,"hide-details":``,maxlength:`200`,clearable:``,onKeydown:_cache[6]||(_cache[6]=withKeys(withModifiers($event=>unref(filter)(),[`prevent`]),[`enter`])),"onClick:clear":_cache[7]||(_cache[7]=$event=>{searchDraft.value=``;unref(filter)()})},{"append-inner":withCtx(()=>[createVNode(VBtn,{icon:unref(mdiArrowRight),variant:`text`,size:`48`,"aria-label":`Search issues`,onClick:_cache[4]||(_cache[4]=$event=>unref(filter)())},null,8,[`icon`])]),_:1},8,[`modelValue`,`prepend-inner-icon`])],32),createBaseVNode(`div`,_hoisted_3,[unref(labelCatalog).isInitialLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:0,class:`issues-panel__label-filter`,type:`list-item`,height:`80`,"aria-label":`Loading label filters`,"aria-busy":`true`})):unref(labelCatalog).loadError.value?(openBlock(),createBlock(VAlert,{key:1,class:`issues-panel__label-filter`,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,onClick:_cache[9]||(_cache[9]=$event=>unref(labelCatalog).reload())},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`Retry labels`,-1)])]),_:1})]),default:withCtx(()=>[createTextVNode(toDisplayString(unref(labelCatalog).loadError.value)+` `,1)]),_:1})):(openBlock(),createBlock(VAutocomplete,{key:2,"model-value":unref(selectedLabels),items:unref(labelCatalog).data.value?.labels||[],class:`issues-panel__label-filter`,"item-title":`name`,"item-value":`name`,multiple:``,chips:``,"closable-chips":``,clearable:``,label:`Filter by labels`,"prepend-inner-icon":unref(mdiLabelOutline),variant:`outlined`,rounded:`lg`,"menu-props":{maxHeight:320},hint:`Match all selected labels.`,"persistent-hint":``,"no-data-text":`No matching labels`,"onUpdate:modelValue":_cache[10]||(_cache[10]=$event=>unref(filter)(unref(state),$event))},{chip:withCtx(({props:chipProps,item})=>[createVNode(GithubLabelChip_default,mergeProps(chipProps,{label:item}),null,16,[`label`])]),item:withCtx(({props:itemProps,item})=>[createVNode(VListItem,mergeProps(itemProps,{"min-height":`48`}),{title:withCtx(()=>[createVNode(GithubLabelChip_default,{label:item},null,8,[`label`])]),subtitle:withCtx(()=>[createTextVNode(toDisplayString(item.description),1)]),_:2},1040)]),_:1},8,[`model-value`,`items`,`prepend-inner-icon`])),unref(labelCatalog).data.value?.canCreateLabels?(openBlock(),createElementBlock(`div`,_hoisted_4,[createVNode(GithubNewLabelButton_default,{"base-path":unref(basePath),labels:unref(labelCatalog).data.value.labels},null,8,[`base-path`,`labels`])])):createCommentVNode(``,true)])],64)):createCommentVNode(``,true),resource.value.isInitialLoading.value?(openBlock(),createBlock(VSheet,{key:1,rounded:`xl`,border:``,class:`pa-4`,"aria-label":`Loading issues`,"aria-busy":`true`},{default:withCtx(()=>[(openBlock(),createElementBlock(Fragment,null,renderList(4,index=>{return createVNode(VSkeletonLoader,{key:index,type:unref(number)?`paragraph`:`list-item-two-line`},null,8,[`type`])}),64))]),_:1})):resource.value.loadError.value&&(!unref(number)||!unref(issue))?(openBlock(),createBlock(VAlert,{key:2,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,disabled:resource.value.isFetching.value,onClick:_cache[11]||(_cache[11]=$event=>resource.value.reload())},{default:withCtx(()=>[..._cache[34]||(_cache[34]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`disabled`])]),default:withCtx(()=>[createTextVNode(toDisplayString(resource.value.loadError.value)+` `,1)]),_:1})):!unref(number)?(openBlock(),createElementBlock(Fragment,{key:3},[unref(list).data.value?.searchLimit&&unref(list).data.value.total>unref(list).data.value.searchLimit?(openBlock(),createElementBlock(`p`,_hoisted_5,` GitHub returns up to 1,000 matches for text searches or multiple labels. Narrow the filters to see more specific results. `)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_6,[createBaseVNode(`span`,null,toDisplayString(unref(list).data.value?.total||0)+` `+toDisplayString(unref(list).data.value?.total===1?`issue`:`issues`),1),_cache[35]||(_cache[35]=createBaseVNode(`span`,null,`Recently updated`,-1))]),unref(labelCatalog).data.value?.canEditLabels&&visibleNumbers.value.length?(openBlock(),createElementBlock(`div`,_hoisted_7,[createVNode(VCheckboxBtn,{"model-value":allSelected.value,indeterminate:selectedNumbers.value.length>0&&!allSelected.value,label:`Select all on this page`,class:`issues-panel__select-all`,"min-height":`48`,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>selectedNumbers.value=$event?[...visibleNumbers.value]:[])},null,8,[`model-value`,`indeterminate`]),createBaseVNode(`span`,_hoisted_8,toDisplayString(selectedNumbers.value.length)+` selected`,1),createVNode(VBtn,{variant:`tonal`,height:`48`,disabled:!selectedNumbers.value.length,onClick:_cache[13]||(_cache[13]=$event=>bulkOpen.value=true)},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(`Bulk edit labels`,-1)])]),_:1},8,[`disabled`]),selectedNumbers.value.length?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,onClick:_cache[14]||(_cache[14]=$event=>selectedNumbers.value=[])},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Clear selection`,-1)])]),_:1})):createCommentVNode(``,true)])):createCommentVNode(``,true),unref(list).data.value?.issues?.length?(openBlock(),createBlock(VList,{key:2,class:`pa-0`,density:`compact`,lines:`two`,rounded:`xl`,border:``,slim:``,"aria-label":`GitHub issues`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(list).data.value.issues,(item,index)=>{return openBlock(),createElementBlock(Fragment,{key:item.number},[index?(openBlock(),createBlock(VDivider,{key:0})):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_9,[unref(labelCatalog).data.value?.canEditLabels?(openBlock(),createBlock(VCheckboxBtn,{key:0,modelValue:selectedNumbers.value,"onUpdate:modelValue":_cache[15]||(_cache[15]=$event=>selectedNumbers.value=$event),value:item.number,"aria-label":`Select issue #${item.number}`,class:`flex-grow-0 ml-2`,"min-width":`48`,"min-height":`48`},null,8,[`modelValue`,`value`,`aria-label`])):createCommentVNode(``,true),createVNode(VListItem,{class:`py-2 flex-grow-1`,active:false},{prepend:withCtx(()=>[createVNode(VIcon,{icon:item.state===`OPEN`?unref(mdiRecordCircleOutline):unref(mdiCheck),color:item.state===`OPEN`?`success`:`primary`,"aria-label":item.state===`OPEN`?`Open`:`Closed`},null,8,[`icon`,`color`,`aria-label`])]),append:withCtx(()=>[createBaseVNode(`span`,{class:`d-flex align-center ga-1 ml-3 text-label-medium text-medium-emphasis`,"aria-label":`${item.comments.totalCount} comments`},[createVNode(VIcon,{icon:unref(mdiCommentOutline),size:`18`},null,8,[`icon`]),createTextVNode(toDisplayString(item.comments.totalCount),1)],8,_hoisted_12)]),default:withCtx(()=>[createBaseVNode(`div`,_hoisted_10,[createVNode(VListItemTitle,{class:`issues-panel__item-title text-title-medium text-wrap`},{default:withCtx(()=>[createVNode(_component_router_link,{class:`issues-panel__issue-link text-decoration-none`,to:{query:{..._ctx.$route.query,issue:String(item.number)}}},{default:withCtx(()=>[createTextVNode(toDisplayString(item.title),1)]),_:2},1032,[`to`])]),_:2},1024),(openBlock(true),createElementBlock(Fragment,null,renderList(item.labels?.nodes||[],label=>{return openBlock(),createBlock(GithubLabelChip_default,{key:label.name,label,tag:`button`,type:`button`,"aria-label":`Filter by label ${label.name}`,onClick:$event=>unref(filterLabel)(label.name)},null,8,[`label`,`aria-label`,`onClick`])}),128)),item.labels?.totalCount>item.labels?.nodes?.length?(openBlock(),createElementBlock(`span`,_hoisted_11,`+`+toDisplayString(item.labels.totalCount-item.labels.nodes.length),1)):createCommentVNode(``,true)]),createVNode(VListItemSubtitle,{class:`text-body-small mt-1`},{default:withCtx(()=>[createTextVNode(` #`+toDisplayString(item.number)+` · `+toDisplayString(item.state===`OPEN`?`Open`:`Closed`)+` · `+toDisplayString(date(item.updatedAt)),1)]),_:2},1024)]),_:2},1024)])],64)}),128))]),_:1})):(openBlock(),createBlock(VSheet,{key:3,rounded:`xl`,color:`surface-light`,class:`pa-8 text-center`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiRecordCircleOutline),size:`40`,class:`mb-3`},null,8,[`icon`]),_cache[38]||(_cache[38]=createBaseVNode(`p`,{class:`text-title-medium mb-1`},`No issues here`,-1)),_cache[39]||(_cache[39]=createBaseVNode(`p`,{class:`text-body-medium text-medium-emphasis ma-0`},`Try a different filter or search.`,-1))]),_:1})),createBaseVNode(`div`,_hoisted_13,[_ctx.$route.query.issueCursor?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,height:`48`,onClick:_cache[16]||(_cache[16]=$event=>unref(navigate)({issueCursor:void 0}))},{default:withCtx(()=>[..._cache[40]||(_cache[40]=[createTextVNode(`First page`,-1)])]),_:1})):createCommentVNode(``,true),createVNode(VSpacer),unref(list).data.value?.pageInfo?.hasNextPage?(openBlock(),createBlock(VBtn,{key:1,variant:`tonal`,height:`48`,"append-icon":unref(mdiArrowRight),onClick:_cache[17]||(_cache[17]=$event=>unref(navigate)({issueCursor:unref(list).data.value.pageInfo.endCursor}))},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(` Next page `,-1)])]),_:1},8,[`append-icon`])):createCommentVNode(``,true)])],64)):unref(issue)?(openBlock(),createElementBlock(Fragment,{key:4},[unref(detail).loadError.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,rounded:`lg`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,height:`48`,disabled:unref(detail).isFetching.value,onClick:_cache[18]||(_cache[18]=$event=>unref(detail).reload())},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(`Refresh`,-1)])]),_:1},8,[`disabled`])]),default:withCtx(()=>[createTextVNode(toDisplayString(unref(detail).loadError.value)+` `,1)]),_:1})):createCommentVNode(``,true),createBaseVNode(`div`,null,[createBaseVNode(`div`,_hoisted_14,[createVNode(VChip,{"prepend-icon":unref(issue).state===`OPEN`?unref(mdiRecordCircleOutline):unref(mdiCheck),color:unref(issue).state===`OPEN`?`success`:`primary`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(issue).state===`OPEN`?`Open`:`Closed`),1)]),_:1},8,[`prepend-icon`,`color`]),createBaseVNode(`span`,_hoisted_15,`#`+toDisplayString(unref(issue).number),1),createVNode(VSpacer),unref(issue).viewerCanUpdate?(openBlock(),createBlock(VBtn,{key:0,"prepend-icon":unref(mdiPencilOutline),variant:`text`,height:`48`,onClick:_cache[19]||(_cache[19]=$event=>openEditor(unref(issue),`content`))},{default:withCtx(()=>[..._cache[43]||(_cache[43]=[createTextVNode(`Edit issue`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true),createVNode(VBtn,{href:unref(issue).url,target:`_blank`,rel:`noopener noreferrer`,"append-icon":unref(mdiOpenInNew),variant:`text`,height:`48`},{default:withCtx(()=>[..._cache[44]||(_cache[44]=[createTextVNode(`GitHub`,-1)])]),_:1},8,[`href`,`append-icon`])]),createBaseVNode(`h2`,_hoisted_16,toDisplayString(unref(issue).title),1),createBaseVNode(`p`,_hoisted_17,toDisplayString(unref(issue).author?.login||`Deleted user`)+` opened this on `+toDisplayString(date(unref(issue).createdAt)),1),createBaseVNode(`div`,_hoisted_18,[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(issue).labels?.nodes||[],label=>{return openBlock(),createBlock(GithubLabelChip_default,{key:label.name,label,tag:`button`,type:`button`,"aria-label":`Filter by label ${label.name}`,onClick:$event=>unref(filterLabel)(label.name)},null,8,[`label`,`aria-label`,`onClick`])}),128)),!unref(issue).labels?.nodes?.length?(openBlock(),createElementBlock(`span`,_hoisted_19,`No labels`)):createCommentVNode(``,true),unref(issue).canEditLabels?(openBlock(),createBlock(VBtn,{key:1,"prepend-icon":unref(mdiLabelOutline),variant:`text`,height:`48`,onClick:_cache[20]||(_cache[20]=$event=>openEditor(unref(issue),`labels`))},{default:withCtx(()=>[..._cache[45]||(_cache[45]=[createTextVNode(`Edit labels`,-1)])]),_:1},8,[`prepend-icon`])):createCommentVNode(``,true)])]),createVNode(VSheet,{border:``,rounded:`xl`,class:`pa-5 issues-panel__markdown`},{default:withCtx(()=>[unref(issue).body||unref(issue).bodyHTML?(openBlock(),createBlock(GithubMarkdown_default,{key:0,text:unref(issue).body,html:unref(issue).bodyHTML},null,8,[`text`,`html`])):(openBlock(),createElementBlock(`p`,_hoisted_20,`No description provided.`))]),_:1}),createBaseVNode(`div`,_hoisted_21,[createBaseVNode(`h3`,_hoisted_22,[_cache[46]||(_cache[46]=createTextVNode(`Comments `,-1)),createBaseVNode(`span`,_hoisted_23,toDisplayString(unref(commentCount)),1)]),createBaseVNode(`div`,_hoisted_24,[unref(commentCursor)?(openBlock(),createBlock(VBtn,{key:0,height:`48`,variant:`text`,onClick:_cache[21]||(_cache[21]=$event=>commentCursor.value=``)},{default:withCtx(()=>[..._cache[47]||(_cache[47]=[createTextVNode(`Latest comments`,-1)])]),_:1})):createCommentVNode(``,true),unref(issue).comments.pageInfo.hasPreviousPage?(openBlock(),createBlock(VBtn,{key:1,height:`48`,variant:`text`,onClick:_cache[22]||(_cache[22]=$event=>commentCursor.value=unref(issue).comments.pageInfo.startCursor)},{default:withCtx(()=>[..._cache[48]||(_cache[48]=[createTextVNode(` Older comments `,-1)])]),_:1})):createCommentVNode(``,true)])]),!unref(comments).length?(openBlock(),createElementBlock(`p`,_hoisted_25,`No comments yet. Start the conversation.`)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(unref(comments),comment=>{return openBlock(),createElementBlock(`article`,{key:comment.id,class:`issues-panel__comment d-flex ga-3`},[createVNode(VAvatar,{color:`primary`,variant:`tonal`,size:`36`,class:`mt-1 text-label-large`,"aria-hidden":`true`},{default:withCtx(()=>[createTextVNode(toDisplayString((comment.author?.login||`?`).slice(0,1).toUpperCase()),1)]),_:2},1024),createBaseVNode(`div`,_hoisted_26,[createBaseVNode(`div`,_hoisted_27,[createBaseVNode(`span`,_hoisted_28,toDisplayString(comment.author?.login||`Deleted user`),1),createBaseVNode(`time`,{class:`text-body-small text-medium-emphasis`,datetime:comment.createdAt},toDisplayString(date(comment.createdAt)),9,_hoisted_29)]),(openBlock(),createBlock(_sfc_main$3,{key:`${unref(basePath)}:${unref(issue).number}:${comment.id}`,comment,issue:unref(issue),"base-path":unref(basePath),onSaved:unref(issueUpdated)},{default:withCtx(()=>[createVNode(VSheet,{color:`surface-light`,rounded:`xl`,class:`pa-4 issues-panel__markdown`},{default:withCtx(()=>[createVNode(GithubMarkdown_default,{text:comment.body,html:comment.bodyHTML},null,8,[`text`,`html`])]),_:2},1024)]),_:2},1032,[`comment`,`issue`,`base-path`,`onSaved`])),comment.delivery&&comment.delivery!==`sent`?(openBlock(),createElementBlock(`div`,_hoisted_30,[comment.delivery===`sending`?(openBlock(),createElementBlock(`span`,_hoisted_31,`Posting…`)):(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`span`,_hoisted_32,toDisplayString(comment.error),1),createVNode(VBtn,{variant:`text`,height:`48`,disabled:Boolean(unref(pending)),onClick:$event=>unref(retryComment)(comment.id)},{default:withCtx(()=>[..._cache[49]||(_cache[49]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`disabled`,`onClick`])],64))])):createCommentVNode(``,true)])])}),128)),createVNode(VDivider),createBaseVNode(`form`,{class:`d-flex flex-column ga-3`,onSubmit:_cache[25]||(_cache[25]=withModifiers($event=>unref(mutate)(`comment`),[`prevent`]))},[unref(issue).locked?(openBlock(),createElementBlock(`p`,_hoisted_33,`This conversation is locked. GitHub limits comments to permitted collaborators.`)):createCommentVNode(``,true),createVNode(_sfc_main$5,{modelValue:unref(draft),"onUpdate:modelValue":_cache[23]||(_cache[23]=$event=>isRef(draft)?draft.value=$event:null),label:`Add a comment`,placeholder:`Share an update or ask a question…`,variant:`outlined`,rounded:`lg`,rows:`4`,"auto-grow":``,counter:unref(draft).length>65e3?unref(GITHUB_BODY_MAX_LENGTH):void 0,"error-messages":unref(draft).length>unref(65536)?`Keep your comment under 65,536 characters.`:[],"base-path":unref(basePath),issue:unref(issue),enabled:__props.dashboardContext.active!==false},null,8,[`modelValue`,`counter`,`error-messages`,`base-path`,`issue`,`enabled`]),createBaseVNode(`div`,_hoisted_34,[createVNode(VBtn,{variant:`tonal`,height:`48`,"prepend-icon":unref(issue).state===`OPEN`?unref(mdiCheck):unref(mdiRestore),disabled:!canChangeState.value||Boolean(unref(pending)),title:canChangeState.value?``:`Your GitHub account cannot change this issue’s state.`,onClick:_cache[24]||(_cache[24]=$event=>unref(mutate)(`state`))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(pending)===`state`?`Updating…`:unref(issue).state===`OPEN`?`Close issue`:`Reopen issue`),1)]),_:1},8,[`prepend-icon`,`disabled`,`title`]),createVNode(VBtn,{type:`submit`,color:`primary`,variant:`flat`,rounded:`pill`,height:`48`,disabled:!unref(draft).trim()||unref(draft).length>unref(65536)||Boolean(unref(pending))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(pending)===`comment`?`Posting…`:`Comment`),1)]),_:1},8,[`disabled`])])],32)],64)):createCommentVNode(``,true)],64)),unref(available)?(openBlock(),createBlock(_sfc_main$2,{key:unref(basePath),modelValue:bulkOpen.value,"onUpdate:modelValue":_cache[26]||(_cache[26]=$event=>bulkOpen.value=$event),"base-path":unref(basePath),numbers:selectedNumbers.value,labels:unref(labelCatalog).data.value?.labels||[],"can-create-labels":unref(labelCatalog).data.value?.canCreateLabels===true,onApplied:labelsApplied},null,8,[`modelValue`,`base-path`,`numbers`,`labels`,`can-create-labels`])):createCommentVNode(``,true),unref(available)?(openBlock(),createBlock(_sfc_main$4,{key:3,modelValue:editorOpen.value,"onUpdate:modelValue":_cache[27]||(_cache[27]=$event=>editorOpen.value=$event),"base-path":unref(basePath),issue:editorIssue.value,mode:editorMode.value,onSaved:unref(issueSaved)},null,8,[`modelValue`,`base-path`,`issue`,`mode`,`onSaved`])):createCommentVNode(``,true)])}}};var GithubIssuesPanel_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-b5746745`]]);var _sfc_main={__name:`index`,props:{dashboardContext:{type:Object,default:()=>({})}},setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(GithubIssuesPanel_default,{"dashboard-context":__props.dashboardContext},null,8,[`dashboard-context`])}}};export{_sfc_main as default};
@@ -1 +1 @@
1
- import{mt as openBlock,v as createBlock}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{t as _slug__default}from"./_slug_-Bq84T_Iv.js";import{t as route_block_default}from"./route-block-DbL-SuOj.js";var _sfc_main={__name:`learning`,setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(_slug__default)}}};if(typeof route_block_default===`function`)route_block_default(_sfc_main);export{_sfc_main as default};
1
+ import{mt as openBlock,v as createBlock}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{t as _slug__default}from"./_slug_-BbEWp01a.js";import{t as route_block_default}from"./route-block-DbL-SuOj.js";var _sfc_main={__name:`learning`,setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(_slug__default)}}};if(typeof route_block_default===`function`)route_block_default(_sfc_main);export{_sfc_main as default};
@@ -0,0 +1 @@
1
+ import{r as normalizePathname}from"./returnToPath-gKtcu91D.js";var EXTERNAL_LINK_PATTERN=/^[A-Za-z][A-Za-z0-9+.-]*:/;function isExternalLinkTarget(target=``){const normalizedTarget=String(target||``).trim();if(!normalizedTarget)return false;if(normalizedTarget.startsWith(`//`))return true;return EXTERNAL_LINK_PATTERN.test(normalizedTarget)}function splitPathQueryHash(target=``){const normalizedTarget=String(target||``).trim();if(!normalizedTarget)return Object.freeze({pathname:``,search:``,hash:``});const hashIndex=normalizedTarget.indexOf(`#`);const beforeHash=hashIndex>=0?normalizedTarget.slice(0,hashIndex):normalizedTarget;const hash=hashIndex>=0?normalizedTarget.slice(hashIndex):``;const queryIndex=beforeHash.indexOf(`?`);const pathname=queryIndex>=0?beforeHash.slice(0,queryIndex):beforeHash;const search=queryIndex>=0?beforeHash.slice(queryIndex):``;return Object.freeze({pathname,search,hash})}function resolveLinkPath(basePath=`/`,relativePath=`/`){const normalizedRelativePath=String(relativePath||``).trim();if(isExternalLinkTarget(normalizedRelativePath))return normalizedRelativePath;const normalizedBasePath=normalizePathname(basePath||`/`);if(!normalizedRelativePath)return normalizedBasePath;const{pathname,search,hash}=splitPathQueryHash(normalizedRelativePath);if(!pathname)return`${normalizedBasePath}${search}${hash}`;const normalizedPathname=normalizePathname(pathname.startsWith(`/`)?pathname:`/${pathname}`);return`${normalizedBasePath===`/`?normalizedPathname:normalizedPathname===`/`?normalizedBasePath:`${normalizedBasePath}${normalizedPathname}`}${search}${hash}`}export{resolveLinkPath as n,splitPathQueryHash as r,isExternalLinkTarget as t};
@@ -1 +1 @@
1
- import{r as __exportAll}from"./rolldown-runtime-DBalRfVu.js";import{u as createPlacementRegistry}from"./placement-B5T1LR7m.js";import{At as mdiFileCogOutline,Kt as mdiGithub,Yt as mdiHeartPulse,Zt as mdiHistory,a as mdiAccountKeyOutline,br as mdiSourceMerge,it as mdiCogOutline,st as mdiConnection,zn as mdiPackageVariantClosed}from"./mdi-X9prU-DG.js";import{i as githubProjectAvailable}from"./vibe64GithubProject-Bct-bzKq.js";import{i as vibe64SessionToolDashboardSuffix,n as VIBE64_ACTIVE_SESSION_NAV_TARGET,r as VIBE64_SESSION_TOOL_DEFINITIONS,t as VIBE64_ACTIVE_SESSION_NAV_OWNER}from"./vibe64SessionToolDefinitions-hqh6mSY8.js";var placementExtensions_default=[];var placement_exports=__exportAll({addPlacement:()=>addPlacement,default:()=>getPlacements,uniqueDashboardSectionPlacements:()=>uniqueDashboardSectionPlacements});var registry=createPlacementRegistry();var{addPlacement}=registry;function getPlacements(){return uniqueDashboardSectionPlacements(registry.build()).map(dashboardSectionVisibility)}function dashboardSectionVisibility(placement){return placement?.owner===`app-dashboard`&&placement.target===`page.section-nav`&&!placement.when&&typeof placement.props?.visibleWhen===`function`?{...placement,when:placement.props.visibleWhen}:placement}function uniqueDashboardSectionPlacements(placements=[]){const winners=new Map;for(const placement of placements){const key=dashboardSectionPlacementKey(placement);if(!key)continue;const current=winners.get(key);if(!current||dashboardSectionPlacementOrder(placement)<dashboardSectionPlacementOrder(current))winners.set(key,placement)}return placements.filter(placement=>{const key=dashboardSectionPlacementKey(placement);return!key||winners.get(key)===placement})}function dashboardSectionPlacementKey(placement={}){if(placement?.kind!==`link`||placement?.owner!==`app-dashboard`||placement?.target!==`page.section-nav`)return``;const destination=dashboardSectionPlacementDestination(placement);return destination?`${placement.owner}:${placement.target}:${destination}`:``}function dashboardSectionPlacementDestination(placement={}){const raw=String(placement?.props?.scopedSuffix||placement?.props?.unscopedSuffix||placement?.props?.to||``).trim();if(!raw)return``;const normalized=raw.replace(/^\/+/u,``).replace(/^project\/\[slug\](?=\/|$)/u,``).replace(/^\[slug\](?=\/|$)/u,``).replace(/^\/+/u,``).replace(/\/+$/u,``);return normalized?`/${normalized}`:`/`}function dashboardSectionPlacementOrder(placement={}){const order=Number(placement?.order);return Number.isFinite(order)?order:Number.MAX_SAFE_INTEGER}addPlacement({id:`realtime.connection.indicator`,target:`shell.status`,kind:`component`,surfaces:[`*`],order:950,componentToken:`realtime.web.connection.indicator`});addPlacement({id:`vibe64.active-session.heading`,target:VIBE64_ACTIVE_SESSION_NAV_TARGET,owner:VIBE64_ACTIVE_SESSION_NAV_OWNER,kind:`link`,surfaces:[`app`],order:100,props:{role:`heading`},when:activeSessionNavPlacementVisible});for(const tool of VIBE64_SESSION_TOOL_DEFINITIONS){const projectTool=tool.navigationScope===`project`;addPlacement({id:`vibe64.${projectTool?`project`:`active-session`}.${tool.id}`,target:projectTool?`page.section-nav`:VIBE64_ACTIVE_SESSION_NAV_TARGET,owner:projectTool?`app-dashboard`:VIBE64_ACTIVE_SESSION_NAV_OWNER,kind:`link`,surfaces:[`app`],order:projectTool?tool.order:100+tool.order,props:{icon:tool.icon,...tool.guideId?{guideId:tool.guideId}:{},label:tool.label,scopedSuffix:`/project/[slug]${vibe64SessionToolDashboardSuffix(tool.id)}`,title:tool.title,toolId:tool.id,unscopedSuffix:`/project/[slug]${vibe64SessionToolDashboardSuffix(tool.id)}`},when:projectTool?void 0:activeSessionNavPlacementVisible})}function activeSessionNavPlacementVisible({activeSessionNav}={}){return activeSessionNav?.visible===true}function githubProjectVisible({projectContext={}}={}){return githubProjectAvailable(projectContext)}function incomingVisible({projectContext={}}={}){return projectContext.repositoryMode===`github`}addPlacement({id:`vibe64.incoming.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:320,props:{label:`Incoming changes`,icon:mdiSourceMerge,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/incoming`,unscopedSuffix:`/project/[slug]/dashboard/incoming`,visibleWhen:incomingVisible},when:incomingVisible});addPlacement({id:`vibe64.issues.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:325,props:{label:`Issues/PR`,icon:mdiGithub,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/issues`,unscopedSuffix:`/project/[slug]/dashboard/issues`,visibleWhen:githubProjectVisible},when:githubProjectVisible});addPlacement({id:`vibe64.project-settings.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:250,props:{label:`Project settings`,icon:mdiCogOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/settings`,unscopedSuffix:`/project/[slug]/dashboard/settings`,to:``}});addPlacement({id:`ui-generator.page.app.dashboard.env.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:300,props:{label:`Env`,icon:mdiFileCogOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/env`,unscopedSuffix:`/project/[slug]/dashboard/env`,to:``}});addPlacement({id:`vibe64.integrations.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:350,props:{label:`Integrations`,icon:mdiConnection,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/integrations`,unscopedSuffix:`/project/[slug]/dashboard/integrations`,to:``}});addPlacement({id:`vibe64.preview-identities.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:400,props:{label:`App access`,icon:mdiAccountKeyOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/access`,unscopedSuffix:`/project/[slug]/dashboard/access`,to:``}});addPlacement({id:`vibe64.publishing.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:500,props:{label:`Publish`,guideId:`publish`,icon:mdiPackageVariantClosed,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/publish`,unscopedSuffix:`/project/[slug]/dashboard/publish`,to:``}});addPlacement({id:`ui-generator.page.app.dashboard.history.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:600,props:{label:`Session History`,icon:mdiHistory,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/history`,unscopedSuffix:`/project/[slug]/dashboard/history`,to:``}});addPlacement({id:`vibe64.studio-health.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:700,props:{label:`Health`,icon:mdiHeartPulse,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/health`,unscopedSuffix:`/project/[slug]/dashboard/health`,to:``}});for(const placement of placementExtensions_default)addPlacement(placement);export{placement_exports as n,getPlacements as t};
1
+ import{r as __exportAll}from"./rolldown-runtime-DBalRfVu.js";import{At as mdiFileCogOutline,Kt as mdiGithub,Yt as mdiHeartPulse,Zt as mdiHistory,a as mdiAccountKeyOutline,br as mdiSourceMerge,it as mdiCogOutline,st as mdiConnection,zn as mdiPackageVariantClosed}from"./mdi-X9prU-DG.js";import{u as createPlacementRegistry}from"./placement-DYM3JJ-F.js";import{i as githubProjectAvailable}from"./vibe64GithubProject-Bct-bzKq.js";import{i as vibe64SessionToolDashboardSuffix,n as VIBE64_ACTIVE_SESSION_NAV_TARGET,r as VIBE64_SESSION_TOOL_DEFINITIONS,t as VIBE64_ACTIVE_SESSION_NAV_OWNER}from"./vibe64SessionToolDefinitions-hqh6mSY8.js";var placementExtensions_default=[];var placement_exports=__exportAll({addPlacement:()=>addPlacement,default:()=>getPlacements,uniqueDashboardSectionPlacements:()=>uniqueDashboardSectionPlacements});var registry=createPlacementRegistry();var{addPlacement}=registry;function getPlacements(){return uniqueDashboardSectionPlacements(registry.build()).map(dashboardSectionVisibility)}function dashboardSectionVisibility(placement){return placement?.owner===`app-dashboard`&&placement.target===`page.section-nav`&&!placement.when&&typeof placement.props?.visibleWhen===`function`?{...placement,when:placement.props.visibleWhen}:placement}function uniqueDashboardSectionPlacements(placements=[]){const winners=new Map;for(const placement of placements){const key=dashboardSectionPlacementKey(placement);if(!key)continue;const current=winners.get(key);if(!current||dashboardSectionPlacementOrder(placement)<dashboardSectionPlacementOrder(current))winners.set(key,placement)}return placements.filter(placement=>{const key=dashboardSectionPlacementKey(placement);return!key||winners.get(key)===placement})}function dashboardSectionPlacementKey(placement={}){if(placement?.kind!==`link`||placement?.owner!==`app-dashboard`||placement?.target!==`page.section-nav`)return``;const destination=dashboardSectionPlacementDestination(placement);return destination?`${placement.owner}:${placement.target}:${destination}`:``}function dashboardSectionPlacementDestination(placement={}){const raw=String(placement?.props?.scopedSuffix||placement?.props?.unscopedSuffix||placement?.props?.to||``).trim();if(!raw)return``;const normalized=raw.replace(/^\/+/u,``).replace(/^project\/\[slug\](?=\/|$)/u,``).replace(/^\[slug\](?=\/|$)/u,``).replace(/^\/+/u,``).replace(/\/+$/u,``);return normalized?`/${normalized}`:`/`}function dashboardSectionPlacementOrder(placement={}){const order=Number(placement?.order);return Number.isFinite(order)?order:Number.MAX_SAFE_INTEGER}addPlacement({id:`realtime.connection.indicator`,target:`shell.status`,kind:`component`,surfaces:[`*`],order:950,componentToken:`realtime.web.connection.indicator`});addPlacement({id:`vibe64.active-session.heading`,target:VIBE64_ACTIVE_SESSION_NAV_TARGET,owner:VIBE64_ACTIVE_SESSION_NAV_OWNER,kind:`link`,surfaces:[`app`],order:100,props:{role:`heading`},when:activeSessionNavPlacementVisible});for(const tool of VIBE64_SESSION_TOOL_DEFINITIONS){const projectTool=tool.navigationScope===`project`;addPlacement({id:`vibe64.${projectTool?`project`:`active-session`}.${tool.id}`,target:projectTool?`page.section-nav`:VIBE64_ACTIVE_SESSION_NAV_TARGET,owner:projectTool?`app-dashboard`:VIBE64_ACTIVE_SESSION_NAV_OWNER,kind:`link`,surfaces:[`app`],order:projectTool?tool.order:100+tool.order,props:{icon:tool.icon,...tool.guideId?{guideId:tool.guideId}:{},label:tool.label,scopedSuffix:`/project/[slug]${vibe64SessionToolDashboardSuffix(tool.id)}`,title:tool.title,toolId:tool.id,unscopedSuffix:`/project/[slug]${vibe64SessionToolDashboardSuffix(tool.id)}`},when:projectTool?void 0:activeSessionNavPlacementVisible})}function activeSessionNavPlacementVisible({activeSessionNav}={}){return activeSessionNav?.visible===true}function githubProjectVisible({projectContext={}}={}){return githubProjectAvailable(projectContext)}function incomingVisible({projectContext={}}={}){return projectContext.repositoryMode===`github`}addPlacement({id:`vibe64.incoming.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:320,props:{label:`Incoming changes`,icon:mdiSourceMerge,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/incoming`,unscopedSuffix:`/project/[slug]/dashboard/incoming`,visibleWhen:incomingVisible},when:incomingVisible});addPlacement({id:`vibe64.issues.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:325,props:{label:`Issues/PR`,icon:mdiGithub,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/issues`,unscopedSuffix:`/project/[slug]/dashboard/issues`,visibleWhen:githubProjectVisible},when:githubProjectVisible});addPlacement({id:`vibe64.project-settings.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:250,props:{label:`Project settings`,icon:mdiCogOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/settings`,unscopedSuffix:`/project/[slug]/dashboard/settings`,to:``}});addPlacement({id:`ui-generator.page.app.dashboard.env.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:300,props:{label:`Env`,icon:mdiFileCogOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/env`,unscopedSuffix:`/project/[slug]/dashboard/env`,to:``}});addPlacement({id:`vibe64.integrations.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:350,props:{label:`Integrations`,icon:mdiConnection,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/integrations`,unscopedSuffix:`/project/[slug]/dashboard/integrations`,to:``}});addPlacement({id:`vibe64.preview-identities.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:400,props:{label:`App access`,icon:mdiAccountKeyOutline,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/access`,unscopedSuffix:`/project/[slug]/dashboard/access`,to:``}});addPlacement({id:`vibe64.publishing.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:500,props:{label:`Publish`,guideId:`publish`,icon:mdiPackageVariantClosed,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/publish`,unscopedSuffix:`/project/[slug]/dashboard/publish`,to:``}});addPlacement({id:`ui-generator.page.app.dashboard.history.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:600,props:{label:`Session History`,icon:mdiHistory,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/history`,unscopedSuffix:`/project/[slug]/dashboard/history`,to:``}});addPlacement({id:`vibe64.studio-health.link`,target:`page.section-nav`,owner:`app-dashboard`,kind:`link`,surfaces:[`app`],order:700,props:{label:`Health`,icon:mdiHeartPulse,surface:`app`,scopedSuffix:`/project/[slug]/dashboard/health`,unscopedSuffix:`/project/[slug]/dashboard/health`,to:``}});for(const placement of placementExtensions_default)addPlacement(placement);export{placement_exports as n,getPlacements as t};
@@ -0,0 +1 @@
1
+ import{J as inject,ct as onMounted,it as onBeforeUnmount,xn as shallowRef}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{a as deriveSurfaceRouteBaseFromPagesRoot,n as createSurfacePathHelpers,o as normalizeSurfaceId,r as normalizePathname,s as normalizeSurfacePagesRoot}from"./returnToPath-gKtcu91D.js";import{f as normalizeText,l as normalizeObject,r as isRecord}from"./normalize-BNAdWJYg.js";import{r as splitPathQueryHash,t as isExternalLinkTarget}from"./linkPath-Ch9eft18.js";import"./surface-DzO5xqc8.js";var PLACEMENT_LAYOUT_CLASSES=Object.freeze([`compact`,`medium`,`expanded`]);var WEB_PLACEMENT_SURFACE_ANY=`*`;function normalizeShellOutletTargetId(value=``){const normalizedValue=normalizeText(value);if(!normalizedValue)return``;const separatorIndex=normalizedValue.indexOf(`:`);if(separatorIndex<=0||separatorIndex>=normalizedValue.length-1)return``;const host=normalizeText(normalizedValue.slice(0,separatorIndex));const position=normalizeText(normalizedValue.slice(separatorIndex+1));if(!host||!position)return``;return`${host}:${position}`}function normalizeSemanticPlacementId(value=``){const normalizedValue=normalizeText(value).toLowerCase();if(!normalizedValue||normalizedValue.includes(`:`)||!normalizedValue.includes(`.`))return``;const segments=normalizedValue.split(`.`);if(segments.length<2)return``;const normalizedSegments=[];for(const segment of segments){const normalizedSegment=normalizeText(segment);if(!/^[a-z0-9]+(?:[_-][a-z0-9]+)*$/.test(normalizedSegment))return``;normalizedSegments.push(normalizedSegment)}return normalizedSegments.join(`.`)}function normalizePlacementOwnerId(value=``){const normalizedValue=normalizeText(value).toLowerCase();if(!normalizedValue)return``;if(!/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(normalizedValue))return``;return normalizedValue}function normalizePlacementLayoutClass(value=``){const normalizedValue=normalizeText(value).toLowerCase();if(PLACEMENT_LAYOUT_CLASSES.includes(normalizedValue))return normalizedValue;return``}function normalizePlacementKind(value=``){const normalizedValue=normalizeText(value).toLowerCase();if(normalizedValue===`link`||normalizedValue===`component`)return normalizedValue;return``}function normalizePlacementSurfaceId(value=``){const normalizedValue=normalizeText(value).toLowerCase();if(!normalizedValue)return``;if(normalizedValue===`*`)return`*`;if(/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/.test(normalizedValue))return normalizedValue;return``}function normalizePlacementSurfaces$1(value){const candidates=Array.isArray(value)?value:value===void 0||value===null?[]:[value];if(candidates.length<1)return Object.freeze([`*`]);const normalized=[];const seen=new Set;for(const candidate of candidates){const surface=normalizePlacementSurfaceId(candidate);if(!surface||seen.has(surface))continue;if(surface===`*`)return Object.freeze([`*`]);seen.add(surface);normalized.push(surface)}if(normalized.length<1)return Object.freeze([`*`]);return Object.freeze(normalized)}function resolvePlacementTargetReference(value=``){const semanticId=normalizeSemanticPlacementId(value);if(semanticId)return Object.freeze({id:semanticId,type:`semantic`});const concreteId=normalizeShellOutletTargetId(value);if(concreteId)return Object.freeze({id:concreteId,type:`concrete`});return null}function normalizePlacementRenderers(value={}){const record=normalizeObject(value);const renderers={};for(const[key,rendererToken]of Object.entries(record)){const kind=normalizePlacementKind(key);const token=normalizeText(rendererToken);if(!kind||!token)continue;renderers[kind]=token}return Object.freeze(renderers)}function normalizePlacementTopologyVariant(value={},{context=`placement topology variant`}={}){const record=normalizeObject(value);const outlet=normalizeShellOutletTargetId(record.outlet||record.target);if(!outlet)throw new Error(`${normalizeText(context)||`placement topology variant`} requires outlet in "host:position" format.`);return Object.freeze({outlet,renderers:normalizePlacementRenderers(record.renderers)})}function normalizePlacementTopologyEntry(value={},{context=`placement topology`}={}){const record=normalizeObject(value);const resolvedContext=normalizeText(context)||`placement topology`;const id=normalizeSemanticPlacementId(record.id||record.target);if(!id)throw new Error(`${resolvedContext} requires semantic placement id in "area.slot" format.`);const owner=normalizePlacementOwnerId(record.owner);const surfaces=normalizePlacementSurfaces$1(record.surfaces);const variantsRecord=normalizeObject(record.variants);const variants={};for(const layoutClass of PLACEMENT_LAYOUT_CLASSES){const variant=variantsRecord[layoutClass];if(!variant)throw new Error(`${resolvedContext} "${id}" requires ${layoutClass} topology variant.`);variants[layoutClass]=normalizePlacementTopologyVariant(variant,{context:`${resolvedContext} "${id}" ${layoutClass}`})}return Object.freeze({id,owner,description:normalizeText(record.description),surfaces,default:record.default===true,variants:Object.freeze(variants)})}function normalizePlacementTopologyDefinition(value={},{context=`placement topology`}={}){const record=normalizeObject(value);const entries=Array.isArray(record.placements)?record.placements:Array.isArray(value)?value:[];const normalized=[];const seen=new Set;for(const entry of entries){const placement=normalizePlacementTopologyEntry(entry,{context});const key=`${placement.id}::${placement.owner||``}`;if(seen.has(key))throw new Error(`${normalizeText(context)||`placement topology`} contains duplicate semantic placement "${placement.id}"${placement.owner?` for owner "${placement.owner}"`:``}.`);seen.add(key);normalized.push(placement)}return Object.freeze({placements:Object.freeze(normalized)})}function isRenderableComponent(value){if(typeof value===`function`)return true;return isRecord(value)}function normalizeSurface(value){return normalizeText(value).toLowerCase()||`*`}function normalizePlacementSurface(value,{strict=false,source=`placement`}={}){const surface=normalizePlacementSurfaceId(value);if(!surface&&strict){const normalized=normalizeText(value).toLowerCase();throw new TypeError(normalized?`${source} surface "${normalized}" is invalid.`:`${source} requires surface id or "*".`)}return surface}function toInteger(value,fallback=1e3){const numeric=Number(value);if(!Number.isFinite(numeric))return fallback;return Math.trunc(numeric)}function normalizePlacementTarget(value,{strict=false,source=`placement`}={}){const reference=resolvePlacementTargetReference(String(value||``).toLowerCase());if(reference?.id)return reference.id;if(strict)throw new TypeError(`${source} requires semantic target in "area.slot" format or internal concrete target in "host:position" format.`);return``}function normalizePlacementSurfaces(value,{strict=false,source=`placement`}={}){if(strict){const candidates=Array.isArray(value)?value:value===void 0||value===null?[]:[value];for(const candidate of candidates)if(normalizePlacementSurface(candidate,{strict,source})===`*`)break}return normalizePlacementSurfaces$1(value)}function normalizePlacementDefinition(value,{strict=false,source=`placement`}={}){if(!isRecord(value)){if(strict)throw new TypeError(`${source} must be an object.`);return null}const id=normalizeText(value.id);if(!id){if(strict)throw new TypeError(`${source} requires id.`);return null}const target=normalizePlacementTarget(value.target,{strict,source:`${source} "${id}"`});if(!target)return null;const targetReference=resolvePlacementTargetReference(target);const internal=value.internal===true;if(targetReference?.type===`concrete`&&internal!==true){if(strict)throw new TypeError(`${source} "${id}" targets concrete outlet "${target}" without internal: true.`);return null}const owner=normalizeText(value.owner).toLowerCase();const kind=normalizePlacementKind(value.kind)||(normalizeText(value.componentToken)?`component`:`link`);const componentToken=normalizeText(value.componentToken);if(kind===`component`&&!componentToken){if(strict)throw new TypeError(`${source} "${id}" requires componentToken.`);return null}const props=isRecord(value.props)?{...value.props}:{};const when=typeof value.when===`function`?value.when:null;const surfaces=normalizePlacementSurfaces(value.surfaces,{strict,source:`${source} "${id}"`});return Object.freeze({id,target,targetType:targetReference?.type||``,owner,kind,surfaces,order:toInteger(value.order,1e3),componentToken,props,when,enabled:value.enabled!==false,internal})}function definePlacement(value={}){return normalizePlacementDefinition(value,{strict:true,source:`placement contribution`})}function createPlacementRegistry({entries=[]}={}){const placements=[];const ids=new Set;function addPlacement(value={}){const placement=definePlacement(value);if(ids.has(placement.id))return false;ids.add(placement.id);placements.push(placement);return true}for(const entry of Array.isArray(entries)?entries:[])addPlacement(entry);function hasPlacement(id){return ids.has(String(id||``).trim())}function build(){return Object.freeze([...placements])}return Object.freeze({addPlacement,hasPlacement,build})}var SHELL_WEB_PLACEMENT_RUNTIME_KEY=`jskit.shell-web.runtime.web-placement.client`;var EMPTY_WEB_PLACEMENT_RUNTIME=Object.freeze({getContext(){return Object.freeze({})},getPlacements(){return Object.freeze([])},setContext(){return Object.freeze({})},subscribe(){return()=>{}},getRevision(){return 0}});var EMPTY_WEB_PLACEMENT_CONTEXT_REF=shallowRef(Object.freeze({}));var EMPTY_WEB_PLACEMENT_CONTEXT=Object.freeze({context:EMPTY_WEB_PLACEMENT_CONTEXT_REF,mergeContext(){return EMPTY_WEB_PLACEMENT_CONTEXT_REF.value},replaceContext(){return EMPTY_WEB_PLACEMENT_CONTEXT_REF.value}});function useWebPlacementRuntime({required=false}={}){const runtime=inject(SHELL_WEB_PLACEMENT_RUNTIME_KEY,null);if(runtime&&typeof runtime.getPlacements===`function`)return runtime;if(required)throw new Error(`Web placement runtime is not available in Vue injection context.`);return EMPTY_WEB_PLACEMENT_RUNTIME}function useWebPlacementContext({required=false}={}){const runtime=useWebPlacementRuntime({required});if(runtime===EMPTY_WEB_PLACEMENT_RUNTIME)return EMPTY_WEB_PLACEMENT_CONTEXT;const context=shallowRef(runtime.getContext());let unsubscribe=null;onMounted(()=>{if(typeof runtime.subscribe!==`function`)return;unsubscribe=runtime.subscribe(()=>{context.value=runtime.getContext()})});onBeforeUnmount(()=>{if(typeof unsubscribe===`function`){unsubscribe();unsubscribe=null}});function mergeContext(value={},source=`component`){context.value=runtime.setContext(value,{source});return context.value}function replaceContext(value={},source=`component`){context.value=runtime.setContext(value,{replace:true,source});return context.value}return Object.freeze({context,mergeContext,replaceContext})}var EMPTY_SURFACE_CONFIG=Object.freeze({tenancyMode:``,defaultSurfaceId:``,enabledSurfaceIds:Object.freeze([]),surfacesById:Object.freeze({})});function normalizeSurfaceIdList(value){if(!Array.isArray(value))return[];const seen=new Set;const normalized=[];for(const candidate of value){const surfaceId=normalizeSurfaceId(candidate);if(!surfaceId||seen.has(surfaceId))continue;seen.add(surfaceId);normalized.push(surfaceId)}return normalized}function normalizeSurfaceConfig(surfaceConfig={}){const source=isRecord(surfaceConfig)?surfaceConfig:{};const enabledSurfaceIds=normalizeSurfaceIdList(source.enabledSurfaceIds);const enabledSet=new Set(enabledSurfaceIds);const rawSurfacesById=isRecord(source.surfacesById)?source.surfacesById:{};const normalizedSurfacesById={};for(const[rawSurfaceId,rawDefinition]of Object.entries(rawSurfacesById)){const definition=isRecord(rawDefinition)?rawDefinition:{};const surfaceId=normalizeSurfaceId(definition.id||rawSurfaceId);if(!surfaceId)continue;const pagesRoot=normalizeSurfacePagesRoot(definition.pagesRoot);const routeBase=String(definition.routeBase||deriveSurfaceRouteBaseFromPagesRoot(pagesRoot)).trim()||`/`;const enabled=enabledSet.size>0?enabledSet.has(surfaceId):definition.enabled!==false;normalizedSurfacesById[surfaceId]=Object.freeze({...definition,id:surfaceId,pagesRoot,routeBase,enabled})}const derivedEnabledSurfaceIds=enabledSurfaceIds.length>0?enabledSurfaceIds.filter(surfaceId=>Boolean(normalizedSurfacesById[surfaceId])):Object.values(normalizedSurfacesById).filter(definition=>definition.enabled).map(definition=>definition.id);const defaultSurfaceId=normalizeSurfaceId(source.defaultSurfaceId);const resolvedDefaultSurfaceId=normalizedSurfacesById[defaultSurfaceId]?defaultSurfaceId:derivedEnabledSurfaceIds[0]||Object.keys(normalizedSurfacesById)[0]||``;return Object.freeze({tenancyMode:String(source.tenancyMode||``).trim().toLowerCase(),defaultSurfaceId:resolvedDefaultSurfaceId,enabledSurfaceIds:Object.freeze([...derivedEnabledSurfaceIds]),surfacesById:Object.freeze({...normalizedSurfacesById})})}function buildSurfaceConfigContext(surfaceRuntime=null,{tenancyMode=``}={}){const normalizedTenancyMode=String(tenancyMode||``).trim().toLowerCase();if(!isRecord(surfaceRuntime))return normalizeSurfaceConfig({tenancyMode:normalizedTenancyMode});const surfaceDefinitions=typeof surfaceRuntime.listSurfaceDefinitions===`function`?surfaceRuntime.listSurfaceDefinitions():[];const surfacesById={};for(const definition of Array.isArray(surfaceDefinitions)?surfaceDefinitions:[]){if(!isRecord(definition))continue;const surfaceId=normalizeSurfaceId(definition.id);if(!surfaceId)continue;surfacesById[surfaceId]=definition}return normalizeSurfaceConfig({tenancyMode:normalizedTenancyMode,defaultSurfaceId:surfaceRuntime.DEFAULT_SURFACE_ID,enabledSurfaceIds:typeof surfaceRuntime.listEnabledSurfaceIds===`function`?surfaceRuntime.listEnabledSurfaceIds():[],surfacesById})}function readPlacementSurfaceConfig(contextValue=null){return normalizeSurfaceConfig((isRecord(contextValue)?contextValue:{}).surfaceConfig)}function resolveSurfaceDefinitionFromPlacementContext(contextValue=null,surfaceId=``){const surfaceConfig=readPlacementSurfaceConfig(contextValue);const normalizedSurfaceId=normalizeSurfaceId(surfaceId);if(!normalizedSurfaceId)return null;return surfaceConfig.surfacesById[normalizedSurfaceId]||null}function joinSurfacePath(surfacePrefix=``,pathname=``){const normalizedPrefix=normalizePathname(surfacePrefix||`/`);const rawPathname=String(pathname||``).trim();if(!rawPathname)return normalizedPrefix;const normalizedPathname=(rawPathname.startsWith(`/`)?rawPathname:`/${rawPathname}`).replace(/\/{2,}/g,`/`);const compacted=(normalizedPrefix===`/`?normalizedPathname:`${normalizedPrefix}${normalizedPathname}`).replace(/\/{2,}/g,`/`);if(!compacted)return`/`;return compacted===`/`?compacted:compacted.replace(/\/+$/,``)||`/`}function resolveSurfaceRootPathFromPlacementContext(contextValue=null,surfaceId=``){return joinSurfacePath(resolveSurfaceDefinitionFromPlacementContext(contextValue,surfaceId)?.routeBase,``)}function normalizeSurfaceOrigin(originValue=``){const rawOrigin=String(originValue||``).trim();if(!rawOrigin)return``;try{const parsed=new URL(rawOrigin);if(parsed.protocol!==`http:`&&parsed.protocol!==`https:`)return``;return parsed.origin}catch{return``}}function resolveRuntimeOrigin(currentOrigin=``){const normalizedCurrentOrigin=normalizeSurfaceOrigin(currentOrigin);if(normalizedCurrentOrigin)return normalizedCurrentOrigin;if(typeof window===`object`&&window?.location?.origin)return normalizeSurfaceOrigin(window.location.origin);return``}function resolveSurfaceNavigationTargetFromPlacementContext(contextValue=null,{path=`/`,surfaceId=``,currentOrigin=``}={}){const rawPath=String(path||``).trim()||`/`;if(isExternalLinkTarget(rawPath))return Object.freeze({href:rawPath,sameOrigin:false,surfaceId:normalizeSurfaceId(surfaceId),external:true});const{pathname,search,hash}=splitPathQueryHash(rawPath);const normalizedPathname=normalizePathname(pathname||`/`);const normalizedPath=`${normalizedPathname}${search}${hash}`;const resolvedSurfaceId=normalizeSurfaceId(surfaceId)||resolveSurfaceIdFromPlacementPathname(contextValue,normalizedPathname)||``;const targetOrigin=normalizeSurfaceOrigin((resolvedSurfaceId?resolveSurfaceDefinitionFromPlacementContext(contextValue,resolvedSurfaceId):null)?.origin||``);const runtimeOrigin=resolveRuntimeOrigin(currentOrigin);if(!targetOrigin)return Object.freeze({href:normalizedPath,sameOrigin:true,surfaceId:resolvedSurfaceId,external:false});if(runtimeOrigin&&targetOrigin===runtimeOrigin)return Object.freeze({href:normalizedPath,sameOrigin:true,surfaceId:resolvedSurfaceId,external:false});return Object.freeze({href:`${targetOrigin}${normalizedPath}`,sameOrigin:false,surfaceId:resolvedSurfaceId,external:false})}function createPlacementSurfacePathHelpers(surfaceConfig=EMPTY_SURFACE_CONFIG){const surfacesById=isRecord(surfaceConfig.surfacesById)?surfaceConfig.surfacesById:{};const defaultSurfaceId=normalizeSurfaceId(surfaceConfig.defaultSurfaceId);const fallbackSurfaceId=Object.keys(surfacesById)[0]||``;const resolvedDefaultSurfaceId=defaultSurfaceId&&surfacesById[defaultSurfaceId]?defaultSurfaceId:fallbackSurfaceId;if(!resolvedDefaultSurfaceId)return null;return createSurfacePathHelpers({defaultSurfaceId:resolvedDefaultSurfaceId,surfaceDefinitions:Object.values(surfacesById)})}function resolveSurfaceIdFromPlacementPathname(contextValue=null,pathname=``){const surfaceConfig=readPlacementSurfaceConfig(contextValue);const normalizedPathname=normalizePathname(pathname)||(typeof window===`object`&&window?.location?.pathname?normalizePathname(window.location.pathname):`/`);const pathHelpers=createPlacementSurfacePathHelpers(surfaceConfig);if(!pathHelpers)return``;return pathHelpers.resolveSurfaceFromPathname(normalizedPathname)}export{resolveSurfaceNavigationTargetFromPlacementContext as a,useWebPlacementContext as c,isRenderableComponent as d,normalizePlacementDefinition as f,normalizePlacementTopologyDefinition as g,normalizePlacementLayoutClass as h,resolveSurfaceIdFromPlacementPathname as i,useWebPlacementRuntime as l,normalizeSurface as m,readPlacementSurfaceConfig as n,resolveSurfaceRootPathFromPlacementContext as o,normalizePlacementTarget as p,resolveSurfaceDefinitionFromPlacementContext as r,SHELL_WEB_PLACEMENT_RUNTIME_KEY as s,buildSurfaceConfigContext as t,createPlacementRegistry as u};