@nextop-os/workspace-issue-manager 0.0.25 → 0.0.27

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.
@@ -25,7 +25,7 @@ import {
25
25
  toContextRefInput,
26
26
  toIssueManagerWorkspaceFileLinkInput,
27
27
  uniqueIssueManagerFileReferences
28
- } from "./chunk-UZEH5YBL.js";
28
+ } from "./chunk-LJQG24Y2.js";
29
29
  import {
30
30
  appendIssueManagerWorkspaceFileLinksToContent,
31
31
  clampIssueManagerSidebarWidth,
@@ -36,7 +36,7 @@ import {
36
36
  issueManagerSidebarMinWidth,
37
37
  normalizeIssueManagerContent,
38
38
  shouldAutoCollapseIssueManagerSidebar
39
- } from "./chunk-QW2WQXOG.js";
39
+ } from "./chunk-MCVRP7RR.js";
40
40
 
41
41
  // src/ui/react/internal/shell/IssueManagerNodeState.ts
42
42
  import { useEffect, useEffectEvent, useState } from "react";
@@ -1402,6 +1402,10 @@ function useIssueManagerNodeView({
1402
1402
 
1403
1403
  // src/ui/react/internal/reference/useIssueManagerReferencePickerView.ts
1404
1404
  import { useEffect as useEffect3, useEffectEvent as useEffectEvent2, useMemo as useMemo3, useState as useState2 } from "react";
1405
+ import {
1406
+ createWorkspaceFilePreviewLoadedState,
1407
+ resolveWorkspaceFilePreviewReadiness
1408
+ } from "@nextop-os/workspace-file-preview";
1405
1409
  var defaultDirectoryPath = "/";
1406
1410
  function useIssueManagerReferencePickerView({
1407
1411
  fileAdapter,
@@ -1420,6 +1424,7 @@ function useIssueManagerReferencePickerView({
1420
1424
  const [selectedRefs, setSelectedRefs] = useState2(
1421
1425
  []
1422
1426
  );
1427
+ const [previewState, setPreviewState] = useState2({ status: "empty" });
1423
1428
  const supportsSearch = hasFileAdapterMethod2(fileAdapter, "searchReferences");
1424
1429
  const supportsTreeSnapshot = hasFileAdapterMethod2(
1425
1430
  fileAdapter,
@@ -1579,6 +1584,73 @@ function useIssueManagerReferencePickerView({
1579
1584
  });
1580
1585
  }, [open, visibleEntries]);
1581
1586
  const focusedEntry = visibleEntries.find((entry) => entry.path === focusedPath) ?? selectedRefs.find((entry) => entry.path === focusedPath) ?? null;
1587
+ useEffect3(() => {
1588
+ if (!open || !focusedEntry) {
1589
+ setPreviewState({ status: "empty" });
1590
+ return;
1591
+ }
1592
+ const readiness = resolveWorkspaceFilePreviewReadiness(focusedEntry);
1593
+ if (readiness.status === "directory") {
1594
+ setPreviewState({ reference: focusedEntry, status: "directory" });
1595
+ return;
1596
+ }
1597
+ if (readiness.status === "unsupported") {
1598
+ setPreviewState({ reference: focusedEntry, status: "unsupported" });
1599
+ return;
1600
+ }
1601
+ if (readiness.status === "readonly") {
1602
+ setPreviewState({
1603
+ maxSizeBytes: readiness.maxSizeBytes,
1604
+ reason: readiness.reason,
1605
+ reference: focusedEntry,
1606
+ status: "readonly"
1607
+ });
1608
+ return;
1609
+ }
1610
+ if (!fileAdapter?.readReferencePreview) {
1611
+ setPreviewState({ reference: focusedEntry, status: "unavailable" });
1612
+ return;
1613
+ }
1614
+ const previewTarget = readiness.target;
1615
+ let canceled = false;
1616
+ let objectUrl = null;
1617
+ setPreviewState({ reference: focusedEntry, status: "loading" });
1618
+ const load = async () => {
1619
+ try {
1620
+ const preview = await fileAdapter.readReferencePreview?.({
1621
+ reference: focusedEntry,
1622
+ workspaceId
1623
+ });
1624
+ if (canceled) {
1625
+ return;
1626
+ }
1627
+ if (!preview) {
1628
+ setPreviewState({ reference: focusedEntry, status: "unsupported" });
1629
+ return;
1630
+ }
1631
+ const nextState = createReferencePreviewState(
1632
+ focusedEntry,
1633
+ previewTarget,
1634
+ preview
1635
+ );
1636
+ if (nextState.status === "image") {
1637
+ objectUrl = nextState.objectUrl;
1638
+ }
1639
+ setPreviewState(nextState);
1640
+ } catch {
1641
+ if (!canceled) {
1642
+ setPreviewState({ reference: focusedEntry, status: "error" });
1643
+ }
1644
+ }
1645
+ };
1646
+ void load();
1647
+ return () => {
1648
+ canceled = true;
1649
+ if (objectUrl) {
1650
+ URL.revokeObjectURL(objectUrl);
1651
+ }
1652
+ };
1653
+ }, [fileAdapter, focusedEntry, open, workspaceId]);
1582
1654
  const toggleRef = (ref) => {
1583
1655
  setSelectedRefs((current) => {
1584
1656
  const existing = current.some((item) => item.path === ref.path);
@@ -1645,6 +1717,7 @@ function useIssueManagerReferencePickerView({
1645
1717
  focusedPath,
1646
1718
  isLoading,
1647
1719
  mode,
1720
+ previewState,
1648
1721
  searchQuery,
1649
1722
  selectedRefs,
1650
1723
  visibleEntries,
@@ -1654,6 +1727,41 @@ function useIssueManagerReferencePickerView({
1654
1727
  toggleRef
1655
1728
  };
1656
1729
  }
1730
+ function createReferencePreviewState(reference, target, preview) {
1731
+ const loadedState = createWorkspaceFilePreviewLoadedState({
1732
+ bytes: preview.bytes,
1733
+ contentType: preview.contentType,
1734
+ entry: reference,
1735
+ target: {
1736
+ ...target,
1737
+ fileKind: preview.kind
1738
+ }
1739
+ });
1740
+ if (loadedState.status === "image") {
1741
+ return {
1742
+ objectUrl: URL.createObjectURL(
1743
+ new Blob([loadedState.bytes], {
1744
+ type: loadedState.contentType
1745
+ })
1746
+ ),
1747
+ reference,
1748
+ status: "image"
1749
+ };
1750
+ }
1751
+ if (loadedState.status === "text") {
1752
+ return {
1753
+ content: loadedState.content,
1754
+ reference,
1755
+ status: "text"
1756
+ };
1757
+ }
1758
+ return {
1759
+ maxSizeBytes: loadedState.maxSizeBytes,
1760
+ reason: loadedState.reason,
1761
+ reference,
1762
+ status: "readonly"
1763
+ };
1764
+ }
1657
1765
  function hasFileAdapterMethod2(fileAdapter, methodName) {
1658
1766
  return typeof Reflect.get(fileAdapter ?? {}, methodName) === "function";
1659
1767
  }
@@ -1678,13 +1786,15 @@ import {
1678
1786
  Badge,
1679
1787
  Button as Button2,
1680
1788
  FileIcon as FileIcon2,
1681
- FolderFilledIcon as FolderFilledIcon2
1789
+ FolderFilledIcon as FolderFilledIcon2,
1790
+ LoadingIcon
1682
1791
  } from "@nextop-os/ui-system";
1792
+ import { formatWorkspacePreviewByteLimit } from "@nextop-os/workspace-file-preview";
1793
+ import { WorkspaceFilePreviewSurface as SharedWorkspaceFilePreviewSurface } from "@nextop-os/workspace-file-preview/react";
1683
1794
 
1684
1795
  // src/ui/internal/reference/IssueManagerReferencePickerTree.tsx
1685
1796
  import { useEffect as useEffect4, useState as useState3 } from "react";
1686
1797
  import {
1687
- AddIcon,
1688
1798
  ArrowRightIcon,
1689
1799
  Button,
1690
1800
  CheckIcon,
@@ -1696,6 +1806,7 @@ import {
1696
1806
  Spinner,
1697
1807
  cn
1698
1808
  } from "@nextop-os/ui-system";
1809
+ import { AddIcon as AddLinedIcon } from "@nextop-os/ui-system/icons";
1699
1810
  import { jsx, jsxs } from "react/jsx-runtime";
1700
1811
  var issueManagerReferenceTreeIndent = 24;
1701
1812
  var issueManagerReferenceTreeCollapseDurationMs = 200;
@@ -1885,7 +1996,7 @@ function IssueManagerReferencePickerTreeEntry({
1885
1996
  onFocusPath(entry.path);
1886
1997
  onToggleRef(entry);
1887
1998
  },
1888
- children: selected ? /* @__PURE__ */ jsx(CheckIcon, { size: 14 }) : /* @__PURE__ */ jsx(AddIcon, { size: 16 })
1999
+ children: selected ? /* @__PURE__ */ jsx(CheckIcon, { size: 14 }) : /* @__PURE__ */ jsx(AddLinedIcon, { size: 16 })
1889
2000
  }
1890
2001
  )
1891
2002
  ]
@@ -1896,7 +2007,8 @@ function IssueManagerReferencePickerTreeEntry({
1896
2007
  {
1897
2008
  className: cn(
1898
2009
  "grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none",
1899
- expanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
2010
+ expanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]",
2011
+ childContent && "mt-[2px]"
1900
2012
  ),
1901
2013
  children: /* @__PURE__ */ jsx(
1902
2014
  "div",
@@ -1957,7 +2069,7 @@ function IssueManagerReferencePickerSearchEntry({
1957
2069
  onFocusPath(entry.path);
1958
2070
  onToggleRef(entry);
1959
2071
  },
1960
- children: selected ? /* @__PURE__ */ jsx(CheckIcon, { size: 14 }) : /* @__PURE__ */ jsx(AddIcon, { size: 16 })
2072
+ children: selected ? /* @__PURE__ */ jsx(CheckIcon, { size: 14 }) : /* @__PURE__ */ jsx(AddLinedIcon, { size: 16 })
1961
2073
  }
1962
2074
  )
1963
2075
  ]
@@ -1979,19 +2091,123 @@ var issueManagerReferencePickerSelectedBadgeClassName = "max-w-[14rem] rounded-[
1979
2091
  function IssueManagerReferencePickerPreviewPane({
1980
2092
  copy,
1981
2093
  focusedEntry,
1982
- mode
2094
+ mode,
2095
+ previewState
1983
2096
  }) {
1984
2097
  return /* @__PURE__ */ jsx2("aside", { className: "flex shrink-0 flex-col border-t border-[var(--line-1)] bg-[var(--background-fronted)] lg:min-h-0 lg:flex-1 lg:border-t-0", children: /* @__PURE__ */ jsx2("div", { className: "flex min-h-0 flex-1 flex-col px-4 py-4 sm:px-5 lg:py-5", children: focusedEntry ? /* @__PURE__ */ jsxs2("div", { className: "flex min-h-0 flex-col gap-4 lg:flex-1 lg:gap-5", children: [
1985
- /* @__PURE__ */ jsxs2("div", { className: "flex min-h-32 flex-col items-center justify-center space-y-4 rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] px-5 py-8 text-center sm:min-h-40 sm:py-10 lg:min-h-56 lg:py-14", children: [
1986
- focusedEntry.kind === "folder" ? /* @__PURE__ */ jsx2(FolderFilledIcon2, { className: "mx-auto size-9 text-[var(--rich-text-folder)]" }) : /* @__PURE__ */ jsx2(FileIcon2, { className: "mx-auto size-9 text-[var(--text-tertiary)]" }),
1987
- /* @__PURE__ */ jsx2("p", { className: "mx-auto max-w-[24ch] text-sm leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]", children: focusedEntry.kind === "folder" ? focusedEntry.path : resolveIssueManagerReferenceLabel(focusedEntry) })
1988
- ] }),
2098
+ /* @__PURE__ */ jsx2(
2099
+ IssueManagerReferencePreviewSurface,
2100
+ {
2101
+ copy,
2102
+ focusedEntry,
2103
+ previewState
2104
+ }
2105
+ ),
1989
2106
  /* @__PURE__ */ jsx2("div", { className: "space-y-2 lg:space-y-3", children: /* @__PURE__ */ jsxs2("div", { className: "space-y-1.5", children: [
1990
2107
  /* @__PURE__ */ jsx2("p", { className: "truncate text-[15px] font-semibold text-[var(--text-primary)]", children: resolveIssueManagerReferenceLabel(focusedEntry) }),
1991
2108
  /* @__PURE__ */ jsx2("p", { className: "line-clamp-3 text-sm text-[var(--text-secondary)] [overflow-wrap:anywhere]", children: focusedEntry.path })
1992
2109
  ] }) })
1993
2110
  ] }) : /* @__PURE__ */ jsx2(IssueManagerReferencePickerFeedback2, { children: mode === "search" ? copy.t("referencePicker.emptySearch") : copy.t("referencePicker.emptyDirectory") }) }) });
1994
2111
  }
2112
+ function IssueManagerReferencePreviewSurface({
2113
+ copy,
2114
+ focusedEntry,
2115
+ previewState
2116
+ }) {
2117
+ return /* @__PURE__ */ jsx2(
2118
+ SharedWorkspaceFilePreviewSurface,
2119
+ {
2120
+ directoryMessage: copy.t("referencePicker.previewFolder"),
2121
+ emptyMessage: copy.t("referencePicker.previewUnavailable"),
2122
+ frameClassName: "flex min-h-32 flex-col items-center justify-center overflow-hidden rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] px-5 py-8 text-center sm:min-h-40 sm:py-10 lg:min-h-56 lg:py-14",
2123
+ imageAlt: resolveIssueManagerReferenceLabel,
2124
+ imageFrameClassName: "p-4",
2125
+ loadingIndicator: /* @__PURE__ */ jsx2("span", { className: "mx-auto grid size-11 place-items-center rounded-[6px] bg-[var(--transparency-block)]", children: /* @__PURE__ */ jsx2(LoadingIcon, { className: "size-4 animate-spin" }) }),
2126
+ loadingMessage: copy.t("referencePicker.previewLoading"),
2127
+ messageClassName: "mx-auto max-w-[24ch] text-sm leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]",
2128
+ renderIcon: (entry) => entry.kind === "folder" ? /* @__PURE__ */ jsx2(FolderFilledIcon2, { className: "mx-auto size-9 text-[var(--rich-text-folder)]" }) : /* @__PURE__ */ jsx2(FileIcon2, { className: "mx-auto size-9 text-[var(--text-tertiary)]" }),
2129
+ state: resolveIssueManagerReferenceSurfaceState(
2130
+ copy,
2131
+ focusedEntry,
2132
+ previewState
2133
+ ),
2134
+ textClassName: "h-full overflow-auto p-4 text-left text-xs leading-5 whitespace-pre-wrap break-words text-[var(--text-primary)]",
2135
+ textFrameClassName: "items-stretch justify-stretch"
2136
+ }
2137
+ );
2138
+ }
2139
+ function resolveIssueManagerReferenceSurfaceState(copy, focusedEntry, previewState) {
2140
+ if (focusedEntry.kind === "folder") {
2141
+ return {
2142
+ entry: focusedEntry,
2143
+ status: "directory"
2144
+ };
2145
+ }
2146
+ if (!("reference" in previewState) || previewState.reference.path !== focusedEntry.path) {
2147
+ return {
2148
+ entry: focusedEntry,
2149
+ message: focusedEntry.path,
2150
+ status: "unsupported"
2151
+ };
2152
+ }
2153
+ switch (previewState.status) {
2154
+ case "loading":
2155
+ case "image":
2156
+ case "text":
2157
+ return {
2158
+ ...previewState,
2159
+ entry: focusedEntry
2160
+ };
2161
+ case "readonly":
2162
+ return {
2163
+ entry: focusedEntry,
2164
+ message: resolveIssueManagerReferencePreviewReadonlyMessage(
2165
+ copy,
2166
+ previewState
2167
+ ),
2168
+ status: "readonly"
2169
+ };
2170
+ case "error":
2171
+ return {
2172
+ entry: focusedEntry,
2173
+ message: copy.t("referencePicker.previewError"),
2174
+ status: "error"
2175
+ };
2176
+ case "unsupported":
2177
+ return {
2178
+ entry: focusedEntry,
2179
+ message: copy.t("referencePicker.previewUnsupported"),
2180
+ status: "unsupported"
2181
+ };
2182
+ case "unavailable":
2183
+ return {
2184
+ entry: focusedEntry,
2185
+ message: copy.t("referencePicker.previewUnavailable"),
2186
+ status: "unsupported"
2187
+ };
2188
+ case "directory":
2189
+ return {
2190
+ entry: focusedEntry,
2191
+ status: "directory"
2192
+ };
2193
+ }
2194
+ }
2195
+ function resolveIssueManagerReferencePreviewReadonlyMessage(copy, previewState) {
2196
+ switch (previewState.reason) {
2197
+ case "binary":
2198
+ return copy.t("referencePicker.previewBinary");
2199
+ case "decode_failed":
2200
+ return copy.t("referencePicker.previewDecodeFailed");
2201
+ case "file_too_large":
2202
+ return copy.t("referencePicker.previewFileTooLarge", {
2203
+ maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)
2204
+ });
2205
+ case "text_too_large":
2206
+ return copy.t("referencePicker.previewTextTooLarge", {
2207
+ maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)
2208
+ });
2209
+ }
2210
+ }
1995
2211
  function IssueManagerReferencePickerFooter({
1996
2212
  copy,
1997
2213
  onClose,
@@ -2064,6 +2280,7 @@ function IssueManagerReferencePicker({
2064
2280
  focusedPath,
2065
2281
  isLoading,
2066
2282
  mode,
2283
+ previewState,
2067
2284
  searchQuery,
2068
2285
  selectedRefs,
2069
2286
  visibleEntries,
@@ -2140,7 +2357,8 @@ function IssueManagerReferencePicker({
2140
2357
  {
2141
2358
  copy,
2142
2359
  focusedEntry,
2143
- mode
2360
+ mode,
2361
+ previewState
2144
2362
  }
2145
2363
  )
2146
2364
  ] }),
@@ -2774,7 +2992,6 @@ import {
2774
2992
  SelectContent,
2775
2993
  SelectItem,
2776
2994
  SelectTrigger,
2777
- SparkIcon,
2778
2995
  buttonVariants,
2779
2996
  cn as cn6
2780
2997
  } from "@nextop-os/ui-system";
@@ -2782,7 +2999,6 @@ import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
2782
2999
  function IssueManagerRunActionTrigger({
2783
3000
  controller,
2784
3001
  disabled = false,
2785
- iconSize = 16,
2786
3002
  triggerClassName
2787
3003
  }) {
2788
3004
  const [resetToken, setResetToken] = useState7(0);
@@ -2804,10 +3020,7 @@ function IssueManagerRunActionTrigger({
2804
3020
  "[&>svg]:hidden",
2805
3021
  triggerClassName
2806
3022
  ),
2807
- children: /* @__PURE__ */ jsxs9("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
2808
- /* @__PURE__ */ jsx9(SparkIcon, { size: iconSize }),
2809
- /* @__PURE__ */ jsx9("span", { className: "truncate", children: controller.copy.t("actions.askAgentToRun") })
2810
- ] })
3023
+ children: /* @__PURE__ */ jsx9("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: /* @__PURE__ */ jsx9("span", { className: "truncate", children: controller.copy.t("actions.askAgentToRun") }) })
2811
3024
  }
2812
3025
  ),
2813
3026
  /* @__PURE__ */ jsx9(SelectContent, { style: { zIndex: "var(--z-panel-popover)" }, children: controller.providerOptions.map((provider) => /* @__PURE__ */ jsx9(SelectItem, { value: provider, children: provider }, provider)) })
@@ -3582,7 +3795,7 @@ import {
3582
3795
  SelectItem as SelectItem2,
3583
3796
  SelectTrigger as SelectTrigger2,
3584
3797
  SelectValue,
3585
- SparkIcon as SparkIcon2
3798
+ CapabilityIcon
3586
3799
  } from "@nextop-os/ui-system";
3587
3800
 
3588
3801
  // src/ui/internal/content/IssueManagerContextSection.tsx
@@ -3970,7 +4183,6 @@ function IssueManagerTaskDrawerFooter({
3970
4183
  IssueManagerRunActionTrigger,
3971
4184
  {
3972
4185
  controller,
3973
- iconSize: 15,
3974
4186
  triggerClassName: "min-w-[11rem]"
3975
4187
  }
3976
4188
  ),
@@ -4028,7 +4240,7 @@ function IssueManagerTaskDrawerFooter({
4028
4240
  type: "button",
4029
4241
  onClick: () => void controller.saveTask(),
4030
4242
  children: [
4031
- /* @__PURE__ */ jsx16(SparkIcon2, { size: 16 }),
4243
+ /* @__PURE__ */ jsx16(CapabilityIcon, { size: 16 }),
4032
4244
  copy.t("actions.saveTask")
4033
4245
  ]
4034
4246
  }
@@ -4514,4 +4726,4 @@ export {
4514
4726
  IssueManagerNode,
4515
4727
  IssueManagerNodeHeader
4516
4728
  };
4517
- //# sourceMappingURL=chunk-PDBLEOV4.js.map
4729
+ //# sourceMappingURL=chunk-5V4DIEWZ.js.map