@stigmer/react 0.0.92 → 0.0.93

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 (328) hide show
  1. package/README.md +57 -12
  2. package/agent/AgentDetailView.js +7 -7
  3. package/agent/AgentDetailView.js.map +1 -1
  4. package/agent/AgentPicker.js +3 -3
  5. package/agent/AgentPicker.js.map +1 -1
  6. package/api-key/ApiKeyCreatedAlert.js +1 -1
  7. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  8. package/api-key/ApiKeyListPanel.js +4 -4
  9. package/api-key/ApiKeyListPanel.js.map +1 -1
  10. package/api-key/CreateApiKeyForm.js +1 -1
  11. package/api-key/CreateApiKeyForm.js.map +1 -1
  12. package/attachment/AttachmentChipList.js +2 -2
  13. package/attachment/AttachmentChipList.js.map +1 -1
  14. package/color-mode.d.ts +48 -0
  15. package/color-mode.d.ts.map +1 -0
  16. package/color-mode.js +53 -0
  17. package/color-mode.js.map +1 -0
  18. package/composer/ComposerToolbar.d.ts +6 -2
  19. package/composer/ComposerToolbar.d.ts.map +1 -1
  20. package/composer/ComposerToolbar.js +5 -3
  21. package/composer/ComposerToolbar.js.map +1 -1
  22. package/composer/ConfigureMenu.js +3 -3
  23. package/composer/ConfigureMenu.js.map +1 -1
  24. package/composer/ContextChip.js +1 -1
  25. package/composer/ContextChip.js.map +1 -1
  26. package/composer/ContextPopover.js +1 -1
  27. package/composer/ContextPopover.js.map +1 -1
  28. package/composer/SessionComposer.d.ts +24 -3
  29. package/composer/SessionComposer.d.ts.map +1 -1
  30. package/composer/SessionComposer.js +5 -4
  31. package/composer/SessionComposer.js.map +1 -1
  32. package/environment/CreateEnvironmentForm.js +1 -1
  33. package/environment/CreateEnvironmentForm.js.map +1 -1
  34. package/environment/EnvVarForm.js +2 -2
  35. package/environment/EnvVarForm.js.map +1 -1
  36. package/environment/EnvironmentListPanel.js +2 -2
  37. package/environment/EnvironmentListPanel.js.map +1 -1
  38. package/environment/EnvironmentVariableEditor.js +6 -6
  39. package/environment/EnvironmentVariableEditor.js.map +1 -1
  40. package/error/ErrorMessage.js +1 -1
  41. package/error/ErrorMessage.js.map +1 -1
  42. package/execution/ApprovalCard.js +4 -4
  43. package/execution/ApprovalCard.js.map +1 -1
  44. package/execution/ArtifactCard.js +1 -1
  45. package/execution/ArtifactCard.js.map +1 -1
  46. package/execution/ArtifactPreviewModal.js +4 -4
  47. package/execution/ArtifactPreviewModal.js.map +1 -1
  48. package/execution/FollowUpInput.js +1 -1
  49. package/execution/FollowUpInput.js.map +1 -1
  50. package/execution/McpToolDetail.js +4 -4
  51. package/execution/McpToolDetail.js.map +1 -1
  52. package/execution/MessageEntry.js +1 -1
  53. package/execution/MessageEntry.js.map +1 -1
  54. package/execution/MessageThread.js +1 -1
  55. package/execution/MessageThread.js.map +1 -1
  56. package/execution/SessionVariablesInput.js +4 -4
  57. package/execution/SessionVariablesInput.js.map +1 -1
  58. package/execution/SubAgentSection.js +2 -2
  59. package/execution/SubAgentSection.js.map +1 -1
  60. package/execution/ToolCallDetail.js +2 -2
  61. package/execution/ToolCallDetail.js.map +1 -1
  62. package/execution/ToolCallGroup.js +1 -1
  63. package/execution/ToolCallGroup.js.map +1 -1
  64. package/execution/ToolCallItem.js +2 -2
  65. package/execution/ToolCallItem.js.map +1 -1
  66. package/execution/WriteBackCard.js +3 -3
  67. package/execution/WriteBackCard.js.map +1 -1
  68. package/execution/tool-rendering-primitives.js +3 -3
  69. package/execution/tool-rendering-primitives.js.map +1 -1
  70. package/github/GitHubRepoPicker.js +5 -5
  71. package/github/GitHubRepoPicker.js.map +1 -1
  72. package/iam-policy/GrantAccessForm.js +1 -1
  73. package/iam-policy/GrantAccessForm.js.map +1 -1
  74. package/iam-policy/OrgMembersPanel.js +5 -5
  75. package/iam-policy/OrgMembersPanel.js.map +1 -1
  76. package/identity-provider/CreateIdentityProviderForm.js +3 -3
  77. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  78. package/identity-provider/IdentityProviderDetailPanel.js +5 -5
  79. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  80. package/identity-provider/IdentityProviderListPanel.js +3 -3
  81. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  82. package/identity-provider/IdentityProviderWizard.js +7 -7
  83. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  84. package/identity-provider/ProviderPicker.js +2 -2
  85. package/identity-provider/ProviderPicker.js.map +1 -1
  86. package/index.d.ts +8 -4
  87. package/index.d.ts.map +1 -1
  88. package/index.js +7 -3
  89. package/index.js.map +1 -1
  90. package/internal/CloudFeatureNotice.js +1 -1
  91. package/internal/CloudFeatureNotice.js.map +1 -1
  92. package/internal/Tabs.js +1 -1
  93. package/internal/Tabs.js.map +1 -1
  94. package/internal/markdown-components.js +2 -2
  95. package/internal/markdown-components.js.map +1 -1
  96. package/invitation/InvitationCreatedAlert.js +1 -1
  97. package/invitation/InvitationCreatedAlert.js.map +1 -1
  98. package/invitation/InvitationManager.js +5 -5
  99. package/invitation/InvitationManager.js.map +1 -1
  100. package/invitation/InvitationRedemption.js +4 -4
  101. package/invitation/InvitationRedemption.js.map +1 -1
  102. package/library/ResourceCountCard.js +1 -1
  103. package/library/ResourceCountCard.js.map +1 -1
  104. package/library/ResourceListView.js +5 -5
  105. package/library/ResourceListView.js.map +1 -1
  106. package/mcp-server/McpServerConfigPanel.js +5 -5
  107. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  108. package/mcp-server/McpServerConnectDialog.js +4 -4
  109. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  110. package/mcp-server/McpServerDetailView.js +14 -14
  111. package/mcp-server/McpServerDetailView.js.map +1 -1
  112. package/mcp-server/McpServerPicker.js +4 -4
  113. package/mcp-server/McpServerPicker.js.map +1 -1
  114. package/mcp-server/McpToolSelector.js +3 -3
  115. package/mcp-server/McpToolSelector.js.map +1 -1
  116. package/mcp-server/OAuthAppForm.js +1 -1
  117. package/mcp-server/OAuthAppForm.js.map +1 -1
  118. package/models/ModelSelector.js +1 -1
  119. package/models/ModelSelector.js.map +1 -1
  120. package/oauth-app/CreateOAuthAppForm.js +1 -1
  121. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  122. package/oauth-app/OAuthAppDetailPanel.js +3 -3
  123. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  124. package/oauth-app/OAuthAppListPanel.js +2 -2
  125. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  126. package/organization/CreateOrganizationForm.js +1 -1
  127. package/organization/CreateOrganizationForm.js.map +1 -1
  128. package/organization/OrgProfilePanel.js +3 -3
  129. package/organization/OrgProfilePanel.js.map +1 -1
  130. package/package.json +4 -4
  131. package/platform-client/CreatePlatformClientForm.js +2 -2
  132. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  133. package/platform-client/PlatformClientDetailPanel.js +4 -4
  134. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  135. package/platform-client/PlatformClientListPanel.js +3 -3
  136. package/platform-client/PlatformClientListPanel.js.map +1 -1
  137. package/platform-client/PlatformClientSecretAlert.js +2 -2
  138. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  139. package/provider.d.ts +39 -2
  140. package/provider.d.ts.map +1 -1
  141. package/provider.js +11 -3
  142. package/provider.js.map +1 -1
  143. package/runner/RunnerListPanel.d.ts +65 -0
  144. package/runner/RunnerListPanel.d.ts.map +1 -0
  145. package/runner/RunnerListPanel.js +237 -0
  146. package/runner/RunnerListPanel.js.map +1 -0
  147. package/runner/RunnerPicker.d.ts +54 -0
  148. package/runner/RunnerPicker.d.ts.map +1 -0
  149. package/runner/RunnerPicker.js +133 -0
  150. package/runner/RunnerPicker.js.map +1 -0
  151. package/runner/__tests__/useDeleteRunner.test.d.ts +2 -0
  152. package/runner/__tests__/useDeleteRunner.test.d.ts.map +1 -0
  153. package/runner/__tests__/useDeleteRunner.test.js +108 -0
  154. package/runner/__tests__/useDeleteRunner.test.js.map +1 -0
  155. package/runner/__tests__/useLaunchLocalRunner.test.d.ts +2 -0
  156. package/runner/__tests__/useLaunchLocalRunner.test.d.ts.map +1 -0
  157. package/runner/__tests__/useLaunchLocalRunner.test.js +143 -0
  158. package/runner/__tests__/useLaunchLocalRunner.test.js.map +1 -0
  159. package/runner/__tests__/useStopRunner.test.d.ts +2 -0
  160. package/runner/__tests__/useStopRunner.test.d.ts.map +1 -0
  161. package/runner/__tests__/useStopRunner.test.js +114 -0
  162. package/runner/__tests__/useStopRunner.test.js.map +1 -0
  163. package/runner/index.d.ts +14 -0
  164. package/runner/index.d.ts.map +1 -0
  165. package/runner/index.js +8 -0
  166. package/runner/index.js.map +1 -0
  167. package/runner/phase.d.ts +30 -0
  168. package/runner/phase.d.ts.map +1 -0
  169. package/runner/phase.js +58 -0
  170. package/runner/phase.js.map +1 -0
  171. package/runner/useDeleteRunner.d.ts +36 -0
  172. package/runner/useDeleteRunner.d.ts.map +1 -0
  173. package/runner/useDeleteRunner.js +42 -0
  174. package/runner/useDeleteRunner.js.map +1 -0
  175. package/runner/useLaunchLocalRunner.d.ts +84 -0
  176. package/runner/useLaunchLocalRunner.d.ts.map +1 -0
  177. package/runner/useLaunchLocalRunner.js +75 -0
  178. package/runner/useLaunchLocalRunner.js.map +1 -0
  179. package/runner/useRunnerList.d.ts +49 -0
  180. package/runner/useRunnerList.d.ts.map +1 -0
  181. package/runner/useRunnerList.js +70 -0
  182. package/runner/useRunnerList.js.map +1 -0
  183. package/runner/useStopRunner.d.ts +53 -0
  184. package/runner/useStopRunner.d.ts.map +1 -0
  185. package/runner/useStopRunner.js +50 -0
  186. package/runner/useStopRunner.js.map +1 -0
  187. package/session/draft.d.ts +53 -0
  188. package/session/draft.d.ts.map +1 -0
  189. package/session/draft.js +45 -0
  190. package/session/draft.js.map +1 -0
  191. package/session/index.d.ts +10 -0
  192. package/session/index.d.ts.map +1 -1
  193. package/session/index.js +5 -0
  194. package/session/index.js.map +1 -1
  195. package/session/useCreateSession.d.ts +8 -0
  196. package/session/useCreateSession.d.ts.map +1 -1
  197. package/session/useCreateSession.js +1 -0
  198. package/session/useCreateSession.js.map +1 -1
  199. package/session/useEditSessionPrep.d.ts +26 -0
  200. package/session/useEditSessionPrep.d.ts.map +1 -0
  201. package/session/useEditSessionPrep.js +83 -0
  202. package/session/useEditSessionPrep.js.map +1 -0
  203. package/session/useNewSessionFlow.d.ts +110 -0
  204. package/session/useNewSessionFlow.d.ts.map +1 -0
  205. package/session/useNewSessionFlow.js +184 -0
  206. package/session/useNewSessionFlow.js.map +1 -0
  207. package/session/usePersistedModel.d.ts +18 -0
  208. package/session/usePersistedModel.d.ts.map +1 -0
  209. package/session/usePersistedModel.js +31 -0
  210. package/session/usePersistedModel.js.map +1 -0
  211. package/session/useSessionPageFlow.d.ts +104 -0
  212. package/session/useSessionPageFlow.d.ts.map +1 -0
  213. package/session/useSessionPageFlow.js +172 -0
  214. package/session/useSessionPageFlow.js.map +1 -0
  215. package/skill/SkillDetailView.js +3 -3
  216. package/skill/SkillDetailView.js.map +1 -1
  217. package/skill/SkillPicker.js +3 -3
  218. package/skill/SkillPicker.js.map +1 -1
  219. package/src/agent/AgentDetailView.tsx +8 -8
  220. package/src/agent/AgentPicker.tsx +3 -3
  221. package/src/api-key/ApiKeyCreatedAlert.tsx +2 -2
  222. package/src/api-key/ApiKeyListPanel.tsx +6 -6
  223. package/src/api-key/CreateApiKeyForm.tsx +2 -2
  224. package/src/attachment/AttachmentChipList.tsx +3 -3
  225. package/src/color-mode.ts +75 -0
  226. package/src/composer/ComposerToolbar.tsx +29 -7
  227. package/src/composer/ConfigureMenu.tsx +6 -6
  228. package/src/composer/ContextChip.tsx +1 -1
  229. package/src/composer/ContextPopover.tsx +2 -2
  230. package/src/composer/SessionComposer.tsx +34 -5
  231. package/src/environment/CreateEnvironmentForm.tsx +3 -3
  232. package/src/environment/EnvVarForm.tsx +6 -6
  233. package/src/environment/EnvironmentListPanel.tsx +3 -3
  234. package/src/environment/EnvironmentVariableEditor.tsx +7 -7
  235. package/src/error/ErrorMessage.tsx +5 -5
  236. package/src/execution/ApprovalCard.tsx +5 -5
  237. package/src/execution/ArtifactCard.tsx +2 -2
  238. package/src/execution/ArtifactPreviewModal.tsx +4 -4
  239. package/src/execution/FollowUpInput.tsx +2 -2
  240. package/src/execution/McpToolDetail.tsx +4 -4
  241. package/src/execution/MessageEntry.tsx +1 -1
  242. package/src/execution/MessageThread.tsx +1 -1
  243. package/src/execution/SessionVariablesInput.tsx +7 -7
  244. package/src/execution/SubAgentSection.tsx +5 -5
  245. package/src/execution/ToolCallDetail.tsx +2 -2
  246. package/src/execution/ToolCallGroup.tsx +3 -3
  247. package/src/execution/ToolCallItem.tsx +4 -4
  248. package/src/execution/WriteBackCard.tsx +5 -5
  249. package/src/execution/tool-rendering-primitives.tsx +5 -5
  250. package/src/github/GitHubRepoPicker.tsx +5 -5
  251. package/src/iam-policy/GrantAccessForm.tsx +2 -2
  252. package/src/iam-policy/OrgMembersPanel.tsx +11 -11
  253. package/src/identity-provider/CreateIdentityProviderForm.tsx +4 -4
  254. package/src/identity-provider/IdentityProviderDetailPanel.tsx +7 -7
  255. package/src/identity-provider/IdentityProviderListPanel.tsx +7 -7
  256. package/src/identity-provider/IdentityProviderWizard.tsx +8 -8
  257. package/src/identity-provider/ProviderPicker.tsx +2 -2
  258. package/src/index.ts +46 -7
  259. package/src/internal/CloudFeatureNotice.tsx +1 -1
  260. package/src/internal/Tabs.tsx +1 -1
  261. package/src/internal/markdown-components.tsx +2 -2
  262. package/src/invitation/InvitationCreatedAlert.tsx +2 -2
  263. package/src/invitation/InvitationManager.tsx +9 -9
  264. package/src/invitation/InvitationRedemption.tsx +11 -11
  265. package/src/library/ResourceCountCard.tsx +1 -1
  266. package/src/library/ResourceListView.tsx +7 -7
  267. package/src/mcp-server/McpServerConfigPanel.tsx +7 -7
  268. package/src/mcp-server/McpServerConnectDialog.tsx +5 -5
  269. package/src/mcp-server/McpServerDetailView.tsx +19 -19
  270. package/src/mcp-server/McpServerPicker.tsx +6 -6
  271. package/src/mcp-server/McpToolSelector.tsx +4 -4
  272. package/src/mcp-server/OAuthAppForm.tsx +3 -3
  273. package/src/models/ModelSelector.tsx +1 -1
  274. package/src/oauth-app/CreateOAuthAppForm.tsx +3 -3
  275. package/src/oauth-app/OAuthAppDetailPanel.tsx +7 -7
  276. package/src/oauth-app/OAuthAppListPanel.tsx +3 -3
  277. package/src/organization/CreateOrganizationForm.tsx +3 -3
  278. package/src/organization/OrgProfilePanel.tsx +4 -5
  279. package/src/platform-client/CreatePlatformClientForm.tsx +6 -6
  280. package/src/platform-client/PlatformClientDetailPanel.tsx +19 -19
  281. package/src/platform-client/PlatformClientListPanel.tsx +7 -7
  282. package/src/platform-client/PlatformClientSecretAlert.tsx +2 -2
  283. package/src/provider.tsx +52 -2
  284. package/src/runner/RunnerListPanel.tsx +725 -0
  285. package/src/runner/RunnerPicker.tsx +319 -0
  286. package/src/runner/__tests__/useDeleteRunner.test.tsx +150 -0
  287. package/src/runner/__tests__/useLaunchLocalRunner.test.tsx +223 -0
  288. package/src/runner/__tests__/useStopRunner.test.tsx +154 -0
  289. package/src/runner/index.ts +34 -0
  290. package/src/runner/phase.ts +62 -0
  291. package/src/runner/useDeleteRunner.ts +67 -0
  292. package/src/runner/useLaunchLocalRunner.ts +139 -0
  293. package/src/runner/useRunnerList.ts +114 -0
  294. package/src/runner/useStopRunner.ts +92 -0
  295. package/src/session/draft.ts +82 -0
  296. package/src/session/index.ts +28 -0
  297. package/src/session/useCreateSession.ts +9 -0
  298. package/src/session/useEditSessionPrep.ts +111 -0
  299. package/src/session/useNewSessionFlow.ts +283 -0
  300. package/src/session/usePersistedModel.ts +41 -0
  301. package/src/session/useSessionPageFlow.ts +280 -0
  302. package/src/skill/SkillDetailView.tsx +5 -5
  303. package/src/skill/SkillPicker.tsx +3 -3
  304. package/src/styles.css +25 -1
  305. package/src/usage/OrgUsagePanel.tsx +4 -4
  306. package/src/workspace/WorkspaceEditor.tsx +78 -66
  307. package/src/workspace/index.ts +0 -8
  308. package/styles.css +1 -1
  309. package/usage/OrgUsagePanel.js +2 -2
  310. package/usage/OrgUsagePanel.js.map +1 -1
  311. package/workspace/WorkspaceEditor.d.ts +28 -3
  312. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  313. package/workspace/WorkspaceEditor.js +24 -25
  314. package/workspace/WorkspaceEditor.js.map +1 -1
  315. package/workspace/index.d.ts +0 -4
  316. package/workspace/index.d.ts.map +1 -1
  317. package/workspace/index.js +0 -2
  318. package/workspace/index.js.map +1 -1
  319. package/src/workspace/FolderBrowser.tsx +0 -579
  320. package/src/workspace/useFolderListing.ts +0 -164
  321. package/workspace/FolderBrowser.d.ts +0 -37
  322. package/workspace/FolderBrowser.d.ts.map +0 -1
  323. package/workspace/FolderBrowser.js +0 -188
  324. package/workspace/FolderBrowser.js.map +0 -1
  325. package/workspace/useFolderListing.d.ts +0 -73
  326. package/workspace/useFolderListing.d.ts.map +0 -1
  327. package/workspace/useFolderListing.js +0 -110
  328. package/workspace/useFolderListing.js.map +0 -1
@@ -1,164 +0,0 @@
1
- "use client";
2
-
3
- import { useCallback, useEffect, useRef, useState } from "react";
4
-
5
- /** A single filesystem entry (file or directory) within a {@link FolderListing}. */
6
- export interface FolderEntry {
7
- /** Filename or directory name (not a full path). */
8
- readonly name: string;
9
- /** `true` when the entry is a directory that can be browsed further. */
10
- readonly isDir: boolean;
11
- /** `true` when the entry name starts with `.` (hidden file/directory). */
12
- readonly hidden?: boolean;
13
- }
14
-
15
- /** Directory listing returned by the local CLI filesystem API. */
16
- export interface FolderListing {
17
- /** Absolute path of the listed directory. */
18
- readonly path: string;
19
- /** Current working directory of the CLI process. */
20
- readonly cwd: string;
21
- /** User home directory, for quick-navigation buttons. */
22
- readonly home: string;
23
- /** Files and subdirectories within the listed directory. */
24
- readonly entries: readonly FolderEntry[];
25
- }
26
-
27
- /** Return value of {@link useFolderListing}. */
28
- export interface UseFolderListingReturn {
29
- /** Current directory listing, or `null` while loading or on error. */
30
- readonly listing: FolderListing | null;
31
- /** `true` while a directory listing is being fetched. */
32
- readonly isLoading: boolean;
33
- /** Error message from the last failed request, or `null` when healthy. */
34
- readonly error: string | null;
35
- /** Whether the `/api/fs/list` endpoint is available. `null` until the first fetch completes. */
36
- readonly isAvailable: boolean | null;
37
- /** Navigate to a different directory by absolute path. */
38
- readonly browse: (path: string) => void;
39
- /** Reset `error` to `null` without navigating. */
40
- readonly clearError: () => void;
41
- }
42
-
43
- const MAX_CACHE_SIZE = 32;
44
-
45
- /**
46
- * Data hook that fetches directory listings from the local CLI's
47
- * filesystem API (`GET /api/fs/list`).
48
- *
49
- * This hook fetches from a same-origin HTTP endpoint — not gRPC — because
50
- * the filesystem listing is a local-only utility outside the domain API
51
- * surface. The endpoint only exists on the Go CLI's web console server.
52
- *
53
- * Provides in-memory caching of recent listings for fast back-navigation,
54
- * and an `isAvailable` flag that detects whether the endpoint exists
55
- * (graceful degradation when running against a backend without the endpoint).
56
- *
57
- * @example
58
- * ```tsx
59
- * function DirectoryPicker() {
60
- * const { listing, isLoading, isAvailable, browse } = useFolderListing();
61
- *
62
- * if (isAvailable === false) return <p>Folder browser not available</p>;
63
- * if (isLoading) return <Skeleton />;
64
- *
65
- * return (
66
- * <ul>
67
- * {listing?.entries
68
- * .filter((e) => e.isDir)
69
- * .map((entry) => (
70
- * <li key={entry.name}>
71
- * <button onClick={() => browse(`${listing.path}/${entry.name}`)}>
72
- * {entry.name}
73
- * </button>
74
- * </li>
75
- * ))}
76
- * </ul>
77
- * );
78
- * }
79
- * ```
80
- */
81
- export function useFolderListing(
82
- initialPath?: string,
83
- ): UseFolderListingReturn {
84
- const [listing, setListing] = useState<FolderListing | null>(null);
85
- const [isLoading, setIsLoading] = useState(false);
86
- const [error, setError] = useState<string | null>(null);
87
- const [isAvailable, setIsAvailable] = useState<boolean | null>(null);
88
-
89
- const cacheRef = useRef<Map<string, FolderListing>>(new Map());
90
- const abortRef = useRef<AbortController | null>(null);
91
-
92
- const fetchListing = useCallback(async (dirPath?: string) => {
93
- abortRef.current?.abort();
94
- const controller = new AbortController();
95
- abortRef.current = controller;
96
-
97
- const cacheKey = dirPath ?? "";
98
- const cached = cacheRef.current.get(cacheKey);
99
- if (cached) {
100
- setListing(cached);
101
- setError(null);
102
- setIsLoading(false);
103
- return;
104
- }
105
-
106
- setIsLoading(true);
107
- setError(null);
108
-
109
- try {
110
- const params = dirPath ? `?path=${encodeURIComponent(dirPath)}` : "";
111
- const resp = await fetch(`/api/fs/list${params}`, {
112
- signal: controller.signal,
113
- });
114
-
115
- if (!resp.ok) {
116
- if (resp.status === 404 && !dirPath) {
117
- setIsAvailable(false);
118
- setError("Folder browser not available");
119
- return;
120
- }
121
- const body = await resp.json().catch(() => null);
122
- const msg =
123
- (body as { error?: string } | null)?.error ?? `Error ${resp.status}`;
124
- setError(msg);
125
- return;
126
- }
127
-
128
- setIsAvailable(true);
129
- const data: FolderListing = await resp.json();
130
- setListing(data);
131
- setError(null);
132
-
133
- const cache = cacheRef.current;
134
- cache.set(data.path, data);
135
- if (cache.size > MAX_CACHE_SIZE) {
136
- const oldest = cache.keys().next().value;
137
- if (oldest !== undefined) cache.delete(oldest);
138
- }
139
- } catch (e) {
140
- if (e instanceof DOMException && e.name === "AbortError") return;
141
- setError("Failed to load directory");
142
- } finally {
143
- if (!controller.signal.aborted) {
144
- setIsLoading(false);
145
- }
146
- }
147
- }, []);
148
-
149
- useEffect(() => {
150
- fetchListing(initialPath);
151
- return () => abortRef.current?.abort();
152
- }, [initialPath, fetchListing]);
153
-
154
- const browse = useCallback(
155
- (path: string) => {
156
- fetchListing(path);
157
- },
158
- [fetchListing],
159
- );
160
-
161
- const clearError = useCallback(() => setError(null), []);
162
-
163
- return { listing, isLoading, error, isAvailable, browse, clearError };
164
- }
@@ -1,37 +0,0 @@
1
- /** Props for {@link FolderBrowser}. */
2
- export interface FolderBrowserProps {
3
- /** Called when the user confirms the selected directory. */
4
- readonly onSelect: (path: string) => void;
5
- /** Called when the user dismisses the browser. */
6
- readonly onCancel: () => void;
7
- /** Starting directory path. Defaults to CWD from the API. */
8
- readonly initialPath?: string;
9
- /** Additional CSS class names for the root container. */
10
- readonly className?: string;
11
- }
12
- /**
13
- * Styled component that renders a navigable filesystem browser for
14
- * selecting a local directory as a workspace entry.
15
- *
16
- * Features:
17
- * - Breadcrumb path bar (clickable segments, editable as text input)
18
- * - Directory listing with folder-first sorting
19
- * - Quick navigation: Home and CWD buttons
20
- * - Hidden files toggle
21
- * - Keyboard navigation (Arrow keys, Enter, Escape)
22
- * - Graceful degradation when the /api/fs/list endpoint is unavailable
23
- *
24
- * All visual properties flow through `--stgm-*` tokens.
25
- * No Console-specific dependencies.
26
- *
27
- * @example
28
- * ```tsx
29
- * <FolderBrowser
30
- * onSelect={(path) => workspace.addLocalPath(path)}
31
- * onCancel={() => setShowBrowser(false)}
32
- * initialPath="/Users/dev/projects"
33
- * />
34
- * ```
35
- */
36
- export declare function FolderBrowser({ onSelect, onCancel, initialPath, className, }: FolderBrowserProps): import("react/jsx-runtime").JSX.Element;
37
- //# sourceMappingURL=FolderBrowser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FolderBrowser.d.ts","sourceRoot":"","sources":["../../src/workspace/FolderBrowser.tsx"],"names":[],"mappings":"AAWA,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,GACV,EAAE,kBAAkB,2CAuYpB"}
@@ -1,188 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useState, useCallback, useRef, useEffect, } from "react";
4
- import { useFolderListing } from "./useFolderListing";
5
- /**
6
- * Styled component that renders a navigable filesystem browser for
7
- * selecting a local directory as a workspace entry.
8
- *
9
- * Features:
10
- * - Breadcrumb path bar (clickable segments, editable as text input)
11
- * - Directory listing with folder-first sorting
12
- * - Quick navigation: Home and CWD buttons
13
- * - Hidden files toggle
14
- * - Keyboard navigation (Arrow keys, Enter, Escape)
15
- * - Graceful degradation when the /api/fs/list endpoint is unavailable
16
- *
17
- * All visual properties flow through `--stgm-*` tokens.
18
- * No Console-specific dependencies.
19
- *
20
- * @example
21
- * ```tsx
22
- * <FolderBrowser
23
- * onSelect={(path) => workspace.addLocalPath(path)}
24
- * onCancel={() => setShowBrowser(false)}
25
- * initialPath="/Users/dev/projects"
26
- * />
27
- * ```
28
- */
29
- export function FolderBrowser({ onSelect, onCancel, initialPath, className, }) {
30
- const { listing, isLoading, error, isAvailable, browse, clearError } = useFolderListing(initialPath);
31
- const [showHidden, setShowHidden] = useState(false);
32
- const [isEditingPath, setIsEditingPath] = useState(false);
33
- const [editPath, setEditPath] = useState("");
34
- const [focusIndex, setFocusIndex] = useState(-1);
35
- const listRef = useRef(null);
36
- const pathInputRef = useRef(null);
37
- const fallbackInputRef = useRef(null);
38
- const [fallbackPath, setFallbackPath] = useState("");
39
- const currentPath = listing?.path ?? initialPath ?? "";
40
- const visibleEntries = listing
41
- ? listing.entries.filter((e) => showHidden || !e.hidden)
42
- : [];
43
- const directories = visibleEntries.filter((e) => e.isDir);
44
- const navigateTo = useCallback((path) => {
45
- setFocusIndex(-1);
46
- browse(path);
47
- }, [browse]);
48
- const handleBreadcrumbClick = useCallback((segmentIndex) => {
49
- const segments = currentPath.split("/").filter(Boolean);
50
- const targetPath = "/" + segments.slice(0, segmentIndex + 1).join("/");
51
- navigateTo(targetPath);
52
- }, [currentPath, navigateTo]);
53
- const startPathEdit = useCallback(() => {
54
- setEditPath(currentPath);
55
- setIsEditingPath(true);
56
- }, [currentPath]);
57
- const commitPathEdit = useCallback(() => {
58
- setIsEditingPath(false);
59
- const trimmed = editPath.trim();
60
- if (trimmed && trimmed !== currentPath) {
61
- navigateTo(trimmed);
62
- }
63
- }, [editPath, currentPath, navigateTo]);
64
- const handlePathKeyDown = useCallback((e) => {
65
- if (e.key === "Enter") {
66
- e.preventDefault();
67
- commitPathEdit();
68
- }
69
- else if (e.key === "Escape") {
70
- e.preventDefault();
71
- setIsEditingPath(false);
72
- }
73
- }, [commitPathEdit]);
74
- const handleListKeyDown = useCallback((e) => {
75
- if (e.key === "Escape") {
76
- e.preventDefault();
77
- onCancel();
78
- return;
79
- }
80
- if (e.key === "ArrowDown") {
81
- e.preventDefault();
82
- setFocusIndex((prev) => prev < directories.length - 1 ? prev + 1 : prev);
83
- return;
84
- }
85
- if (e.key === "ArrowUp") {
86
- e.preventDefault();
87
- setFocusIndex((prev) => (prev > 0 ? prev - 1 : prev));
88
- return;
89
- }
90
- if (e.key === "Enter" && focusIndex >= 0 && focusIndex < directories.length) {
91
- e.preventDefault();
92
- const entry = directories[focusIndex];
93
- navigateTo(joinPath(currentPath, entry.name));
94
- return;
95
- }
96
- if (e.key === "Backspace" && currentPath !== "/") {
97
- e.preventDefault();
98
- navigateTo(parentPath(currentPath));
99
- }
100
- }, [onCancel, directories, focusIndex, currentPath, navigateTo]);
101
- useEffect(() => {
102
- if (focusIndex >= 0) {
103
- const el = listRef.current?.querySelector(`[data-index="${focusIndex}"]`);
104
- el?.scrollIntoView({ block: "nearest" });
105
- }
106
- }, [focusIndex]);
107
- useEffect(() => {
108
- if (isEditingPath) {
109
- pathInputRef.current?.focus();
110
- pathInputRef.current?.select();
111
- }
112
- }, [isEditingPath]);
113
- // Graceful fallback: if the endpoint is not available, show a text input.
114
- if (isAvailable === false) {
115
- return (_jsxs("div", { className: ["space-y-2", className].filter(Boolean).join(" "), children: [_jsx("input", { ref: fallbackInputRef, type: "text", placeholder: "/path/to/project", value: fallbackPath, onChange: (e) => setFallbackPath(e.target.value), onKeyDown: (e) => {
116
- if (e.key === "Enter" && fallbackPath.trim()) {
117
- e.preventDefault();
118
- onSelect(fallbackPath.trim());
119
- }
120
- else if (e.key === "Escape") {
121
- e.preventDefault();
122
- onCancel();
123
- }
124
- }, className: "w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", autoFocus: true }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Cancel" }), _jsx("button", { type: "button", onClick: () => fallbackPath.trim() && onSelect(fallbackPath.trim()), disabled: !fallbackPath.trim(), className: "rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-40", children: "Add" })] })] }));
125
- }
126
- const pathSegments = currentPath.split("/").filter(Boolean);
127
- return (_jsxs("div", { className: ["space-y-2", className].filter(Boolean).join(" "), onKeyDown: !isEditingPath ? handleListKeyDown : undefined, children: [_jsxs("div", { className: "flex items-center gap-1", children: [listing && (_jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: () => navigateTo(listing.home), className: "rounded p-1 text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors", "aria-label": "Go to home directory", title: "Home", children: _jsx(HomeIcon, {}) }), _jsx("button", { type: "button", onClick: () => navigateTo(listing.cwd), className: "rounded p-1 text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors", "aria-label": "Go to working directory", title: "Working directory", children: _jsx(TerminalIcon, {}) })] })), _jsx("div", { className: "min-w-0 flex-1", children: isEditingPath ? (_jsx("input", { ref: pathInputRef, type: "text", value: editPath, onChange: (e) => setEditPath(e.target.value), onKeyDown: handlePathKeyDown, onBlur: commitPathEdit, className: "w-full rounded-md border border-input bg-background px-2 py-1 text-xs text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" })) : (_jsxs("button", { type: "button", onClick: startPathEdit, className: "flex w-full min-w-0 items-center gap-0.5 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent/50 transition-colors", "aria-label": "Edit path", title: "Click to type a path", children: [_jsx("span", { className: "cursor-pointer hover:text-foreground", onClick: (e) => {
128
- e.stopPropagation();
129
- navigateTo("/");
130
- }, children: "/" }), pathSegments.map((seg, i) => (_jsxs("span", { className: "flex items-center gap-0.5 min-w-0", children: [_jsx(ChevronRightIcon, {}), _jsx("span", { className: [
131
- "truncate cursor-pointer hover:text-foreground",
132
- i === pathSegments.length - 1
133
- ? "text-foreground font-medium"
134
- : "",
135
- ]
136
- .filter(Boolean)
137
- .join(" "), onClick: (e) => {
138
- e.stopPropagation();
139
- handleBreadcrumbClick(i);
140
- }, children: seg })] }, i)))] })) }), _jsx("button", { type: "button", onClick: () => setShowHidden((prev) => !prev), className: [
141
- "shrink-0 rounded p-1 transition-colors",
142
- showHidden
143
- ? "text-foreground bg-accent"
144
- : "text-muted-foreground hover:text-foreground hover:bg-accent/50",
145
- ].join(" "), "aria-label": showHidden ? "Hide hidden files" : "Show hidden files", title: showHidden ? "Hide hidden files" : "Show hidden files", children: _jsx(EyeIcon, {}) })] }), error && (_jsxs("div", { className: "flex items-center justify-between rounded-md border border-destructive/30 bg-destructive/5 px-2.5 py-2 text-xs text-destructive", children: [_jsx("span", { children: error }), _jsx("button", { type: "button", onClick: clearError, className: "shrink-0 rounded-md px-2 py-0.5 text-[0.65rem] hover:bg-destructive/10 transition-colors", children: "Dismiss" })] })), _jsxs("div", { ref: listRef, className: "max-h-52 overflow-y-auto", role: "listbox", "aria-label": "Directory contents", tabIndex: 0, children: [currentPath !== "/" && !isLoading && (_jsxs("button", { type: "button", onClick: () => navigateTo(parentPath(currentPath)), className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs text-muted-foreground hover:bg-accent/50 hover:text-foreground transition-colors", role: "option", "aria-selected": false, children: [_jsx(ParentDirIcon, {}), _jsx("span", { children: ".." })] })), isLoading ? (_jsx("div", { className: "space-y-1 py-1", children: Array.from({ length: 5 }).map((_, i) => (_jsxs("div", { className: "flex items-center gap-2 rounded-md px-2 py-1.5", children: [_jsx("div", { className: "h-3.5 w-3.5 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 rounded bg-muted animate-pulse", style: { width: `${40 + Math.random() * 40}%` } })] }, i))) })) : (_jsxs(_Fragment, { children: [directories.map((entry, i) => (_jsxs("button", { type: "button", "data-index": i, onClick: () => navigateTo(joinPath(currentPath, entry.name)), onDoubleClick: () => onSelect(joinPath(currentPath, entry.name)), className: [
146
- "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs transition-colors",
147
- i === focusIndex
148
- ? "bg-accent text-foreground"
149
- : "text-foreground hover:bg-accent/50",
150
- ].join(" "), role: "option", "aria-selected": i === focusIndex, children: [_jsx(FolderIcon, {}), _jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: entry.name })] }, entry.name))), visibleEntries
151
- .filter((e) => !e.isDir)
152
- .map((entry) => (_jsxs("div", { className: "flex items-center gap-2 rounded-md px-2 py-1.5 text-xs text-muted-foreground/50", children: [_jsx(FileIcon, {}), _jsx("span", { className: "min-w-0 flex-1 truncate", children: entry.name })] }, entry.name))), !isLoading &&
153
- directories.length === 0 &&
154
- visibleEntries.length === 0 && (_jsx("div", { className: "py-4 text-center text-xs text-muted-foreground", children: "Empty directory" }))] }))] }), _jsxs("div", { className: "flex items-center justify-between border-t border-border/50 pt-2", children: [_jsx("span", { className: "truncate text-[0.6rem] text-muted-foreground", children: currentPath }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx("button", { type: "button", onClick: onCancel, className: "rounded-md px-2.5 py-1 text-xs text-muted-foreground hover:text-foreground transition-colors", children: "Cancel" }), _jsx("button", { type: "button", onClick: () => onSelect(currentPath), disabled: !currentPath || isLoading, className: "rounded-md bg-primary px-2.5 py-1 text-xs text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-40", children: "Select" })] })] })] }));
155
- }
156
- function joinPath(base, name) {
157
- if (base === "/")
158
- return "/" + name;
159
- return base + "/" + name;
160
- }
161
- function parentPath(p) {
162
- const segments = p.split("/").filter(Boolean);
163
- if (segments.length <= 1)
164
- return "/";
165
- return "/" + segments.slice(0, -1).join("/");
166
- }
167
- function HomeIcon() {
168
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M2 7L7 2.5L12 7" }), _jsx("path", { d: "M3.5 8V11.5H5.5V9H8.5V11.5H10.5V8" })] }));
169
- }
170
- function TerminalIcon() {
171
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M3.5 5L6 7L3.5 9" }), _jsx("path", { d: "M7.5 9.5H10.5" })] }));
172
- }
173
- function EyeIcon() {
174
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M1.5 7C2.5 4.5 4.5 3 7 3C9.5 3 11.5 4.5 12.5 7C11.5 9.5 9.5 11 7 11C4.5 11 2.5 9.5 1.5 7Z" }), _jsx("circle", { cx: "7", cy: "7", r: "1.5" })] }));
175
- }
176
- function ChevronRightIcon() {
177
- return (_jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M3.5 2L6.5 5L3.5 8" }) }));
178
- }
179
- function FolderIcon() {
180
- return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M1.5 3.5V11a1 1 0 001 1h9a1 1 0 001-1V5.5a1 1 0 00-1-1H7L5.5 3H2.5a1 1 0 00-1 .5z" }) }));
181
- }
182
- function FileIcon() {
183
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M3.5 1.5H8.5L11 4V12a.5.5 0 01-.5.5H3.5a.5.5 0 01-.5-.5V2a.5.5 0 01.5-.5z" }), _jsx("path", { d: "M8.5 1.5V4H11" })] }));
184
- }
185
- function ParentDirIcon() {
186
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M7 10V4" }), _jsx("path", { d: "M4 6.5L7 3.5L10 6.5" })] }));
187
- }
188
- //# sourceMappingURL=FolderBrowser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FolderBrowser.js","sourceRoot":"","sources":["../../src/workspace/FolderBrowser.tsx"],"names":[],"mappings":"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"}
@@ -1,73 +0,0 @@
1
- /** A single filesystem entry (file or directory) within a {@link FolderListing}. */
2
- export interface FolderEntry {
3
- /** Filename or directory name (not a full path). */
4
- readonly name: string;
5
- /** `true` when the entry is a directory that can be browsed further. */
6
- readonly isDir: boolean;
7
- /** `true` when the entry name starts with `.` (hidden file/directory). */
8
- readonly hidden?: boolean;
9
- }
10
- /** Directory listing returned by the local CLI filesystem API. */
11
- export interface FolderListing {
12
- /** Absolute path of the listed directory. */
13
- readonly path: string;
14
- /** Current working directory of the CLI process. */
15
- readonly cwd: string;
16
- /** User home directory, for quick-navigation buttons. */
17
- readonly home: string;
18
- /** Files and subdirectories within the listed directory. */
19
- readonly entries: readonly FolderEntry[];
20
- }
21
- /** Return value of {@link useFolderListing}. */
22
- export interface UseFolderListingReturn {
23
- /** Current directory listing, or `null` while loading or on error. */
24
- readonly listing: FolderListing | null;
25
- /** `true` while a directory listing is being fetched. */
26
- readonly isLoading: boolean;
27
- /** Error message from the last failed request, or `null` when healthy. */
28
- readonly error: string | null;
29
- /** Whether the `/api/fs/list` endpoint is available. `null` until the first fetch completes. */
30
- readonly isAvailable: boolean | null;
31
- /** Navigate to a different directory by absolute path. */
32
- readonly browse: (path: string) => void;
33
- /** Reset `error` to `null` without navigating. */
34
- readonly clearError: () => void;
35
- }
36
- /**
37
- * Data hook that fetches directory listings from the local CLI's
38
- * filesystem API (`GET /api/fs/list`).
39
- *
40
- * This hook fetches from a same-origin HTTP endpoint — not gRPC — because
41
- * the filesystem listing is a local-only utility outside the domain API
42
- * surface. The endpoint only exists on the Go CLI's web console server.
43
- *
44
- * Provides in-memory caching of recent listings for fast back-navigation,
45
- * and an `isAvailable` flag that detects whether the endpoint exists
46
- * (graceful degradation when running against a backend without the endpoint).
47
- *
48
- * @example
49
- * ```tsx
50
- * function DirectoryPicker() {
51
- * const { listing, isLoading, isAvailable, browse } = useFolderListing();
52
- *
53
- * if (isAvailable === false) return <p>Folder browser not available</p>;
54
- * if (isLoading) return <Skeleton />;
55
- *
56
- * return (
57
- * <ul>
58
- * {listing?.entries
59
- * .filter((e) => e.isDir)
60
- * .map((entry) => (
61
- * <li key={entry.name}>
62
- * <button onClick={() => browse(`${listing.path}/${entry.name}`)}>
63
- * {entry.name}
64
- * </button>
65
- * </li>
66
- * ))}
67
- * </ul>
68
- * );
69
- * }
70
- * ```
71
- */
72
- export declare function useFolderListing(initialPath?: string): UseFolderListingReturn;
73
- //# sourceMappingURL=useFolderListing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFolderListing.d.ts","sourceRoot":"","sources":["../../src/workspace/useFolderListing.ts"],"names":[],"mappings":"AAIA,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C;AAED,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gGAAgG;IAChG,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,CAAC,EAAE,MAAM,GACnB,sBAAsB,CAiFxB"}
@@ -1,110 +0,0 @@
1
- "use client";
2
- import { useCallback, useEffect, useRef, useState } from "react";
3
- const MAX_CACHE_SIZE = 32;
4
- /**
5
- * Data hook that fetches directory listings from the local CLI's
6
- * filesystem API (`GET /api/fs/list`).
7
- *
8
- * This hook fetches from a same-origin HTTP endpoint — not gRPC — because
9
- * the filesystem listing is a local-only utility outside the domain API
10
- * surface. The endpoint only exists on the Go CLI's web console server.
11
- *
12
- * Provides in-memory caching of recent listings for fast back-navigation,
13
- * and an `isAvailable` flag that detects whether the endpoint exists
14
- * (graceful degradation when running against a backend without the endpoint).
15
- *
16
- * @example
17
- * ```tsx
18
- * function DirectoryPicker() {
19
- * const { listing, isLoading, isAvailable, browse } = useFolderListing();
20
- *
21
- * if (isAvailable === false) return <p>Folder browser not available</p>;
22
- * if (isLoading) return <Skeleton />;
23
- *
24
- * return (
25
- * <ul>
26
- * {listing?.entries
27
- * .filter((e) => e.isDir)
28
- * .map((entry) => (
29
- * <li key={entry.name}>
30
- * <button onClick={() => browse(`${listing.path}/${entry.name}`)}>
31
- * {entry.name}
32
- * </button>
33
- * </li>
34
- * ))}
35
- * </ul>
36
- * );
37
- * }
38
- * ```
39
- */
40
- export function useFolderListing(initialPath) {
41
- const [listing, setListing] = useState(null);
42
- const [isLoading, setIsLoading] = useState(false);
43
- const [error, setError] = useState(null);
44
- const [isAvailable, setIsAvailable] = useState(null);
45
- const cacheRef = useRef(new Map());
46
- const abortRef = useRef(null);
47
- const fetchListing = useCallback(async (dirPath) => {
48
- abortRef.current?.abort();
49
- const controller = new AbortController();
50
- abortRef.current = controller;
51
- const cacheKey = dirPath ?? "";
52
- const cached = cacheRef.current.get(cacheKey);
53
- if (cached) {
54
- setListing(cached);
55
- setError(null);
56
- setIsLoading(false);
57
- return;
58
- }
59
- setIsLoading(true);
60
- setError(null);
61
- try {
62
- const params = dirPath ? `?path=${encodeURIComponent(dirPath)}` : "";
63
- const resp = await fetch(`/api/fs/list${params}`, {
64
- signal: controller.signal,
65
- });
66
- if (!resp.ok) {
67
- if (resp.status === 404 && !dirPath) {
68
- setIsAvailable(false);
69
- setError("Folder browser not available");
70
- return;
71
- }
72
- const body = await resp.json().catch(() => null);
73
- const msg = body?.error ?? `Error ${resp.status}`;
74
- setError(msg);
75
- return;
76
- }
77
- setIsAvailable(true);
78
- const data = await resp.json();
79
- setListing(data);
80
- setError(null);
81
- const cache = cacheRef.current;
82
- cache.set(data.path, data);
83
- if (cache.size > MAX_CACHE_SIZE) {
84
- const oldest = cache.keys().next().value;
85
- if (oldest !== undefined)
86
- cache.delete(oldest);
87
- }
88
- }
89
- catch (e) {
90
- if (e instanceof DOMException && e.name === "AbortError")
91
- return;
92
- setError("Failed to load directory");
93
- }
94
- finally {
95
- if (!controller.signal.aborted) {
96
- setIsLoading(false);
97
- }
98
- }
99
- }, []);
100
- useEffect(() => {
101
- fetchListing(initialPath);
102
- return () => abortRef.current?.abort();
103
- }, [initialPath, fetchListing]);
104
- const browse = useCallback((path) => {
105
- fetchListing(path);
106
- }, [fetchListing]);
107
- const clearError = useCallback(() => setError(null), []);
108
- return { listing, isLoading, error, isAvailable, browse, clearError };
109
- }
110
- //# sourceMappingURL=useFolderListing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFolderListing.js","sourceRoot":"","sources":["../../src/workspace/useFolderListing.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAwCjE,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAoB;IAEpB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,MAAM,CAA6B,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;QAC1D,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC;QAE9B,MAAM,QAAQ,GAAG,OAAO,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,MAAM,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,eAAe,MAAM,EAAE,EAAE;gBAChD,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtB,QAAQ,CAAC,8BAA8B,CAAC,CAAC;oBACzC,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,GAAG,GACN,IAAkC,EAAE,KAAK,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,IAAI,GAAkB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEf,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBACzC,IAAI,MAAM,KAAK,SAAS;oBAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YACjE,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,IAAY,EAAE,EAAE;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC"}