@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.
- package/README.md +57 -12
- package/agent/AgentDetailView.js +7 -7
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/AgentPicker.js +3 -3
- package/agent/AgentPicker.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +1 -1
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.js +4 -4
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.js +1 -1
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/attachment/AttachmentChipList.js +2 -2
- package/attachment/AttachmentChipList.js.map +1 -1
- package/color-mode.d.ts +48 -0
- package/color-mode.d.ts.map +1 -0
- package/color-mode.js +53 -0
- package/color-mode.js.map +1 -0
- package/composer/ComposerToolbar.d.ts +6 -2
- package/composer/ComposerToolbar.d.ts.map +1 -1
- package/composer/ComposerToolbar.js +5 -3
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/ConfigureMenu.js +3 -3
- package/composer/ConfigureMenu.js.map +1 -1
- package/composer/ContextChip.js +1 -1
- package/composer/ContextChip.js.map +1 -1
- package/composer/ContextPopover.js +1 -1
- package/composer/ContextPopover.js.map +1 -1
- package/composer/SessionComposer.d.ts +24 -3
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +5 -4
- package/composer/SessionComposer.js.map +1 -1
- package/environment/CreateEnvironmentForm.js +1 -1
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.js +2 -2
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentListPanel.js +2 -2
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/environment/EnvironmentVariableEditor.js +6 -6
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/error/ErrorMessage.js +1 -1
- package/error/ErrorMessage.js.map +1 -1
- package/execution/ApprovalCard.js +4 -4
- package/execution/ApprovalCard.js.map +1 -1
- package/execution/ArtifactCard.js +1 -1
- package/execution/ArtifactCard.js.map +1 -1
- package/execution/ArtifactPreviewModal.js +4 -4
- package/execution/ArtifactPreviewModal.js.map +1 -1
- package/execution/FollowUpInput.js +1 -1
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/McpToolDetail.js +4 -4
- package/execution/McpToolDetail.js.map +1 -1
- package/execution/MessageEntry.js +1 -1
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.js +1 -1
- package/execution/MessageThread.js.map +1 -1
- package/execution/SessionVariablesInput.js +4 -4
- package/execution/SessionVariablesInput.js.map +1 -1
- package/execution/SubAgentSection.js +2 -2
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/ToolCallDetail.js +2 -2
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallGroup.js +1 -1
- package/execution/ToolCallGroup.js.map +1 -1
- package/execution/ToolCallItem.js +2 -2
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/WriteBackCard.js +3 -3
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/tool-rendering-primitives.js +3 -3
- package/execution/tool-rendering-primitives.js.map +1 -1
- package/github/GitHubRepoPicker.js +5 -5
- package/github/GitHubRepoPicker.js.map +1 -1
- package/iam-policy/GrantAccessForm.js +1 -1
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.js +5 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +3 -3
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +5 -5
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +3 -3
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +7 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/ProviderPicker.js +2 -2
- package/identity-provider/ProviderPicker.js.map +1 -1
- package/index.d.ts +8 -4
- package/index.d.ts.map +1 -1
- package/index.js +7 -3
- package/index.js.map +1 -1
- package/internal/CloudFeatureNotice.js +1 -1
- package/internal/CloudFeatureNotice.js.map +1 -1
- package/internal/Tabs.js +1 -1
- package/internal/Tabs.js.map +1 -1
- package/internal/markdown-components.js +2 -2
- package/internal/markdown-components.js.map +1 -1
- package/invitation/InvitationCreatedAlert.js +1 -1
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.js +5 -5
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.js +4 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/ResourceCountCard.js +1 -1
- package/library/ResourceCountCard.js.map +1 -1
- package/library/ResourceListView.js +5 -5
- package/library/ResourceListView.js.map +1 -1
- package/mcp-server/McpServerConfigPanel.js +5 -5
- package/mcp-server/McpServerConfigPanel.js.map +1 -1
- package/mcp-server/McpServerConnectDialog.js +4 -4
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.js +14 -14
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/McpServerPicker.js +4 -4
- package/mcp-server/McpServerPicker.js.map +1 -1
- package/mcp-server/McpToolSelector.js +3 -3
- package/mcp-server/McpToolSelector.js.map +1 -1
- package/mcp-server/OAuthAppForm.js +1 -1
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/models/ModelSelector.js +1 -1
- package/models/ModelSelector.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +1 -1
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +3 -3
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/oauth-app/OAuthAppListPanel.js +2 -2
- package/oauth-app/OAuthAppListPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.js +1 -1
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.js +3 -3
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.js +2 -2
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +4 -4
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.js +3 -3
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +2 -2
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +39 -2
- package/provider.d.ts.map +1 -1
- package/provider.js +11 -3
- package/provider.js.map +1 -1
- package/runner/RunnerListPanel.d.ts +65 -0
- package/runner/RunnerListPanel.d.ts.map +1 -0
- package/runner/RunnerListPanel.js +237 -0
- package/runner/RunnerListPanel.js.map +1 -0
- package/runner/RunnerPicker.d.ts +54 -0
- package/runner/RunnerPicker.d.ts.map +1 -0
- package/runner/RunnerPicker.js +133 -0
- package/runner/RunnerPicker.js.map +1 -0
- package/runner/__tests__/useDeleteRunner.test.d.ts +2 -0
- package/runner/__tests__/useDeleteRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useDeleteRunner.test.js +108 -0
- package/runner/__tests__/useDeleteRunner.test.js.map +1 -0
- package/runner/__tests__/useLaunchLocalRunner.test.d.ts +2 -0
- package/runner/__tests__/useLaunchLocalRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useLaunchLocalRunner.test.js +143 -0
- package/runner/__tests__/useLaunchLocalRunner.test.js.map +1 -0
- package/runner/__tests__/useStopRunner.test.d.ts +2 -0
- package/runner/__tests__/useStopRunner.test.d.ts.map +1 -0
- package/runner/__tests__/useStopRunner.test.js +114 -0
- package/runner/__tests__/useStopRunner.test.js.map +1 -0
- package/runner/index.d.ts +14 -0
- package/runner/index.d.ts.map +1 -0
- package/runner/index.js +8 -0
- package/runner/index.js.map +1 -0
- package/runner/phase.d.ts +30 -0
- package/runner/phase.d.ts.map +1 -0
- package/runner/phase.js +58 -0
- package/runner/phase.js.map +1 -0
- package/runner/useDeleteRunner.d.ts +36 -0
- package/runner/useDeleteRunner.d.ts.map +1 -0
- package/runner/useDeleteRunner.js +42 -0
- package/runner/useDeleteRunner.js.map +1 -0
- package/runner/useLaunchLocalRunner.d.ts +84 -0
- package/runner/useLaunchLocalRunner.d.ts.map +1 -0
- package/runner/useLaunchLocalRunner.js +75 -0
- package/runner/useLaunchLocalRunner.js.map +1 -0
- package/runner/useRunnerList.d.ts +49 -0
- package/runner/useRunnerList.d.ts.map +1 -0
- package/runner/useRunnerList.js +70 -0
- package/runner/useRunnerList.js.map +1 -0
- package/runner/useStopRunner.d.ts +53 -0
- package/runner/useStopRunner.d.ts.map +1 -0
- package/runner/useStopRunner.js +50 -0
- package/runner/useStopRunner.js.map +1 -0
- package/session/draft.d.ts +53 -0
- package/session/draft.d.ts.map +1 -0
- package/session/draft.js +45 -0
- package/session/draft.js.map +1 -0
- package/session/index.d.ts +10 -0
- package/session/index.d.ts.map +1 -1
- package/session/index.js +5 -0
- package/session/index.js.map +1 -1
- package/session/useCreateSession.d.ts +8 -0
- package/session/useCreateSession.d.ts.map +1 -1
- package/session/useCreateSession.js +1 -0
- package/session/useCreateSession.js.map +1 -1
- package/session/useEditSessionPrep.d.ts +26 -0
- package/session/useEditSessionPrep.d.ts.map +1 -0
- package/session/useEditSessionPrep.js +83 -0
- package/session/useEditSessionPrep.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +110 -0
- package/session/useNewSessionFlow.d.ts.map +1 -0
- package/session/useNewSessionFlow.js +184 -0
- package/session/useNewSessionFlow.js.map +1 -0
- package/session/usePersistedModel.d.ts +18 -0
- package/session/usePersistedModel.d.ts.map +1 -0
- package/session/usePersistedModel.js +31 -0
- package/session/usePersistedModel.js.map +1 -0
- package/session/useSessionPageFlow.d.ts +104 -0
- package/session/useSessionPageFlow.d.ts.map +1 -0
- package/session/useSessionPageFlow.js +172 -0
- package/session/useSessionPageFlow.js.map +1 -0
- package/skill/SkillDetailView.js +3 -3
- package/skill/SkillDetailView.js.map +1 -1
- package/skill/SkillPicker.js +3 -3
- package/skill/SkillPicker.js.map +1 -1
- package/src/agent/AgentDetailView.tsx +8 -8
- package/src/agent/AgentPicker.tsx +3 -3
- package/src/api-key/ApiKeyCreatedAlert.tsx +2 -2
- package/src/api-key/ApiKeyListPanel.tsx +6 -6
- package/src/api-key/CreateApiKeyForm.tsx +2 -2
- package/src/attachment/AttachmentChipList.tsx +3 -3
- package/src/color-mode.ts +75 -0
- package/src/composer/ComposerToolbar.tsx +29 -7
- package/src/composer/ConfigureMenu.tsx +6 -6
- package/src/composer/ContextChip.tsx +1 -1
- package/src/composer/ContextPopover.tsx +2 -2
- package/src/composer/SessionComposer.tsx +34 -5
- package/src/environment/CreateEnvironmentForm.tsx +3 -3
- package/src/environment/EnvVarForm.tsx +6 -6
- package/src/environment/EnvironmentListPanel.tsx +3 -3
- package/src/environment/EnvironmentVariableEditor.tsx +7 -7
- package/src/error/ErrorMessage.tsx +5 -5
- package/src/execution/ApprovalCard.tsx +5 -5
- package/src/execution/ArtifactCard.tsx +2 -2
- package/src/execution/ArtifactPreviewModal.tsx +4 -4
- package/src/execution/FollowUpInput.tsx +2 -2
- package/src/execution/McpToolDetail.tsx +4 -4
- package/src/execution/MessageEntry.tsx +1 -1
- package/src/execution/MessageThread.tsx +1 -1
- package/src/execution/SessionVariablesInput.tsx +7 -7
- package/src/execution/SubAgentSection.tsx +5 -5
- package/src/execution/ToolCallDetail.tsx +2 -2
- package/src/execution/ToolCallGroup.tsx +3 -3
- package/src/execution/ToolCallItem.tsx +4 -4
- package/src/execution/WriteBackCard.tsx +5 -5
- package/src/execution/tool-rendering-primitives.tsx +5 -5
- package/src/github/GitHubRepoPicker.tsx +5 -5
- package/src/iam-policy/GrantAccessForm.tsx +2 -2
- package/src/iam-policy/OrgMembersPanel.tsx +11 -11
- package/src/identity-provider/CreateIdentityProviderForm.tsx +4 -4
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +7 -7
- package/src/identity-provider/IdentityProviderListPanel.tsx +7 -7
- package/src/identity-provider/IdentityProviderWizard.tsx +8 -8
- package/src/identity-provider/ProviderPicker.tsx +2 -2
- package/src/index.ts +46 -7
- package/src/internal/CloudFeatureNotice.tsx +1 -1
- package/src/internal/Tabs.tsx +1 -1
- package/src/internal/markdown-components.tsx +2 -2
- package/src/invitation/InvitationCreatedAlert.tsx +2 -2
- package/src/invitation/InvitationManager.tsx +9 -9
- package/src/invitation/InvitationRedemption.tsx +11 -11
- package/src/library/ResourceCountCard.tsx +1 -1
- package/src/library/ResourceListView.tsx +7 -7
- package/src/mcp-server/McpServerConfigPanel.tsx +7 -7
- package/src/mcp-server/McpServerConnectDialog.tsx +5 -5
- package/src/mcp-server/McpServerDetailView.tsx +19 -19
- package/src/mcp-server/McpServerPicker.tsx +6 -6
- package/src/mcp-server/McpToolSelector.tsx +4 -4
- package/src/mcp-server/OAuthAppForm.tsx +3 -3
- package/src/models/ModelSelector.tsx +1 -1
- package/src/oauth-app/CreateOAuthAppForm.tsx +3 -3
- package/src/oauth-app/OAuthAppDetailPanel.tsx +7 -7
- package/src/oauth-app/OAuthAppListPanel.tsx +3 -3
- package/src/organization/CreateOrganizationForm.tsx +3 -3
- package/src/organization/OrgProfilePanel.tsx +4 -5
- package/src/platform-client/CreatePlatformClientForm.tsx +6 -6
- package/src/platform-client/PlatformClientDetailPanel.tsx +19 -19
- package/src/platform-client/PlatformClientListPanel.tsx +7 -7
- package/src/platform-client/PlatformClientSecretAlert.tsx +2 -2
- package/src/provider.tsx +52 -2
- package/src/runner/RunnerListPanel.tsx +725 -0
- package/src/runner/RunnerPicker.tsx +319 -0
- package/src/runner/__tests__/useDeleteRunner.test.tsx +150 -0
- package/src/runner/__tests__/useLaunchLocalRunner.test.tsx +223 -0
- package/src/runner/__tests__/useStopRunner.test.tsx +154 -0
- package/src/runner/index.ts +34 -0
- package/src/runner/phase.ts +62 -0
- package/src/runner/useDeleteRunner.ts +67 -0
- package/src/runner/useLaunchLocalRunner.ts +139 -0
- package/src/runner/useRunnerList.ts +114 -0
- package/src/runner/useStopRunner.ts +92 -0
- package/src/session/draft.ts +82 -0
- package/src/session/index.ts +28 -0
- package/src/session/useCreateSession.ts +9 -0
- package/src/session/useEditSessionPrep.ts +111 -0
- package/src/session/useNewSessionFlow.ts +283 -0
- package/src/session/usePersistedModel.ts +41 -0
- package/src/session/useSessionPageFlow.ts +280 -0
- package/src/skill/SkillDetailView.tsx +5 -5
- package/src/skill/SkillPicker.tsx +3 -3
- package/src/styles.css +25 -1
- package/src/usage/OrgUsagePanel.tsx +4 -4
- package/src/workspace/WorkspaceEditor.tsx +78 -66
- package/src/workspace/index.ts +0 -8
- package/styles.css +1 -1
- package/usage/OrgUsagePanel.js +2 -2
- package/usage/OrgUsagePanel.js.map +1 -1
- package/workspace/WorkspaceEditor.d.ts +28 -3
- package/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/workspace/WorkspaceEditor.js +24 -25
- package/workspace/WorkspaceEditor.js.map +1 -1
- package/workspace/index.d.ts +0 -4
- package/workspace/index.d.ts.map +1 -1
- package/workspace/index.js +0 -2
- package/workspace/index.js.map +1 -1
- package/src/workspace/FolderBrowser.tsx +0 -579
- package/src/workspace/useFolderListing.ts +0 -164
- package/workspace/FolderBrowser.d.ts +0 -37
- package/workspace/FolderBrowser.d.ts.map +0 -1
- package/workspace/FolderBrowser.js +0 -188
- package/workspace/FolderBrowser.js.map +0 -1
- package/workspace/useFolderListing.d.ts +0 -73
- package/workspace/useFolderListing.d.ts.map +0 -1
- package/workspace/useFolderListing.js +0 -110
- 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":"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"}
|