@industry-theme/alexandria-panels 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/index.d.ts +5 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/mocks/panelContext.d.ts.map +1 -1
  4. package/dist/panels/DependenciesPanel/DependenciesPanel.stories.d.ts +59 -0
  5. package/dist/panels/DependenciesPanel/DependenciesPanel.stories.d.ts.map +1 -0
  6. package/dist/panels/DependenciesPanel/components/DependencyInfoModal.d.ts +8 -0
  7. package/dist/panels/DependenciesPanel/components/DependencyInfoModal.d.ts.map +1 -0
  8. package/dist/panels/DependenciesPanel/components/DependencyRow.d.ts +8 -0
  9. package/dist/panels/DependenciesPanel/components/DependencyRow.d.ts.map +1 -0
  10. package/dist/panels/DependenciesPanel/components/FilterBar.d.ts +17 -0
  11. package/dist/panels/DependenciesPanel/components/FilterBar.d.ts.map +1 -0
  12. package/dist/panels/DependenciesPanel/components/index.d.ts +4 -0
  13. package/dist/panels/DependenciesPanel/components/index.d.ts.map +1 -0
  14. package/dist/panels/DependenciesPanel/index.d.ts +7 -0
  15. package/dist/panels/DependenciesPanel/index.d.ts.map +1 -0
  16. package/dist/panels/DependenciesPanel/tools.d.ts +35 -0
  17. package/dist/panels/DependenciesPanel/tools.d.ts.map +1 -0
  18. package/dist/panels/DependenciesPanel/types.d.ts +36 -0
  19. package/dist/panels/DependenciesPanel/types.d.ts.map +1 -0
  20. package/dist/panels/LocalProjectsPanel/LocalProjectCard.d.ts.map +1 -1
  21. package/dist/panels/LocalProjectsPanel/types.d.ts +11 -1
  22. package/dist/panels/LocalProjectsPanel/types.d.ts.map +1 -1
  23. package/dist/panels/WorkspaceRepositoriesPanel/index.d.ts +2 -2
  24. package/dist/panels/WorkspaceRepositoriesPanel/index.d.ts.map +1 -1
  25. package/dist/panels/WorkspaceRepositoriesPanel/types.d.ts +0 -23
  26. package/dist/panels/WorkspaceRepositoriesPanel/types.d.ts.map +1 -1
  27. package/dist/panels.bundle.js +1372 -459
  28. package/dist/panels.bundle.js.map +1 -1
  29. package/dist/tools/index.d.ts +3 -24
  30. package/dist/tools/index.d.ts.map +1 -1
  31. package/dist/tools.bundle.js +194 -2
  32. package/dist/types/index.d.ts +1 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/package.json +3 -2
  35. package/dist/panels/WorkspaceRepositoriesPanel/WorkspaceRepositoryCard.d.ts +0 -10
  36. package/dist/panels/WorkspaceRepositoriesPanel/WorkspaceRepositoryCard.d.ts.map +0 -1
  37. package/dist/panels.bundle.css +0 -86
@@ -1,3 +1,15 @@
1
+ (function() {
2
+ "use strict";
3
+ try {
4
+ if (typeof document != "undefined") {
5
+ var elementStyle = document.createElement("style");
6
+ elementStyle.appendChild(document.createTextNode("/* Container query for responsive LocalProjectCard */\n.local-projects-panel {\n container-type: inline-size;\n container-name: local-projects;\n height: 100%;\n}\n\n.local-project-card {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.local-project-card__content {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.local-project-card__info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.local-project-card__path,\n.local-project-card__meta {\n display: flex;\n}\n\n.local-project-card__actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n align-items: center;\n}\n\n.local-project-card__actions--stacked {\n display: none;\n}\n\n/* Compact mode when container is 400px or less */\n@container local-projects (max-width: 400px) {\n .local-projects-panel {\n padding: 8px !important;\n gap: 8px !important;\n }\n\n .local-projects-list {\n gap: 12px !important;\n }\n\n .local-project-card {\n flex-direction: column;\n align-items: stretch;\n gap: 6px;\n padding: 0 !important;\n }\n\n .local-project-card__content {\n gap: 8px;\n }\n\n .local-project-card__path,\n .local-project-card__meta {\n display: none;\n }\n\n .local-project-card__actions {\n display: none;\n }\n\n .local-project-card__actions--stacked {\n display: flex;\n gap: 4px;\n }\n\n .local-project-card__actions--stacked button {\n flex: 1;\n }\n}"));
7
+ document.head.appendChild(elementStyle);
8
+ }
9
+ } catch (e) {
10
+ console.error("vite-plugin-css-injected-by-js", e);
11
+ }
12
+ })();
1
13
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
14
  import React2, { createContext, useState, useEffect, useContext, forwardRef, createElement, useMemo, useCallback } from "react";
3
15
  var terminalTheme = {
@@ -320,7 +332,46 @@ const createLucideIcon = (iconName, iconNode) => {
320
332
  * This source code is licensed under the ISC license.
321
333
  * See the LICENSE file in the root directory of this source tree.
322
334
  */
323
- const __iconNode$e = [
335
+ const __iconNode$j = [
336
+ [
337
+ "path",
338
+ {
339
+ d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",
340
+ key: "lc1i9w"
341
+ }
342
+ ],
343
+ ["path", { d: "m7 16.5-4.74-2.85", key: "1o9zyk" }],
344
+ ["path", { d: "m7 16.5 5-3", key: "va8pkn" }],
345
+ ["path", { d: "M7 16.5v5.17", key: "jnp8gn" }],
346
+ [
347
+ "path",
348
+ {
349
+ d: "M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",
350
+ key: "8zsnat"
351
+ }
352
+ ],
353
+ ["path", { d: "m17 16.5-5-3", key: "8arw3v" }],
354
+ ["path", { d: "m17 16.5 4.74-2.85", key: "8rfmw" }],
355
+ ["path", { d: "M17 16.5v5.17", key: "k6z78m" }],
356
+ [
357
+ "path",
358
+ {
359
+ d: "M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",
360
+ key: "1xygjf"
361
+ }
362
+ ],
363
+ ["path", { d: "M12 8 7.26 5.15", key: "1vbdud" }],
364
+ ["path", { d: "m12 8 4.74-2.85", key: "3rx089" }],
365
+ ["path", { d: "M12 13.5V8", key: "1io7kd" }]
366
+ ];
367
+ const Boxes = createLucideIcon("boxes", __iconNode$j);
368
+ /**
369
+ * @license lucide-react v0.552.0 - ISC
370
+ *
371
+ * This source code is licensed under the ISC license.
372
+ * See the LICENSE file in the root directory of this source tree.
373
+ */
374
+ const __iconNode$i = [
324
375
  ["path", { d: "M10 12h4", key: "a56b0p" }],
325
376
  ["path", { d: "M10 8h4", key: "1sr2af" }],
326
377
  ["path", { d: "M14 21v-3a2 2 0 0 0-4 0v3", key: "1rgiei" }],
@@ -333,47 +384,71 @@ const __iconNode$e = [
333
384
  ],
334
385
  ["path", { d: "M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16", key: "16ra0t" }]
335
386
  ];
336
- const Building2 = createLucideIcon("building-2", __iconNode$e);
387
+ const Building2 = createLucideIcon("building-2", __iconNode$i);
337
388
  /**
338
389
  * @license lucide-react v0.552.0 - ISC
339
390
  *
340
391
  * This source code is licensed under the ISC license.
341
392
  * See the LICENSE file in the root directory of this source tree.
342
393
  */
343
- const __iconNode$d = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
344
- const Check = createLucideIcon("check", __iconNode$d);
394
+ const __iconNode$h = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
395
+ const Check = createLucideIcon("check", __iconNode$h);
345
396
  /**
346
397
  * @license lucide-react v0.552.0 - ISC
347
398
  *
348
399
  * This source code is licensed under the ISC license.
349
400
  * See the LICENSE file in the root directory of this source tree.
350
401
  */
351
- const __iconNode$c = [
402
+ const __iconNode$g = [
403
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
404
+ ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
405
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
406
+ ];
407
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$g);
408
+ /**
409
+ * @license lucide-react v0.552.0 - ISC
410
+ *
411
+ * This source code is licensed under the ISC license.
412
+ * See the LICENSE file in the root directory of this source tree.
413
+ */
414
+ const __iconNode$f = [
352
415
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
353
416
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
354
417
  ];
355
- const Copy = createLucideIcon("copy", __iconNode$c);
418
+ const Copy = createLucideIcon("copy", __iconNode$f);
356
419
  /**
357
420
  * @license lucide-react v0.552.0 - ISC
358
421
  *
359
422
  * This source code is licensed under the ISC license.
360
423
  * See the LICENSE file in the root directory of this source tree.
361
424
  */
362
- const __iconNode$b = [
425
+ const __iconNode$e = [
426
+ ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
427
+ ["path", { d: "M10 14 21 3", key: "gplh6r" }],
428
+ ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
429
+ ];
430
+ const ExternalLink = createLucideIcon("external-link", __iconNode$e);
431
+ /**
432
+ * @license lucide-react v0.552.0 - ISC
433
+ *
434
+ * This source code is licensed under the ISC license.
435
+ * See the LICENSE file in the root directory of this source tree.
436
+ */
437
+ const __iconNode$d = [
363
438
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }],
364
439
  ["path", { d: "M3 7V5a2 2 0 0 1 2-2h2", key: "aa7l1z" }],
365
440
  ["path", { d: "M17 3h2a2 2 0 0 1 2 2v2", key: "4qcy5o" }],
366
441
  ["path", { d: "M21 17v2a2 2 0 0 1-2 2h-2", key: "6vwrx8" }],
367
442
  ["path", { d: "M7 21H5a2 2 0 0 1-2-2v-2", key: "ioqczr" }]
368
443
  ];
369
- const Focus = createLucideIcon("focus", __iconNode$b);
444
+ const Focus = createLucideIcon("focus", __iconNode$d);
370
445
  /**
371
446
  * @license lucide-react v0.552.0 - ISC
372
447
  *
373
448
  * This source code is licensed under the ISC license.
374
449
  * See the LICENSE file in the root directory of this source tree.
375
450
  */
376
- const __iconNode$a = [
451
+ const __iconNode$c = [
377
452
  [
378
453
  "path",
379
454
  {
@@ -385,14 +460,14 @@ const __iconNode$a = [
385
460
  ["path", { d: "M18 19c-2.8 0-5-2.2-5-5v8", key: "pkpw2h" }],
386
461
  ["circle", { cx: "20", cy: "19", r: "2", key: "1obnsp" }]
387
462
  ];
388
- const FolderGit2 = createLucideIcon("folder-git-2", __iconNode$a);
463
+ const FolderGit2 = createLucideIcon("folder-git-2", __iconNode$c);
389
464
  /**
390
465
  * @license lucide-react v0.552.0 - ISC
391
466
  *
392
467
  * This source code is licensed under the ISC license.
393
468
  * See the LICENSE file in the root directory of this source tree.
394
469
  */
395
- const __iconNode$9 = [
470
+ const __iconNode$b = [
396
471
  [
397
472
  "path",
398
473
  {
@@ -401,14 +476,14 @@ const __iconNode$9 = [
401
476
  }
402
477
  ]
403
478
  ];
404
- const FolderOpen = createLucideIcon("folder-open", __iconNode$9);
479
+ const FolderOpen = createLucideIcon("folder-open", __iconNode$b);
405
480
  /**
406
481
  * @license lucide-react v0.552.0 - ISC
407
482
  *
408
483
  * This source code is licensed under the ISC license.
409
484
  * See the LICENSE file in the root directory of this source tree.
410
485
  */
411
- const __iconNode$8 = [
486
+ const __iconNode$a = [
412
487
  [
413
488
  "path",
414
489
  {
@@ -417,14 +492,14 @@ const __iconNode$8 = [
417
492
  }
418
493
  ]
419
494
  ];
420
- const Folder = createLucideIcon("folder", __iconNode$8);
495
+ const Folder = createLucideIcon("folder", __iconNode$a);
421
496
  /**
422
497
  * @license lucide-react v0.552.0 - ISC
423
498
  *
424
499
  * This source code is licensed under the ISC license.
425
500
  * See the LICENSE file in the root directory of this source tree.
426
501
  */
427
- const __iconNode$7 = [
502
+ const __iconNode$9 = [
428
503
  ["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
429
504
  [
430
505
  "path",
@@ -434,33 +509,52 @@ const __iconNode$7 = [
434
509
  }
435
510
  ]
436
511
  ];
437
- const House = createLucideIcon("house", __iconNode$7);
512
+ const House = createLucideIcon("house", __iconNode$9);
438
513
  /**
439
514
  * @license lucide-react v0.552.0 - ISC
440
515
  *
441
516
  * This source code is licensed under the ISC license.
442
517
  * See the LICENSE file in the root directory of this source tree.
443
518
  */
444
- const __iconNode$6 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
445
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$6);
519
+ const __iconNode$8 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
520
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$8);
446
521
  /**
447
522
  * @license lucide-react v0.552.0 - ISC
448
523
  *
449
524
  * This source code is licensed under the ISC license.
450
525
  * See the LICENSE file in the root directory of this source tree.
451
526
  */
452
- const __iconNode$5 = [
527
+ const __iconNode$7 = [
453
528
  ["path", { d: "M8 6L12 2L16 6", key: "1yvkyx" }],
454
529
  ["path", { d: "M12 2V22", key: "r89rzk" }]
455
530
  ];
456
- const MoveUp = createLucideIcon("move-up", __iconNode$5);
531
+ const MoveUp = createLucideIcon("move-up", __iconNode$7);
457
532
  /**
458
533
  * @license lucide-react v0.552.0 - ISC
459
534
  *
460
535
  * This source code is licensed under the ISC license.
461
536
  * See the LICENSE file in the root directory of this source tree.
462
537
  */
463
- const __iconNode$4 = [
538
+ const __iconNode$6 = [
539
+ [
540
+ "path",
541
+ {
542
+ d: "M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",
543
+ key: "1a0edw"
544
+ }
545
+ ],
546
+ ["path", { d: "M12 22V12", key: "d0xqtd" }],
547
+ ["polyline", { points: "3.29 7 12 12 20.71 7", key: "ousv84" }],
548
+ ["path", { d: "m7.5 4.27 9 5.15", key: "1c824w" }]
549
+ ];
550
+ const Package = createLucideIcon("package", __iconNode$6);
551
+ /**
552
+ * @license lucide-react v0.552.0 - ISC
553
+ *
554
+ * This source code is licensed under the ISC license.
555
+ * See the LICENSE file in the root directory of this source tree.
556
+ */
557
+ const __iconNode$5 = [
464
558
  [
465
559
  "path",
466
560
  {
@@ -470,18 +564,32 @@ const __iconNode$4 = [
470
564
  ],
471
565
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
472
566
  ];
473
- const Pencil = createLucideIcon("pencil", __iconNode$4);
567
+ const Pencil = createLucideIcon("pencil", __iconNode$5);
474
568
  /**
475
569
  * @license lucide-react v0.552.0 - ISC
476
570
  *
477
571
  * This source code is licensed under the ISC license.
478
572
  * See the LICENSE file in the root directory of this source tree.
479
573
  */
480
- const __iconNode$3 = [
574
+ const __iconNode$4 = [
481
575
  ["path", { d: "M5 12h14", key: "1ays0h" }],
482
576
  ["path", { d: "M12 5v14", key: "s699le" }]
483
577
  ];
484
- const Plus = createLucideIcon("plus", __iconNode$3);
578
+ const Plus = createLucideIcon("plus", __iconNode$4);
579
+ /**
580
+ * @license lucide-react v0.552.0 - ISC
581
+ *
582
+ * This source code is licensed under the ISC license.
583
+ * See the LICENSE file in the root directory of this source tree.
584
+ */
585
+ const __iconNode$3 = [
586
+ ["path", { d: "m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z", key: "7g6ntu" }],
587
+ ["path", { d: "m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z", key: "ijws7r" }],
588
+ ["path", { d: "M7 21h10", key: "1b0cd5" }],
589
+ ["path", { d: "M12 3v18", key: "108xh3" }],
590
+ ["path", { d: "M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2", key: "3gwbw2" }]
591
+ ];
592
+ const Scale = createLucideIcon("scale", __iconNode$3);
485
593
  /**
486
594
  * @license lucide-react v0.552.0 - ISC
487
595
  *
@@ -604,13 +712,20 @@ const LocalProjectCard = ({
604
712
  onOpen,
605
713
  onRemove,
606
714
  onAddToWorkspace,
715
+ onRemoveFromWorkspace,
716
+ onMoveToWorkspace,
607
717
  isLoading = false,
608
718
  windowState = "closed",
609
- compact: _compact = false
719
+ compact: _compact = false,
720
+ isEditMode = false,
721
+ isInWorkspaceDirectory,
722
+ workspacePath
610
723
  }) => {
611
724
  var _a, _b, _c, _d;
612
725
  const { theme: theme2 } = useTheme();
613
726
  const [copiedPath, setCopiedPath] = useState(false);
727
+ const [isMoving, setIsMoving] = useState(false);
728
+ const [isRemoving, setIsRemoving] = useState(false);
614
729
  const highlightColor = theme2.colors.primary;
615
730
  const avatarUrl = ((_a = entry.github) == null ? void 0 : _a.owner) ? `https://github.com/${entry.github.owner}.png` : null;
616
731
  const handleCardClick = () => {
@@ -628,6 +743,33 @@ const LocalProjectCard = ({
628
743
  e.stopPropagation();
629
744
  onAddToWorkspace == null ? void 0 : onAddToWorkspace(entry);
630
745
  };
746
+ const handleRemoveFromWorkspaceClick = async (e) => {
747
+ e.stopPropagation();
748
+ try {
749
+ setIsRemoving(true);
750
+ onRemoveFromWorkspace == null ? void 0 : onRemoveFromWorkspace(entry);
751
+ } finally {
752
+ setIsRemoving(false);
753
+ }
754
+ };
755
+ const handleMoveToWorkspaceClick = async (e) => {
756
+ e.stopPropagation();
757
+ try {
758
+ setIsMoving(true);
759
+ onMoveToWorkspace == null ? void 0 : onMoveToWorkspace(entry);
760
+ } finally {
761
+ setIsMoving(false);
762
+ }
763
+ };
764
+ const displayPath = useMemo(() => {
765
+ if (actionMode === "workspace" && isInWorkspaceDirectory && workspacePath) {
766
+ if (entry.path.startsWith(workspacePath)) {
767
+ const relativePath = entry.path.slice(workspacePath.length);
768
+ return relativePath.startsWith("/") ? relativePath.slice(1) : relativePath;
769
+ }
770
+ }
771
+ return entry.path;
772
+ }, [actionMode, isInWorkspaceDirectory, workspacePath, entry.path]);
631
773
  const handleCopyPath = async (e) => {
632
774
  e.stopPropagation();
633
775
  try {
@@ -672,6 +814,100 @@ const LocalProjectCard = ({
672
814
  }
673
815
  );
674
816
  }
817
+ if (actionMode === "workspace") {
818
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
819
+ isEditMode && isInWorkspaceDirectory === false && onMoveToWorkspace && /* @__PURE__ */ jsxs(
820
+ "button",
821
+ {
822
+ type: "button",
823
+ onClick: handleMoveToWorkspaceClick,
824
+ disabled: isMoving,
825
+ title: "Move to workspace directory",
826
+ style: {
827
+ flex: buttonFlex,
828
+ display: "inline-flex",
829
+ alignItems: "center",
830
+ justifyContent: "center",
831
+ padding: "6px 10px",
832
+ gap: "4px",
833
+ borderRadius: "4px",
834
+ border: `1px solid ${theme2.colors.primary || "#3b82f6"}`,
835
+ backgroundColor: `${theme2.colors.primary || "#3b82f6"}15`,
836
+ color: theme2.colors.primary || "#3b82f6",
837
+ fontSize: `${theme2.fontSizes[0]}px`,
838
+ fontWeight: theme2.fontWeights.medium,
839
+ cursor: isMoving ? "wait" : "pointer",
840
+ opacity: isMoving ? 0.6 : 1,
841
+ transition: "all 0.15s ease"
842
+ },
843
+ children: [
844
+ isMoving ? /* @__PURE__ */ jsx(LoaderCircle, { size: 12, className: "animate-spin" }) : /* @__PURE__ */ jsx(MoveUp, { size: 12 }),
845
+ isMoving ? "Moving..." : "Move"
846
+ ]
847
+ }
848
+ ),
849
+ /* @__PURE__ */ jsxs(
850
+ "button",
851
+ {
852
+ type: "button",
853
+ onClick: handleOpenClick,
854
+ title: "Open repository",
855
+ style: {
856
+ flex: buttonFlex,
857
+ display: "inline-flex",
858
+ alignItems: "center",
859
+ justifyContent: "center",
860
+ padding: "6px 10px",
861
+ gap: "4px",
862
+ borderRadius: "4px",
863
+ border: `1px solid ${theme2.colors.success || "#10b981"}`,
864
+ backgroundColor: `${theme2.colors.success || "#10b981"}15`,
865
+ color: theme2.colors.success || "#10b981",
866
+ fontSize: `${theme2.fontSizes[0]}px`,
867
+ fontWeight: theme2.fontWeights.medium,
868
+ cursor: "pointer",
869
+ transition: "all 0.15s ease"
870
+ },
871
+ children: [
872
+ /* @__PURE__ */ jsx(FolderOpen, { size: 12 }),
873
+ "Open"
874
+ ]
875
+ }
876
+ ),
877
+ isEditMode && onRemoveFromWorkspace && /* @__PURE__ */ jsxs(
878
+ "button",
879
+ {
880
+ type: "button",
881
+ onClick: handleRemoveFromWorkspaceClick,
882
+ disabled: isRemoving,
883
+ title: "Remove from workspace",
884
+ style: {
885
+ flex: buttonFlex,
886
+ display: "inline-flex",
887
+ alignItems: "center",
888
+ justifyContent: "center",
889
+ minWidth: isCompact ? void 0 : "28px",
890
+ height: "28px",
891
+ padding: isCompact ? "6px 10px" : 0,
892
+ gap: "4px",
893
+ borderRadius: "4px",
894
+ border: isCompact ? `1px solid ${theme2.colors.error || "#ef4444"}` : "none",
895
+ backgroundColor: isCompact ? `${theme2.colors.error || "#ef4444"}15` : "transparent",
896
+ color: isCompact ? theme2.colors.error || "#ef4444" : theme2.colors.textSecondary,
897
+ fontSize: `${theme2.fontSizes[0]}px`,
898
+ fontWeight: theme2.fontWeights.medium,
899
+ cursor: isRemoving ? "wait" : "pointer",
900
+ opacity: isRemoving ? 0.6 : 1,
901
+ transition: "all 0.15s ease"
902
+ },
903
+ children: [
904
+ isRemoving ? /* @__PURE__ */ jsx(LoaderCircle, { size: 14, className: "animate-spin" }) : /* @__PURE__ */ jsx(X, { size: 14 }),
905
+ isCompact && (isRemoving ? "Removing..." : "Remove")
906
+ ]
907
+ }
908
+ )
909
+ ] });
910
+ }
675
911
  return /* @__PURE__ */ jsxs(Fragment, { children: [
676
912
  /* @__PURE__ */ jsxs(
677
913
  "button",
@@ -809,7 +1045,7 @@ const LocalProjectCard = ({
809
1045
  title: copiedPath ? "Copied!" : `Click to copy: ${entry.path}`,
810
1046
  children: [
811
1047
  copiedPath ? /* @__PURE__ */ jsx(Check, { size: 12 }) : /* @__PURE__ */ jsx(Copy, { size: 12 }),
812
- entry.path
1048
+ displayPath
813
1049
  ]
814
1050
  }
815
1051
  ),
@@ -844,10 +1080,10 @@ const LocalProjectCard = ({
844
1080
  }
845
1081
  );
846
1082
  };
847
- const PANEL_ID$3 = "industry-theme.local-projects";
1083
+ const PANEL_ID$4 = "industry-theme.local-projects";
848
1084
  const createPanelEvent$1 = (type, payload) => ({
849
1085
  type,
850
- source: PANEL_ID$3,
1086
+ source: PANEL_ID$4,
851
1087
  timestamp: Date.now(),
852
1088
  payload
853
1089
  });
@@ -883,7 +1119,7 @@ const LocalProjectsPanelContent = ({
883
1119
  try {
884
1120
  await panelActions.openRepository(entry);
885
1121
  setWindowStates((prev) => new Map(prev).set(entry.path, "ready"));
886
- events.emit(createPanelEvent$1(`${PANEL_ID$3}:repository-opened`, { entry }));
1122
+ events.emit(createPanelEvent$1(`${PANEL_ID$4}:repository-opened`, { entry }));
887
1123
  } catch (error) {
888
1124
  console.error("Error opening repository:", error);
889
1125
  setWindowStates((prev) => new Map(prev).set(entry.path, "closed"));
@@ -894,14 +1130,14 @@ const LocalProjectsPanelContent = ({
894
1130
  useEffect(() => {
895
1131
  const unsubscribers = [
896
1132
  // Filter event from tools
897
- events.on(`${PANEL_ID$3}:filter`, (event) => {
1133
+ events.on(`${PANEL_ID$4}:filter`, (event) => {
898
1134
  var _a2;
899
1135
  if (((_a2 = event.payload) == null ? void 0 : _a2.filter) !== void 0) {
900
1136
  setFilter(event.payload.filter);
901
1137
  }
902
1138
  }),
903
1139
  // Select repository event from tools
904
- events.on(`${PANEL_ID$3}:select-repository`, (event) => {
1140
+ events.on(`${PANEL_ID$4}:select-repository`, (event) => {
905
1141
  var _a2;
906
1142
  const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
907
1143
  if (identifier) {
@@ -910,12 +1146,12 @@ const LocalProjectsPanelContent = ({
910
1146
  );
911
1147
  if (entry) {
912
1148
  setSelectedEntry(entry);
913
- events.emit(createPanelEvent$1(`${PANEL_ID$3}:repository-selected`, { entry }));
1149
+ events.emit(createPanelEvent$1(`${PANEL_ID$4}:repository-selected`, { entry }));
914
1150
  }
915
1151
  }
916
1152
  }),
917
1153
  // Open repository event from tools
918
- events.on(`${PANEL_ID$3}:open-repository`, (event) => {
1154
+ events.on(`${PANEL_ID$4}:open-repository`, (event) => {
919
1155
  var _a2;
920
1156
  const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
921
1157
  if (identifier) {
@@ -963,7 +1199,7 @@ const LocalProjectsPanelContent = ({
963
1199
  };
964
1200
  const handleSelectRepository = (entry) => {
965
1201
  setSelectedEntry(entry);
966
- events.emit(createPanelEvent$1(`${PANEL_ID$3}:repository-selected`, { entry }));
1202
+ events.emit(createPanelEvent$1(`${PANEL_ID$4}:repository-selected`, { entry }));
967
1203
  };
968
1204
  const normalizedFilter = filter.trim().toLowerCase();
969
1205
  const filteredAndSortedRepositories = useMemo(() => {
@@ -1224,365 +1460,47 @@ const LocalProjectsPanelPreview = () => {
1224
1460
  }
1225
1461
  );
1226
1462
  };
1227
- const WorkspaceRepositoryCard = ({
1228
- repository,
1229
- workspace,
1463
+ const PANEL_ID$3 = "industry-theme.workspace-repositories";
1464
+ const createPanelEvent = (type, payload) => ({
1465
+ type,
1466
+ source: PANEL_ID$3,
1467
+ timestamp: Date.now(),
1468
+ payload
1469
+ });
1470
+ const WorkspaceRepositoriesPanelContent = ({
1471
+ context,
1230
1472
  actions,
1231
- isEditMode = false,
1232
- isInWorkspaceDirectory,
1233
- onSelect,
1234
- onOpen,
1235
- onRemoveFromWorkspace,
1236
- onMoveToWorkspace
1473
+ events
1237
1474
  }) => {
1238
- var _a, _b;
1239
1475
  const { theme: theme2 } = useTheme();
1240
- const [isRemoving, setIsRemoving] = useState(false);
1241
- const [copiedPath, setCopiedPath] = useState(false);
1242
- const [isMoving, setIsMoving] = useState(false);
1243
- const handleCardClick = () => {
1244
- onSelect == null ? void 0 : onSelect(repository);
1245
- };
1246
- const handleOpenClick = (e) => {
1247
- e.stopPropagation();
1248
- onOpen == null ? void 0 : onOpen(repository);
1249
- };
1250
- const handleRemoveFromWorkspace = async (e) => {
1251
- e.stopPropagation();
1252
- if (!(workspace == null ? void 0 : workspace.id)) return;
1253
- if (!confirm(
1254
- `Remove ${repository.name} from workspace "${workspace.name}"?
1255
-
1256
- This will not delete any files, only remove the repository from this workspace.`
1257
- )) {
1258
- return;
1259
- }
1260
- try {
1261
- setIsRemoving(true);
1262
- onRemoveFromWorkspace == null ? void 0 : onRemoveFromWorkspace(repository);
1263
- } finally {
1264
- setIsRemoving(false);
1265
- }
1266
- };
1267
- const handleCopyPath = async (e) => {
1268
- e.stopPropagation();
1269
- try {
1270
- if (actions.copyToClipboard) {
1271
- await actions.copyToClipboard(repository.path);
1272
- } else {
1273
- await navigator.clipboard.writeText(repository.path);
1274
- }
1275
- setCopiedPath(true);
1276
- setTimeout(() => setCopiedPath(false), 2e3);
1277
- } catch (err) {
1278
- console.error("Failed to copy path:", err);
1279
- }
1280
- };
1281
- const handleMoveToWorkspace = async (e) => {
1282
- e.stopPropagation();
1283
- if (!(workspace == null ? void 0 : workspace.id) || !workspace.suggestedClonePath) return;
1284
- if (!confirm(
1285
- `Move ${repository.name} to ${workspace.suggestedClonePath}?
1286
-
1287
- This will move all files to the workspace directory.`
1288
- )) {
1289
- return;
1290
- }
1291
- try {
1292
- setIsMoving(true);
1293
- onMoveToWorkspace == null ? void 0 : onMoveToWorkspace(repository);
1294
- } finally {
1295
- setIsMoving(false);
1296
- }
1297
- };
1298
- const avatarUrl = ((_a = repository.github) == null ? void 0 : _a.owner) ? `https://github.com/${repository.github.owner}.png` : null;
1299
- const displayPath = React2.useMemo(() => {
1300
- if (isInWorkspaceDirectory && (workspace == null ? void 0 : workspace.suggestedClonePath)) {
1301
- const workspacePath = workspace.suggestedClonePath;
1302
- if (repository.path.startsWith(workspacePath)) {
1303
- const relativePath = repository.path.slice(workspacePath.length);
1304
- return relativePath.startsWith("/") ? relativePath.slice(1) : relativePath;
1476
+ const [isEditMode, setIsEditMode] = React2.useState(false);
1477
+ const [repositoryLocations, setRepositoryLocations] = React2.useState(
1478
+ /* @__PURE__ */ new Map()
1479
+ );
1480
+ const panelActions = actions;
1481
+ const workspaceSlice = context.getSlice("workspace");
1482
+ const repositoriesSlice = context.getSlice("workspaceRepositories");
1483
+ const workspace = (workspaceSlice == null ? void 0 : workspaceSlice.data) ?? null;
1484
+ const isLoading = (workspaceSlice == null ? void 0 : workspaceSlice.loading) || (repositoriesSlice == null ? void 0 : repositoriesSlice.loading) || false;
1485
+ const sortedRepositories = useMemo(() => {
1486
+ const repos = (repositoriesSlice == null ? void 0 : repositoriesSlice.data) ?? [];
1487
+ return [...repos].sort((a, b) => a.name.localeCompare(b.name));
1488
+ }, [repositoriesSlice == null ? void 0 : repositoriesSlice.data]);
1489
+ useEffect(() => {
1490
+ const checkLocations = async () => {
1491
+ if (!(workspace == null ? void 0 : workspace.id) || !panelActions.isRepositoryInWorkspaceDirectory || !sortedRepositories.length) {
1492
+ return;
1305
1493
  }
1306
- }
1307
- return repository.path;
1308
- }, [isInWorkspaceDirectory, workspace, repository.path]);
1309
- return /* @__PURE__ */ jsxs(
1310
- "div",
1311
- {
1312
- style: {
1313
- display: "flex",
1314
- alignItems: "center",
1315
- gap: "12px",
1316
- padding: "8px 12px",
1317
- borderRadius: "4px",
1318
- backgroundColor: "transparent",
1319
- border: "1px solid transparent",
1320
- cursor: "pointer",
1321
- transition: "background-color 0.15s"
1322
- },
1323
- onClick: handleCardClick,
1324
- onMouseEnter: (event) => {
1325
- event.currentTarget.style.backgroundColor = theme2.colors.backgroundTertiary || theme2.colors.backgroundSecondary;
1326
- },
1327
- onMouseLeave: (event) => {
1328
- event.currentTarget.style.backgroundColor = "transparent";
1329
- },
1330
- children: [
1331
- /* @__PURE__ */ jsx(
1332
- RepositoryAvatar,
1333
- {
1334
- customAvatarUrl: avatarUrl,
1335
- size: 32,
1336
- fallbackIcon: /* @__PURE__ */ jsx(
1337
- "div",
1338
- {
1339
- style: {
1340
- color: theme2.colors.textSecondary,
1341
- fontSize: `${theme2.fontSizes[1]}px`,
1342
- fontWeight: theme2.fontWeights.semibold,
1343
- fontFamily: theme2.fonts.body
1344
- },
1345
- children: ((_b = repository.name[0]) == null ? void 0 : _b.toUpperCase()) || "?"
1346
- }
1347
- )
1348
- }
1349
- ),
1350
- /* @__PURE__ */ jsxs(
1351
- "div",
1352
- {
1353
- style: {
1354
- flex: 1,
1355
- minWidth: 0,
1356
- display: "flex",
1357
- flexDirection: "column",
1358
- gap: "4px"
1359
- },
1360
- children: [
1361
- /* @__PURE__ */ jsx(
1362
- "div",
1363
- {
1364
- style: {
1365
- display: "flex",
1366
- alignItems: "center",
1367
- gap: "6px",
1368
- flexWrap: "wrap"
1369
- },
1370
- children: /* @__PURE__ */ jsx(
1371
- "span",
1372
- {
1373
- style: {
1374
- fontSize: `${theme2.fontSizes[2]}px`,
1375
- fontWeight: theme2.fontWeights.medium,
1376
- fontFamily: theme2.fonts.body,
1377
- color: theme2.colors.text
1378
- },
1379
- children: repository.name
1380
- }
1381
- )
1382
- }
1383
- ),
1384
- /* @__PURE__ */ jsxs(
1385
- "div",
1386
- {
1387
- onClick: handleCopyPath,
1388
- style: {
1389
- fontSize: `${theme2.fontSizes[0]}px`,
1390
- fontFamily: theme2.fonts.monospace,
1391
- color: copiedPath ? theme2.colors.success || "#10b981" : theme2.colors.textTertiary || theme2.colors.textSecondary,
1392
- overflow: "hidden",
1393
- textOverflow: "ellipsis",
1394
- whiteSpace: "nowrap",
1395
- cursor: "pointer",
1396
- display: "flex",
1397
- alignItems: "center",
1398
- gap: "4px",
1399
- transition: "color 0.15s ease"
1400
- },
1401
- title: copiedPath ? "Copied!" : `Click to copy: ${repository.path}`,
1402
- onMouseEnter: (event) => {
1403
- if (!copiedPath) {
1404
- event.currentTarget.style.color = theme2.colors.textSecondary;
1405
- }
1406
- },
1407
- onMouseLeave: (event) => {
1408
- if (!copiedPath) {
1409
- event.currentTarget.style.color = theme2.colors.textTertiary || theme2.colors.textSecondary;
1410
- }
1411
- },
1412
- children: [
1413
- copiedPath ? /* @__PURE__ */ jsx(Check, { size: 12 }) : /* @__PURE__ */ jsx(Copy, { size: 12 }),
1414
- displayPath
1415
- ]
1416
- }
1417
- )
1418
- ]
1419
- }
1420
- ),
1421
- /* @__PURE__ */ jsxs(
1422
- "div",
1423
- {
1424
- style: {
1425
- display: "flex",
1426
- gap: "4px",
1427
- flexShrink: 0,
1428
- alignItems: "center"
1429
- },
1430
- children: [
1431
- isEditMode && workspace && workspace.suggestedClonePath && isInWorkspaceDirectory === false && /* @__PURE__ */ jsxs(
1432
- "button",
1433
- {
1434
- type: "button",
1435
- onClick: handleMoveToWorkspace,
1436
- disabled: isMoving,
1437
- title: `Move to ${workspace.suggestedClonePath}`,
1438
- style: {
1439
- display: "inline-flex",
1440
- alignItems: "center",
1441
- justifyContent: "center",
1442
- padding: "6px 10px",
1443
- gap: "4px",
1444
- borderRadius: "4px",
1445
- border: `1px solid ${theme2.colors.primary || "#3b82f6"}`,
1446
- backgroundColor: `${theme2.colors.primary || "#3b82f6"}15`,
1447
- color: theme2.colors.primary || "#3b82f6",
1448
- fontSize: `${theme2.fontSizes[0]}px`,
1449
- fontWeight: theme2.fontWeights.medium,
1450
- fontFamily: theme2.fonts.body,
1451
- cursor: isMoving ? "wait" : "pointer",
1452
- opacity: isMoving ? 0.6 : 1,
1453
- transition: "all 0.15s ease"
1454
- },
1455
- onMouseEnter: (event) => {
1456
- if (!isMoving) {
1457
- event.currentTarget.style.backgroundColor = `${theme2.colors.primary || "#3b82f6"}25`;
1458
- }
1459
- },
1460
- onMouseLeave: (event) => {
1461
- event.currentTarget.style.backgroundColor = `${theme2.colors.primary || "#3b82f6"}15`;
1462
- },
1463
- children: [
1464
- isMoving ? /* @__PURE__ */ jsx(LoaderCircle, { size: 12, className: "animate-spin" }) : /* @__PURE__ */ jsx(MoveUp, { size: 12 }),
1465
- isMoving ? "Moving..." : "Move"
1466
- ]
1467
- }
1468
- ),
1469
- /* @__PURE__ */ jsxs(
1470
- "button",
1471
- {
1472
- type: "button",
1473
- onClick: handleOpenClick,
1474
- title: "Open repository",
1475
- style: {
1476
- display: "inline-flex",
1477
- alignItems: "center",
1478
- justifyContent: "center",
1479
- padding: "6px 10px",
1480
- gap: "4px",
1481
- borderRadius: "4px",
1482
- border: `1px solid ${theme2.colors.success || "#10b981"}`,
1483
- backgroundColor: `${theme2.colors.success || "#10b981"}15`,
1484
- color: theme2.colors.success || "#10b981",
1485
- fontSize: `${theme2.fontSizes[0]}px`,
1486
- fontWeight: theme2.fontWeights.medium,
1487
- fontFamily: theme2.fonts.body,
1488
- cursor: "pointer",
1489
- transition: "all 0.15s ease"
1490
- },
1491
- onMouseEnter: (event) => {
1492
- event.currentTarget.style.backgroundColor = `${theme2.colors.success || "#10b981"}25`;
1493
- },
1494
- onMouseLeave: (event) => {
1495
- event.currentTarget.style.backgroundColor = `${theme2.colors.success || "#10b981"}15`;
1496
- },
1497
- children: [
1498
- /* @__PURE__ */ jsx(FolderOpen, { size: 12 }),
1499
- "Open"
1500
- ]
1501
- }
1502
- ),
1503
- isEditMode && workspace && /* @__PURE__ */ jsx(
1504
- "button",
1505
- {
1506
- type: "button",
1507
- onClick: handleRemoveFromWorkspace,
1508
- disabled: isRemoving,
1509
- title: `Remove from workspace "${workspace.name}"`,
1510
- style: {
1511
- display: "inline-flex",
1512
- alignItems: "center",
1513
- justifyContent: "center",
1514
- width: "28px",
1515
- height: "28px",
1516
- padding: 0,
1517
- borderRadius: "4px",
1518
- border: "none",
1519
- backgroundColor: "transparent",
1520
- color: theme2.colors.textSecondary,
1521
- cursor: isRemoving ? "wait" : "pointer",
1522
- opacity: isRemoving ? 0.6 : 1,
1523
- transition: "all 0.15s ease"
1524
- },
1525
- onMouseEnter: (event) => {
1526
- if (!isRemoving) {
1527
- event.currentTarget.style.backgroundColor = theme2.colors.error || "#ef4444";
1528
- event.currentTarget.style.color = "#fff";
1529
- }
1530
- },
1531
- onMouseLeave: (event) => {
1532
- event.currentTarget.style.backgroundColor = "transparent";
1533
- event.currentTarget.style.color = theme2.colors.textSecondary;
1534
- },
1535
- children: isRemoving ? /* @__PURE__ */ jsx(LoaderCircle, { size: 14, className: "animate-spin" }) : /* @__PURE__ */ jsx(X, { size: 14 })
1536
- }
1537
- )
1538
- ]
1539
- }
1540
- )
1541
- ]
1542
- }
1543
- );
1544
- };
1545
- const PANEL_ID$2 = "industry-theme.workspace-repositories";
1546
- const createPanelEvent = (type, payload) => ({
1547
- type,
1548
- source: PANEL_ID$2,
1549
- timestamp: Date.now(),
1550
- payload
1551
- });
1552
- const WorkspaceRepositoriesPanelContent = ({
1553
- context,
1554
- actions,
1555
- events
1556
- }) => {
1557
- const { theme: theme2 } = useTheme();
1558
- const [isEditMode, setIsEditMode] = React2.useState(false);
1559
- const [repositoryLocations, setRepositoryLocations] = React2.useState(
1560
- /* @__PURE__ */ new Map()
1561
- );
1562
- const panelActions = actions;
1563
- const workspaceSlice = context.getSlice("workspace");
1564
- const repositoriesSlice = context.getSlice("workspaceRepositories");
1565
- const workspace = (workspaceSlice == null ? void 0 : workspaceSlice.data) ?? null;
1566
- const isLoading = (workspaceSlice == null ? void 0 : workspaceSlice.loading) || (repositoriesSlice == null ? void 0 : repositoriesSlice.loading) || false;
1567
- const sortedRepositories = useMemo(() => {
1568
- const repos = (repositoriesSlice == null ? void 0 : repositoriesSlice.data) ?? [];
1569
- return [...repos].sort((a, b) => a.name.localeCompare(b.name));
1570
- }, [repositoriesSlice == null ? void 0 : repositoriesSlice.data]);
1571
- useEffect(() => {
1572
- const checkLocations = async () => {
1573
- if (!(workspace == null ? void 0 : workspace.id) || !panelActions.isRepositoryInWorkspaceDirectory || !sortedRepositories.length) {
1574
- return;
1575
- }
1576
- const locationMap = /* @__PURE__ */ new Map();
1577
- await Promise.all(
1578
- sortedRepositories.map(async (repo) => {
1579
- try {
1580
- const isInWorkspace = await panelActions.isRepositoryInWorkspaceDirectory(repo, workspace.id);
1581
- if (isInWorkspace !== null) {
1582
- locationMap.set(repo.path, isInWorkspace);
1583
- }
1584
- } catch (error) {
1585
- console.error(`Failed to check location for ${repo.name}:`, error);
1494
+ const locationMap = /* @__PURE__ */ new Map();
1495
+ await Promise.all(
1496
+ sortedRepositories.map(async (repo) => {
1497
+ try {
1498
+ const isInWorkspace = await panelActions.isRepositoryInWorkspaceDirectory(repo, workspace.id);
1499
+ if (isInWorkspace !== null) {
1500
+ locationMap.set(repo.path, isInWorkspace);
1501
+ }
1502
+ } catch (error) {
1503
+ console.error(`Failed to check location for ${repo.name}:`, error);
1586
1504
  }
1587
1505
  })
1588
1506
  );
@@ -1661,7 +1579,7 @@ const WorkspaceRepositoriesPanelContent = ({
1661
1579
  );
1662
1580
  useEffect(() => {
1663
1581
  const unsubscribers = [
1664
- events.on(`${PANEL_ID$2}:select-repository`, (event) => {
1582
+ events.on(`${PANEL_ID$3}:select-repository`, (event) => {
1665
1583
  var _a;
1666
1584
  const path = (_a = event.payload) == null ? void 0 : _a.repositoryPath;
1667
1585
  if (path) {
@@ -1671,7 +1589,7 @@ const WorkspaceRepositoriesPanelContent = ({
1671
1589
  }
1672
1590
  }
1673
1591
  }),
1674
- events.on(`${PANEL_ID$2}:open-repository`, (event) => {
1592
+ events.on(`${PANEL_ID$3}:open-repository`, (event) => {
1675
1593
  var _a;
1676
1594
  const path = (_a = event.payload) == null ? void 0 : _a.repositoryPath;
1677
1595
  if (path) {
@@ -2004,13 +1922,13 @@ const WorkspaceRepositoriesPanelContent = ({
2004
1922
  }
2005
1923
  ),
2006
1924
  /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: repositoriesInWorkspace.map((repository) => /* @__PURE__ */ jsx(
2007
- WorkspaceRepositoryCard,
1925
+ LocalProjectCard,
2008
1926
  {
2009
- repository,
2010
- workspace,
2011
- actions: panelActions,
1927
+ entry: repository,
1928
+ actionMode: "workspace",
2012
1929
  isEditMode,
2013
1930
  isInWorkspaceDirectory: true,
1931
+ workspacePath: workspace.suggestedClonePath,
2014
1932
  onSelect: handleSelectRepository,
2015
1933
  onOpen: handleOpenRepository,
2016
1934
  onRemoveFromWorkspace: handleRemoveFromWorkspace,
@@ -2070,13 +1988,13 @@ const WorkspaceRepositoriesPanelContent = ({
2070
1988
  }
2071
1989
  ),
2072
1990
  /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: repositoriesOutsideWorkspace.map((repository) => /* @__PURE__ */ jsx(
2073
- WorkspaceRepositoryCard,
1991
+ LocalProjectCard,
2074
1992
  {
2075
- repository,
2076
- workspace,
2077
- actions: panelActions,
1993
+ entry: repository,
1994
+ actionMode: "workspace",
2078
1995
  isEditMode,
2079
1996
  isInWorkspaceDirectory: false,
1997
+ workspacePath: workspace.suggestedClonePath,
2080
1998
  onSelect: handleSelectRepository,
2081
1999
  onOpen: handleOpenRepository,
2082
2000
  onRemoveFromWorkspace: handleRemoveFromWorkspace,
@@ -2093,61 +2011,941 @@ const WorkspaceRepositoriesPanelContent = ({
2093
2011
  const WorkspaceRepositoriesPanel = (props) => {
2094
2012
  return /* @__PURE__ */ jsx(ThemeProvider, { children: /* @__PURE__ */ jsx(WorkspaceRepositoriesPanelContent, { ...props }) });
2095
2013
  };
2096
- const PANEL_ID$1 = "industry-theme.local-projects";
2097
- const filterProjectsTool = {
2098
- name: "filter_projects",
2099
- description: "Filter the local projects list by name, owner, or path",
2100
- inputs: {
2101
- type: "object",
2102
- properties: {
2103
- filter: {
2104
- type: "string",
2105
- description: "Search term to filter projects (matches name, owner, or path)"
2106
- }
2107
- },
2108
- required: ["filter"]
2109
- },
2110
- outputs: {
2111
- type: "object",
2112
- properties: {
2113
- success: { type: "boolean" },
2114
- message: { type: "string" }
2014
+ const DependencyInfoModal = ({
2015
+ isOpen,
2016
+ onClose
2017
+ }) => {
2018
+ const { theme: theme2 } = useTheme();
2019
+ if (!isOpen) return null;
2020
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
2021
+ "div",
2022
+ {
2023
+ style: {
2024
+ position: "fixed",
2025
+ top: 0,
2026
+ left: 0,
2027
+ right: 0,
2028
+ bottom: 0,
2029
+ backgroundColor: theme2.colors.muted,
2030
+ zIndex: theme2.zIndices[4],
2031
+ display: "flex",
2032
+ alignItems: "center",
2033
+ justifyContent: "center"
2034
+ },
2035
+ onClick: onClose,
2036
+ children: /* @__PURE__ */ jsxs(
2037
+ "div",
2038
+ {
2039
+ style: {
2040
+ backgroundColor: theme2.colors.background,
2041
+ borderRadius: `${theme2.radii[3]}px`,
2042
+ maxWidth: "600px",
2043
+ maxHeight: "80vh",
2044
+ width: "90%",
2045
+ overflow: "hidden",
2046
+ display: "flex",
2047
+ flexDirection: "column",
2048
+ boxShadow: theme2.shadows[3]
2049
+ },
2050
+ onClick: (e) => e.stopPropagation(),
2051
+ children: [
2052
+ /* @__PURE__ */ jsxs(
2053
+ "div",
2054
+ {
2055
+ style: {
2056
+ padding: `${theme2.space[4]}px`,
2057
+ borderBottom: `1px solid ${theme2.colors.border}`,
2058
+ display: "flex",
2059
+ alignItems: "center",
2060
+ justifyContent: "space-between"
2061
+ },
2062
+ children: [
2063
+ /* @__PURE__ */ jsxs(
2064
+ "h2",
2065
+ {
2066
+ style: {
2067
+ fontSize: `${theme2.fontSizes[4]}px`,
2068
+ fontWeight: theme2.fontWeights.semibold,
2069
+ color: theme2.colors.text,
2070
+ display: "flex",
2071
+ alignItems: "center",
2072
+ gap: `${theme2.space[2]}px`,
2073
+ margin: 0
2074
+ },
2075
+ children: [
2076
+ /* @__PURE__ */ jsx(CircleQuestionMark, { size: 20 }),
2077
+ "Understanding Dependencies"
2078
+ ]
2079
+ }
2080
+ ),
2081
+ /* @__PURE__ */ jsx(
2082
+ "button",
2083
+ {
2084
+ onClick: onClose,
2085
+ style: {
2086
+ background: "none",
2087
+ border: "none",
2088
+ color: theme2.colors.textSecondary,
2089
+ cursor: "pointer",
2090
+ padding: `${theme2.space[1]}px`
2091
+ },
2092
+ children: /* @__PURE__ */ jsx(X, { size: 20 })
2093
+ }
2094
+ )
2095
+ ]
2096
+ }
2097
+ ),
2098
+ /* @__PURE__ */ jsxs(
2099
+ "div",
2100
+ {
2101
+ style: {
2102
+ padding: `${theme2.space[4]}px`,
2103
+ overflow: "auto",
2104
+ flex: 1
2105
+ },
2106
+ children: [
2107
+ /* @__PURE__ */ jsxs(
2108
+ Section,
2109
+ {
2110
+ icon: /* @__PURE__ */ jsx(Package, { size: 18 }),
2111
+ title: "Dependency Types",
2112
+ theme: theme2,
2113
+ children: [
2114
+ /* @__PURE__ */ jsx(
2115
+ InfoItem,
2116
+ {
2117
+ badge: { text: "prod", color: theme2.colors.primary },
2118
+ title: "Production Dependencies",
2119
+ description: "Required for your application to run in production. These are bundled with your app and affect its size and security.",
2120
+ theme: theme2
2121
+ }
2122
+ ),
2123
+ /* @__PURE__ */ jsx(
2124
+ InfoItem,
2125
+ {
2126
+ badge: { text: "dev", color: theme2.colors.secondary },
2127
+ title: "Development Dependencies",
2128
+ description: "Only needed during development (build tools, testing, linters). Not included in production builds.",
2129
+ theme: theme2
2130
+ }
2131
+ ),
2132
+ /* @__PURE__ */ jsx(
2133
+ InfoItem,
2134
+ {
2135
+ badge: { text: "peer", color: theme2.colors.accent },
2136
+ title: "Peer Dependencies",
2137
+ description: "Expected to be provided by the consumer of your package. Important for library authors to specify compatibility.",
2138
+ theme: theme2
2139
+ }
2140
+ )
2141
+ ]
2142
+ }
2143
+ ),
2144
+ /* @__PURE__ */ jsxs(
2145
+ Section,
2146
+ {
2147
+ icon: /* @__PURE__ */ jsx(Scale, { size: 18 }),
2148
+ title: "Common Licenses",
2149
+ theme: theme2,
2150
+ children: [
2151
+ /* @__PURE__ */ jsx(
2152
+ InfoItem,
2153
+ {
2154
+ badge: { text: "MIT", color: theme2.colors.success },
2155
+ title: "Permissive Licenses (MIT, Apache, BSD)",
2156
+ description: "Few restrictions. Can use in commercial projects. Must include copyright notice.",
2157
+ theme: theme2
2158
+ }
2159
+ ),
2160
+ /* @__PURE__ */ jsx(
2161
+ InfoItem,
2162
+ {
2163
+ badge: { text: "GPL", color: theme2.colors.warning },
2164
+ title: "Copyleft Licenses (GPL, LGPL, AGPL)",
2165
+ description: "Requires sharing source code of derivative works. Can impact your project's licensing.",
2166
+ theme: theme2
2167
+ }
2168
+ )
2169
+ ]
2170
+ }
2171
+ )
2172
+ ]
2173
+ }
2174
+ )
2175
+ ]
2176
+ }
2177
+ )
2115
2178
  }
2116
- },
2117
- tags: ["filter", "search", "projects"],
2118
- tool_call_template: {
2119
- call_template_type: "panel_event",
2120
- event_type: `${PANEL_ID$1}:filter`
2121
- }
2179
+ ) });
2122
2180
  };
2123
- const selectProjectTool = {
2124
- name: "select_project",
2125
- description: "Select a project by name or path to view its details",
2126
- inputs: {
2127
- type: "object",
2128
- properties: {
2129
- identifier: {
2130
- type: "string",
2131
- description: "Project name or full path to select"
2132
- }
2133
- },
2134
- required: ["identifier"]
2135
- },
2136
- outputs: {
2137
- type: "object",
2138
- properties: {
2139
- success: { type: "boolean" },
2140
- selectedProject: { type: "string" }
2181
+ const Section = ({ icon, title, theme: theme2, children }) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: `${theme2.space[5]}px` }, children: [
2182
+ /* @__PURE__ */ jsxs(
2183
+ "h3",
2184
+ {
2185
+ style: {
2186
+ fontSize: `${theme2.fontSizes[2]}px`,
2187
+ fontWeight: theme2.fontWeights.semibold,
2188
+ color: theme2.colors.text,
2189
+ marginBottom: `${theme2.space[3]}px`,
2190
+ display: "flex",
2191
+ alignItems: "center",
2192
+ gap: `${theme2.space[2]}px`
2193
+ },
2194
+ children: [
2195
+ icon,
2196
+ title
2197
+ ]
2141
2198
  }
2142
- },
2143
- tags: ["select", "project", "navigation"],
2144
- tool_call_template: {
2145
- call_template_type: "panel_event",
2146
- event_type: `${PANEL_ID$1}:select-repository`
2147
- }
2148
- };
2149
- const openProjectTool = {
2150
- name: "open_project",
2199
+ ),
2200
+ /* @__PURE__ */ jsx(
2201
+ "div",
2202
+ {
2203
+ style: {
2204
+ display: "flex",
2205
+ flexDirection: "column",
2206
+ gap: `${theme2.space[2]}px`
2207
+ },
2208
+ children
2209
+ }
2210
+ )
2211
+ ] });
2212
+ const InfoItem = ({ badge, title, description, theme: theme2 }) => /* @__PURE__ */ jsxs(
2213
+ "div",
2214
+ {
2215
+ style: {
2216
+ padding: `${theme2.space[3]}px`,
2217
+ backgroundColor: theme2.colors.backgroundSecondary,
2218
+ borderRadius: `${theme2.radii[2]}px`,
2219
+ border: `1px solid ${theme2.colors.border}`
2220
+ },
2221
+ children: [
2222
+ /* @__PURE__ */ jsxs(
2223
+ "div",
2224
+ {
2225
+ style: {
2226
+ display: "flex",
2227
+ alignItems: "center",
2228
+ gap: `${theme2.space[2]}px`,
2229
+ marginBottom: `${theme2.space[1]}px`
2230
+ },
2231
+ children: [
2232
+ /* @__PURE__ */ jsx(
2233
+ "span",
2234
+ {
2235
+ style: {
2236
+ padding: `${theme2.space[1]}px ${theme2.space[2]}px`,
2237
+ borderRadius: `${theme2.radii[1]}px`,
2238
+ fontSize: `${theme2.fontSizes[0]}px`,
2239
+ fontWeight: theme2.fontWeights.medium,
2240
+ backgroundColor: `${badge.color}20`,
2241
+ color: badge.color
2242
+ },
2243
+ children: badge.text
2244
+ }
2245
+ ),
2246
+ /* @__PURE__ */ jsx(
2247
+ "span",
2248
+ {
2249
+ style: {
2250
+ fontSize: `${theme2.fontSizes[1]}px`,
2251
+ fontWeight: theme2.fontWeights.medium,
2252
+ color: theme2.colors.text
2253
+ },
2254
+ children: title
2255
+ }
2256
+ )
2257
+ ]
2258
+ }
2259
+ ),
2260
+ /* @__PURE__ */ jsx(
2261
+ "div",
2262
+ {
2263
+ style: {
2264
+ fontSize: `${theme2.fontSizes[1]}px`,
2265
+ color: theme2.colors.textSecondary,
2266
+ lineHeight: theme2.lineHeights.relaxed
2267
+ },
2268
+ children: description
2269
+ }
2270
+ )
2271
+ ]
2272
+ }
2273
+ );
2274
+ const DependencyRow = ({ dependency }) => {
2275
+ const { theme: theme2 } = useTheme();
2276
+ const getDependencyTypeBadgeStyle = (type) => {
2277
+ const baseStyle = {
2278
+ padding: `${theme2.space[1]}px ${theme2.space[2]}px`,
2279
+ borderRadius: `${theme2.radii[1]}px`,
2280
+ fontSize: `${theme2.fontSizes[0]}px`,
2281
+ fontWeight: theme2.fontWeights.medium,
2282
+ minWidth: "36px",
2283
+ textAlign: "center"
2284
+ };
2285
+ switch (type) {
2286
+ case "production":
2287
+ return {
2288
+ ...baseStyle,
2289
+ backgroundColor: `${theme2.colors.primary}20`,
2290
+ color: theme2.colors.primary
2291
+ };
2292
+ case "development":
2293
+ return {
2294
+ ...baseStyle,
2295
+ backgroundColor: `${theme2.colors.secondary}20`,
2296
+ color: theme2.colors.secondary
2297
+ };
2298
+ case "peer":
2299
+ return {
2300
+ ...baseStyle,
2301
+ backgroundColor: `${theme2.colors.accent}20`,
2302
+ color: theme2.colors.accent
2303
+ };
2304
+ default:
2305
+ return {
2306
+ ...baseStyle,
2307
+ backgroundColor: theme2.colors.backgroundLight,
2308
+ color: theme2.colors.textSecondary
2309
+ };
2310
+ }
2311
+ };
2312
+ return /* @__PURE__ */ jsxs(
2313
+ "div",
2314
+ {
2315
+ style: {
2316
+ display: "flex",
2317
+ alignItems: "center",
2318
+ justifyContent: "space-between",
2319
+ padding: `${theme2.space[2]}px ${theme2.space[3]}px`,
2320
+ backgroundColor: theme2.colors.background,
2321
+ borderRadius: `${theme2.radii[1]}px`,
2322
+ fontSize: `${theme2.fontSizes[1]}px`,
2323
+ border: `1px solid ${theme2.colors.border}`,
2324
+ transition: "all 0.2s"
2325
+ },
2326
+ children: [
2327
+ /* @__PURE__ */ jsxs(
2328
+ "div",
2329
+ {
2330
+ style: {
2331
+ display: "flex",
2332
+ alignItems: "center",
2333
+ gap: `${theme2.space[2]}px`,
2334
+ flex: 1,
2335
+ minWidth: 0
2336
+ },
2337
+ children: [
2338
+ /* @__PURE__ */ jsx("span", { style: getDependencyTypeBadgeStyle(dependency.dependencyType), children: dependency.dependencyType === "production" ? "prod" : dependency.dependencyType === "development" ? "dev" : "peer" }),
2339
+ /* @__PURE__ */ jsx(
2340
+ "span",
2341
+ {
2342
+ style: {
2343
+ fontWeight: theme2.fontWeights.medium,
2344
+ color: theme2.colors.text,
2345
+ overflow: "hidden",
2346
+ textOverflow: "ellipsis",
2347
+ whiteSpace: "nowrap"
2348
+ },
2349
+ children: dependency.name
2350
+ }
2351
+ )
2352
+ ]
2353
+ }
2354
+ ),
2355
+ /* @__PURE__ */ jsxs(
2356
+ "div",
2357
+ {
2358
+ style: {
2359
+ display: "flex",
2360
+ alignItems: "center",
2361
+ gap: "8px"
2362
+ },
2363
+ children: [
2364
+ /* @__PURE__ */ jsx("span", { style: { color: theme2.colors.textSecondary }, children: dependency.version }),
2365
+ /* @__PURE__ */ jsx(
2366
+ "a",
2367
+ {
2368
+ href: `https://www.npmjs.com/package/${dependency.name}`,
2369
+ target: "_blank",
2370
+ rel: "noopener noreferrer",
2371
+ style: {
2372
+ padding: `${theme2.space[1]}px`,
2373
+ borderRadius: `${theme2.radii[1]}px`,
2374
+ display: "flex",
2375
+ alignItems: "center",
2376
+ transition: "background-color 0.2s"
2377
+ },
2378
+ title: "View on npm",
2379
+ children: /* @__PURE__ */ jsx(ExternalLink, { size: 12, color: theme2.colors.textSecondary })
2380
+ }
2381
+ )
2382
+ ]
2383
+ }
2384
+ )
2385
+ ]
2386
+ }
2387
+ );
2388
+ };
2389
+ const FilterBar = ({
2390
+ activeFilters,
2391
+ onToggleFilter,
2392
+ searchQuery,
2393
+ onSearchChange,
2394
+ counts
2395
+ }) => {
2396
+ const { theme: theme2 } = useTheme();
2397
+ const availableFilters = [
2398
+ ...counts.peer > 0 ? ["peer"] : [],
2399
+ ...counts.production > 0 ? ["production"] : [],
2400
+ ...counts.development > 0 ? ["development"] : []
2401
+ ];
2402
+ const showFilters = availableFilters.length > 1;
2403
+ return /* @__PURE__ */ jsxs(
2404
+ "div",
2405
+ {
2406
+ style: {
2407
+ display: "flex",
2408
+ flexDirection: "column",
2409
+ gap: `${theme2.space[2]}px`
2410
+ },
2411
+ children: [
2412
+ /* @__PURE__ */ jsxs(
2413
+ "div",
2414
+ {
2415
+ style: {
2416
+ position: "relative",
2417
+ display: "flex",
2418
+ alignItems: "center"
2419
+ },
2420
+ children: [
2421
+ /* @__PURE__ */ jsx(
2422
+ Search,
2423
+ {
2424
+ size: 14,
2425
+ style: {
2426
+ position: "absolute",
2427
+ left: `${theme2.space[3]}px`,
2428
+ color: theme2.colors.textSecondary,
2429
+ pointerEvents: "none"
2430
+ }
2431
+ }
2432
+ ),
2433
+ /* @__PURE__ */ jsx(
2434
+ "input",
2435
+ {
2436
+ type: "text",
2437
+ placeholder: "Search dependencies...",
2438
+ value: searchQuery,
2439
+ onChange: (e) => onSearchChange(e.target.value),
2440
+ style: {
2441
+ width: "100%",
2442
+ padding: `${theme2.space[2]}px ${theme2.space[5]}px`,
2443
+ borderRadius: `${theme2.radii[2]}px`,
2444
+ border: `1px solid ${theme2.colors.border}`,
2445
+ backgroundColor: theme2.colors.backgroundSecondary,
2446
+ color: theme2.colors.text,
2447
+ fontSize: `${theme2.fontSizes[1]}px`,
2448
+ fontFamily: theme2.fonts.body,
2449
+ outline: "none",
2450
+ transition: "all 0.2s"
2451
+ }
2452
+ }
2453
+ ),
2454
+ searchQuery && /* @__PURE__ */ jsx(
2455
+ "button",
2456
+ {
2457
+ onClick: () => onSearchChange(""),
2458
+ style: {
2459
+ position: "absolute",
2460
+ right: `${theme2.space[2]}px`,
2461
+ padding: `${theme2.space[1]}px`,
2462
+ display: "flex",
2463
+ alignItems: "center",
2464
+ justifyContent: "center",
2465
+ backgroundColor: "transparent",
2466
+ border: "none",
2467
+ cursor: "pointer",
2468
+ borderRadius: `${theme2.radii[1]}px`
2469
+ },
2470
+ title: "Clear search",
2471
+ children: /* @__PURE__ */ jsx(X, { size: 14, color: theme2.colors.textSecondary })
2472
+ }
2473
+ )
2474
+ ]
2475
+ }
2476
+ ),
2477
+ showFilters && /* @__PURE__ */ jsx("div", { style: { display: "flex", gap: `${theme2.space[1]}px`, width: "100%" }, children: availableFilters.map((type) => {
2478
+ const isActive = activeFilters.has(type);
2479
+ return /* @__PURE__ */ jsxs(
2480
+ "button",
2481
+ {
2482
+ onClick: () => onToggleFilter(type),
2483
+ style: {
2484
+ flex: 1,
2485
+ padding: `${theme2.space[1]}px ${theme2.space[2]}px`,
2486
+ fontSize: `${theme2.fontSizes[0]}px`,
2487
+ fontWeight: theme2.fontWeights.medium,
2488
+ fontFamily: theme2.fonts.body,
2489
+ borderRadius: `${theme2.radii[1]}px`,
2490
+ border: `1px solid ${isActive ? theme2.colors.primary : theme2.colors.border}`,
2491
+ backgroundColor: isActive ? `${theme2.colors.primary}20` : theme2.colors.backgroundSecondary,
2492
+ color: isActive ? theme2.colors.primary : theme2.colors.text,
2493
+ cursor: "pointer",
2494
+ transition: "all 0.2s"
2495
+ },
2496
+ children: [
2497
+ type === "production" ? "Prod" : type === "development" ? "Dev" : "Peer",
2498
+ /* @__PURE__ */ jsxs(
2499
+ "span",
2500
+ {
2501
+ style: { marginLeft: `${theme2.space[1]}px`, opacity: 0.7 },
2502
+ children: [
2503
+ "(",
2504
+ counts[type],
2505
+ ")"
2506
+ ]
2507
+ }
2508
+ )
2509
+ ]
2510
+ },
2511
+ type
2512
+ );
2513
+ }) })
2514
+ ]
2515
+ }
2516
+ );
2517
+ };
2518
+ const dependencyTypeOrder = {
2519
+ peer: 0,
2520
+ production: 1,
2521
+ development: 2
2522
+ };
2523
+ function extractDependencies(packageLayer) {
2524
+ const { dependencies, devDependencies, peerDependencies } = packageLayer.packageData;
2525
+ const items = [];
2526
+ if (dependencies) {
2527
+ Object.entries(dependencies).forEach(([name, version]) => {
2528
+ items.push({ name, version, dependencyType: "production" });
2529
+ });
2530
+ }
2531
+ if (devDependencies) {
2532
+ Object.entries(devDependencies).forEach(([name, version]) => {
2533
+ items.push({ name, version, dependencyType: "development" });
2534
+ });
2535
+ }
2536
+ if (peerDependencies) {
2537
+ Object.entries(peerDependencies).forEach(([name, version]) => {
2538
+ items.push({ name, version, dependencyType: "peer" });
2539
+ });
2540
+ }
2541
+ return items.sort((a, b) => {
2542
+ const typeCompare = dependencyTypeOrder[a.dependencyType] - dependencyTypeOrder[b.dependencyType];
2543
+ if (typeCompare !== 0) return typeCompare;
2544
+ return a.name.localeCompare(b.name);
2545
+ });
2546
+ }
2547
+ const DependenciesPanelContent = ({
2548
+ context
2549
+ }) => {
2550
+ var _a;
2551
+ const { theme: theme2 } = useTheme();
2552
+ const [selectedPackagePath, setSelectedPackagePath] = useState(
2553
+ null
2554
+ );
2555
+ const [activeFilters, setActiveFilters] = useState(/* @__PURE__ */ new Set());
2556
+ const [searchQuery, setSearchQuery] = useState("");
2557
+ const [showInfoModal, setShowInfoModal] = useState(false);
2558
+ const packagesSlice = context.getSlice("packages");
2559
+ const isLoading = context.isSliceLoading("packages");
2560
+ const hasPackages = context.hasSlice("packages");
2561
+ const packages = useMemo(() => {
2562
+ var _a2;
2563
+ return ((_a2 = packagesSlice == null ? void 0 : packagesSlice.data) == null ? void 0 : _a2.packages) ?? [];
2564
+ }, [(_a = packagesSlice == null ? void 0 : packagesSlice.data) == null ? void 0 : _a.packages]);
2565
+ const effectiveSelectedPath = useMemo(() => {
2566
+ if (selectedPackagePath !== null) return selectedPackagePath;
2567
+ if (packages.length === 1) return packages[0].packageData.path;
2568
+ const rootPackage = packages.find((p) => p.packageData.path === "");
2569
+ if (rootPackage) return "";
2570
+ return null;
2571
+ }, [selectedPackagePath, packages]);
2572
+ const selectedPackage = useMemo(() => {
2573
+ if (effectiveSelectedPath === null) return null;
2574
+ return packages.find((p) => p.packageData.path === effectiveSelectedPath);
2575
+ }, [effectiveSelectedPath, packages]);
2576
+ const dependencyItems = useMemo(() => {
2577
+ if (!selectedPackage) return [];
2578
+ return extractDependencies(selectedPackage);
2579
+ }, [selectedPackage]);
2580
+ const counts = useMemo(() => {
2581
+ return {
2582
+ all: dependencyItems.length,
2583
+ production: dependencyItems.filter((d) => d.dependencyType === "production").length,
2584
+ development: dependencyItems.filter(
2585
+ (d) => d.dependencyType === "development"
2586
+ ).length,
2587
+ peer: dependencyItems.filter((d) => d.dependencyType === "peer").length
2588
+ };
2589
+ }, [dependencyItems]);
2590
+ const handleToggleFilter = (type) => {
2591
+ setActiveFilters((prev) => {
2592
+ const next = new Set(prev);
2593
+ if (next.has(type)) {
2594
+ next.delete(type);
2595
+ } else {
2596
+ next.add(type);
2597
+ }
2598
+ return next;
2599
+ });
2600
+ };
2601
+ const filteredDependencies = useMemo(() => {
2602
+ let filtered = [...dependencyItems];
2603
+ if (searchQuery.trim()) {
2604
+ const query = searchQuery.toLowerCase();
2605
+ filtered = filtered.filter(
2606
+ (dep) => dep.name.toLowerCase().includes(query)
2607
+ );
2608
+ }
2609
+ const allTypes = ["production", "development", "peer"];
2610
+ const availableTypes = allTypes.filter((t) => counts[t] > 0);
2611
+ const isAllSelected = activeFilters.size === 0 || availableTypes.every((t) => activeFilters.has(t));
2612
+ if (!isAllSelected && activeFilters.size > 0) {
2613
+ filtered = filtered.filter((dep) => activeFilters.has(dep.dependencyType));
2614
+ }
2615
+ return filtered;
2616
+ }, [dependencyItems, searchQuery, activeFilters, counts]);
2617
+ if (isLoading) {
2618
+ return /* @__PURE__ */ jsx(
2619
+ "div",
2620
+ {
2621
+ style: {
2622
+ padding: `${theme2.space[3]}px`,
2623
+ height: "100%",
2624
+ display: "flex",
2625
+ alignItems: "center",
2626
+ justifyContent: "center",
2627
+ color: theme2.colors.textSecondary,
2628
+ backgroundColor: theme2.colors.background,
2629
+ fontFamily: theme2.fonts.body
2630
+ },
2631
+ children: "Loading packages..."
2632
+ }
2633
+ );
2634
+ }
2635
+ if (!hasPackages || packages.length === 0) {
2636
+ return /* @__PURE__ */ jsxs(
2637
+ "div",
2638
+ {
2639
+ style: {
2640
+ padding: `${theme2.space[3]}px`,
2641
+ height: "100%",
2642
+ display: "flex",
2643
+ flexDirection: "column",
2644
+ alignItems: "center",
2645
+ justifyContent: "center",
2646
+ gap: `${theme2.space[2]}px`,
2647
+ color: theme2.colors.textSecondary,
2648
+ backgroundColor: theme2.colors.background,
2649
+ fontFamily: theme2.fonts.body
2650
+ },
2651
+ children: [
2652
+ /* @__PURE__ */ jsx(Package, { size: 32 }),
2653
+ /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "No package data available" })
2654
+ ]
2655
+ }
2656
+ );
2657
+ }
2658
+ return /* @__PURE__ */ jsxs(
2659
+ "div",
2660
+ {
2661
+ style: {
2662
+ height: "100%",
2663
+ display: "flex",
2664
+ flexDirection: "column",
2665
+ backgroundColor: theme2.colors.background,
2666
+ color: theme2.colors.text,
2667
+ fontFamily: theme2.fonts.body,
2668
+ overflow: "hidden"
2669
+ },
2670
+ children: [
2671
+ /* @__PURE__ */ jsxs(
2672
+ "div",
2673
+ {
2674
+ style: {
2675
+ flexShrink: 0,
2676
+ padding: `${theme2.space[3]}px`,
2677
+ paddingBottom: `${theme2.space[2]}px`,
2678
+ display: "flex",
2679
+ flexDirection: "column",
2680
+ gap: `${theme2.space[2]}px`,
2681
+ borderBottom: `1px solid ${theme2.colors.border}`
2682
+ },
2683
+ children: [
2684
+ /* @__PURE__ */ jsxs(
2685
+ "div",
2686
+ {
2687
+ style: {
2688
+ display: "flex",
2689
+ alignItems: "center",
2690
+ justifyContent: "space-between"
2691
+ },
2692
+ children: [
2693
+ /* @__PURE__ */ jsx(
2694
+ "h3",
2695
+ {
2696
+ style: {
2697
+ fontSize: `${theme2.fontSizes[2]}px`,
2698
+ fontWeight: theme2.fontWeights.semibold,
2699
+ color: theme2.colors.text,
2700
+ display: "flex",
2701
+ alignItems: "center",
2702
+ gap: `${theme2.space[2]}px`,
2703
+ margin: 0
2704
+ },
2705
+ children: packages.length > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [
2706
+ /* @__PURE__ */ jsx(Boxes, { size: 16 }),
2707
+ "Monorepo Dependencies",
2708
+ /* @__PURE__ */ jsxs(
2709
+ "span",
2710
+ {
2711
+ style: {
2712
+ fontSize: `${theme2.fontSizes[0]}px`,
2713
+ fontWeight: theme2.fontWeights.body,
2714
+ color: theme2.colors.textSecondary
2715
+ },
2716
+ children: [
2717
+ "(",
2718
+ packages.length,
2719
+ ")"
2720
+ ]
2721
+ }
2722
+ )
2723
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2724
+ /* @__PURE__ */ jsx(Package, { size: 16 }),
2725
+ "Dependencies"
2726
+ ] })
2727
+ }
2728
+ ),
2729
+ /* @__PURE__ */ jsxs(
2730
+ "button",
2731
+ {
2732
+ onClick: () => setShowInfoModal(true),
2733
+ style: {
2734
+ padding: `${theme2.space[1]}px ${theme2.space[2]}px`,
2735
+ fontSize: `${theme2.fontSizes[0]}px`,
2736
+ fontWeight: theme2.fontWeights.medium,
2737
+ fontFamily: theme2.fonts.body,
2738
+ borderRadius: `${theme2.radii[1]}px`,
2739
+ border: `1px solid ${theme2.colors.border}`,
2740
+ backgroundColor: theme2.colors.backgroundSecondary,
2741
+ color: theme2.colors.primary,
2742
+ cursor: "pointer",
2743
+ display: "flex",
2744
+ alignItems: "center",
2745
+ gap: `${theme2.space[1]}px`,
2746
+ transition: "all 0.2s"
2747
+ },
2748
+ children: [
2749
+ /* @__PURE__ */ jsx(CircleQuestionMark, { size: 12 }),
2750
+ "Learn More"
2751
+ ]
2752
+ }
2753
+ )
2754
+ ]
2755
+ }
2756
+ ),
2757
+ packages.length > 1 && /* @__PURE__ */ jsx(
2758
+ "select",
2759
+ {
2760
+ value: effectiveSelectedPath ?? "__none__",
2761
+ onChange: (e) => setSelectedPackagePath(e.target.value === "__none__" ? null : e.target.value),
2762
+ style: {
2763
+ width: "100%",
2764
+ padding: `${theme2.space[2]}px`,
2765
+ borderRadius: `${theme2.radii[1]}px`,
2766
+ border: `1px solid ${theme2.colors.border}`,
2767
+ backgroundColor: theme2.colors.backgroundSecondary,
2768
+ color: theme2.colors.text,
2769
+ fontSize: `${theme2.fontSizes[1]}px`,
2770
+ fontFamily: theme2.fonts.body,
2771
+ cursor: "pointer"
2772
+ },
2773
+ children: packages.map((pkg) => /* @__PURE__ */ jsxs("option", { value: pkg.packageData.path, children: [
2774
+ pkg.packageData.name,
2775
+ " (",
2776
+ pkg.packageData.path || "root",
2777
+ ")"
2778
+ ] }, pkg.packageData.path || "__root__"))
2779
+ }
2780
+ ),
2781
+ packages.length === 1 && selectedPackage && /* @__PURE__ */ jsxs(
2782
+ "div",
2783
+ {
2784
+ style: {
2785
+ fontSize: `${theme2.fontSizes[0]}px`,
2786
+ color: theme2.colors.textSecondary
2787
+ },
2788
+ children: [
2789
+ selectedPackage.packageData.name,
2790
+ " • ",
2791
+ dependencyItems.length,
2792
+ " dependencies"
2793
+ ]
2794
+ }
2795
+ ),
2796
+ selectedPackage && dependencyItems.length > 0 && /* @__PURE__ */ jsx(
2797
+ FilterBar,
2798
+ {
2799
+ activeFilters,
2800
+ onToggleFilter: handleToggleFilter,
2801
+ searchQuery,
2802
+ onSearchChange: setSearchQuery,
2803
+ counts
2804
+ }
2805
+ )
2806
+ ]
2807
+ }
2808
+ ),
2809
+ selectedPackage && dependencyItems.length > 0 && /* @__PURE__ */ jsxs(
2810
+ "div",
2811
+ {
2812
+ style: {
2813
+ flex: 1,
2814
+ overflow: "auto",
2815
+ padding: `${theme2.space[2]}px ${theme2.space[3]}px ${theme2.space[3]}px`
2816
+ },
2817
+ children: [
2818
+ /* @__PURE__ */ jsxs(
2819
+ "div",
2820
+ {
2821
+ style: {
2822
+ fontSize: `${theme2.fontSizes[0]}px`,
2823
+ color: theme2.colors.textSecondary,
2824
+ marginBottom: `${theme2.space[2]}px`
2825
+ },
2826
+ children: [
2827
+ "Showing ",
2828
+ filteredDependencies.length,
2829
+ " of ",
2830
+ dependencyItems.length,
2831
+ " dependencies"
2832
+ ]
2833
+ }
2834
+ ),
2835
+ /* @__PURE__ */ jsx(
2836
+ "div",
2837
+ {
2838
+ style: {
2839
+ display: "flex",
2840
+ flexDirection: "column",
2841
+ gap: `${theme2.space[1]}px`
2842
+ },
2843
+ children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
2844
+ "div",
2845
+ {
2846
+ style: {
2847
+ padding: `${theme2.space[3]}px`,
2848
+ textAlign: "center",
2849
+ color: theme2.colors.textSecondary,
2850
+ fontSize: `${theme2.fontSizes[1]}px`
2851
+ },
2852
+ children: "No dependencies match your filters"
2853
+ }
2854
+ ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
2855
+ DependencyRow,
2856
+ {
2857
+ dependency: dep
2858
+ },
2859
+ `${dep.name}-${dep.dependencyType}`
2860
+ ))
2861
+ }
2862
+ )
2863
+ ]
2864
+ }
2865
+ ),
2866
+ !selectedPackage && packages.length > 1 && /* @__PURE__ */ jsx(
2867
+ "div",
2868
+ {
2869
+ style: {
2870
+ flex: 1,
2871
+ display: "flex",
2872
+ alignItems: "center",
2873
+ justifyContent: "center",
2874
+ color: theme2.colors.textSecondary,
2875
+ fontSize: `${theme2.fontSizes[1]}px`
2876
+ },
2877
+ children: "Select a package to view its dependencies"
2878
+ }
2879
+ ),
2880
+ /* @__PURE__ */ jsx(
2881
+ DependencyInfoModal,
2882
+ {
2883
+ isOpen: showInfoModal,
2884
+ onClose: () => setShowInfoModal(false)
2885
+ }
2886
+ )
2887
+ ]
2888
+ }
2889
+ );
2890
+ };
2891
+ const DependenciesPanel = (props) => {
2892
+ return /* @__PURE__ */ jsx(ThemeProvider, { children: /* @__PURE__ */ jsx(DependenciesPanelContent, { ...props }) });
2893
+ };
2894
+ const PANEL_ID$2 = "industry-theme.local-projects";
2895
+ const filterProjectsTool = {
2896
+ name: "filter_projects",
2897
+ description: "Filter the local projects list by name, owner, or path",
2898
+ inputs: {
2899
+ type: "object",
2900
+ properties: {
2901
+ filter: {
2902
+ type: "string",
2903
+ description: "Search term to filter projects (matches name, owner, or path)"
2904
+ }
2905
+ },
2906
+ required: ["filter"]
2907
+ },
2908
+ outputs: {
2909
+ type: "object",
2910
+ properties: {
2911
+ success: { type: "boolean" },
2912
+ message: { type: "string" }
2913
+ }
2914
+ },
2915
+ tags: ["filter", "search", "projects"],
2916
+ tool_call_template: {
2917
+ call_template_type: "panel_event",
2918
+ event_type: `${PANEL_ID$2}:filter`
2919
+ }
2920
+ };
2921
+ const selectProjectTool = {
2922
+ name: "select_project",
2923
+ description: "Select a project by name or path to view its details",
2924
+ inputs: {
2925
+ type: "object",
2926
+ properties: {
2927
+ identifier: {
2928
+ type: "string",
2929
+ description: "Project name or full path to select"
2930
+ }
2931
+ },
2932
+ required: ["identifier"]
2933
+ },
2934
+ outputs: {
2935
+ type: "object",
2936
+ properties: {
2937
+ success: { type: "boolean" },
2938
+ selectedProject: { type: "string" }
2939
+ }
2940
+ },
2941
+ tags: ["select", "project", "navigation"],
2942
+ tool_call_template: {
2943
+ call_template_type: "panel_event",
2944
+ event_type: `${PANEL_ID$2}:select-repository`
2945
+ }
2946
+ };
2947
+ const openProjectTool = {
2948
+ name: "open_project",
2151
2949
  description: "Open a local project in the development workspace",
2152
2950
  inputs: {
2153
2951
  type: "object",
@@ -2169,7 +2967,7 @@ const openProjectTool = {
2169
2967
  tags: ["open", "project", "workspace"],
2170
2968
  tool_call_template: {
2171
2969
  call_template_type: "panel_event",
2172
- event_type: `${PANEL_ID$1}:open-repository`
2970
+ event_type: `${PANEL_ID$2}:open-repository`
2173
2971
  }
2174
2972
  };
2175
2973
  const localProjectsPanelTools = [
@@ -2178,12 +2976,12 @@ const localProjectsPanelTools = [
2178
2976
  openProjectTool
2179
2977
  ];
2180
2978
  const localProjectsPanelToolsMetadata = {
2181
- id: PANEL_ID$1,
2979
+ id: PANEL_ID$2,
2182
2980
  name: "Local Projects Panel",
2183
2981
  description: "Tools for browsing and managing local Alexandria repositories",
2184
2982
  tools: localProjectsPanelTools
2185
2983
  };
2186
- const PANEL_ID = "industry-theme.workspace-repositories";
2984
+ const PANEL_ID$1 = "industry-theme.workspace-repositories";
2187
2985
  const selectRepositoryTool = {
2188
2986
  name: "select_workspace_repository",
2189
2987
  description: "Selects a repository in the workspace panel",
@@ -2207,7 +3005,7 @@ const selectRepositoryTool = {
2207
3005
  tags: ["workspace", "repository", "select"],
2208
3006
  tool_call_template: {
2209
3007
  call_template_type: "panel_event",
2210
- event_type: `${PANEL_ID}:select-repository`
3008
+ event_type: `${PANEL_ID$1}:select-repository`
2211
3009
  }
2212
3010
  };
2213
3011
  const refreshWorkspaceTool = {
@@ -2232,7 +3030,7 @@ const refreshWorkspaceTool = {
2232
3030
  tags: ["workspace", "refresh"],
2233
3031
  tool_call_template: {
2234
3032
  call_template_type: "panel_event",
2235
- event_type: `${PANEL_ID}:refresh-workspace`
3033
+ event_type: `${PANEL_ID$1}:refresh-workspace`
2236
3034
  }
2237
3035
  };
2238
3036
  const openRepositoryTool = {
@@ -2258,7 +3056,7 @@ const openRepositoryTool = {
2258
3056
  tags: ["workspace", "repository", "open"],
2259
3057
  tool_call_template: {
2260
3058
  call_template_type: "panel_event",
2261
- event_type: `${PANEL_ID}:open-repository`
3059
+ event_type: `${PANEL_ID$1}:open-repository`
2262
3060
  }
2263
3061
  };
2264
3062
  const workspaceRepositoriesPanelTools = [
@@ -2267,11 +3065,102 @@ const workspaceRepositoriesPanelTools = [
2267
3065
  openRepositoryTool
2268
3066
  ];
2269
3067
  const workspaceRepositoriesPanelToolsMetadata = {
2270
- id: PANEL_ID,
3068
+ id: PANEL_ID$1,
2271
3069
  name: "Workspace Repositories Panel",
2272
3070
  description: "Tools provided by the workspace repositories panel",
2273
3071
  tools: workspaceRepositoriesPanelTools
2274
3072
  };
3073
+ const PANEL_ID = "principal-ade.dependencies-panel";
3074
+ const filterDependenciesTool = {
3075
+ name: "filter_dependencies",
3076
+ description: "Filter the dependencies list by package name",
3077
+ inputs: {
3078
+ type: "object",
3079
+ properties: {
3080
+ filter: {
3081
+ type: "string",
3082
+ description: "Search term to filter dependencies by name"
3083
+ }
3084
+ },
3085
+ required: ["filter"]
3086
+ },
3087
+ outputs: {
3088
+ type: "object",
3089
+ properties: {
3090
+ success: { type: "boolean" },
3091
+ message: { type: "string" }
3092
+ }
3093
+ },
3094
+ tags: ["filter", "search", "dependencies"],
3095
+ tool_call_template: {
3096
+ call_template_type: "panel_event",
3097
+ event_type: `${PANEL_ID}:filter`
3098
+ }
3099
+ };
3100
+ const selectDependencyTypeTool = {
3101
+ name: "select_dependency_type",
3102
+ description: "Filter dependencies by type (production, development, or peer)",
3103
+ inputs: {
3104
+ type: "object",
3105
+ properties: {
3106
+ type: {
3107
+ type: "string",
3108
+ enum: ["production", "development", "peer", "all"],
3109
+ description: "The dependency type to filter by"
3110
+ }
3111
+ },
3112
+ required: ["type"]
3113
+ },
3114
+ outputs: {
3115
+ type: "object",
3116
+ properties: {
3117
+ success: { type: "boolean" },
3118
+ selectedType: { type: "string" }
3119
+ }
3120
+ },
3121
+ tags: ["filter", "type", "dependencies"],
3122
+ tool_call_template: {
3123
+ call_template_type: "panel_event",
3124
+ event_type: `${PANEL_ID}:select-type`
3125
+ }
3126
+ };
3127
+ const selectPackageTool = {
3128
+ name: "select_package",
3129
+ description: "Select a package to view its dependencies (for monorepos)",
3130
+ inputs: {
3131
+ type: "object",
3132
+ properties: {
3133
+ packagePath: {
3134
+ type: "string",
3135
+ description: "The path of the package to select"
3136
+ }
3137
+ },
3138
+ required: ["packagePath"]
3139
+ },
3140
+ outputs: {
3141
+ type: "object",
3142
+ properties: {
3143
+ success: { type: "boolean" },
3144
+ selectedPackage: { type: "string" }
3145
+ }
3146
+ },
3147
+ tags: ["select", "package", "monorepo"],
3148
+ tool_call_template: {
3149
+ call_template_type: "panel_event",
3150
+ event_type: `${PANEL_ID}:select-package`
3151
+ }
3152
+ };
3153
+ const dependenciesPanelTools = [
3154
+ filterDependenciesTool,
3155
+ selectDependencyTypeTool,
3156
+ selectPackageTool
3157
+ ];
3158
+ const dependenciesPanelToolsMetadata = {
3159
+ id: PANEL_ID,
3160
+ name: "Dependencies Panel",
3161
+ description: "Tools for viewing and exploring package dependencies",
3162
+ tools: dependenciesPanelTools
3163
+ };
2275
3164
  const panels = [
2276
3165
  {
2277
3166
  metadata: {
@@ -2314,6 +3203,25 @@ const panels = [
2314
3203
  onUnmount: async (_context) => {
2315
3204
  console.log("Workspace Repositories Panel unmounting");
2316
3205
  }
3206
+ },
3207
+ {
3208
+ metadata: {
3209
+ id: "principal-ade.dependencies-panel",
3210
+ name: "Dependencies",
3211
+ icon: "Package",
3212
+ version: "0.1.0",
3213
+ author: "Principal ADE",
3214
+ description: "View and explore package dependencies",
3215
+ slices: ["packages"],
3216
+ tools: dependenciesPanelTools
3217
+ },
3218
+ component: DependenciesPanel,
3219
+ onMount: async (_context) => {
3220
+ console.log("Dependencies Panel mounted");
3221
+ },
3222
+ onUnmount: async (_context) => {
3223
+ console.log("Dependencies Panel unmounting");
3224
+ }
2317
3225
  }
2318
3226
  ];
2319
3227
  const onPackageLoad = async () => {
@@ -2323,12 +3231,15 @@ const onPackageUnload = async () => {
2323
3231
  console.log("Alexandria Panels package unloading");
2324
3232
  };
2325
3233
  export {
3234
+ DependenciesPanel,
2326
3235
  LocalProjectCard,
2327
3236
  LocalProjectsPanel,
2328
3237
  LocalProjectsPanelPreview,
2329
3238
  RepositoryAvatar,
2330
3239
  WorkspaceRepositoriesPanel,
2331
- WorkspaceRepositoryCard,
3240
+ dependenciesPanelTools,
3241
+ dependenciesPanelToolsMetadata,
3242
+ filterDependenciesTool,
2332
3243
  filterProjectsTool,
2333
3244
  localProjectsPanelTools,
2334
3245
  localProjectsPanelToolsMetadata,
@@ -2338,6 +3249,8 @@ export {
2338
3249
  openRepositoryTool,
2339
3250
  panels,
2340
3251
  refreshWorkspaceTool,
3252
+ selectDependencyTypeTool,
3253
+ selectPackageTool,
2341
3254
  selectProjectTool,
2342
3255
  selectRepositoryTool,
2343
3256
  workspaceRepositoriesPanelTools,