@agent-native/core 0.114.5 → 0.114.6
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/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +8 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/resources/ResourceTree.tsx +11 -5
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +141 -18
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +1 -2
- package/corpus/templates/clips/changelog/2026-07-20-opening-zoom-meeting-launches-native-app.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +7 -11
- package/corpus/templates/clips/desktop/src/lib/open-meeting-join-url.ts +22 -0
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +2 -3
- package/corpus/templates/clips/shared/meeting-join-url.ts +0 -5
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +9 -1
- package/corpus/templates/content/AGENTS.md +4 -1
- package/corpus/templates/content/actions/_content-spaces.ts +6 -1
- package/corpus/templates/content/actions/_database-row-batch.ts +15 -2
- package/corpus/templates/content/actions/_database-utils.ts +83 -15
- package/corpus/templates/content/actions/add-database-item.ts +3 -0
- package/corpus/templates/content/actions/connect-local-folder-source.ts +2 -1
- package/corpus/templates/content/actions/delete-content-database.ts +12 -9
- package/corpus/templates/content/actions/delete-database-items.ts +3 -2
- package/corpus/templates/content/actions/delete-document.ts +233 -6
- package/corpus/templates/content/actions/duplicate-database-item.ts +1 -0
- package/corpus/templates/content/actions/get-document.ts +4 -1
- package/corpus/templates/content/actions/list-content-databases.ts +1 -0
- package/corpus/templates/content/actions/list-documents.ts +1 -0
- package/corpus/templates/content/actions/list-trashed-content-databases.ts +8 -2
- package/corpus/templates/content/actions/list-trashed-documents.ts +50 -0
- package/corpus/templates/content/actions/permanently-delete-document.ts +28 -0
- package/corpus/templates/content/actions/pull-document.ts +15 -2
- package/corpus/templates/content/actions/restore-content-database.ts +48 -11
- package/corpus/templates/content/actions/restore-document.ts +28 -0
- package/corpus/templates/content/actions/search-documents.ts +2 -1
- package/corpus/templates/content/actions/view-screen.ts +2 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +149 -55
- package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +7 -2
- package/corpus/templates/content/app/components/editor/database/ListView.tsx +7 -2
- package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +3 -0
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +26 -5
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +243 -163
- package/corpus/templates/content/app/components/sidebar/WorkspaceSourceMenu.tsx +154 -0
- package/corpus/templates/content/app/components/sidebar/select-content-space.ts +11 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +6 -0
- package/corpus/templates/content/app/hooks/use-documents.ts +57 -0
- package/corpus/templates/content/app/i18n-data.ts +83 -2
- package/corpus/templates/content/app/routes/_app.local-files.tsx +8 -1
- package/corpus/templates/content/changelog/2026-07-19-pages-now-move-to-a-reversible-trash-and-the-organization-pi.md +6 -0
- package/corpus/templates/content/changelog/2026-07-20-trash-actions-now-preserve-independent-archived-pages-enforc.md +6 -0
- package/corpus/templates/content/changelog/2026-07-20-workspace-toggles-now-stay-independently-open-or-closed-and-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-20-workspaces-can-be-added-from-a-blank-workspace-or-a-connecte.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +3 -0
- package/corpus/templates/content/server/db/schema.ts +2 -0
- package/corpus/templates/content/server/lib/public-documents.ts +8 -2
- package/corpus/templates/content/server/plugins/db.ts +52 -0
- package/corpus/templates/content/server/routes/api/document-agent-context.json.get.ts +2 -2
- package/corpus/templates/content/shared/api.ts +10 -0
- package/corpus/toolkit/CHANGELOG.md +6 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/ui/progress.tsx +3 -2
- package/dist/client/resources/ResourceTree.d.ts +3 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +4 -4
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +55 -6
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/package.json +2 -2
- package/src/client/resources/ResourceTree.tsx +11 -5
- package/src/client/resources/ResourcesPanel.tsx +141 -18
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "@tabler/icons-react";
|
|
18
18
|
import { useQueryClient } from "@tanstack/react-query";
|
|
19
19
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
20
|
-
import { useNavigate, useSearchParams } from "react-router";
|
|
20
|
+
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
|
21
21
|
import { toast } from "sonner";
|
|
22
22
|
|
|
23
23
|
import { Button } from "@/components/ui/button";
|
|
@@ -749,11 +749,17 @@ export default function LocalFilesRoute() {
|
|
|
749
749
|
const t = useT();
|
|
750
750
|
const queryClient = useQueryClient();
|
|
751
751
|
const [searchParams] = useSearchParams();
|
|
752
|
+
const location = useLocation();
|
|
752
753
|
const navigate = useNavigate();
|
|
753
754
|
const targetSpaceId = searchParams.get("spaceId") || undefined;
|
|
754
755
|
const targetDatabaseId = searchParams.get("databaseId") || undefined;
|
|
755
756
|
const manifestConnectionId = searchParams.get("connectionId") || undefined;
|
|
756
757
|
const manifestFile = searchParams.get("file") || undefined;
|
|
758
|
+
const workspacePropertyValues = (
|
|
759
|
+
location.state as {
|
|
760
|
+
workspacePropertyValues?: Record<string, unknown>;
|
|
761
|
+
} | null
|
|
762
|
+
)?.workspacePropertyValues;
|
|
757
763
|
const { data: documents = [] } = useDocuments();
|
|
758
764
|
const [directories, setDirectories] = useState<SelectedDirectory[]>([]);
|
|
759
765
|
const [status, setStatus] = useState<SyncStatus>({ kind: "idle" });
|
|
@@ -929,6 +935,7 @@ export default function LocalFilesRoute() {
|
|
|
929
935
|
spaceId: targetSpaceId,
|
|
930
936
|
databaseId: targetDatabaseId,
|
|
931
937
|
createSourceBackedSpace: !targetSpaceId && !targetDatabaseId,
|
|
938
|
+
propertyValues: workspacePropertyValues,
|
|
932
939
|
truthPolicy: "source_primary",
|
|
933
940
|
dryRun,
|
|
934
941
|
} as never,
|
|
@@ -20,7 +20,7 @@ This generated matrix tracks whether high-value Content UI operations use the sa
|
|
|
20
20
|
| sharing.document-discoverability-and-export | sharing | Share, hide from search, export, and reveal documents | action-backed | `export-document`, `reveal-local-source-file`, `set-document-discoverability`, `share-local-file-document` | `app/components/editor/DocumentToolbar.tsx`, `app/hooks/use-documents.ts` | Search discoverability, shareable copies, exports, and OS reveal requests are managed through Content actions. | - | - | P0 | covered | `actions/_local-file-documents.test.ts` | `local-file-source-truth` | - |
|
|
21
21
|
| sharing.os-reveal-local-source | sharing | Reveal a local source file in the system file manager | host-only | `reveal-local-source-file` | `app/components/editor/DocumentToolbar.tsx`, `actions/reveal-local-source-file.ts` | - | OS reveal depends on trusted local host capabilities and should not spend agent tool surface or imply portable hosted behavior. | - | P2 | seeded | - | - | Local folder exception/docs PR |
|
|
22
22
|
| sidebar.chrome-state | sidebar | Collapse sections and resize the sidebar | client-only-ephemeral | - | `app/components/sidebar/DocumentSidebar.tsx`, `app/components/layout/Layout.tsx` | - | - | - | P2 | none | - | - | - |
|
|
23
|
-
| sidebar.document-tree-crud | sidebar | Create, delete, move, favorite, list, search, and open pages | action-backed | `create-document`, `clone-creative-context-document`, `delete-document`, `get-document`, `list-documents`, `move-document`, `search-documents`, `update-document`
|
|
23
|
+
| sidebar.document-tree-crud | sidebar | Create, delete, move, favorite, list, search, and open pages | action-backed | `create-document`, `clone-creative-context-document`, `delete-document`, `get-document`, `list-trashed-documents`, `list-documents`, `move-document`, `permanently-delete-document`, `restore-document`, `search-documents`, `update-document` | `app/components/sidebar/DocumentSidebar.tsx`, `app/components/sidebar/DocumentTreeItem.tsx`, `app/hooks/use-documents.ts` | Document tree rows and document metadata are created, updated, deleted, moved, searched, or read. | - | - | P0 | covered | `actions/content-database-lifecycle.db.test.ts`, `actions/_local-file-documents.test.ts` | `document-search-edit` | - |
|
|
24
24
|
| sidebar.navigation-and-screen-context | sidebar | Navigate between documents and expose current screen context | action-equivalent | `navigate`, `view-screen` | `app/components/sidebar/DocumentSidebar.tsx`, `actions/navigate.ts`, `actions/view-screen.ts` | Application navigation state is updated or read so the agent can reason about the user's current page/view. | Human navigation is router-local, while agent navigation/screen inspection uses application-state actions to produce the same workspace orientation effect. | - | P1 | seeded | - | - | - |
|
|
25
25
|
| source-sync.builder-body-hydration-worker | source-sync | Process queued Builder CMS body hydration work | action-backed | `process-builder-body-hydration` | `app/components/editor/DocumentEditor.tsx`, `app/components/editor/database/DatabaseView.tsx`, `app/hooks/use-content-database.ts` | Queued Builder body hydration entries are processed into readable Content document/database body state. | This action is intentionally hidden from the model with agentTool: false because it is an internal bounded queue worker; agents should use source refresh, review, and execution actions rather than manually driving hydration internals. | - | P0 | covered | `actions/_database-source-utils.test.ts` | - | - |
|
|
26
26
|
| source-sync.builder-cms-review-and-write-gates | source-sync | Review, stage, validate, cancel, and execute Builder CMS source writes | action-backed | `cancel-prepared-builder-source-update`, `execute-builder-source-batch`, `execute-builder-source-execution`, `prepare-builder-source-execution`, `prepare-builder-source-review`, `preview-builder-source-review`, `review-content-database-source-change-set`, `set-content-database-source-write-mode`, `stage-builder-source-bulk-update`, `stage-builder-revision`, `validate-builder-source-execution` | `app/components/editor/DocumentDatabase.tsx`, `app/components/editor/database/DatabaseView.tsx`, `app/components/editor/database-sources/BuilderSourceReviewDialog.tsx` | Builder source write mode, staged reviews, pre-dispatch cancellations, validation records, and bounded execution records are created through guarded actions. | - | - | P0 | covered | `actions/builder-source-review-gates.db.test.ts`, `actions/cancel-prepared-builder-source-update.db.test.ts`, `actions/execute-builder-source-execution.test.ts`, `actions/stage-builder-source-bulk-update.db.test.ts` | `builder-source-review-readonly` | - |
|
|
@@ -20,8 +20,11 @@ export const parityMatrix: ParityRow[] = [
|
|
|
20
20
|
"clone-creative-context-document",
|
|
21
21
|
"delete-document",
|
|
22
22
|
"get-document",
|
|
23
|
+
"list-trashed-documents",
|
|
23
24
|
"list-documents",
|
|
24
25
|
"move-document",
|
|
26
|
+
"permanently-delete-document",
|
|
27
|
+
"restore-document",
|
|
25
28
|
"search-documents",
|
|
26
29
|
"update-document",
|
|
27
30
|
],
|
|
@@ -27,6 +27,8 @@ export const documents = table("documents", {
|
|
|
27
27
|
sourcePath: text("source_path"),
|
|
28
28
|
sourceRootPath: text("source_root_path"),
|
|
29
29
|
sourceUpdatedAt: text("source_updated_at"),
|
|
30
|
+
trashedAt: text("trashed_at"),
|
|
31
|
+
trashRootId: text("trash_root_id"),
|
|
30
32
|
createdAt: text("created_at").notNull().default(now()),
|
|
31
33
|
updatedAt: text("updated_at").notNull().default(now()),
|
|
32
34
|
...ownableColumns(),
|
|
@@ -88,7 +88,7 @@ async function getPublicDocumentForEvent(event: H3Event) {
|
|
|
88
88
|
|
|
89
89
|
const { getDb } = await import("../db/index.js");
|
|
90
90
|
const { documents } = await import("../db/schema.js");
|
|
91
|
-
const { and, eq } = await import("drizzle-orm");
|
|
91
|
+
const { and, eq, isNull } = await import("drizzle-orm");
|
|
92
92
|
|
|
93
93
|
const [doc] = await getDb()
|
|
94
94
|
.select({
|
|
@@ -100,7 +100,13 @@ async function getPublicDocumentForEvent(event: H3Event) {
|
|
|
100
100
|
visibility: documents.visibility,
|
|
101
101
|
})
|
|
102
102
|
.from(documents)
|
|
103
|
-
.where(
|
|
103
|
+
.where(
|
|
104
|
+
and(
|
|
105
|
+
eq(documents.id, id),
|
|
106
|
+
eq(documents.visibility, "public"),
|
|
107
|
+
isNull(documents.trashedAt),
|
|
108
|
+
),
|
|
109
|
+
)
|
|
104
110
|
.limit(1);
|
|
105
111
|
|
|
106
112
|
return doc ?? null;
|
|
@@ -856,6 +856,58 @@ const runContentMigrations = runMigrations(
|
|
|
856
856
|
CREATE UNIQUE INDEX IF NOT EXISTS document_property_definitions_database_system_role_unique
|
|
857
857
|
ON document_property_definitions (database_id, system_role)`,
|
|
858
858
|
},
|
|
859
|
+
{
|
|
860
|
+
version: 76,
|
|
861
|
+
name: "document-trash-lifecycle",
|
|
862
|
+
sql: `ALTER TABLE documents ADD COLUMN IF NOT EXISTS trashed_at TEXT;
|
|
863
|
+
ALTER TABLE documents ADD COLUMN IF NOT EXISTS trash_root_id TEXT;
|
|
864
|
+
CREATE INDEX IF NOT EXISTS documents_trash_idx ON documents (owner_email, trashed_at, trash_root_id)`,
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
version: 77,
|
|
868
|
+
name: "backfill-database-trash-roots",
|
|
869
|
+
// guard:allow-unscoped — boot migration claims only archived database trees that predate document Trash metadata.
|
|
870
|
+
sql: `WITH RECURSIVE legacy_database_trash(document_id, root_id, deleted_at) AS (
|
|
871
|
+
SELECT documents.id, documents.id, MIN(content_databases.deleted_at)
|
|
872
|
+
FROM documents
|
|
873
|
+
INNER JOIN content_databases
|
|
874
|
+
ON content_databases.document_id = documents.id
|
|
875
|
+
WHERE documents.trashed_at IS NULL
|
|
876
|
+
AND content_databases.deleted_at IS NOT NULL
|
|
877
|
+
GROUP BY documents.id
|
|
878
|
+
UNION
|
|
879
|
+
SELECT child.id, legacy_database_trash.root_id, legacy_database_trash.deleted_at
|
|
880
|
+
FROM documents child
|
|
881
|
+
INNER JOIN legacy_database_trash
|
|
882
|
+
ON child.parent_id = legacy_database_trash.document_id
|
|
883
|
+
WHERE child.trashed_at IS NULL
|
|
884
|
+
AND NOT EXISTS (
|
|
885
|
+
SELECT 1
|
|
886
|
+
FROM content_databases child_database
|
|
887
|
+
WHERE child_database.document_id = child.id
|
|
888
|
+
AND child_database.deleted_at IS NOT NULL
|
|
889
|
+
)
|
|
890
|
+
)
|
|
891
|
+
UPDATE documents
|
|
892
|
+
SET trashed_at = (
|
|
893
|
+
SELECT legacy_database_trash.deleted_at
|
|
894
|
+
FROM legacy_database_trash
|
|
895
|
+
WHERE legacy_database_trash.document_id = documents.id
|
|
896
|
+
LIMIT 1
|
|
897
|
+
),
|
|
898
|
+
trash_root_id = (
|
|
899
|
+
SELECT legacy_database_trash.root_id
|
|
900
|
+
FROM legacy_database_trash
|
|
901
|
+
WHERE legacy_database_trash.document_id = documents.id
|
|
902
|
+
LIMIT 1
|
|
903
|
+
)
|
|
904
|
+
WHERE documents.trashed_at IS NULL
|
|
905
|
+
AND EXISTS (
|
|
906
|
+
SELECT 1
|
|
907
|
+
FROM legacy_database_trash
|
|
908
|
+
WHERE legacy_database_trash.document_id = documents.id
|
|
909
|
+
)`,
|
|
910
|
+
},
|
|
859
911
|
],
|
|
860
912
|
{ table: "content_migrations" },
|
|
861
913
|
);
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
getConfiguredAppBasePath,
|
|
4
4
|
verifyScopedAgentAccessToken,
|
|
5
5
|
} from "@agent-native/core/server";
|
|
6
|
-
import { eq } from "drizzle-orm";
|
|
6
|
+
import { and, eq, isNull } from "drizzle-orm";
|
|
7
7
|
import {
|
|
8
8
|
defineEventHandler,
|
|
9
9
|
getQuery,
|
|
@@ -56,7 +56,7 @@ export default defineEventHandler(async (event) => {
|
|
|
56
56
|
createdAt: schema.documents.createdAt,
|
|
57
57
|
})
|
|
58
58
|
.from(schema.documents)
|
|
59
|
-
.where(eq(schema.documents.id, id))
|
|
59
|
+
.where(and(eq(schema.documents.id, id), isNull(schema.documents.trashedAt)))
|
|
60
60
|
.limit(1);
|
|
61
61
|
|
|
62
62
|
if (!document) {
|
|
@@ -911,6 +911,16 @@ export interface ListTrashedContentDatabasesResponse {
|
|
|
911
911
|
databases: TrashedContentDatabaseSummary[];
|
|
912
912
|
}
|
|
913
913
|
|
|
914
|
+
export interface TrashedDocumentSummary {
|
|
915
|
+
documentId: string;
|
|
916
|
+
title: string;
|
|
917
|
+
trashedAt: string;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
export interface ListTrashedDocumentsResponse {
|
|
921
|
+
documents: TrashedDocumentSummary[];
|
|
922
|
+
}
|
|
923
|
+
|
|
914
924
|
export interface SuggestSourceJoinKeyRequest {
|
|
915
925
|
databaseId?: string;
|
|
916
926
|
documentId?: string;
|
|
@@ -9,6 +9,7 @@ const Progress = React.forwardRef<
|
|
|
9
9
|
>(({ className, value, ...props }, ref) => (
|
|
10
10
|
<ProgressPrimitive.Root
|
|
11
11
|
ref={ref}
|
|
12
|
+
value={value}
|
|
12
13
|
className={cn(
|
|
13
14
|
"relative h-4 w-full overflow-hidden rounded-full bg-secondary",
|
|
14
15
|
className,
|
|
@@ -16,8 +17,8 @@ const Progress = React.forwardRef<
|
|
|
16
17
|
{...props}
|
|
17
18
|
>
|
|
18
19
|
<ProgressPrimitive.Indicator
|
|
19
|
-
className="h-full w-full flex-1 bg-primary transition-
|
|
20
|
-
style={{ transform: `translateX(-${100 - (value
|
|
20
|
+
className="h-full w-full flex-1 bg-primary transition-transform"
|
|
21
|
+
style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}
|
|
21
22
|
/>
|
|
22
23
|
</ProgressPrimitive.Root>
|
|
23
24
|
));
|
|
@@ -25,6 +25,8 @@ export interface ResourceTreeProps {
|
|
|
25
25
|
headingHint?: React.ReactNode;
|
|
26
26
|
/** Scope-specific action shown beside the section heading. */
|
|
27
27
|
sectionAction?: React.ReactNode;
|
|
28
|
+
/** Scope-specific action shown beneath an empty collection message. */
|
|
29
|
+
emptyStateAction?: React.ReactNode;
|
|
28
30
|
}
|
|
29
|
-
export declare function ResourceTree({ tree, variant, selectedId, onSelect, onCreateFile, onCreateFolder, onDelete, onDrop, title, titleTooltip, isLoading, deletingId, readOnly, headingHint, sectionAction, }: ResourceTreeProps): React.JSX.Element;
|
|
31
|
+
export declare function ResourceTree({ tree, variant, selectedId, onSelect, onCreateFile, onCreateFolder, onDelete, onDrop, title, titleTooltip, isLoading, deletingId, readOnly, headingHint, sectionAction, emptyStateAction, }: ResourceTreeProps): React.JSX.Element;
|
|
30
32
|
//# sourceMappingURL=ResourceTree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceTree.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAU7D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAoE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ResourceTree.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAU7D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAoE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC;AAsfD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAgB,EAChB,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,MAAM,EACN,KAAe,EACf,YAAY,EACZ,SAAiB,EACjB,UAAiB,EACjB,QAAgB,EAChB,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,EAAE,iBAAiB,qBA8NnB"}
|
|
@@ -197,7 +197,7 @@ function InlineInput({ depth, onConfirm, onCancel, }) {
|
|
|
197
197
|
}, className: "min-w-0 flex-1 bg-transparent text-[12px] leading-none text-foreground outline-none placeholder:text-muted-foreground/50", placeholder: "filename.md" })] }));
|
|
198
198
|
}
|
|
199
199
|
// ─── ResourceTree ───────────────────────────────────────────────────────────
|
|
200
|
-
export function ResourceTree({ tree, variant = "tree", selectedId, onSelect, onCreateFile, onCreateFolder, onDelete, onDrop, title = "Files", titleTooltip, isLoading = false, deletingId = null, readOnly = false, headingHint, sectionAction, }) {
|
|
200
|
+
export function ResourceTree({ tree, variant = "tree", selectedId, onSelect, onCreateFile, onCreateFolder, onDelete, onDrop, title = "Files", titleTooltip, isLoading = false, deletingId = null, readOnly = false, headingHint, sectionAction, emptyStateAction, }) {
|
|
201
201
|
const [expanded, setExpanded] = useState(() => new Set());
|
|
202
202
|
const [creating, setCreating] = useState(null);
|
|
203
203
|
const [dragOver, setDragOver] = useState(false);
|
|
@@ -264,8 +264,8 @@ export function ResourceTree({ tree, variant = "tree", selectedId, onSelect, onC
|
|
|
264
264
|
: tree.map((node) => (_jsx(TreeNodeRow, { node: node, depth: 0, expanded: expanded, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onToggle: toggleExpand, onSelect: onSelect, onDelete: onDelete, onStartCreate: handleStartCreate }, node.resource?.id ?? node.path))), isLoading && isEmpty && (_jsx("div", { className: cn("px-1 py-1"), children: Array.from({ length: 3 }).map((_, i) => (_jsxs("div", { className: cn("flex items-center gap-2 px-1.5 py-1", variant === "collection" && "gap-3 px-2.5 py-3"), children: [_jsx("div", { className: cn("rounded bg-muted-foreground/10 animate-pulse", variant === "collection" ? "size-8" : "h-3.5 w-3.5"), style: { animationDelay: `${i * 75}ms` } }), _jsx("div", { className: "h-3 rounded bg-muted-foreground/10 animate-pulse", style: {
|
|
265
265
|
width: `${50 + ((i * 37) % 40)}%`,
|
|
266
266
|
animationDelay: `${i * 75}ms`,
|
|
267
|
-
} })] }, i))) })), creating && creating.parentPath === "" && (_jsx(InlineInput, { depth: 0, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), creating && creating.parentPath !== "" && (_jsx(InlineInput, { depth: creating.parentPath.split("/").filter(Boolean).length, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), isEmpty && !creating && !isLoading && (_jsxs("div", { className: "flex items-start gap-2 border-y border-border/60 px-2 py-4", children: [_jsx(IconFile, { className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground" }), _jsx("p", { className: "text-xs text-muted-foreground", children: variant === "collection"
|
|
268
|
-
|
|
269
|
-
|
|
267
|
+
} })] }, i))) })), creating && creating.parentPath === "" && (_jsx(InlineInput, { depth: 0, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), creating && creating.parentPath !== "" && (_jsx(InlineInput, { depth: creating.parentPath.split("/").filter(Boolean).length, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), isEmpty && !creating && !isLoading && (_jsxs("div", { className: "flex items-start gap-2 border-y border-border/60 px-2 py-4", children: [_jsx(IconFile, { className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: variant === "collection"
|
|
268
|
+
? "No resources in this collection yet"
|
|
269
|
+
: "No files yet" }), emptyStateAction] })] }))] }));
|
|
270
270
|
}
|
|
271
271
|
//# sourceMappingURL=ResourceTree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceTree.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,WAAW,EACX,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAIjC,SAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAO,GAIR;IACC,OAAO,CACL,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,6BACc,OAAO,EACnB,SAAS,EAAE,EAAE,CAAC,wCAAwC,EAAE,SAAS,CAAC,GAClE,GACa,EACjB,KAAC,cAAc,cAAE,OAAO,GAAkB,IAClC,GACM,CACnB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,SAAS,WAAW,CAAC,IAAc;IACjC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CACL,KAAC,cAAc,IAAC,SAAS,EAAC,4CAA4C,GAAG,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/D,OAAO,CACL,KAAC,iBAAiB,IAAC,SAAS,EAAC,4CAA4C,GAAG,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,cAAc,EAAE,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,CACzD,KAAC,WAAW,IAAC,SAAS,EAAC,4CAA4C,GAAG,CACvE,CAAC,CAAC,CAAC,CACF,KAAC,iBAAiB,IAAC,SAAS,EAAC,4CAA4C,GAAG,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,KAAC,QAAQ,IAAC,SAAS,EAAC,4CAA4C,GAAG,CAAC;IAC7E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CACL,KAAC,cAAc,IAAC,SAAS,EAAC,4CAA4C,GAAG,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,4CAA4C,CAAC;IAC/D,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;QAC/B,OAAO,KAAC,YAAY,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IAChD,IACE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAE3E,OAAO,KAAC,YAAY,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnE,OAAO,KAAC,SAAS,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;IAC7C,OAAO,KAAC,QAAQ,IAAC,SAAS,EAAE,SAAS,GAAI,CAAC;AAC5C,CAAC;AAoCD,SAAS,YAAY,CAAC,EAAE,MAAM,EAAyB;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC;IAC9D,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAE,cAAc,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAClF,CACH,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,GACjC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAC,kBAAa,GACrB,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,IAAI,EAAsB;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAE,IAAI,EAAE,iBAAiB,IAAI,4BAA4B,GAChE,CACH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAC,UAAU,GAClB,CACH,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAE,eAAe,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GACnF,CACH,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,GACjC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,KAAC,SAAS,IAAC,SAAS,EAAC,2BAA2B,EAAC,OAAO,EAAC,SAAS,GAAG,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,IAAI,EAAyB;IACnD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAC,UAAU,GAClB,CACH,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,wCAAwC,EAClD,OAAO,EAAC,SAAS,GACjB,CACH,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAC,iBAAiB,GACzB,CACH,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAC,oBAAoB,GAC5B,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAC,yBAAyB,GACjC,CACH,CAAC;AACJ,CAAC;AAID,SAAS,gBAAgB,CAAC,KAAiB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAsB;IACrD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CACL,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,cAAc,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,OAAO,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,CACL,IAAI,CAAC,eAAe,EAAE,WAAW;YACjC,IAAI,CAAC,eAAe,EAAE,GAAG;YACzB,cAAc,CACf,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CACL,IAAI,CAAC,OAAO,EAAE,mBAAmB;YACjC,IAAI,CAAC,OAAO,EAAE,QAAQ;YACtB,eAAe,CAChB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,cAAc,CAAC;IACvD,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,IAAI,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,GAQT;IACC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC;IACnD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAEjD,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,UAAU;YAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,yMAAyM,EACzM,UAAU;YACR,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,UAAU;gBACV,CAAC,CAAC,2BAA2B;gBAC7B,CAAC,CAAC,oCAAoC,CAC3C,EACD,YAAY,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,aAE9C,kBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,UAAU,kBACN,UAAU,EACxB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAC,8HAA8H,aAExI,cACE,SAAS,EAAE,EAAE,CACX,yEAAyE,EACzE,UAAU,IAAI,kBAAkB,CACjC,YAEA,WAAW,CAAC,IAAI,CAAC,GACd,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,0CAA0C,YACvD,IAAI,CAAC,IAAI,GACL,EACN,IAAI,CAAC,OAAO,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,CAAC,OAAO,GAAI,EACpD,IAAI,CAAC,aAAa,IAAI,KAAC,YAAY,IAAC,MAAM,EAAE,IAAI,CAAC,aAAa,GAAI,EAClE,IAAI,CAAC,cAAc,IAAI,KAAC,gBAAgB,IAAC,IAAI,EAAE,IAAI,GAAI,IACpD,EACN,eAAK,SAAS,EAAC,sDAAsD,aACnE,eAAM,SAAS,EAAC,2CAA2C,YACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,GACd,EACP,eAAM,SAAS,EAAC,mCAAmC,uBAAS,EAC5D,eAAM,SAAS,EAAC,wDAAwD,YACrE,UAAU,GACN,IACH,IACF,IACC,EACR,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAC3C,cACE,SAAS,EAAE,EAAE,CACX,8IAA8I,EAC9I,gBAAgB,IAAI,aAAa,CAClC,YAED,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YAChC,UAAU,CAAC,CAAC,CAAC,CACZ,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,6BACa,gBAAW,EACtB,SAAS,EAAC,uEAAuE,YAEjF,KAAC,WAAW,IAAC,SAAS,EAAC,uBAAuB,GAAG,GAC5C,GACQ,EACjB,KAAC,cAAc,iCAA2B,IAClC,CACX,CAAC,CAAC,CAAC,CACF,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;wCACjB,KAAK,CAAC,eAAe,EAAE,CAAC;wCACxB,IAAI,gBAAgB,EAAE,CAAC;4CACrB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;4CAC3B,mBAAmB,CAAC,KAAK,CAAC,CAAC;wCAC7B,CAAC;6CAAM,CAAC;4CACN,mBAAmB,CAAC,IAAI,CAAC,CAAC;wCAC5B,CAAC;oCACH,CAAC,gBACW,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAC1D,SAAS,EAAE,EAAE,CACX,iHAAiH,EACjH,gBAAgB,IAAI,oCAAoC,CACzD,YAED,KAAC,SAAS,IAAC,SAAS,EAAC,UAAU,GAAG,GAC3B,GACM,EACjB,KAAC,cAAc,cACZ,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,GACvC,IACT,CACX,GACe,GACd,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,SAAS,WAAW,CAAC,EACnB,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,GAYd;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,UAAU,CAAC;IACpD,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC;IACtE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhE,OAAO,CACL,0BACE,eACE,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,UAAU,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,gBAAgB,EAChE,UAAU;oBACR,CAAC,CAAC,2BAA2B;oBAC7B,CAAC,CAAC,gEAAgE,CACrE,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,EACtC,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,UAAU;wBAAE,OAAO;oBACvB,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;yBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACzB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC,EACD,YAAY,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,aAE7C,QAAQ,CAAC,CAAC,CAAC,CACV,UAAU,CAAC,CAAC,CAAC,CACX,KAAC,eAAe,IAAC,SAAS,EAAC,kBAAkB,GAAG,CACjD,CAAC,CAAC,CAAC,CACF,KAAC,gBAAgB,IAAC,SAAS,EAAC,kBAAkB,GAAG,CAClD,CACF,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,cAAc,GAAG,CAClC,EACA,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,UAAU,IAAC,SAAS,EAAC,4CAA4C,GAAG,CACtE,CAAC,CAAC,CAAC,CACF,WAAW,CAAC,IAAI,CAAC,CAClB,EACD,eAAM,SAAS,EAAC,2CAA2C,YACxD,IAAI,CAAC,IAAI,GACL,EACN,IAAI,CAAC,OAAO,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,CAAC,OAAO,GAAI,EACpD,IAAI,CAAC,aAAa,IAAI,KAAC,YAAY,IAAC,MAAM,EAAE,IAAI,CAAC,aAAa,GAAI,EAClE,IAAI,CAAC,cAAc,IAAI,KAAC,gBAAgB,IAAC,IAAI,EAAE,IAAI,GAAI,EACvD,CAAC,QAAQ,IAAI,CACZ,cACE,SAAS,EAAE,EAAE,CACX,kFAAkF,EAClF,gBAAgB,IAAI,aAAa,CAClC,YAED,MAAC,eAAe,IAAC,aAAa,EAAE,GAAG,aAChC,QAAQ,IAAI,CACX,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oDACb,CAAC,CAAC,eAAe,EAAE,CAAC;oDACpB,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gDACnC,CAAC,gBACU,UAAU,EACrB,SAAS,EAAC,iHAAiH,YAE3H,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,GACzB,GACM,EACjB,KAAC,cAAc,2BAA0B,IACjC,CACX,EACA,IAAI,CAAC,QAAQ;oCACZ,IAAI,CAAC,IAAI,KAAK,aAAa;oCAC3B,CAAC,UAAU,CAAC,CAAC,CAAC,CACZ,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,6BACa,gBAAW,EACtB,SAAS,EAAC,wEAAwE,YAElF,KAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,GAAG,GAC3C,GACQ,EACjB,KAAC,cAAc,iCAA2B,IAClC,CACX,CAAC,CAAC,CAAC,CACF,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;wDACb,CAAC,CAAC,eAAe,EAAE,CAAC;wDACpB,IAAI,gBAAgB,EAAE,CAAC;4DACrB,QAAQ,CAAC,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC;4DAC5B,mBAAmB,CAAC,KAAK,CAAC,CAAC;wDAC7B,CAAC;6DAAM,CAAC;4DACN,mBAAmB,CAAC,IAAI,CAAC,CAAC;wDAC5B,CAAC;oDACH,CAAC,gBAEC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAEhD,SAAS,EAAE,EAAE,CACX,kHAAkH,EAClH,gBAAgB;wDACd,oCAAoC,CACvC,YAED,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,GAC1B,GACM,EACjB,KAAC,cAAc,cACZ,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,GACvC,IACT,CACX,CAAC,IACY,GACd,CACP,IACG,EACL,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,CAC1C,wBACG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,KAAC,WAAW,IAEV,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,KAAK,GAAG,CAAC,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,IAVvB,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,KAAK,CAAC,IAAI,CAWrC,CACH,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,SAAS,WAAW,CAAC,EACnB,KAAK,EACL,SAAS,EACT,QAAQ,GAKT;IACC,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eACE,SAAS,EAAC,uCAAuC,EACjD,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,aAE3C,KAAC,QAAQ,IAAC,SAAS,EAAC,4CAA4C,GAAG,EACnE,gBACE,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;wBACtC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1B,CAAC;yBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;wBAC9B,QAAQ,EAAE,CAAC;oBACb,CAAC;gBACH,CAAC,EACD,MAAM,EAAE,GAAG,EAAE;oBACX,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;wBACjB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACN,QAAQ,EAAE,CAAC;oBACb,CAAC;gBACH,CAAC,EACD,SAAS,EAAC,0HAA0H,EACpI,WAAW,EAAC,aAAa,GACzB,IACE,CACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,GAAG,MAAM,EAChB,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,MAAM,EACN,KAAK,GAAG,OAAO,EACf,YAAY,EACZ,SAAS,GAAG,KAAK,EACjB,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,KAAK,EAChB,WAAW,EACX,aAAa,GACK;IAClB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,OAAO,GACX,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAChD,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,UAAkB,EAAE,IAAuB,EAAE,EAAE;QAC9C,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,gCAAgC;QAChC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,mBAAmB,GAAG,WAAW,CACrC,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CACzC,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QACxD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QACzD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,CAAkB,EAAE,EAAE;QACrB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,KAAK,EACL,QAAQ,IAAI,CAAC,QAAQ,IAAI,+BAA+B,CACzD,EACD,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,EACjD,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EACnD,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,aAGzC,cAAK,SAAS,EAAC,0DAA0D,YACvE,MAAC,eAAe,IAAC,aAAa,EAAE,GAAG,aACjC,gBAAM,SAAS,EAAC,oGAAoG,aACjH,KAAK,EACL,WAAW,IAAI,CACd,eAAM,SAAS,EAAC,8EAA8E,YAC3F,WAAW,GACP,CACR,EACA,YAAY,IAAI,CACf,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,gBACD,SAAS,KAAK,EAAE,EAC5B,SAAS,EAAC,gHAAgH,YAE1H,KAAC,cAAc,IAAC,SAAS,EAAC,SAAS,GAAG,GAC/B,GACM,EACjB,KAAC,cAAc,cAAE,YAAY,GAAkB,IACvC,CACX,IACI,EACN,aAAa;4BACZ,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,CAClC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,gBACjC,UAAU,EACrB,SAAS,EAAC,2JAA2J,YAErK,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,GACzB,GACM,EACjB,KAAC,cAAc,2BAA0B,IACjC,CACX,CAAC,IACY,GACd,EAEL,OAAO,KAAK,YAAY;gBACvB,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1B,cAAK,SAAS,EAAC,2BAA2B,YACvC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC3B,KAAC,qBAAqB,IAEpB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,IANb,IAAI,CAAC,QAAQ,CAAC,EAAE,CAOrB,CACH,CAAC,GACE,CACP;gBACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACjB,KAAC,WAAW,IAEV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,iBAAiB,IAV3B,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAWnC,CACH,CAAC,EAEL,SAAS,IAAI,OAAO,IAAI,CACvB,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvC,eAEE,SAAS,EAAE,EAAE,CACX,qCAAqC,EACrC,OAAO,KAAK,YAAY,IAAI,mBAAmB,CAChD,aAED,cACE,SAAS,EAAE,EAAE,CACX,8CAA8C,EAC9C,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CACpD,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GACxC,EACF,cACE,SAAS,EAAC,kDAAkD,EAC5D,KAAK,EAAE;gCACL,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG;gCACjC,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI;6BAC9B,GACD,KAnBG,CAAC,CAoBF,CACP,CAAC,GACE,CACP,EAGA,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,EAAE,IAAI,CACzC,KAAC,WAAW,IACV,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,kBAAkB,GAC5B,CACH,EAGA,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,EAAE,IAAI,CACzC,KAAC,WAAW,IACV,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAC5D,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,kBAAkB,GAC5B,CACH,EAEA,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,CACrC,eAAK,SAAS,EAAC,4DAA4D,aACzE,KAAC,QAAQ,IAAC,SAAS,EAAC,gDAAgD,GAAG,EACvE,YAAG,SAAS,EAAC,+BAA+B,YACzC,OAAO,KAAK,YAAY;4BACvB,CAAC,CAAC,qCAAqC;4BACvC,CAAC,CAAC,cAAc,GAChB,IACA,CACP,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import {\n IconChevronRight,\n IconChevronDown,\n IconFolder,\n IconFileText,\n IconFileCode,\n IconPhoto,\n IconFile,\n IconPlus,\n IconTrash,\n IconHierarchy2,\n IconPlugConnected,\n IconBrowser,\n IconDeviceDesktop,\n IconBulb,\n IconClockHour3,\n IconLoader2,\n IconHelpCircle,\n} from \"@tabler/icons-react\";\nimport React, { useState, useRef, useCallback } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\nimport type { TreeNode, ResourceMeta, JobMetadata } from \"./use-resources.js\";\n\nfunction StatusDot({\n className,\n tooltip,\n}: {\n className: string;\n tooltip: string;\n}) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label={tooltip}\n className={cn(\"ml-1 inline-block h-1.5 w-1.5 shrink-0\", className)}\n />\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getFileIcon(node: TreeNode): React.ReactNode {\n if (node.kind === \"agent\") {\n return (\n <IconHierarchy2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"remote-agent\" || node.kind === \"mcp-server\") {\n return (\n <IconPlugConnected className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"mcp-builtin\") {\n return node.mcpBuiltinMeta?.exclusiveGroup === \"browser\" ? (\n <IconBrowser className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n <IconDeviceDesktop className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"skill\") {\n return <IconBulb className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />;\n }\n if (node.kind === \"job\") {\n return (\n <IconClockHour3 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n const name = node.name;\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n const iconClass = \"h-3.5 w-3.5 shrink-0 text-muted-foreground\";\n if (ext === \"md\" || ext === \"mdx\")\n return <IconFileText className={iconClass} />;\n if (\n [\"ts\", \"tsx\", \"js\", \"jsx\", \"json\", \"css\", \"html\", \"py\", \"sh\"].includes(ext)\n )\n return <IconFileCode className={iconClass} />;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\"].includes(ext))\n return <IconPhoto className={iconClass} />;\n return <IconFile className={iconClass} />;\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ResourceTreeProps {\n tree: TreeNode[];\n /** Presentation mode for the resources: nested tree rows or a flat collection. */\n variant?: \"tree\" | \"collection\";\n selectedId: string | null;\n onSelect: (resource: ResourceMeta) => void;\n onCreateFile: (parentPath: string, name: string) => void;\n onCreateFolder: (parentPath: string, name: string) => void;\n onDelete: (id: string) => void;\n onRename: (id: string, newPath: string) => void;\n onDrop: (files: FileList) => void;\n /** Section title displayed as heading */\n title?: string;\n /** Tooltip for the section heading */\n titleTooltip?: string;\n /** Whether this section's tree is still loading */\n isLoading?: boolean;\n /** Resource id currently being deleted (shows spinner + muted row) */\n deletingId?: string | null;\n /** When true, hide create/delete/rename/upload affordances. Files stay readable. */\n readOnly?: boolean;\n /** Optional hint shown next to the heading (e.g. \"Read only\") */\n headingHint?: React.ReactNode;\n /** Scope-specific action shown beside the section heading. */\n sectionAction?: React.ReactNode;\n}\n\ninterface CreatingState {\n parentPath: string;\n type: \"file\" | \"folder\";\n}\n\nfunction McpStatusDot({ server }: { server: McpServer }) {\n const status = server.status ?? { state: \"unknown\" as const };\n if (status.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected: ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Connecting…\"\n />\n );\n}\n\nfunction BuiltinStatusDot({ node }: { node: TreeNode }) {\n const meta = node.mcpBuiltinMeta;\n if (!meta?.available) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/30\"\n tooltip={meta?.unavailableReason ?? \"Not available on this host\"}\n />\n );\n }\n if (!meta.scopeEnabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n const status = meta.status?.[meta.scope];\n if (status?.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected — ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status?.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return <StatusDot className=\"rounded-full bg-amber-500\" tooltip=\"Enabled\" />;\n}\n\nfunction JobStatusDot({ meta }: { meta: JobMetadata }) {\n if (!meta.enabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n if (meta.lastStatus === \"running\") {\n return (\n <StatusDot\n className=\"rounded-full bg-blue-500 animate-pulse\"\n tooltip=\"Running\"\n />\n );\n }\n if (meta.lastStatus === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip=\"Last run failed\"\n />\n );\n }\n if (meta.lastStatus === \"success\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip=\"Last run succeeded\"\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-amber-500\"\n tooltip=\"Scheduled (not yet run)\"\n />\n );\n}\n\ntype LeafResourceNode = TreeNode & { resource: ResourceMeta };\n\nfunction getLeafResources(nodes: TreeNode[]): LeafResourceNode[] {\n return nodes.flatMap((node) => {\n if (node.type === \"folder\") {\n return getLeafResources(node.children ?? []);\n }\n return node.resource ? [node as LeafResourceNode] : [];\n });\n}\n\nfunction formatResourceSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCollectionDescriptor(node: LeafResourceNode): string {\n if (node.kind === \"agent\") {\n return (\n node.agentMeta?.description || node.agentMeta?.model || \"Custom agent\"\n );\n }\n if (node.kind === \"skill\") {\n return node.skillMeta?.description || \"Skill\";\n }\n if (node.kind === \"remote-agent\") {\n return (\n node.remoteAgentMeta?.description ||\n node.remoteAgentMeta?.url ||\n \"Remote agent\"\n );\n }\n if (node.kind === \"job\") {\n return (\n node.jobMeta?.scheduleDescription ||\n node.jobMeta?.schedule ||\n \"Scheduled job\"\n );\n }\n if (node.kind === \"mcp-server\") return \"MCP server\";\n if (node.kind === \"mcp-builtin\") return \"Built-in MCP\";\n return formatResourceSize(node.resource.size);\n}\n\nfunction CollectionResourceRow({\n node,\n selectedId,\n deletingId,\n readOnly,\n onSelect,\n onDelete,\n}: {\n node: LeafResourceNode;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n}) {\n const isSelected = node.resource.id === selectedId;\n const isDeleting = node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const descriptor = getCollectionDescriptor(node);\n\n const selectResource = () => {\n if (!isDeleting) onSelect(node.resource);\n };\n\n return (\n <div\n className={cn(\n \"group/collection-row flex w-full items-center gap-3 px-2.5 py-3 text-left transition-[background-color,opacity] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\",\n isDeleting\n ? \"pointer-events-none opacity-40\"\n : isSelected\n ? \"bg-accent text-foreground\"\n : \"text-foreground hover:bg-accent/50\",\n )}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n <button\n type=\"button\"\n disabled={isDeleting}\n aria-pressed={isSelected}\n onClick={selectResource}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-3 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n >\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md bg-muted/50\",\n isSelected && \"bg-background/70\",\n )}\n >\n {getFileIcon(node)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[12px] font-medium\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n </div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-[10px]\">\n <span className=\"min-w-0 truncate text-muted-foreground/60\">\n {node.resource.path}\n </span>\n <span className=\"shrink-0 text-muted-foreground/30\">·</span>\n <span className=\"max-w-[40%] shrink-0 truncate text-muted-foreground/80\">\n {descriptor}\n </span>\n </div>\n </div>\n </button>\n {!readOnly && node.kind !== \"mcp-builtin\" && (\n <div\n className={cn(\n \"flex shrink-0 items-center opacity-0 transition-opacity group-hover/collection-row:opacity-100 group-focus-within/collection-row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={confirmingDelete ? \"Confirm delete\" : \"Delete\"}\n className={cn(\n \"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent/50 hover:text-destructive\",\n confirmingDelete && \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n )}\n </div>\n );\n}\n\n// ─── TreeNodeRow ────────────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n expanded,\n selectedId,\n deletingId,\n readOnly,\n onToggle,\n onSelect,\n onDelete,\n onStartCreate,\n}: {\n node: TreeNode;\n depth: number;\n expanded: Set<string>;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onToggle: (path: string) => void;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n onStartCreate: (parentPath: string, type: \"file\" | \"folder\") => void;\n}) {\n const isFolder = node.type === \"folder\";\n const isExpanded = expanded.has(node.path);\n const isSelected = node.resource?.id === selectedId;\n const isDeleting = !!node.resource && node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n return (\n <div>\n <div\n className={cn(\n \"group/row flex items-center gap-1 rounded-md px-1.5 py-1 select-none\",\n isDeleting ? \"pointer-events-none opacity-40\" : \"cursor-pointer\",\n isSelected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={{ paddingLeft: depth * 16 + 6 }}\n onClick={() => {\n if (isDeleting) return;\n if (isFolder) {\n onToggle(node.path);\n } else if (node.resource) {\n onSelect(node.resource);\n }\n }}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n {isFolder ? (\n isExpanded ? (\n <IconChevronDown className=\"h-3 w-3 shrink-0\" />\n ) : (\n <IconChevronRight className=\"h-3 w-3 shrink-0\" />\n )\n ) : (\n <span className=\"w-3 shrink-0\" />\n )}\n {isFolder ? (\n <IconFolder className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n getFileIcon(node)\n )}\n <span className=\"min-w-0 truncate text-[12px] leading-none\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n {!readOnly && (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5 opacity-0 group-hover/row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isFolder && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onStartCreate(node.path, \"file\");\n }}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n )}\n {node.resource &&\n node.kind !== \"mcp-builtin\" &&\n (isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource!.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={\n confirmingDelete ? \"Confirm delete\" : \"Delete\"\n }\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n confirmingDelete &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n )}\n </div>\n {isFolder && isExpanded && node.children && (\n <div>\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.resource?.id ?? child.path}\n node={child}\n depth={depth + 1}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={onToggle}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={onStartCreate}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── InlineInput ────────────────────────────────────────────────────────────\n\nfunction InlineInput({\n depth,\n onConfirm,\n onCancel,\n}: {\n depth: number;\n onConfirm: (name: string) => void;\n onCancel: () => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(\"\");\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div\n className=\"flex items-center gap-1 px-1.5 py-0.5\"\n style={{ paddingLeft: depth * 16 + 6 + 16 }}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && value.trim()) {\n onConfirm(value.trim());\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n }}\n onBlur={() => {\n if (value.trim()) {\n onConfirm(value.trim());\n } else {\n onCancel();\n }\n }}\n className=\"min-w-0 flex-1 bg-transparent text-[12px] leading-none text-foreground outline-none placeholder:text-muted-foreground/50\"\n placeholder=\"filename.md\"\n />\n </div>\n );\n}\n\n// ─── ResourceTree ───────────────────────────────────────────────────────────\n\nexport function ResourceTree({\n tree,\n variant = \"tree\",\n selectedId,\n onSelect,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onDrop,\n title = \"Files\",\n titleTooltip,\n isLoading = false,\n deletingId = null,\n readOnly = false,\n headingHint,\n sectionAction,\n}: ResourceTreeProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n const [creating, setCreating] = useState<CreatingState | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const leafResources = variant === \"collection\" ? getLeafResources(tree) : [];\n const isEmpty =\n variant === \"collection\" ? leafResources.length === 0 : tree.length === 0;\n\n const toggleExpand = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleStartCreate = useCallback(\n (parentPath: string, type: \"file\" | \"folder\") => {\n setCreating({ parentPath, type });\n // auto-expand the parent folder\n setExpanded((prev) => {\n const next = new Set(prev);\n next.add(parentPath);\n return next;\n });\n },\n [],\n );\n\n const handleConfirmCreate = useCallback(\n (name: string) => {\n if (!creating) return;\n if (creating.type === \"file\") {\n onCreateFile(creating.parentPath, name);\n } else {\n onCreateFolder(creating.parentPath, name);\n }\n setCreating(null);\n },\n [creating, onCreateFile, onCreateFolder],\n );\n\n const handleCancelCreate = useCallback(() => {\n setCreating(null);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (readOnly) return;\n if (e.dataTransfer.files.length > 0) {\n onDrop(e.dataTransfer.files);\n }\n },\n [onDrop, readOnly],\n );\n\n return (\n <div\n className={cn(\n \"p-1\",\n dragOver && !readOnly && \"ring-1 ring-inset ring-accent\",\n )}\n onDragOver={readOnly ? undefined : handleDragOver}\n onDragLeave={readOnly ? undefined : handleDragLeave}\n onDrop={readOnly ? undefined : handleDrop}\n >\n {/* Section heading */}\n <div className=\"group/root flex items-center justify-between px-1.5 py-1\">\n <TooltipProvider delayDuration={200}>\n <span className=\"flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60\">\n {title}\n {headingHint && (\n <span className=\"text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50\">\n {headingHint}\n </span>\n )}\n {titleTooltip && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`About ${title}`}\n className=\"flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground\"\n >\n <IconHelpCircle className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{titleTooltip}</TooltipContent>\n </Tooltip>\n )}\n </span>\n {sectionAction ??\n (variant === \"tree\" && !readOnly && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => handleStartCreate(\"\", \"file\")}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n\n {variant === \"collection\"\n ? leafResources.length > 0 && (\n <div className=\"divide-y divide-border/60\">\n {leafResources.map((node) => (\n <CollectionResourceRow\n key={node.resource.id}\n node={node}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onSelect={onSelect}\n onDelete={onDelete}\n />\n ))}\n </div>\n )\n : tree.map((node) => (\n <TreeNodeRow\n key={node.resource?.id ?? node.path}\n node={node}\n depth={0}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={toggleExpand}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={handleStartCreate}\n />\n ))}\n\n {isLoading && isEmpty && (\n <div className={cn(\"px-1 py-1\")}>\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"flex items-center gap-2 px-1.5 py-1\",\n variant === \"collection\" && \"gap-3 px-2.5 py-3\",\n )}\n >\n <div\n className={cn(\n \"rounded bg-muted-foreground/10 animate-pulse\",\n variant === \"collection\" ? \"size-8\" : \"h-3.5 w-3.5\",\n )}\n style={{ animationDelay: `${i * 75}ms` }}\n />\n <div\n className=\"h-3 rounded bg-muted-foreground/10 animate-pulse\"\n style={{\n width: `${50 + ((i * 37) % 40)}%`,\n animationDelay: `${i * 75}ms`,\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Inline input for root-level creation */}\n {creating && creating.parentPath === \"\" && (\n <InlineInput\n depth={0}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {/* Inline input for folder-level creation */}\n {creating && creating.parentPath !== \"\" && (\n <InlineInput\n depth={creating.parentPath.split(\"/\").filter(Boolean).length}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {isEmpty && !creating && !isLoading && (\n <div className=\"flex items-start gap-2 border-y border-border/60 px-2 py-4\">\n <IconFile className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />\n <p className=\"text-xs text-muted-foreground\">\n {variant === \"collection\"\n ? \"No resources in this collection yet\"\n : \"No files yet\"}\n </p>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ResourceTree.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChevronRight,\n IconChevronDown,\n IconFolder,\n IconFileText,\n IconFileCode,\n IconPhoto,\n IconFile,\n IconPlus,\n IconTrash,\n IconHierarchy2,\n IconPlugConnected,\n IconBrowser,\n IconDeviceDesktop,\n IconBulb,\n IconClockHour3,\n IconLoader2,\n IconHelpCircle,\n} from \"@tabler/icons-react\";\nimport React, { useState, useRef, useCallback } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\nimport type { TreeNode, ResourceMeta, JobMetadata } from \"./use-resources.js\";\n\nfunction StatusDot({\n className,\n tooltip,\n}: {\n className: string;\n tooltip: string;\n}) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label={tooltip}\n className={cn(\"ml-1 inline-block h-1.5 w-1.5 shrink-0\", className)}\n />\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getFileIcon(node: TreeNode): React.ReactNode {\n if (node.kind === \"agent\") {\n return (\n <IconHierarchy2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"remote-agent\" || node.kind === \"mcp-server\") {\n return (\n <IconPlugConnected className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"mcp-builtin\") {\n return node.mcpBuiltinMeta?.exclusiveGroup === \"browser\" ? (\n <IconBrowser className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n <IconDeviceDesktop className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"skill\") {\n return <IconBulb className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />;\n }\n if (node.kind === \"job\") {\n return (\n <IconClockHour3 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n const name = node.name;\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n const iconClass = \"h-3.5 w-3.5 shrink-0 text-muted-foreground\";\n if (ext === \"md\" || ext === \"mdx\")\n return <IconFileText className={iconClass} />;\n if (\n [\"ts\", \"tsx\", \"js\", \"jsx\", \"json\", \"css\", \"html\", \"py\", \"sh\"].includes(ext)\n )\n return <IconFileCode className={iconClass} />;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\"].includes(ext))\n return <IconPhoto className={iconClass} />;\n return <IconFile className={iconClass} />;\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ResourceTreeProps {\n tree: TreeNode[];\n /** Presentation mode for the resources: nested tree rows or a flat collection. */\n variant?: \"tree\" | \"collection\";\n selectedId: string | null;\n onSelect: (resource: ResourceMeta) => void;\n onCreateFile: (parentPath: string, name: string) => void;\n onCreateFolder: (parentPath: string, name: string) => void;\n onDelete: (id: string) => void;\n onRename: (id: string, newPath: string) => void;\n onDrop: (files: FileList) => void;\n /** Section title displayed as heading */\n title?: string;\n /** Tooltip for the section heading */\n titleTooltip?: string;\n /** Whether this section's tree is still loading */\n isLoading?: boolean;\n /** Resource id currently being deleted (shows spinner + muted row) */\n deletingId?: string | null;\n /** When true, hide create/delete/rename/upload affordances. Files stay readable. */\n readOnly?: boolean;\n /** Optional hint shown next to the heading (e.g. \"Read only\") */\n headingHint?: React.ReactNode;\n /** Scope-specific action shown beside the section heading. */\n sectionAction?: React.ReactNode;\n /** Scope-specific action shown beneath an empty collection message. */\n emptyStateAction?: React.ReactNode;\n}\n\ninterface CreatingState {\n parentPath: string;\n type: \"file\" | \"folder\";\n}\n\nfunction McpStatusDot({ server }: { server: McpServer }) {\n const status = server.status ?? { state: \"unknown\" as const };\n if (status.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected: ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Connecting…\"\n />\n );\n}\n\nfunction BuiltinStatusDot({ node }: { node: TreeNode }) {\n const meta = node.mcpBuiltinMeta;\n if (!meta?.available) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/30\"\n tooltip={meta?.unavailableReason ?? \"Not available on this host\"}\n />\n );\n }\n if (!meta.scopeEnabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n const status = meta.status?.[meta.scope];\n if (status?.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected — ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status?.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return <StatusDot className=\"rounded-full bg-amber-500\" tooltip=\"Enabled\" />;\n}\n\nfunction JobStatusDot({ meta }: { meta: JobMetadata }) {\n if (!meta.enabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n if (meta.lastStatus === \"running\") {\n return (\n <StatusDot\n className=\"rounded-full bg-blue-500 animate-pulse\"\n tooltip=\"Running\"\n />\n );\n }\n if (meta.lastStatus === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip=\"Last run failed\"\n />\n );\n }\n if (meta.lastStatus === \"success\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip=\"Last run succeeded\"\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-amber-500\"\n tooltip=\"Scheduled (not yet run)\"\n />\n );\n}\n\ntype LeafResourceNode = TreeNode & { resource: ResourceMeta };\n\nfunction getLeafResources(nodes: TreeNode[]): LeafResourceNode[] {\n return nodes.flatMap((node) => {\n if (node.type === \"folder\") {\n return getLeafResources(node.children ?? []);\n }\n return node.resource ? [node as LeafResourceNode] : [];\n });\n}\n\nfunction formatResourceSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCollectionDescriptor(node: LeafResourceNode): string {\n if (node.kind === \"agent\") {\n return (\n node.agentMeta?.description || node.agentMeta?.model || \"Custom agent\"\n );\n }\n if (node.kind === \"skill\") {\n return node.skillMeta?.description || \"Skill\";\n }\n if (node.kind === \"remote-agent\") {\n return (\n node.remoteAgentMeta?.description ||\n node.remoteAgentMeta?.url ||\n \"Remote agent\"\n );\n }\n if (node.kind === \"job\") {\n return (\n node.jobMeta?.scheduleDescription ||\n node.jobMeta?.schedule ||\n \"Scheduled job\"\n );\n }\n if (node.kind === \"mcp-server\") return \"MCP server\";\n if (node.kind === \"mcp-builtin\") return \"Built-in MCP\";\n return formatResourceSize(node.resource.size);\n}\n\nfunction CollectionResourceRow({\n node,\n selectedId,\n deletingId,\n readOnly,\n onSelect,\n onDelete,\n}: {\n node: LeafResourceNode;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n}) {\n const isSelected = node.resource.id === selectedId;\n const isDeleting = node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const descriptor = getCollectionDescriptor(node);\n\n const selectResource = () => {\n if (!isDeleting) onSelect(node.resource);\n };\n\n return (\n <div\n className={cn(\n \"group/collection-row flex w-full items-center gap-3 px-2.5 py-3 text-left transition-[background-color,opacity] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\",\n isDeleting\n ? \"pointer-events-none opacity-40\"\n : isSelected\n ? \"bg-accent text-foreground\"\n : \"text-foreground hover:bg-accent/50\",\n )}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n <button\n type=\"button\"\n disabled={isDeleting}\n aria-pressed={isSelected}\n onClick={selectResource}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-3 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n >\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md bg-muted/50\",\n isSelected && \"bg-background/70\",\n )}\n >\n {getFileIcon(node)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[12px] font-medium\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n </div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-[10px]\">\n <span className=\"min-w-0 truncate text-muted-foreground/60\">\n {node.resource.path}\n </span>\n <span className=\"shrink-0 text-muted-foreground/30\">·</span>\n <span className=\"max-w-[40%] shrink-0 truncate text-muted-foreground/80\">\n {descriptor}\n </span>\n </div>\n </div>\n </button>\n {!readOnly && node.kind !== \"mcp-builtin\" && (\n <div\n className={cn(\n \"flex shrink-0 items-center opacity-0 transition-opacity group-hover/collection-row:opacity-100 group-focus-within/collection-row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={confirmingDelete ? \"Confirm delete\" : \"Delete\"}\n className={cn(\n \"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent/50 hover:text-destructive\",\n confirmingDelete && \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n )}\n </div>\n );\n}\n\n// ─── TreeNodeRow ────────────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n expanded,\n selectedId,\n deletingId,\n readOnly,\n onToggle,\n onSelect,\n onDelete,\n onStartCreate,\n}: {\n node: TreeNode;\n depth: number;\n expanded: Set<string>;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onToggle: (path: string) => void;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n onStartCreate: (parentPath: string, type: \"file\" | \"folder\") => void;\n}) {\n const isFolder = node.type === \"folder\";\n const isExpanded = expanded.has(node.path);\n const isSelected = node.resource?.id === selectedId;\n const isDeleting = !!node.resource && node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n return (\n <div>\n <div\n className={cn(\n \"group/row flex items-center gap-1 rounded-md px-1.5 py-1 select-none\",\n isDeleting ? \"pointer-events-none opacity-40\" : \"cursor-pointer\",\n isSelected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={{ paddingLeft: depth * 16 + 6 }}\n onClick={() => {\n if (isDeleting) return;\n if (isFolder) {\n onToggle(node.path);\n } else if (node.resource) {\n onSelect(node.resource);\n }\n }}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n {isFolder ? (\n isExpanded ? (\n <IconChevronDown className=\"h-3 w-3 shrink-0\" />\n ) : (\n <IconChevronRight className=\"h-3 w-3 shrink-0\" />\n )\n ) : (\n <span className=\"w-3 shrink-0\" />\n )}\n {isFolder ? (\n <IconFolder className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n getFileIcon(node)\n )}\n <span className=\"min-w-0 truncate text-[12px] leading-none\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n {!readOnly && (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5 opacity-0 group-hover/row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isFolder && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onStartCreate(node.path, \"file\");\n }}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n )}\n {node.resource &&\n node.kind !== \"mcp-builtin\" &&\n (isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource!.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={\n confirmingDelete ? \"Confirm delete\" : \"Delete\"\n }\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n confirmingDelete &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n )}\n </div>\n {isFolder && isExpanded && node.children && (\n <div>\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.resource?.id ?? child.path}\n node={child}\n depth={depth + 1}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={onToggle}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={onStartCreate}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── InlineInput ────────────────────────────────────────────────────────────\n\nfunction InlineInput({\n depth,\n onConfirm,\n onCancel,\n}: {\n depth: number;\n onConfirm: (name: string) => void;\n onCancel: () => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(\"\");\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div\n className=\"flex items-center gap-1 px-1.5 py-0.5\"\n style={{ paddingLeft: depth * 16 + 6 + 16 }}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && value.trim()) {\n onConfirm(value.trim());\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n }}\n onBlur={() => {\n if (value.trim()) {\n onConfirm(value.trim());\n } else {\n onCancel();\n }\n }}\n className=\"min-w-0 flex-1 bg-transparent text-[12px] leading-none text-foreground outline-none placeholder:text-muted-foreground/50\"\n placeholder=\"filename.md\"\n />\n </div>\n );\n}\n\n// ─── ResourceTree ───────────────────────────────────────────────────────────\n\nexport function ResourceTree({\n tree,\n variant = \"tree\",\n selectedId,\n onSelect,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onDrop,\n title = \"Files\",\n titleTooltip,\n isLoading = false,\n deletingId = null,\n readOnly = false,\n headingHint,\n sectionAction,\n emptyStateAction,\n}: ResourceTreeProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n const [creating, setCreating] = useState<CreatingState | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const leafResources = variant === \"collection\" ? getLeafResources(tree) : [];\n const isEmpty =\n variant === \"collection\" ? leafResources.length === 0 : tree.length === 0;\n\n const toggleExpand = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleStartCreate = useCallback(\n (parentPath: string, type: \"file\" | \"folder\") => {\n setCreating({ parentPath, type });\n // auto-expand the parent folder\n setExpanded((prev) => {\n const next = new Set(prev);\n next.add(parentPath);\n return next;\n });\n },\n [],\n );\n\n const handleConfirmCreate = useCallback(\n (name: string) => {\n if (!creating) return;\n if (creating.type === \"file\") {\n onCreateFile(creating.parentPath, name);\n } else {\n onCreateFolder(creating.parentPath, name);\n }\n setCreating(null);\n },\n [creating, onCreateFile, onCreateFolder],\n );\n\n const handleCancelCreate = useCallback(() => {\n setCreating(null);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (readOnly) return;\n if (e.dataTransfer.files.length > 0) {\n onDrop(e.dataTransfer.files);\n }\n },\n [onDrop, readOnly],\n );\n\n return (\n <div\n className={cn(\n \"p-1\",\n dragOver && !readOnly && \"ring-1 ring-inset ring-accent\",\n )}\n onDragOver={readOnly ? undefined : handleDragOver}\n onDragLeave={readOnly ? undefined : handleDragLeave}\n onDrop={readOnly ? undefined : handleDrop}\n >\n {/* Section heading */}\n <div className=\"group/root flex items-center justify-between px-1.5 py-1\">\n <TooltipProvider delayDuration={200}>\n <span className=\"flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60\">\n {title}\n {headingHint && (\n <span className=\"text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50\">\n {headingHint}\n </span>\n )}\n {titleTooltip && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`About ${title}`}\n className=\"flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground\"\n >\n <IconHelpCircle className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{titleTooltip}</TooltipContent>\n </Tooltip>\n )}\n </span>\n {sectionAction ??\n (variant === \"tree\" && !readOnly && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => handleStartCreate(\"\", \"file\")}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n\n {variant === \"collection\"\n ? leafResources.length > 0 && (\n <div className=\"divide-y divide-border/60\">\n {leafResources.map((node) => (\n <CollectionResourceRow\n key={node.resource.id}\n node={node}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onSelect={onSelect}\n onDelete={onDelete}\n />\n ))}\n </div>\n )\n : tree.map((node) => (\n <TreeNodeRow\n key={node.resource?.id ?? node.path}\n node={node}\n depth={0}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={toggleExpand}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={handleStartCreate}\n />\n ))}\n\n {isLoading && isEmpty && (\n <div className={cn(\"px-1 py-1\")}>\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"flex items-center gap-2 px-1.5 py-1\",\n variant === \"collection\" && \"gap-3 px-2.5 py-3\",\n )}\n >\n <div\n className={cn(\n \"rounded bg-muted-foreground/10 animate-pulse\",\n variant === \"collection\" ? \"size-8\" : \"h-3.5 w-3.5\",\n )}\n style={{ animationDelay: `${i * 75}ms` }}\n />\n <div\n className=\"h-3 rounded bg-muted-foreground/10 animate-pulse\"\n style={{\n width: `${50 + ((i * 37) % 40)}%`,\n animationDelay: `${i * 75}ms`,\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Inline input for root-level creation */}\n {creating && creating.parentPath === \"\" && (\n <InlineInput\n depth={0}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {/* Inline input for folder-level creation */}\n {creating && creating.parentPath !== \"\" && (\n <InlineInput\n depth={creating.parentPath.split(\"/\").filter(Boolean).length}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {isEmpty && !creating && !isLoading && (\n <div className=\"flex items-start gap-2 border-y border-border/60 px-2 py-4\">\n <IconFile className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />\n <div className=\"flex flex-col items-start gap-2\">\n <p className=\"text-xs text-muted-foreground\">\n {variant === \"collection\"\n ? \"No resources in this collection yet\"\n : \"No files yet\"}\n </p>\n {emptyStateAction}\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAgBtC,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAyC5B,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;AAuCxD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,QAAQ,EAAE,CAoBZ;AAm8BD,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6CAA6C;IAC7C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC3C;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,UAAU,EAAE,OAAO,GAClB,aAAa,CAIf;AAED,wBAAgB,cAAc,CAAC,EAC7B,cAAqB,EACrB,KAAK,EAAE,cAAc,EACrB,sBAA8B,EAC9B,cAAc,EACd,mBAA4B,EAC5B,eAAe,GAChB,GAAE,mBAAwB,qBAg4B1B"}
|