@thxgg/steward 0.1.16 → 0.1.17

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 (157) hide show
  1. package/.env.example +6 -0
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/_nuxt/{wbjFvimm.js → 4r0X30JV.js} +1 -1
  4. package/.output/public/_nuxt/{ynmyrfyT.js → BMdjSp24.js} +1 -1
  5. package/.output/public/_nuxt/{BWVTacYj.js → BSZqAKg4.js} +1 -1
  6. package/.output/public/_nuxt/{Dum5qplW.js → BdjPva1I.js} +1 -1
  7. package/.output/public/_nuxt/Beeir9iR.js +1 -0
  8. package/.output/public/_nuxt/Bh3vsUvl.js +1 -0
  9. package/.output/public/_nuxt/{Bibm_IDv.js → BlTKcjLJ.js} +2 -2
  10. package/.output/public/_nuxt/{CxHOXVf6.js → By7gAVcL.js} +1 -1
  11. package/.output/public/_nuxt/CbJfCtEa.js +1 -0
  12. package/.output/public/_nuxt/CbkpNvIu.js +141 -0
  13. package/.output/public/_nuxt/CmhLcqDu.js +1 -0
  14. package/.output/public/_nuxt/DC6iPLz1.js +30 -0
  15. package/.output/public/_nuxt/{BSA0RJ-H.js → DD--ojY9.js} +1 -1
  16. package/.output/public/_nuxt/Detail.DSyVQNdr.css +1 -0
  17. package/.output/public/_nuxt/DhKWRjCh.js +60 -0
  18. package/.output/public/_nuxt/_prd_.BkpxMFSV.css +1 -0
  19. package/.output/public/_nuxt/builds/latest.json +1 -1
  20. package/.output/public/_nuxt/builds/meta/f3f42dbd-d501-442b-871c-3d06157e7aa1.json +1 -0
  21. package/.output/public/_nuxt/c1sXju8w.js +1 -0
  22. package/.output/public/_nuxt/eGCjCghR.js +1 -0
  23. package/.output/public/_nuxt/nX8Sf7cz.js +13 -0
  24. package/.output/server/chunks/_/git-api.mjs +100 -7
  25. package/.output/server/chunks/_/git-api.mjs.map +1 -1
  26. package/.output/server/chunks/_/git.mjs +3 -10
  27. package/.output/server/chunks/_/git.mjs.map +1 -1
  28. package/.output/server/chunks/_/prd-service.mjs +234 -0
  29. package/.output/server/chunks/_/prd-service.mjs.map +1 -0
  30. package/.output/server/chunks/_/task-graph.mjs +3 -3
  31. package/.output/server/chunks/_/task-graph.mjs.map +1 -1
  32. package/.output/server/chunks/_/watcher.mjs +26 -46
  33. package/.output/server/chunks/_/watcher.mjs.map +1 -1
  34. package/.output/server/chunks/build/{Detail-CUfU85GY.mjs → Detail-MGwP_u2d.mjs} +63 -34
  35. package/.output/server/chunks/build/Detail-MGwP_u2d.mjs.map +1 -0
  36. package/.output/server/chunks/build/DiffViewer-styles-1.mjs-BFsE2PCW.mjs +4 -0
  37. package/.output/server/chunks/build/DiffViewer-styles-1.mjs-BFsE2PCW.mjs.map +1 -0
  38. package/.output/server/chunks/build/DiffViewer-styles.D2bqX3nK.mjs +8 -0
  39. package/.output/server/chunks/build/DiffViewer-styles.D2bqX3nK.mjs.map +1 -0
  40. package/.output/server/chunks/build/DiffViewer-styles.FoV36wuV.mjs +10 -0
  41. package/.output/server/chunks/build/DiffViewer-styles.FoV36wuV.mjs.map +1 -0
  42. package/.output/server/chunks/build/Viewer-styles.D6wYWFb1.mjs +8 -0
  43. package/.output/server/chunks/build/Viewer-styles.D6wYWFb1.mjs.map +1 -0
  44. package/.output/server/chunks/build/{_prd_-CeVnQzOV.mjs → _prd_-C-Aj4fVa.mjs} +75 -33
  45. package/.output/server/chunks/build/_prd_-C-Aj4fVa.mjs.map +1 -0
  46. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  47. package/.output/server/chunks/build/{default-DWCOHHTE.mjs → default-Cao5eO80.mjs} +4 -3
  48. package/.output/server/chunks/build/default-Cao5eO80.mjs.map +1 -0
  49. package/.output/server/chunks/build/error-404-Bf6kdO80.mjs +2 -1
  50. package/.output/server/chunks/build/error-500-D_bcARXN.mjs +2 -1
  51. package/.output/server/chunks/build/{index-CckL_NBD.mjs → index-ByZO4Bvq.mjs} +2 -2
  52. package/.output/server/chunks/build/index-ByZO4Bvq.mjs.map +1 -0
  53. package/.output/server/chunks/build/{index-QVeSHT3L.mjs → index-ljj9uTXI.mjs} +8 -5
  54. package/.output/server/chunks/build/index-ljj9uTXI.mjs.map +1 -0
  55. package/.output/server/chunks/build/nuxt-link-SvT1nf8Z.mjs +1 -1
  56. package/.output/server/chunks/build/{repo-graph-CHNl58mY.mjs → repo-graph-EuhMeFt7.mjs} +25 -10
  57. package/.output/server/chunks/build/repo-graph-EuhMeFt7.mjs.map +1 -0
  58. package/.output/server/chunks/build/server.mjs +7 -6
  59. package/.output/server/chunks/build/styles.mjs +4 -4
  60. package/.output/server/chunks/build/{usePrd-SqcxGyFU.mjs → usePrd-f7ylhIqs.mjs} +10 -34
  61. package/.output/server/chunks/build/usePrd-f7ylhIqs.mjs.map +1 -0
  62. package/.output/server/chunks/nitro/nitro.mjs +1106 -677
  63. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  64. package/.output/server/chunks/routes/api/browse.get.mjs +12 -6
  65. package/.output/server/chunks/routes/api/browse.get.mjs.map +1 -1
  66. package/.output/server/chunks/routes/api/index.get.mjs +2 -1
  67. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  68. package/.output/server/chunks/routes/api/index.post.mjs +3 -2
  69. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  70. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +11 -13
  71. package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
  72. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +11 -6
  73. package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
  74. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +31 -12
  75. package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
  76. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +13 -13
  77. package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
  78. package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs +5 -1
  79. package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs.map +1 -1
  80. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs +14 -1
  81. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs.map +1 -1
  82. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +20 -9
  83. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
  84. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +20 -85
  85. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
  86. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +20 -9
  87. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
  88. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs +30 -50
  89. package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs.map +1 -1
  90. package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs +19 -49
  91. package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs.map +1 -1
  92. package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +6 -13
  93. package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs.map +1 -1
  94. package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs +2 -1
  95. package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs.map +1 -1
  96. package/.output/server/chunks/routes/api/runtime.get.mjs +3 -2
  97. package/.output/server/chunks/routes/api/runtime.get.mjs.map +1 -1
  98. package/.output/server/chunks/routes/api/watch.get.mjs +5 -4
  99. package/.output/server/chunks/routes/api/watch.get.mjs.map +1 -1
  100. package/.output/server/chunks/routes/renderer.mjs +1 -1
  101. package/.output/server/index.mjs +3 -2
  102. package/.output/server/index.mjs.map +1 -1
  103. package/.output/server/node_modules/zod/index.js +4 -0
  104. package/.output/server/node_modules/zod/package.json +118 -0
  105. package/.output/server/node_modules/zod/v3/ZodError.js +133 -0
  106. package/.output/server/node_modules/zod/v3/errors.js +9 -0
  107. package/.output/server/node_modules/zod/v3/external.js +6 -0
  108. package/.output/server/node_modules/zod/v3/helpers/errorUtil.js +6 -0
  109. package/.output/server/node_modules/zod/v3/helpers/parseUtil.js +109 -0
  110. package/.output/server/node_modules/zod/v3/helpers/typeAliases.js +1 -0
  111. package/.output/server/node_modules/zod/v3/helpers/util.js +133 -0
  112. package/.output/server/node_modules/zod/v3/locales/en.js +109 -0
  113. package/.output/server/node_modules/zod/v3/types.js +3693 -0
  114. package/.output/server/package.json +2 -1
  115. package/README.md +7 -2
  116. package/dist/host/src/api/prds.js +6 -172
  117. package/dist/host/src/api/repos.js +3 -16
  118. package/dist/host/src/api/state.js +7 -2
  119. package/dist/host/src/executor-runner.js +368 -0
  120. package/dist/host/src/executor.js +138 -260
  121. package/dist/host/src/index.js +7 -2
  122. package/dist/host/src/mcp.js +27 -1
  123. package/dist/host/src/ui.js +18 -3
  124. package/dist/server/utils/change-events.js +33 -0
  125. package/dist/server/utils/git.js +11 -16
  126. package/dist/server/utils/prd-service.js +235 -0
  127. package/dist/server/utils/prd-state.js +57 -45
  128. package/dist/server/utils/repos.js +58 -13
  129. package/dist/server/utils/state-schema.js +61 -0
  130. package/dist/server/utils/task-graph.js +2 -2
  131. package/package.json +2 -1
  132. package/.output/public/_nuxt/CVJh28bx.js +0 -1
  133. package/.output/public/_nuxt/CyZuidLG.js +0 -60
  134. package/.output/public/_nuxt/D0op9E2g.js +0 -1
  135. package/.output/public/_nuxt/DX8awZaa.js +0 -1
  136. package/.output/public/_nuxt/Detail.z33AHKev.css +0 -1
  137. package/.output/public/_nuxt/DiTJUZOC.js +0 -1
  138. package/.output/public/_nuxt/T_3JE9C-.js +0 -1
  139. package/.output/public/_nuxt/WOI2tLsR.js +0 -42
  140. package/.output/public/_nuxt/_prd_.KTotLoF_.css +0 -1
  141. package/.output/public/_nuxt/builds/meta/029070b0-b8e2-4988-84f4-d0c9ff55c998.json +0 -1
  142. package/.output/public/_nuxt/odRGDGwj.js +0 -1
  143. package/.output/server/chunks/build/Detail-CUfU85GY.mjs.map +0 -1
  144. package/.output/server/chunks/build/DiffViewer-styles-1.mjs-CS8FTppg.mjs +0 -4
  145. package/.output/server/chunks/build/DiffViewer-styles-1.mjs-CS8FTppg.mjs.map +0 -1
  146. package/.output/server/chunks/build/DiffViewer-styles.AUfwwelI.mjs +0 -10
  147. package/.output/server/chunks/build/DiffViewer-styles.AUfwwelI.mjs.map +0 -1
  148. package/.output/server/chunks/build/DiffViewer-styles.D_it8zfk.mjs +0 -8
  149. package/.output/server/chunks/build/DiffViewer-styles.D_it8zfk.mjs.map +0 -1
  150. package/.output/server/chunks/build/Viewer-styles.CshnetGw.mjs +0 -8
  151. package/.output/server/chunks/build/Viewer-styles.CshnetGw.mjs.map +0 -1
  152. package/.output/server/chunks/build/_prd_-CeVnQzOV.mjs.map +0 -1
  153. package/.output/server/chunks/build/default-DWCOHHTE.mjs.map +0 -1
  154. package/.output/server/chunks/build/index-CckL_NBD.mjs.map +0 -1
  155. package/.output/server/chunks/build/index-QVeSHT3L.mjs.map +0 -1
  156. package/.output/server/chunks/build/repo-graph-CHNl58mY.mjs.map +0 -1
  157. package/.output/server/chunks/build/usePrd-SqcxGyFU.mjs.map +0 -1
@@ -5,11 +5,10 @@ import { Background } from '@vue-flow/background';
5
5
  import { Controls } from '@vue-flow/controls';
6
6
  import { MarkerType, VueFlow, Position, Handle } from '@vue-flow/core';
7
7
  import { Loader2, AlertCircle, GitBranch, Circle, Clock3, CheckCircle2, AlertTriangle, Clock, ArrowLeft, Tag, ListOrdered, CheckSquare, Check, Link2, Diff, Calendar, ExternalLink, X, RefreshCw, Keyboard, FileDiff, FileCode, GitCommit, FileText, Plus, Minus, FolderGit2, ArrowRight, FileWarning, ChevronDown, Link, Link2Off, FileEdit, FileX, FilePlus } from 'lucide-vue-next';
8
- import { codeToHtml } from 'shiki/bundle/full';
9
- import { B as Button } from './index-CckL_NBD.mjs';
8
+ import { B as Button } from './index-ByZO4Bvq.mjs';
10
9
  import { _ as _export_sfc } from './_plugin-vue_export-helper-1tPrXgE0.mjs';
11
10
  import { Primitive, useForwardPropsEmits, DialogRoot, DialogPortal, DialogContent, DialogClose, DialogTitle, DialogDescription, Separator as Separator$1, DialogOverlay, TooltipProvider as TooltipProvider$1, TooltipRoot, TooltipTrigger as TooltipTrigger$1, TooltipPortal, TooltipContent as TooltipContent$1, TooltipArrow, ScrollAreaRoot, ScrollAreaViewport, ScrollAreaCorner, ScrollAreaScrollbar, ScrollAreaThumb, DialogTrigger } from 'reka-ui';
12
- import { c as cn, b as useToast } from './usePrd-SqcxGyFU.mjs';
11
+ import { c as cn, b as useToast } from './usePrd-f7ylhIqs.mjs';
13
12
  import { cva } from 'class-variance-authority';
14
13
  import { _ as __nuxt_component_0$3 } from './nuxt-link-SvT1nf8Z.mjs';
15
14
 
@@ -563,6 +562,8 @@ _sfc_main$k.setup = (props, ctx) => {
563
562
  };
564
563
  const __nuxt_component_0$1 = Object.assign(_sfc_main$k, { __name: "GitChangesMinimap" });
565
564
  const LINE_LIMIT = 1e4;
565
+ const MAX_DIFF_HIGHLIGHT_LINES = 1500;
566
+ const MAX_FULL_FILE_HIGHLIGHT_LINES = 4e3;
566
567
  const _sfc_main$j = /* @__PURE__ */ defineComponent({
567
568
  __name: "DiffViewer",
568
569
  __ssrInlineRender: true,
@@ -661,6 +662,14 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
661
662
  const language = computed(() => detectLanguage(props.filePath));
662
663
  const highlightedLines = ref(/* @__PURE__ */ new Map());
663
664
  const isLoading = ref(true);
665
+ const lineHighlightCache = /* @__PURE__ */ new Map();
666
+ let codeToHtmlLoader = null;
667
+ async function getCodeToHtml() {
668
+ if (!codeToHtmlLoader) {
669
+ codeToHtmlLoader = import('shiki').then((module) => module.codeToHtml);
670
+ }
671
+ return codeToHtmlLoader;
672
+ }
664
673
  const displayItems = computed(() => {
665
674
  const items = [];
666
675
  for (let hunkIndex = 0; hunkIndex < props.hunks.length; hunkIndex++) {
@@ -747,7 +756,13 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
747
756
  if (!content.trim()) {
748
757
  return "";
749
758
  }
759
+ const cacheKey = `${lang}:${content}`;
760
+ const cached = lineHighlightCache.get(cacheKey);
761
+ if (cached !== void 0) {
762
+ return cached;
763
+ }
750
764
  try {
765
+ const codeToHtml = await getCodeToHtml();
751
766
  const html = await codeToHtml(content, {
752
767
  lang,
753
768
  themes: {
@@ -756,16 +771,25 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
756
771
  }
757
772
  });
758
773
  const codeMatch = html.match(/<code[^>]*>([\s\S]*?)<\/code>/);
759
- return codeMatch ? codeMatch[1] || "" : escapeHtml(content);
774
+ const highlighted = codeMatch ? codeMatch[1] || "" : escapeHtml(content);
775
+ lineHighlightCache.set(cacheKey, highlighted);
776
+ return highlighted;
760
777
  } catch {
761
- return escapeHtml(content);
778
+ const fallback = escapeHtml(content);
779
+ lineHighlightCache.set(cacheKey, fallback);
780
+ return fallback;
762
781
  }
763
782
  }
764
783
  async function highlightFullContent(content, lang) {
765
784
  if (!content) {
766
785
  return [];
767
786
  }
787
+ const lines = content.split("\n");
788
+ if (lines.length > MAX_FULL_FILE_HIGHLIGHT_LINES) {
789
+ return lines.map(escapeHtml);
790
+ }
768
791
  try {
792
+ const codeToHtml = await getCodeToHtml();
769
793
  const html = await codeToHtml(content, {
770
794
  lang,
771
795
  themes: {
@@ -775,12 +799,12 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
775
799
  });
776
800
  const codeMatch = html.match(/<code[^>]*>([\s\S]*?)<\/code>/);
777
801
  if (!codeMatch || !codeMatch[1]) {
778
- return content.split("\n").map(escapeHtml);
802
+ return lines.map(escapeHtml);
779
803
  }
780
804
  const highlightedContent = codeMatch[1];
781
805
  return highlightedContent.split("\n");
782
806
  } catch {
783
- return content.split("\n").map(escapeHtml);
807
+ return lines.map(escapeHtml);
784
808
  }
785
809
  }
786
810
  function escapeHtml(text) {
@@ -836,9 +860,14 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
836
860
  }
837
861
  }
838
862
  }
863
+ const limitedLines = linesToHighlight.slice(0, MAX_DIFF_HIGHLIGHT_LINES);
864
+ const overflowLines = linesToHighlight.slice(MAX_DIFF_HIGHLIGHT_LINES);
865
+ for (const { key, content } of overflowLines) {
866
+ newHighlighted.set(key, escapeHtml(content));
867
+ }
839
868
  const batchSize = 50;
840
- for (let i = 0; i < linesToHighlight.length; i += batchSize) {
841
- const batch = linesToHighlight.slice(i, i + batchSize);
869
+ for (let i = 0; i < limitedLines.length; i += batchSize) {
870
+ const batch = limitedLines.slice(i, i + batchSize);
842
871
  const results = await Promise.all(
843
872
  batch.map(async ({ key, content }) => {
844
873
  const result = await highlightLine(content, lang);
@@ -862,21 +891,21 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
862
891
  return "context";
863
892
  }
864
893
  return (_ctx, _push, _parent, _attrs) => {
865
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "diff-viewer" }, _attrs))} data-v-8fd455b9>`);
894
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "diff-viewer" }, _attrs))} data-v-a5da7e6e>`);
866
895
  if ((unref(isLoading) || __props.isLoadingContent || unref(isLoadingFullFile)) && !__props.binary) {
867
- _push(`<div class="flex items-center justify-center py-8" data-v-8fd455b9><div class="size-6 animate-spin rounded-full border-2 border-primary border-t-transparent" data-v-8fd455b9></div></div>`);
896
+ _push(`<div class="flex items-center justify-center py-8" data-v-a5da7e6e><div class="size-6 animate-spin rounded-full border-2 border-primary border-t-transparent" data-v-a5da7e6e></div></div>`);
868
897
  } else if (__props.binary) {
869
- _push(`<div class="flex flex-col items-center justify-center gap-3 py-12 text-muted-foreground" data-v-8fd455b9>`);
898
+ _push(`<div class="flex flex-col items-center justify-center gap-3 py-12 text-muted-foreground" data-v-a5da7e6e>`);
870
899
  _push(ssrRenderComponent(unref(FileWarning), { class: "size-10 opacity-50" }, null, _parent));
871
- _push(`<div class="text-center" data-v-8fd455b9><p class="font-medium" data-v-8fd455b9>Binary file</p><p class="text-sm" data-v-8fd455b9>This file cannot be displayed as a diff</p></div></div>`);
900
+ _push(`<div class="text-center" data-v-a5da7e6e><p class="font-medium" data-v-a5da7e6e>Binary file</p><p class="text-sm" data-v-a5da7e6e>This file cannot be displayed as a diff</p></div></div>`);
872
901
  } else if (unref(isEmpty) && !__props.showFullFile) {
873
- _push(`<div class="flex flex-col items-center justify-center gap-3 py-12 text-muted-foreground" data-v-8fd455b9>`);
902
+ _push(`<div class="flex flex-col items-center justify-center gap-3 py-12 text-muted-foreground" data-v-a5da7e6e>`);
874
903
  _push(ssrRenderComponent(unref(AlertTriangle), { class: "size-10 opacity-50" }, null, _parent));
875
- _push(`<div class="text-center" data-v-8fd455b9><p class="font-medium" data-v-8fd455b9>No changes</p><p class="text-sm" data-v-8fd455b9>This file was touched but has no content changes</p></div></div>`);
904
+ _push(`<div class="text-center" data-v-a5da7e6e><p class="font-medium" data-v-a5da7e6e>No changes</p><p class="text-sm" data-v-a5da7e6e>This file was touched but has no content changes</p></div></div>`);
876
905
  } else if (unref(isLargeFile) && !unref(showAll) && !__props.showFullFile) {
877
- _push(`<div class="diff-container" data-v-8fd455b9><div class="flex flex-col items-center justify-center gap-3 border-b border-border bg-muted/30 py-6" data-v-8fd455b9>`);
906
+ _push(`<div class="diff-container" data-v-a5da7e6e><div class="flex flex-col items-center justify-center gap-3 border-b border-border bg-muted/30 py-6" data-v-a5da7e6e>`);
878
907
  _push(ssrRenderComponent(unref(AlertTriangle), { class: "size-8 text-yellow-500" }, null, _parent));
879
- _push(`<div class="text-center" data-v-8fd455b9><p class="font-medium" data-v-8fd455b9>Large file</p><p class="text-sm text-muted-foreground" data-v-8fd455b9> This file has ${ssrInterpolate(unref(totalLines).toLocaleString())} lines (threshold: ${ssrInterpolate(LINE_LIMIT.toLocaleString())}) </p></div>`);
908
+ _push(`<div class="text-center" data-v-a5da7e6e><p class="font-medium" data-v-a5da7e6e>Large file</p><p class="text-sm text-muted-foreground" data-v-a5da7e6e> This file has ${ssrInterpolate(unref(totalLines).toLocaleString())} lines (threshold: ${ssrInterpolate(LINE_LIMIT.toLocaleString())}) </p></div>`);
880
909
  _push(ssrRenderComponent(unref(Button), {
881
910
  variant: "outline",
882
911
  size: "sm",
@@ -897,15 +926,15 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
897
926
  }, _parent));
898
927
  _push(`</div></div>`);
899
928
  } else if (__props.showFullFile && __props.fileContent) {
900
- _push(`<div class="diff-container" data-v-8fd455b9><div class="full-file-view" data-v-8fd455b9><!--[-->`);
929
+ _push(`<div class="diff-container" data-v-a5da7e6e><div class="full-file-view" data-v-a5da7e6e><!--[-->`);
901
930
  ssrRenderList(unref(fullFileLines), (line, index) => {
902
931
  _push(`<div class="${ssrRenderClass([{
903
932
  "diff-add": getFullFileLineType(index + 1) === "add"
904
- }, "full-file-line"])}" data-v-8fd455b9><div class="diff-gutter" data-v-8fd455b9><span class="line-number" data-v-8fd455b9>${ssrInterpolate(index + 1)}</span></div><div class="diff-content" data-v-8fd455b9><span class="diff-code" data-v-8fd455b9>${(unref(highlightedFullFile)[index] || escapeHtml(line)) ?? ""}</span></div></div>`);
933
+ }, "full-file-line"])}" data-v-a5da7e6e><div class="diff-gutter" data-v-a5da7e6e><span class="line-number" data-v-a5da7e6e>${ssrInterpolate(index + 1)}</span></div><div class="diff-content" data-v-a5da7e6e><span class="diff-code" data-v-a5da7e6e>${(unref(highlightedFullFile)[index] || escapeHtml(line)) ?? ""}</span></div></div>`);
905
934
  });
906
935
  _push(`<!--]--></div></div>`);
907
936
  } else {
908
- _push(`<div class="diff-container" data-v-8fd455b9><div class="diff-toolbar" data-v-8fd455b9>`);
937
+ _push(`<div class="diff-container" data-v-a5da7e6e><div class="diff-toolbar" data-v-a5da7e6e>`);
909
938
  _push(ssrRenderComponent(unref(Button), {
910
939
  variant: "ghost",
911
940
  size: "sm",
@@ -925,25 +954,25 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
925
954
  }),
926
955
  _: 1
927
956
  }, _parent));
928
- _push(`</div><div class="diff-split" data-v-8fd455b9><div class="diff-column diff-column-left" data-v-8fd455b9><div class="diff-column-content" data-v-8fd455b9><!--[-->`);
957
+ _push(`</div><div class="diff-split" data-v-a5da7e6e><div class="diff-column diff-column-left" data-v-a5da7e6e><div class="diff-column-content" data-v-a5da7e6e><!--[-->`);
929
958
  ssrRenderList(unref(displayItems), (item) => {
930
959
  _push(`<!--[-->`);
931
960
  if (item.type === "separator") {
932
- _push(`<div class="diff-separator-half" data-v-8fd455b9><div class="separator-line" data-v-8fd455b9></div><span class="separator-text" data-v-8fd455b9>···</span></div>`);
961
+ _push(`<div class="diff-separator-half" data-v-a5da7e6e><div class="separator-line" data-v-a5da7e6e></div><span class="separator-text" data-v-a5da7e6e>···</span></div>`);
933
962
  } else if (item.pair) {
934
963
  _push(`<div class="${ssrRenderClass([{
935
964
  "diff-remove": item.pair.left.type === "remove",
936
965
  "diff-empty": item.pair.left.type === "empty",
937
966
  "diff-context": item.pair.left.type === "context"
938
- }, "diff-line"])}" data-v-8fd455b9><div class="diff-gutter" data-v-8fd455b9>`);
967
+ }, "diff-line"])}" data-v-a5da7e6e><div class="diff-gutter" data-v-a5da7e6e>`);
939
968
  if (item.pair.left.lineNum) {
940
- _push(`<span class="line-number" data-v-8fd455b9>${ssrInterpolate(item.pair.left.lineNum)}</span>`);
969
+ _push(`<span class="line-number" data-v-a5da7e6e>${ssrInterpolate(item.pair.left.lineNum)}</span>`);
941
970
  } else {
942
971
  _push(`<!---->`);
943
972
  }
944
- _push(`</div><div class="diff-content" data-v-8fd455b9>`);
973
+ _push(`</div><div class="diff-content" data-v-a5da7e6e>`);
945
974
  if (item.pair.left.type !== "empty") {
946
- _push(`<span class="diff-code" data-v-8fd455b9>${(getHighlightedContent(item.pair.id, "old") || escapeHtml(item.pair.left.content)) ?? ""}</span>`);
975
+ _push(`<span class="diff-code" data-v-a5da7e6e>${(getHighlightedContent(item.pair.id, "old") || escapeHtml(item.pair.left.content)) ?? ""}</span>`);
947
976
  } else {
948
977
  _push(`<!---->`);
949
978
  }
@@ -953,25 +982,25 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
953
982
  }
954
983
  _push(`<!--]-->`);
955
984
  });
956
- _push(`<!--]--></div></div><div class="diff-column diff-column-right" data-v-8fd455b9><div class="diff-column-content" data-v-8fd455b9><!--[-->`);
985
+ _push(`<!--]--></div></div><div class="diff-column diff-column-right" data-v-a5da7e6e><div class="diff-column-content" data-v-a5da7e6e><!--[-->`);
957
986
  ssrRenderList(unref(displayItems), (item) => {
958
987
  _push(`<!--[-->`);
959
988
  if (item.type === "separator") {
960
- _push(`<div class="diff-separator-half" data-v-8fd455b9><span class="separator-text" data-v-8fd455b9>···</span><div class="separator-line" data-v-8fd455b9></div></div>`);
989
+ _push(`<div class="diff-separator-half" data-v-a5da7e6e><span class="separator-text" data-v-a5da7e6e>···</span><div class="separator-line" data-v-a5da7e6e></div></div>`);
961
990
  } else if (item.pair) {
962
991
  _push(`<div class="${ssrRenderClass([{
963
992
  "diff-add": item.pair.right.type === "add",
964
993
  "diff-empty": item.pair.right.type === "empty",
965
994
  "diff-context": item.pair.right.type === "context"
966
- }, "diff-line"])}" data-v-8fd455b9><div class="diff-gutter" data-v-8fd455b9>`);
995
+ }, "diff-line"])}" data-v-a5da7e6e><div class="diff-gutter" data-v-a5da7e6e>`);
967
996
  if (item.pair.right.lineNum) {
968
- _push(`<span class="line-number" data-v-8fd455b9>${ssrInterpolate(item.pair.right.lineNum)}</span>`);
997
+ _push(`<span class="line-number" data-v-a5da7e6e>${ssrInterpolate(item.pair.right.lineNum)}</span>`);
969
998
  } else {
970
999
  _push(`<!---->`);
971
1000
  }
972
- _push(`</div><div class="diff-content" data-v-8fd455b9>`);
1001
+ _push(`</div><div class="diff-content" data-v-a5da7e6e>`);
973
1002
  if (item.pair.right.type !== "empty") {
974
- _push(`<span class="diff-code" data-v-8fd455b9>${(getHighlightedContent(item.pair.id, "new") || escapeHtml(item.pair.right.content)) ?? ""}</span>`);
1003
+ _push(`<span class="diff-code" data-v-a5da7e6e>${(getHighlightedContent(item.pair.id, "new") || escapeHtml(item.pair.right.content)) ?? ""}</span>`);
975
1004
  } else {
976
1005
  _push(`<!---->`);
977
1006
  }
@@ -993,7 +1022,7 @@ _sfc_main$j.setup = (props, ctx) => {
993
1022
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/git/DiffViewer.vue");
994
1023
  return _sfc_setup$j ? _sfc_setup$j(props, ctx) : void 0;
995
1024
  };
996
- const __nuxt_component_1$2 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$j, [["__scopeId", "data-v-8fd455b9"]]), { __name: "GitDiffViewer" });
1025
+ const __nuxt_component_1$2 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$j, [["__scopeId", "data-v-a5da7e6e"]]), { __name: "GitDiffViewer" });
997
1026
  const _sfc_main$i = /* @__PURE__ */ defineComponent({
998
1027
  __name: "ScrollBar",
999
1028
  __ssrInlineRender: true,
@@ -3445,4 +3474,4 @@ _sfc_main.setup = (props, ctx) => {
3445
3474
  const __nuxt_component_1 = Object.assign(_sfc_main, { __name: "TasksDetail" });
3446
3475
 
3447
3476
  export { Badge as B, __nuxt_component_0$2 as _, __nuxt_component_1 as a };
3448
- //# sourceMappingURL=Detail-CUfU85GY.mjs.map
3477
+ //# sourceMappingURL=Detail-MGwP_u2d.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Detail-MGwP_u2d.mjs","sources":["../../../../node_modules/@dagrejs/dagre/dist/dagre.esm.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Detail-MGwP_u2d.js"],"names":[],"mappings":"","x_google_ignoreList":[0,1]}
@@ -0,0 +1,4 @@
1
+ const DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang = ".diff-viewer[data-v-a5da7e6e]{color:hsl(var(--foreground));font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,monospace;font-size:.8125rem;line-height:1.5}.diff-container[data-v-a5da7e6e]{overflow-x:auto}.diff-toolbar[data-v-a5da7e6e]{background:hsl(var(--muted)/.3);border-bottom:1px solid hsl(var(--border));display:flex;justify-content:flex-end;padding:.25rem .5rem}.diff-split[data-v-a5da7e6e]{display:flex;min-width:100%}.diff-column[data-v-a5da7e6e]{flex:1;min-width:0;overflow-x:auto}.diff-column-left[data-v-a5da7e6e]{border-right:1px solid hsl(var(--border))}.diff-column-content[data-v-a5da7e6e]{min-width:-moz-fit-content;min-width:fit-content}.diff-line[data-v-a5da7e6e]{display:flex}.diff-gutter[data-v-a5da7e6e]{background:hsl(var(--muted)/.3);color:hsl(var(--muted-foreground));flex-shrink:0;padding:0 .5rem;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:3.5rem}.line-number[data-v-a5da7e6e]{display:inline-block;min-width:2rem;opacity:.7}.diff-content[data-v-a5da7e6e]{color:hsl(var(--foreground));flex:1;min-width:0;padding:0 .5rem;white-space:pre}.diff-code[data-v-a5da7e6e]{color:inherit;display:inline}.diff-add[data-v-a5da7e6e]{background:#16a24926}.diff-add .diff-gutter[data-v-a5da7e6e]{background:#16a24940}.diff-remove[data-v-a5da7e6e]{background:#ef434326}.diff-remove .diff-gutter[data-v-a5da7e6e]{background:#ef434340}.diff-empty[data-v-a5da7e6e]{background:hsl(var(--muted)/.2)}.diff-empty .diff-gutter[data-v-a5da7e6e]{background:hsl(var(--muted)/.3)}.diff-context[data-v-a5da7e6e]{background:transparent}.full-file-view[data-v-a5da7e6e]{min-width:100%}.full-file-line[data-v-a5da7e6e]{display:flex}.full-file-line .diff-gutter[data-v-a5da7e6e]{width:4rem}.full-file-line.diff-add[data-v-a5da7e6e]{background:#16a24926}.full-file-line.diff-add .diff-gutter[data-v-a5da7e6e]{background:#16a24940}.dark .full-file-line.diff-add[data-v-a5da7e6e]{background:#16a2491a}.dark .full-file-line.diff-add .diff-gutter[data-v-a5da7e6e]{background:#16a24933}.diff-separator[data-v-a5da7e6e],.diff-separator-half[data-v-a5da7e6e]{align-items:center;background:hsl(var(--muted)/.4);display:flex;padding:.25rem 0}.separator-line[data-v-a5da7e6e]{background:hsl(var(--border));flex:1;height:1px}.separator-text[data-v-a5da7e6e]{color:hsl(var(--muted-foreground));font-size:.75rem;padding:0 .75rem}.dark .diff-add[data-v-a5da7e6e]{background:#16a2491a}.dark .diff-add .diff-gutter[data-v-a5da7e6e]{background:#16a24933}.dark .diff-remove[data-v-a5da7e6e]{background:#ef43431a}.dark .diff-remove .diff-gutter[data-v-a5da7e6e]{background:#ef434333}[data-v-a5da7e6e] .shiki span,[data-v-a5da7e6e] .shiki{background:transparent!important}";
2
+
3
+ export { DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang as D };
4
+ //# sourceMappingURL=DiffViewer-styles-1.mjs-BFsE2PCW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffViewer-styles-1.mjs-BFsE2PCW.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/DiffViewer-styles-1.mjs-BFsE2PCW.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}
@@ -0,0 +1,8 @@
1
+ import { D as DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang } from './DiffViewer-styles-1.mjs-BFsE2PCW.mjs';
2
+
3
+ const DiffViewerStyles_D2bqX3nK = [
4
+ DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang
5
+ ];
6
+
7
+ export { DiffViewerStyles_D2bqX3nK as default };
8
+ //# sourceMappingURL=DiffViewer-styles.D2bqX3nK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffViewer-styles.D2bqX3nK.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/DiffViewer-styles.D2bqX3nK.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}
@@ -0,0 +1,10 @@
1
+ import { D as DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang } from './DiffViewer-styles-1.mjs-BFsE2PCW.mjs';
2
+ import { D as DiffViewer_vue_vue_type_style_index_1_lang } from './DiffViewer-styles-2.mjs-X6QKNjM0.mjs';
3
+
4
+ const DiffViewerStyles_FoV36wuV = [
5
+ DiffViewer_vue_vue_type_style_index_0_scoped_a5da7e6e_lang,
6
+ DiffViewer_vue_vue_type_style_index_1_lang
7
+ ];
8
+
9
+ export { DiffViewerStyles_FoV36wuV as default };
10
+ //# sourceMappingURL=DiffViewer-styles.FoV36wuV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffViewer-styles.FoV36wuV.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/DiffViewer-styles.FoV36wuV.mjs"],"names":["style_0","style_1"],"mappings":"","x_google_ignoreList":[0]}
@@ -0,0 +1,8 @@
1
+ const Viewer_vue_vue_type_style_index_0_lang = ".prd-viewer .prose{--tw-prose-body:var(--foreground);--tw-prose-headings:var(--foreground);--tw-prose-links:var(--primary);--tw-prose-code:var(--foreground);--tw-prose-pre-bg:var(--muted);--tw-prose-quotes:var(--muted-foreground);--tw-prose-hr:var(--border)}.prd-viewer .prose h1,.prd-viewer .prose h2,.prd-viewer .prose h3,.prd-viewer .prose h4{font-weight:600;margin-bottom:.5em;margin-top:1.5em}.prd-viewer .prose h1{border-bottom:1px solid var(--border);font-size:1.875rem;padding-bottom:.5rem}.prd-viewer .prose h2{border-bottom:1px solid var(--border);font-size:1.5rem;padding-bottom:.25rem}.prd-viewer .prose h3{font-size:1.25rem}.prd-viewer .prose p{line-height:1.7;margin-bottom:.75em;margin-top:.75em}.prd-viewer .prose a{color:var(--primary);text-decoration:underline;text-underline-offset:2px}.prd-viewer .prose a:hover{opacity:.8}.prd-viewer .prose code:not(pre code){background:var(--muted);border-radius:.25rem;font-size:.875em;font-weight:500;padding:.125rem .375rem}.prd-viewer .prose pre{background:var(--muted);border-radius:.5rem;margin:1rem 0;overflow-x:auto;padding:1rem}.prd-viewer .prose pre.shiki{background-color:var(--muted)!important}.prd-viewer .prose .shiki code{background:transparent;font-size:.875rem;line-height:1.5;padding:0}.dark .prd-viewer .prose .shiki,.dark .prd-viewer .prose pre.shiki{background-color:var(--muted)!important}.dark .prd-viewer .prose .shiki.github-light,.light .prd-viewer .prose .shiki.github-dark,:not(.dark) .prd-viewer .prose .shiki.github-dark{display:none!important}.prd-viewer .prose table{border-collapse:collapse;margin:1rem 0;width:100%}.prd-viewer .prose td,.prd-viewer .prose th{border:1px solid var(--border);padding:.5rem .75rem;text-align:left}.prd-viewer .prose th{background:var(--muted);font-weight:600}.prd-viewer .prose tr:nth-child(2n){background:color-mix(in oklch,var(--muted) 30%,transparent)}.prd-viewer .prose ol,.prd-viewer .prose ul{margin:.75em 0;padding-left:1.5rem}.prd-viewer .prose li{margin:.25em 0}.prd-viewer .prose ul{list-style-type:disc}.prd-viewer .prose ol{list-style-type:decimal}.prd-viewer .prose input[type=checkbox]{margin-right:.5rem;pointer-events:none}.prd-viewer .prose blockquote{border-left:4px solid var(--border);color:var(--muted-foreground);font-style:italic;margin:1rem 0;padding-left:1rem}.prd-viewer .prose hr{border:none;border-top:1px solid var(--border);margin:2rem 0}.prd-viewer .prose img{border-radius:.5rem;height:auto;margin:1rem 0;max-width:100%}";
2
+
3
+ const ViewerStyles_D6wYWFb1 = [
4
+ Viewer_vue_vue_type_style_index_0_lang
5
+ ];
6
+
7
+ export { ViewerStyles_D6wYWFb1 as default };
8
+ //# sourceMappingURL=Viewer-styles.D6wYWFb1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Viewer-styles.D6wYWFb1.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Viewer-styles-1.mjs-D92u4Pso.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Viewer-styles.D6wYWFb1.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}
@@ -2,15 +2,15 @@ import { _ as __nuxt_component_0$2 } from './nuxt-link-SvT1nf8Z.mjs';
2
2
  import { defineComponent, computed, ref, watch, inject, mergeProps, unref, withCtx, createVNode, createTextVNode, isRef, openBlock, createBlock, toDisplayString, createCommentVNode, renderSlot, resolveDynamicComponent, useSSRContext } from 'vue';
3
3
  import { ssrRenderAttrs, ssrRenderComponent, ssrInterpolate, ssrRenderAttr, ssrRenderSlot, ssrRenderList, ssrRenderClass, ssrRenderVNode } from 'vue/server-renderer';
4
4
  import { Loader2, AlertCircle, RefreshCw, FileText, LayoutGrid, GitBranch, User, Calendar, CircleDot, ExternalLink, Circle, CheckCircle2, PlayCircle, Minus, ArrowDown, ArrowUp } from 'lucide-vue-next';
5
- import { _ as __nuxt_component_0$2$1, a as __nuxt_component_1$1, B as Badge } from './Detail-CUfU85GY.mjs';
5
+ import { _ as __nuxt_component_0$2$1, a as __nuxt_component_1$1, B as Badge } from './Detail-MGwP_u2d.mjs';
6
6
  import { marked } from 'marked';
7
7
  import { codeToHtml } from 'shiki';
8
8
  import DOMPurify from 'dompurify';
9
- import { u as useRepos, a as usePrd, b as useToast, c as cn } from './usePrd-SqcxGyFU.mjs';
9
+ import { u as useRepos, a as usePrd, b as useToast, c as cn } from './usePrd-f7ylhIqs.mjs';
10
10
  import { _ as _export_sfc } from './_plugin-vue_export-helper-1tPrXgE0.mjs';
11
11
  import { reactiveOmit } from '@vueuse/core';
12
12
  import { useForwardPropsEmits, TabsRoot, TabsList as TabsList$1, useForwardProps, TabsTrigger as TabsTrigger$1, TabsContent as TabsContent$1 } from 'reka-ui';
13
- import { B as Button } from './index-CckL_NBD.mjs';
13
+ import { B as Button } from './index-ByZO4Bvq.mjs';
14
14
  import { b as useRoute, a as useRouter } from './server.mjs';
15
15
  import '../nitro/nitro.mjs';
16
16
  import 'node:http';
@@ -20,12 +20,12 @@ import 'node:buffer';
20
20
  import 'node:fs';
21
21
  import 'node:path';
22
22
  import 'node:crypto';
23
- import 'node:os';
24
23
  import 'node:url';
24
+ import 'node:os';
25
+ import 'zod';
25
26
  import '@vue-flow/background';
26
27
  import '@vue-flow/controls';
27
28
  import '@vue-flow/core';
28
- import 'shiki/bundle/full';
29
29
  import 'class-variance-authority';
30
30
  import 'clsx';
31
31
  import 'tailwind-merge';
@@ -184,13 +184,16 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
184
184
  return DOMPurify.sanitize(html, purifyConfig);
185
185
  }
186
186
  watch(() => props.content, async (newContent) => {
187
- if (newContent) {
188
- isLoading.value = true;
189
- try {
190
- renderedHtml.value = await renderMarkdown(newContent);
191
- } finally {
192
- isLoading.value = false;
193
- }
187
+ if (!newContent) {
188
+ renderedHtml.value = "";
189
+ isLoading.value = false;
190
+ return;
191
+ }
192
+ isLoading.value = true;
193
+ try {
194
+ renderedHtml.value = await renderMarkdown(newContent);
195
+ } finally {
196
+ isLoading.value = false;
194
197
  }
195
198
  }, { immediate: true });
196
199
  return (_ctx, _push, _parent, _attrs) => {
@@ -904,6 +907,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
904
907
  }
905
908
  return null;
906
909
  }
910
+ function getStatusCode(error2) {
911
+ const fetchError = error2;
912
+ return fetchError.statusCode ?? fetchError.status;
913
+ }
914
+ function getErrorMessage(error2, fallback) {
915
+ const fetchError = error2;
916
+ return fetchError.data?.message || fetchError.statusMessage || fetchError.message || fallback;
917
+ }
907
918
  const route = useRoute();
908
919
  const router = useRouter();
909
920
  const { selectRepo } = useRepos();
@@ -955,9 +966,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
955
966
  if (Object.prototype.hasOwnProperty.call(tasksByPrd.value, slug)) {
956
967
  return tasksByPrd.value[slug] ?? null;
957
968
  }
958
- const tasks = await fetchTasks(slug);
959
- cacheTasksForPrd(slug, tasks);
960
- return tasks;
969
+ try {
970
+ const tasks = await fetchTasks(slug);
971
+ cacheTasksForPrd(slug, tasks);
972
+ return tasks;
973
+ } catch (error2) {
974
+ showError("Failed to load tasks", getErrorMessage(error2, `Could not load tasks for ${slug}.`));
975
+ return null;
976
+ }
961
977
  }
962
978
  function buildBaseQuery() {
963
979
  const query = {};
@@ -999,7 +1015,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
999
1015
  detailOpen.value = true;
1000
1016
  selectedTaskCommits.value = [];
1001
1017
  await syncTaskQuery(task.id, sourcePrdSlug);
1002
- selectedTaskCommits.value = await fetchTaskCommits(sourcePrdSlug, task.id);
1018
+ try {
1019
+ selectedTaskCommits.value = await fetchTaskCommits(sourcePrdSlug, task.id);
1020
+ } catch (error2) {
1021
+ selectedTaskCommits.value = [];
1022
+ showError("Failed to load commits", getErrorMessage(error2, "Could not resolve commits for this task."));
1023
+ }
1003
1024
  }
1004
1025
  async function syncTaskDetailFromRoute() {
1005
1026
  const selection = routeTaskSelection.value;
@@ -1026,7 +1047,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1026
1047
  selectedTaskPrdSlug.value = selection.prdSlug;
1027
1048
  detailOpen.value = true;
1028
1049
  if (!isSameTask) {
1029
- selectedTaskCommits.value = await fetchTaskCommits(selection.prdSlug, task.id);
1050
+ try {
1051
+ selectedTaskCommits.value = await fetchTaskCommits(selection.prdSlug, task.id);
1052
+ } catch (error2) {
1053
+ selectedTaskCommits.value = [];
1054
+ showError("Failed to load commits", getErrorMessage(error2, "Could not resolve commits for this task."));
1055
+ }
1030
1056
  }
1031
1057
  }
1032
1058
  const taskTitles = computed(() => {
@@ -1045,19 +1071,33 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1045
1071
  });
1046
1072
  const fileChangeEvent = inject("fileChangeEvent", ref(null));
1047
1073
  async function loadDocument() {
1048
- const doc = await fetchDocument(prdSlug.value);
1049
- if (doc) {
1050
- document.value = doc;
1074
+ try {
1075
+ const doc = await fetchDocument(prdSlug.value);
1076
+ if (doc) {
1077
+ document.value = doc;
1078
+ error.value = null;
1079
+ }
1080
+ } catch (err) {
1081
+ const statusCode = getStatusCode(err);
1082
+ if (statusCode === 404) {
1083
+ error.value = `PRD "${prdSlug.value}" not found in this repository.`;
1084
+ return;
1085
+ }
1086
+ showError("Failed to reload PRD", getErrorMessage(err, "Could not refresh the PRD document."));
1051
1087
  }
1052
1088
  }
1053
1089
  async function loadTasksAndProgress() {
1054
- const [tasks, progress] = await Promise.all([
1055
- fetchTasks(prdSlug.value),
1056
- fetchProgress(prdSlug.value)
1057
- ]);
1058
- tasksFile.value = tasks;
1059
- progressFile.value = progress;
1060
- cacheTasksForPrd(prdSlug.value, tasks);
1090
+ try {
1091
+ const [tasks, progress] = await Promise.all([
1092
+ fetchTasks(prdSlug.value),
1093
+ fetchProgress(prdSlug.value)
1094
+ ]);
1095
+ tasksFile.value = tasks;
1096
+ progressFile.value = progress;
1097
+ cacheTasksForPrd(prdSlug.value, tasks);
1098
+ } catch (err) {
1099
+ showError("Failed to refresh task state", getErrorMessage(err, "Could not refresh tasks and progress."));
1100
+ }
1061
1101
  }
1062
1102
  async function loadGraph(force = false) {
1063
1103
  graphLoading.value = true;
@@ -1072,6 +1112,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1072
1112
  }
1073
1113
  prdGraph.value = graph;
1074
1114
  graphError.value = null;
1115
+ } catch (err) {
1116
+ graphError.value = getErrorMessage(err, "Failed to load PRD graph.");
1075
1117
  } finally {
1076
1118
  graphLoading.value = false;
1077
1119
  }
@@ -1109,15 +1151,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1109
1151
  await ensureGraphLoaded();
1110
1152
  await syncTaskDetailFromRoute();
1111
1153
  } catch (err) {
1112
- const fetchErr = err;
1113
- if (fetchErr.statusCode === 404) {
1154
+ const statusCode = getStatusCode(err);
1155
+ if (statusCode === 404) {
1114
1156
  error.value = `PRD "${prdSlug.value}" not found. Check if the file exists in docs/prd/.`;
1115
- } else if (fetchErr.statusCode === 500) {
1157
+ } else if (statusCode === 500) {
1116
1158
  error.value = "Server error while loading the PRD. Check the file format.";
1117
- showError("Server error", fetchErr.data?.message || "Failed to read PRD file");
1159
+ showError("Server error", getErrorMessage(err, "Failed to read PRD file"));
1118
1160
  } else {
1119
1161
  error.value = "Failed to load PRD document. Please try again.";
1120
- showError("Load failed", "Could not fetch the PRD document");
1162
+ showError("Load failed", getErrorMessage(err, "Could not fetch the PRD document"));
1121
1163
  }
1122
1164
  } finally {
1123
1165
  isLoading.value = false;
@@ -1593,4 +1635,4 @@ _sfc_main.setup = (props, ctx) => {
1593
1635
  };
1594
1636
 
1595
1637
  export { _sfc_main as default };
1596
- //# sourceMappingURL=_prd_-CeVnQzOV.mjs.map
1638
+ //# sourceMappingURL=_prd_-C-Aj4fVa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_prd_-C-Aj4fVa.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_prd_-C-Aj4fVa.js"],"names":["__nuxt_component_0$3"],"mappings":"","x_google_ignoreList":[0]}