@parhelia/core 0.1.12390 → 0.1.12397

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 (79) hide show
  1. package/dist/editor/Editor.js +32 -17
  2. package/dist/editor/Editor.js.map +1 -1
  3. package/dist/editor/PictureCropper.js +9 -4
  4. package/dist/editor/PictureCropper.js.map +1 -1
  5. package/dist/editor/PictureEditor.js +12 -13
  6. package/dist/editor/PictureEditor.js.map +1 -1
  7. package/dist/editor/SetupWizard.js +20 -2
  8. package/dist/editor/SetupWizard.js.map +1 -1
  9. package/dist/editor/ai/AgentTerminal.js +14 -3
  10. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  11. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +1 -1
  12. package/dist/editor/client/editContext.d.ts +4 -0
  13. package/dist/editor/client/editContext.js.map +1 -1
  14. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +283 -298
  15. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  16. package/dist/editor/pictureRawValue.d.ts +3 -0
  17. package/dist/editor/pictureRawValue.js +30 -0
  18. package/dist/editor/pictureRawValue.js.map +1 -0
  19. package/dist/editor/services/templateBuilderService.d.ts +7 -0
  20. package/dist/editor/services/templateBuilderService.js +7 -1
  21. package/dist/editor/services/templateBuilderService.js.map +1 -1
  22. package/dist/editor/settings/About.js +25 -19
  23. package/dist/editor/settings/About.js.map +1 -1
  24. package/dist/editor/settings/panels/AgentProfileEditorPanel.d.ts +14 -0
  25. package/dist/editor/settings/panels/AgentProfileEditorPanel.js +7 -0
  26. package/dist/editor/settings/panels/AgentProfileEditorPanel.js.map +1 -0
  27. package/dist/editor/settings/panels/AgentsPanel.js +2 -2
  28. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  29. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +146 -8
  30. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  31. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +2 -1
  32. package/dist/editor/setup-wizard/steps/CompleteStep.js +2 -1
  33. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  34. package/dist/editor/setup-wizard/steps/LicenseActivationStep.d.ts +9 -0
  35. package/dist/editor/setup-wizard/steps/LicenseActivationStep.js +160 -0
  36. package/dist/editor/setup-wizard/steps/LicenseActivationStep.js.map +1 -0
  37. package/dist/editor/setup-wizard/steps/LicenseEmailStep.d.ts +10 -0
  38. package/dist/editor/setup-wizard/steps/LicenseEmailStep.js +101 -0
  39. package/dist/editor/setup-wizard/steps/LicenseEmailStep.js.map +1 -0
  40. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +422 -65
  41. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
  42. package/dist/licensing/EmailEntry.js +1 -1
  43. package/dist/licensing/EmailEntry.js.map +1 -1
  44. package/dist/licensing/LicenseActivationForm.js +1 -1
  45. package/dist/licensing/LicenseActivationForm.js.map +1 -1
  46. package/dist/licensing/LicenseCodeEntry.js +2 -2
  47. package/dist/licensing/LicenseCodeEntry.js.map +1 -1
  48. package/dist/licensing/LicenseContext.js +18 -9
  49. package/dist/licensing/LicenseContext.js.map +1 -1
  50. package/dist/licensing/LicenseOverlay.js +2 -1
  51. package/dist/licensing/LicenseOverlay.js.map +1 -1
  52. package/dist/licensing/licenseService.d.ts +10 -0
  53. package/dist/licensing/licenseService.js +28 -0
  54. package/dist/licensing/licenseService.js.map +1 -1
  55. package/dist/revision.d.ts +2 -2
  56. package/dist/revision.js +2 -2
  57. package/dist/task-board/TaskBoardWorkspace.js +3 -2
  58. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  59. package/dist/task-board/components/ProjectDashboard.d.ts +4 -0
  60. package/dist/task-board/components/ProjectDashboard.js +1 -1
  61. package/dist/task-board/components/ProjectDashboard.js.map +1 -1
  62. package/dist/task-board/components/ProjectListContent.d.ts +1 -1
  63. package/dist/task-board/components/ProjectListContent.js +4 -1
  64. package/dist/task-board/components/ProjectListContent.js.map +1 -1
  65. package/dist/task-board/components/ProjectOverviewContent.d.ts +17 -0
  66. package/dist/task-board/components/ProjectOverviewContent.js +134 -0
  67. package/dist/task-board/components/ProjectOverviewContent.js.map +1 -0
  68. package/dist/task-board/components/ProjectSelector.d.ts +1 -1
  69. package/dist/task-board/components/ProjectSelector.js +1 -1
  70. package/dist/task-board/components/ProjectSelector.js.map +1 -1
  71. package/dist/task-board/components/TaskDetailPanel.js +59 -9
  72. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  73. package/dist/task-board/services/taskService.d.ts +4 -1
  74. package/dist/task-board/services/taskService.js +3 -0
  75. package/dist/task-board/services/taskService.js.map +1 -1
  76. package/dist/task-board/taskBoardNavStore.d.ts +3 -1
  77. package/dist/task-board/taskBoardNavStore.js.map +1 -1
  78. package/dist/task-board/types.d.ts +30 -0
  79. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectDashboard.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectDashboard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectDashboard.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectDashboard.tsx"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ interface ProjectListContentProps {
6
6
  showAllProjects: boolean;
7
7
  isProjectsLoading: boolean;
8
8
  projectOptions: TaskBoardProjectOption[];
9
- onSelectProject?: (projectId: string) => void;
9
+ onSelectProject?: (projectId: string | null) => void;
10
10
  onCreateProject?: () => void;
11
11
  onOpenProjectSettings?: (projectId: string) => void;
12
12
  onDeleteProject?: (projectId: string, title: string) => void;
@@ -27,7 +27,10 @@ export function ProjectListContent({ nav, onProjectSelected, className, maxHeigh
27
27
  status.includes(query));
28
28
  });
29
29
  }, [nav.projectOptions, projectSearch, hideArchivedProjects]);
30
- return (_jsxs("div", { className: cn("flex flex-col", className), children: [_jsxs("div", { className: "flex items-center justify-between border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold tracking-wider text-slate-500 uppercase", children: "Projects" }), nav.isProjectsLoading ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-slate-400", "data-testid": "taskboard-projects-loading-spinner" })) : null] }), _jsxs(Button, { variant: "default", size: "sm", className: "h-8 px-3", "data-testid": "taskboard-create-project-button", onClick: () => nav.onCreateProject?.(), children: [_jsx(FolderPlus, { className: "mr-1.5 h-3.5 w-3.5" }), "New project"] })] }), _jsx("div", { className: "border-b px-3 py-2", children: _jsxs("div", { className: "grid gap-2", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute top-1/2 left-2.5 h-3.5 w-3.5 -translate-y-1/2 text-slate-400" }), _jsx(Input, { value: projectSearch, onChange: (e) => setProjectSearch(e.target.value), placeholder: "Search projects...", className: "h-8 pl-8 text-xs", "data-testid": "taskboard-project-search-input" })] }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: hideArchivedProjects, onChange: (e) => setHideArchivedProjects(e.target.checked), "data-testid": "taskboard-hide-archived-checkbox" }), "Hide archived projects"] }), nav.isAdministrator ? (_jsxs("div", { className: "grid gap-1", children: [_jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: nav.showAllProjects, onChange: (e) => nav.onToggleShowAllProjects?.(e.target.checked), "data-testid": "taskboard-show-all-projects-checkbox" }), "Show all projects"] }), _jsx("p", { className: "pl-5 text-[10px] text-slate-500", "data-testid": "taskboard-show-all-projects-hint", children: "Admin feature: includes projects across all users." })] })) : null] }) }), _jsx("div", { className: cn("overflow-y-auto p-2", maxHeight === "none" && "min-h-0 flex-1"), style: maxHeight !== "none" ? { maxHeight } : undefined, children: nav.isProjectsLoading && nav.projectOptions.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center gap-2 rounded-md border border-dashed px-3 py-8 text-xs text-slate-400", "data-testid": "taskboard-projects-empty-loading", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Loading projects..."] })) : nav.projectOptions.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed px-3 py-8 text-center text-xs text-slate-400", children: "No projects yet" })) : filteredProjectOptions.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed px-3 py-8 text-center text-xs text-slate-400", children: "No matching projects" })) : (_jsx("div", { className: "flex flex-col gap-1", children: filteredProjectOptions.map((project) => {
30
+ return (_jsxs("div", { className: cn("flex flex-col", className), children: [_jsxs("div", { className: "flex items-center justify-between border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold tracking-wider text-slate-500 uppercase", children: "Projects" }), nav.isProjectsLoading ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-slate-400", "data-testid": "taskboard-projects-loading-spinner" })) : null] }), _jsxs("div", { className: "flex items-center gap-2", children: [nav.selectedProjectId ? (_jsxs(Button, { variant: "ghost", size: "sm", className: "h-8 px-2.5 text-slate-600", "data-testid": "taskboard-open-project-overview-button", onClick: () => {
31
+ nav.onSelectProject?.(null);
32
+ onProjectSelected?.();
33
+ }, children: [_jsx(LayoutGrid, { className: "mr-1.5 h-3.5 w-3.5" }), "Overview"] })) : null, _jsxs(Button, { variant: "default", size: "sm", className: "h-8 px-3", "data-testid": "taskboard-create-project-button", onClick: () => nav.onCreateProject?.(), children: [_jsx(FolderPlus, { className: "mr-1.5 h-3.5 w-3.5" }), "New project"] })] })] }), _jsx("div", { className: "border-b px-3 py-2", children: _jsxs("div", { className: "grid gap-2", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute top-1/2 left-2.5 h-3.5 w-3.5 -translate-y-1/2 text-slate-400" }), _jsx(Input, { value: projectSearch, onChange: (e) => setProjectSearch(e.target.value), placeholder: "Search projects...", className: "h-8 pl-8 text-xs", "data-testid": "taskboard-project-search-input" })] }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: hideArchivedProjects, onChange: (e) => setHideArchivedProjects(e.target.checked), "data-testid": "taskboard-hide-archived-checkbox" }), "Hide archived projects"] }), nav.isAdministrator ? (_jsxs("div", { className: "grid gap-1", children: [_jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: nav.showAllProjects, onChange: (e) => nav.onToggleShowAllProjects?.(e.target.checked), "data-testid": "taskboard-show-all-projects-checkbox" }), "Show all projects"] }), _jsx("p", { className: "pl-5 text-[10px] text-slate-500", "data-testid": "taskboard-show-all-projects-hint", children: "Admin feature: includes projects across all users." })] })) : null] }) }), _jsx("div", { className: cn("overflow-y-auto p-2", maxHeight === "none" && "min-h-0 flex-1"), style: maxHeight !== "none" ? { maxHeight } : undefined, children: nav.isProjectsLoading && nav.projectOptions.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center gap-2 rounded-md border border-dashed px-3 py-8 text-xs text-slate-400", "data-testid": "taskboard-projects-empty-loading", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Loading projects..."] })) : nav.projectOptions.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed px-3 py-8 text-center text-xs text-slate-400", children: "No projects yet" })) : filteredProjectOptions.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed px-3 py-8 text-center text-xs text-slate-400", children: "No matching projects" })) : (_jsx("div", { className: "flex flex-col gap-1", children: filteredProjectOptions.map((project) => {
31
34
  const isSelected = project.projectId === nav.selectedProjectId;
32
35
  const canManage = project.permission === "Owner";
33
36
  const isSubproject = (project.depth ?? 0) > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectListContent.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectListContent.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectListContent.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectListContent.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TaskBoardProjectOption } from "../taskBoardNavStore";
2
+ interface ProjectOverviewContentProps {
3
+ nav: {
4
+ selectedProjectId: string | null;
5
+ isAdministrator: boolean;
6
+ showAllProjects: boolean;
7
+ isProjectsLoading: boolean;
8
+ projectOptions: TaskBoardProjectOption[];
9
+ onSelectProject?: (projectId: string) => void;
10
+ onCreateProject?: () => void;
11
+ onOpenProjectSettings?: (projectId: string) => void;
12
+ onDeleteProject?: (projectId: string, title: string) => void;
13
+ onToggleShowAllProjects?: (enabled: boolean) => void;
14
+ };
15
+ }
16
+ export declare function ProjectOverviewContent({ nav }: ProjectOverviewContentProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
@@ -0,0 +1,134 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { AlertTriangle, Clock, FolderPlus, LayoutGrid, Loader2, Search, Settings, Shield, Trash2, } from "lucide-react";
4
+ import { formatDistanceToNow } from "date-fns";
5
+ import { Button } from "../../components/ui/button";
6
+ import { Input } from "../../components/ui/input";
7
+ import { Tooltip, TooltipContent, TooltipTrigger, } from "../../components/ui/tooltip";
8
+ import { cn } from "../../lib/utils";
9
+ import { TaskStateProgressBar } from "./ProjectDashboard";
10
+ function formatAttentionSummaryLine(project) {
11
+ const attention = project.overview?.attention;
12
+ if (!attention || attention.total <= 0)
13
+ return "No attention needed";
14
+ const cap = attention.capacity ?? 0;
15
+ const parts = [];
16
+ if (attention.failed > 0)
17
+ parts.push(`${attention.failed} failed`);
18
+ if (attention.budget > 0)
19
+ parts.push(`${attention.budget} budget`);
20
+ if (attention.blocked > 0)
21
+ parts.push(`${attention.blocked} blocked`);
22
+ if (cap > 0)
23
+ parts.push(`${cap} capacity`);
24
+ if (attention.approval > 0) {
25
+ parts.push(`${attention.approval} ${attention.approval === 1 ? "approval" : "approvals"}`);
26
+ }
27
+ if (attention.input > 0) {
28
+ parts.push(`${attention.input} ${attention.input === 1 ? "input" : "inputs"}`);
29
+ }
30
+ if (parts.length > 0)
31
+ return parts.join(", ");
32
+ return `${attention.total} need attention`;
33
+ }
34
+ function buildAttentionTooltipText(project) {
35
+ const attention = project.overview?.attention;
36
+ if (!attention || attention.total <= 0) {
37
+ return "No tasks in this project currently need execution attention.";
38
+ }
39
+ const cap = attention.capacity ?? 0;
40
+ const lines = [
41
+ "Tasks counted here are waiting on execution: errors, limits, dependencies, approvals, input, or agent capacity.",
42
+ ];
43
+ if (attention.failed > 0) {
44
+ lines.push(`Failed (${attention.failed}): agent or tool reported an error.`);
45
+ }
46
+ if (attention.budget > 0) {
47
+ lines.push(`Budget (${attention.budget}): project cost limit reached.`);
48
+ }
49
+ if (attention.blocked > 0) {
50
+ lines.push(`Blocked (${attention.blocked}): unfinished task dependencies.`);
51
+ }
52
+ if (cap > 0) {
53
+ lines.push(`Capacity (${cap}): waiting for a free agent slot on this project.`);
54
+ }
55
+ if (attention.approval > 0) {
56
+ lines.push(`Approval (${attention.approval}): review or tool approval required.`);
57
+ }
58
+ if (attention.input > 0) {
59
+ lines.push(`Input (${attention.input}): user or agent input required.`);
60
+ }
61
+ if (lines.length === 1) {
62
+ return `${lines[0]}\n\nTotal attention count may include categories not listed if data is from an older API.`;
63
+ }
64
+ return lines.join("\n\n");
65
+ }
66
+ function getAttentionClasses(project) {
67
+ const attention = project.overview?.attention;
68
+ if (!attention || attention.total <= 0) {
69
+ return "border-slate-200 bg-slate-50 text-slate-500";
70
+ }
71
+ if (attention.failed > 0 || attention.budget > 0) {
72
+ return "border-red-200 bg-red-50 text-red-700";
73
+ }
74
+ return "border-amber-200 bg-amber-50 text-amber-700";
75
+ }
76
+ export function ProjectOverviewContent({ nav }) {
77
+ const [projectSearch, setProjectSearch] = useState("");
78
+ const [hideArchivedProjects, setHideArchivedProjects] = useState(true);
79
+ const filteredProjectOptions = useMemo(() => {
80
+ const query = projectSearch.trim().toLowerCase();
81
+ return nav.projectOptions.filter((project) => {
82
+ if (hideArchivedProjects &&
83
+ project.status?.toLowerCase() === "archived") {
84
+ return false;
85
+ }
86
+ if (!query)
87
+ return true;
88
+ const title = project.title?.toLowerCase() ?? "";
89
+ const description = project.description?.toLowerCase() ?? "";
90
+ const permission = project.permission?.toLowerCase() ?? "";
91
+ const status = project.status?.toLowerCase() ?? "";
92
+ const attentionLabel = formatAttentionSummaryLine(project).toLowerCase();
93
+ return (title.includes(query) ||
94
+ description.includes(query) ||
95
+ permission.includes(query) ||
96
+ status.includes(query) ||
97
+ attentionLabel.includes(query));
98
+ });
99
+ }, [hideArchivedProjects, nav.projectOptions, projectSearch]);
100
+ return (_jsxs("div", { className: "flex min-h-full w-full flex-col rounded-2xl border bg-white shadow-sm", "data-testid": "taskboard-project-overview", children: [_jsxs("div", { className: "flex flex-col gap-3 border-b px-4 py-4 md:flex-row md:items-start md:justify-between", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "text-xs font-semibold tracking-wider text-slate-500 uppercase", children: "Taskboard" }), _jsx("h2", { className: "text-xl font-semibold text-slate-900", children: "Project Overview" }), _jsx("p", { className: "max-w-2xl text-sm text-slate-500", children: "Pick a project to open the board. Progress and attention are shown here so you can see what needs help first." })] }), _jsxs(Button, { variant: "default", size: "sm", className: "h-9 px-3", "data-testid": "taskboard-project-overview-create-button", onClick: () => nav.onCreateProject?.(), children: [_jsx(FolderPlus, { className: "mr-1.5 h-3.5 w-3.5" }), "New project"] })] }), _jsx("div", { className: "border-b px-4 py-3", children: _jsxs("div", { className: "grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_auto] lg:items-center", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute top-1/2 left-2.5 h-3.5 w-3.5 -translate-y-1/2 text-slate-400" }), _jsx(Input, { value: projectSearch, onChange: (e) => setProjectSearch(e.target.value), placeholder: "Search projects...", className: "h-9 pl-8 text-sm", "data-testid": "taskboard-project-overview-search-input" })] }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: hideArchivedProjects, onChange: (e) => setHideArchivedProjects(e.target.checked), "data-testid": "taskboard-project-overview-hide-archived" }), "Hide archived projects"] }), nav.isAdministrator ? (_jsxs("label", { className: "flex items-center gap-2 text-xs text-slate-600", children: [_jsx("input", { type: "checkbox", checked: nav.showAllProjects, onChange: (e) => nav.onToggleShowAllProjects?.(e.target.checked), "data-testid": "taskboard-project-overview-show-all-projects" }), "Show all projects"] })) : null] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: nav.isProjectsLoading && nav.projectOptions.length === 0 ? (_jsxs("div", { className: "flex min-h-[240px] items-center justify-center gap-2 rounded-xl border border-dashed text-sm text-slate-400", "data-testid": "taskboard-project-overview-loading", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), "Loading projects..."] })) : nav.projectOptions.length === 0 ? (_jsx("div", { className: "rounded-xl border border-dashed px-4 py-12 text-center text-sm text-slate-400", children: "No projects yet" })) : filteredProjectOptions.length === 0 ? (_jsx("div", { className: "rounded-xl border border-dashed px-4 py-12 text-center text-sm text-slate-400", children: "No matching projects" })) : (_jsx("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-3", children: filteredProjectOptions.map((project) => {
101
+ const counts = project.overview?.taskCounts ?? {
102
+ total: 0,
103
+ todo: 0,
104
+ waiting: 0,
105
+ inProgress: 0,
106
+ review: 0,
107
+ done: 0,
108
+ };
109
+ const attentionTotal = project.overview?.attention?.total ?? 0;
110
+ const attentionLine = formatAttentionSummaryLine(project);
111
+ const attentionTooltip = buildAttentionTooltipText(project);
112
+ const completionLabel = counts.total > 0
113
+ ? `${counts.done}/${counts.total} done`
114
+ : "No tasks yet";
115
+ const canManage = project.permission === "Owner";
116
+ const isSelected = project.projectId === nav.selectedProjectId;
117
+ const depth = Math.max(0, Math.min(project.depth ?? 0, 6));
118
+ const subprojectCount = project.overview?.directSubprojectCount ?? 0;
119
+ return (_jsxs("div", { className: cn("group flex flex-col rounded-xl border bg-white transition-colors", isSelected
120
+ ? "border-slate-300 shadow-sm"
121
+ : "border-slate-200 hover:border-slate-300"), "data-testid": `taskboard-project-overview-card-${project.projectId}`, children: [_jsxs("div", { className: "flex items-start justify-between gap-2 px-4 pt-4", children: [_jsxs("button", { type: "button", className: "min-w-0 flex-1 text-left", onClick: () => nav.onSelectProject?.(project.projectId), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LayoutGrid, { className: "h-4 w-4 flex-none text-slate-400" }), depth > 0 ? (_jsx("span", { className: "text-[10px] text-slate-400", children: "↳".repeat(Math.min(depth, 2)) })) : null, _jsx("span", { className: "truncate text-base font-semibold text-slate-900", children: project.title })] }), project.description?.trim() ? (_jsx("p", { className: "mt-2 line-clamp-3 text-xs text-slate-500", children: project.description.trim() })) : (_jsx("p", { className: "mt-2 text-xs text-slate-400", children: "No description" }))] }), canManage ? (_jsxs("div", { className: "flex items-center gap-1 opacity-100 transition-opacity md:opacity-0 md:group-hover:opacity-100", children: [_jsx(Button, { variant: "ghost", size: "icon", className: "h-8 w-8", onClick: (e) => {
122
+ e.stopPropagation();
123
+ nav.onOpenProjectSettings?.(project.projectId);
124
+ }, title: "Project settings", "data-testid": `taskboard-project-overview-settings-${project.projectId}`, children: _jsx(Settings, { className: "h-3.5 w-3.5" }) }), _jsx(Button, { variant: "ghost", size: "icon", className: "text-destructive hover:bg-destructive/10 hover:text-destructive h-8 w-8", onClick: (e) => {
125
+ e.stopPropagation();
126
+ nav.onDeleteProject?.(project.projectId, project.title);
127
+ }, title: "Delete project", "data-testid": `taskboard-project-overview-delete-${project.projectId}`, children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })] })) : null] }), _jsxs("button", { type: "button", className: "flex flex-1 flex-col px-4 pb-4 text-left", onClick: () => nav.onSelectProject?.(project.projectId), children: [_jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "rounded-full border border-slate-200 bg-slate-50 px-2.5 py-1 text-[11px] font-medium text-slate-600", children: project.status ?? "Active" }), _jsxs(Tooltip, { delayDuration: 250, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: cn("inline-flex cursor-default rounded-full border px-2.5 py-1 text-[11px] font-medium", getAttentionClasses(project)), "data-testid": `taskboard-project-overview-attention-${project.projectId}`, children: _jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), attentionTotal > 0
128
+ ? attentionLine
129
+ : "No attention needed"] }) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, className: "max-w-xs whitespace-pre-line text-left", children: attentionTooltip })] })] }), _jsxs("div", { className: "mt-auto pt-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 text-xs text-slate-500", children: [_jsx("span", { children: "Progress" }), _jsx("span", { children: completionLabel })] }), _jsx(TaskStateProgressBar, { counts: counts }), _jsxs("div", { className: "flex flex-wrap gap-2 text-[11px] text-slate-500", children: [_jsxs("span", { children: [counts.todo, " todo"] }), _jsxs("span", { children: [counts.inProgress, " in progress"] }), _jsxs("span", { children: [counts.review, " review"] }), _jsxs("span", { children: [counts.waiting, " waiting"] })] })] }), _jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-3 border-t pt-3 text-[11px] text-slate-500", children: [_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(Shield, { className: "h-3 w-3 text-slate-400" }), project.permission] }), subprojectCount > 0 ? (_jsxs("span", { children: [subprojectCount, " subproject", subprojectCount === 1 ? "" : "s"] })) : null, project.updatedAt ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", title: `Last updated: ${new Date(project.updatedAt).toLocaleString()}`, children: [_jsx(Clock, { className: "h-3 w-3 text-slate-400" }), formatDistanceToNow(new Date(project.updatedAt), {
130
+ addSuffix: true,
131
+ })] })) : null] })] })] })] }, project.projectId));
132
+ }) })) })] }));
133
+ }
134
+ //# sourceMappingURL=ProjectOverviewContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectOverviewContent.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectOverviewContent.tsx"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ interface ProjectSelectorProps {
9
9
  showAllProjects: boolean;
10
10
  isProjectsLoading: boolean;
11
11
  projectOptions: TaskBoardProjectOption[];
12
- onSelectProject?: (projectId: string) => void;
12
+ onSelectProject?: (projectId: string | null) => void;
13
13
  onCreateProject?: () => void;
14
14
  onOpenProjectSettings?: (projectId: string) => void;
15
15
  onDeleteProject?: (projectId: string, title: string) => void;
@@ -5,6 +5,6 @@ import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/po
5
5
  import { ProjectListContent } from "./ProjectListContent";
6
6
  export function ProjectSelector({ nav }) {
7
7
  const [projectPopoverOpen, setProjectPopoverOpen] = useState(false);
8
- return (_jsxs(Popover, { open: projectPopoverOpen, onOpenChange: setProjectPopoverOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "data-testid": "taskboard-project-selector-trigger", className: "group flex min-w-0 items-center gap-2 rounded-md px-2 py-1 text-left hover:bg-slate-100/70", title: "Select project", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: nav.projectTitle }), _jsxs("div", { className: "mt-0.5 flex items-center gap-2", children: [nav.selectedProjectId && (_jsx("div", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-green-500" })), _jsx("span", { className: "truncate text-[11px] text-slate-500", children: nav.projectSubtitle }), nav.selectedProjectId && (_jsx("span", { className: "shrink-0 truncate text-[10px] font-semibold tracking-wider text-slate-400 uppercase", children: nav.permissionLabel }))] })] }), _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-slate-500 group-hover:text-slate-700" })] }) }), _jsx(PopoverContent, { align: "start", sideOffset: 8, className: "w-dvw max-w-[420px] p-0", "data-testid": "taskboard-project-popover", children: _jsx(ProjectListContent, { nav: nav, onProjectSelected: () => setProjectPopoverOpen(false) }) })] }));
8
+ return (_jsxs(Popover, { open: projectPopoverOpen, onOpenChange: setProjectPopoverOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "data-testid": "taskboard-project-selector-trigger", className: "group flex min-w-0 items-center gap-2 rounded-md px-2 py-1 text-left hover:bg-slate-100/70", title: "Select project", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: nav.projectTitle }), _jsxs("div", { className: "mt-0.5 flex items-center gap-2", children: [nav.selectedProjectId && (_jsx("div", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-green-500" })), _jsx("span", { className: "truncate text-[11px] text-slate-500", children: nav.projectSubtitle }), nav.selectedProjectId && (_jsx("span", { className: "shrink-0 truncate text-[10px] font-semibold tracking-wider text-slate-400 uppercase", children: nav.permissionLabel }))] })] }), _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-slate-500 group-hover:text-slate-700" })] }) }), _jsx(PopoverContent, { align: "start", sideOffset: 8, className: "w-[calc(100vw-2rem)] max-w-[560px] p-0", "data-testid": "taskboard-project-popover", children: _jsx(ProjectListContent, { nav: nav, onProjectSelected: () => setProjectPopoverOpen(false) }) })] }));
9
9
  }
10
10
  //# sourceMappingURL=ProjectSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectSelector.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EACL,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAoB1D,MAAM,UAAU,eAAe,CAAC,EAAE,GAAG,EAAwB;IAC3D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,qBAAqB,aACpE,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,iBACD,oCAAoC,EAChD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAC,gBAAgB,aAEtB,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,+CAA+C,YAC3D,GAAG,CAAC,YAAY,GACb,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC5C,GAAG,CAAC,iBAAiB,IAAI,CACxB,cAAK,SAAS,EAAC,gDAAgD,GAAG,CACnE,EACD,eAAM,SAAS,EAAC,qCAAqC,YAClD,GAAG,CAAC,eAAe,GACf,EACN,GAAG,CAAC,iBAAiB,IAAI,CACxB,eAAM,SAAS,EAAC,qFAAqF,YAClG,GAAG,CAAC,eAAe,GACf,CACR,IACG,IACF,EACN,KAAC,WAAW,IAAC,SAAS,EAAC,4DAA4D,GAAG,IAC/E,GACM,EACjB,KAAC,cAAc,IACb,KAAK,EAAC,OAAO,EACb,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,yBAAyB,iBACvB,2BAA2B,YAEvC,KAAC,kBAAkB,IACjB,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,GACrD,GACa,IACT,CACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ProjectSelector.js","sourceRoot":"","sources":["../../../src/task-board/components/ProjectSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EACL,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAoB1D,MAAM,UAAU,eAAe,CAAC,EAAE,GAAG,EAAwB;IAC3D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,qBAAqB,aACpE,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,iBACD,oCAAoC,EAChD,SAAS,EAAC,4FAA4F,EACtG,KAAK,EAAC,gBAAgB,aAEtB,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,+CAA+C,YAC3D,GAAG,CAAC,YAAY,GACb,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC5C,GAAG,CAAC,iBAAiB,IAAI,CACxB,cAAK,SAAS,EAAC,gDAAgD,GAAG,CACnE,EACD,eAAM,SAAS,EAAC,qCAAqC,YAClD,GAAG,CAAC,eAAe,GACf,EACN,GAAG,CAAC,iBAAiB,IAAI,CACxB,eAAM,SAAS,EAAC,qFAAqF,YAClG,GAAG,CAAC,eAAe,GACf,CACR,IACG,IACF,EACN,KAAC,WAAW,IAAC,SAAS,EAAC,4DAA4D,GAAG,IAC/E,GACM,EACjB,KAAC,cAAc,IACb,KAAK,EAAC,OAAO,EACb,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,wCAAwC,iBACtC,2BAA2B,YAEvC,KAAC,kBAAkB,IACjB,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,GACrD,GACa,IACT,CACX,CAAC;AACJ,CAAC"}
@@ -8,7 +8,7 @@ import { Textarea } from "../../components/ui/textarea";
8
8
  import { Select } from "../../components/ui/select";
9
9
  import { Plus, Link as LinkIcon, Trash2, X, Loader2, MessageSquare, CheckCircle2, } from "lucide-react";
10
10
  import { useEditContext } from "../../editor/client/editContext";
11
- import { addComment, updateTask, deleteTask } from "../services/taskService";
11
+ import { addComment, updateTask, deleteTask, removeDependency, } from "../services/taskService";
12
12
  import { CommentsList } from "./CommentsList";
13
13
  import { TaskCard } from "./TaskCard";
14
14
  import { CreateTaskDialog } from "./CreateTaskDialog";
@@ -34,12 +34,24 @@ const priorities = [
34
34
  { value: "High", label: "High" },
35
35
  { value: "Critical", label: "Critical" },
36
36
  ];
37
+ function RelationshipRow(props) {
38
+ const { entry, compact, canEdit, isRemoving, dependencyTaskIds, onSelectTask, onRemove, } = props;
39
+ const removeButton = canEdit ? (_jsx(Button, { variant: "ghost", size: "icon", className: "h-7 w-7 shrink-0 text-slate-400 hover:bg-red-50 hover:text-red-600", onClick: (event) => {
40
+ event.stopPropagation();
41
+ void onRemove(entry.dependency);
42
+ }, disabled: isRemoving, title: "Remove relationship", "data-testid": `taskboard-task-detail-remove-dependency-${entry.dependency.dependencyId}`, children: isRemoving ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Trash2, { className: "h-3.5 w-3.5" })) })) : null;
43
+ if (compact) {
44
+ return (_jsxs("div", { className: "group flex items-center gap-2 rounded-md border border-slate-200 bg-white pr-2 transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsxs("button", { type: "button", onClick: () => onSelectTask(entry.task.taskId), className: "flex min-w-0 flex-1 items-center gap-2 px-3 py-2 text-left", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: entry.task.taskKey || entry.task.taskId.slice(0, 4) }), _jsx("span", { className: "truncate text-xs font-medium text-slate-700", children: entry.task.title }), entry.task.status === "Done" && (_jsx(CheckCircle2, { className: "ml-auto h-3.5 w-3.5 shrink-0 text-emerald-600" }))] }), removeButton] }));
45
+ }
46
+ return (_jsxs("div", { className: "relative", children: [_jsx(TaskCard, { task: entry.task, selected: false, onClick: () => onSelectTask(entry.task.taskId), dependencyTaskIds: dependencyTaskIds, showDoneCheckmark: true }), canEdit ? (_jsx("div", { className: "absolute top-2 right-2 z-10", children: removeButton })) : null] }));
47
+ }
37
48
  export function TaskDetailPanel(props) {
38
49
  const { project, task, allTasks, dependencies, onTaskChanged, onSelectTask, onClose, variant = "panel", } = props;
39
50
  const [commentText, setCommentText] = useState("");
40
51
  const [commentRefreshKey, setCommentRefreshKey] = useState(0);
41
52
  const [isCreateSubtaskOpen, setIsCreateSubtaskOpen] = useState(false);
42
53
  const [isAddDependencyOpen, setIsAddDependencyOpen] = useState(false);
54
+ const [removingDependencyId, setRemovingDependencyId] = useState(null);
43
55
  const [localDescription, setLocalDescription] = useState(task?.description ?? "");
44
56
  const [localResultData, setLocalResultData] = useState(task?.resultData ?? "");
45
57
  const editContext = useEditContext();
@@ -124,16 +136,22 @@ export function TaskDetailPanel(props) {
124
136
  return [];
125
137
  const blockingDeps = dependencies.filter((d) => d.taskId === task.taskId && d.dependencyType === "BlockedBy");
126
138
  return blockingDeps
127
- .map((dep) => allTasks.find((t) => t.taskId === dep.dependsOnTaskId))
128
- .filter((t) => t !== undefined);
139
+ .map((dep) => {
140
+ const linkedTask = allTasks.find((t) => t.taskId === dep.dependsOnTaskId);
141
+ return linkedTask ? { dependency: dep, task: linkedTask } : null;
142
+ })
143
+ .filter((entry) => entry !== null);
129
144
  }, [task, dependencies, allTasks]);
130
145
  const relatedTasks = useMemo(() => {
131
146
  if (!task)
132
147
  return [];
133
148
  const relatedDeps = dependencies.filter((d) => d.taskId === task.taskId && d.dependencyType === "RelatedTo");
134
149
  return relatedDeps
135
- .map((dep) => allTasks.find((t) => t.taskId === dep.dependsOnTaskId))
136
- .filter((t) => t !== undefined);
150
+ .map((dep) => {
151
+ const linkedTask = allTasks.find((t) => t.taskId === dep.dependsOnTaskId);
152
+ return linkedTask ? { dependency: dep, task: linkedTask } : null;
153
+ })
154
+ .filter((entry) => entry !== null);
137
155
  }, [task, dependencies, allTasks]);
138
156
  const blockingTasks = useMemo(() => {
139
157
  if (!task)
@@ -141,8 +159,11 @@ export function TaskDetailPanel(props) {
141
159
  // Tasks that are blocked by this task
142
160
  const blockingDeps = dependencies.filter((d) => d.dependsOnTaskId === task.taskId && d.dependencyType === "BlockedBy");
143
161
  return blockingDeps
144
- .map((dep) => allTasks.find((t) => t.taskId === dep.taskId))
145
- .filter((t) => t !== undefined);
162
+ .map((dep) => {
163
+ const linkedTask = allTasks.find((t) => t.taskId === dep.taskId);
164
+ return linkedTask ? { dependency: dep, task: linkedTask } : null;
165
+ })
166
+ .filter((entry) => entry !== null);
146
167
  }, [task, dependencies, allTasks]);
147
168
  const setStatus = async (status) => {
148
169
  if (!task)
@@ -242,6 +263,29 @@ export function TaskDetailPanel(props) {
242
263
  toast.success("Comment added");
243
264
  await onTaskChanged();
244
265
  };
266
+ const removeRelationship = useCallback(async (dependency) => {
267
+ setRemovingDependencyId(dependency.dependencyId);
268
+ try {
269
+ const result = await removeDependency({
270
+ dependencyId: dependency.dependencyId,
271
+ });
272
+ if (result.type !== "success") {
273
+ toast.error(result.summary || "Failed to remove relationship");
274
+ return;
275
+ }
276
+ const response = result.data;
277
+ const removedCount = response?.removedCount ?? response?.RemovedCount ?? 1;
278
+ if (removedCount <= 0) {
279
+ toast.error("Relationship not found");
280
+ return;
281
+ }
282
+ toast.success("Relationship removed");
283
+ await onTaskChanged();
284
+ }
285
+ finally {
286
+ setRemovingDependencyId((current) => current === dependency.dependencyId ? null : current);
287
+ }
288
+ }, [onTaskChanged]);
245
289
  const parentOptions = useMemo(() => {
246
290
  if (!task)
247
291
  return [];
@@ -335,9 +379,15 @@ export function TaskDetailPanel(props) {
335
379
  }, [task]);
336
380
  return (_jsxs("div", { "data-testid": "taskboard-task-detail-panel", className: `flex h-full flex-col bg-slate-50/50 ${variant === "panel" ? "border-t" : ""}`, children: [_jsx("div", { className: "flex flex-col border-b bg-white p-4 shadow-sm", children: _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [task && (_jsx(Badge, { variant: "outline", className: "h-5 shrink-0 border-slate-200 bg-slate-50 px-1.5 text-[10px] font-bold tracking-tight text-slate-500 uppercase", children: displayTaskId })), _jsx("h2", { className: "truncate text-base leading-none font-bold tracking-tight text-slate-900", "data-testid": "taskboard-task-detail-title", children: title })] }), task ? (_jsxs("div", { className: "flex flex-wrap items-center gap-2 pt-1", children: [_jsx(Select, { "data-testid": "taskboard-task-detail-status-select", value: task.status, onValueChange: (v) => setStatus(v), disabled: !canEdit, options: statuses, className: "h-7 w-[130px] text-xs font-medium" }), _jsx(Select, { "data-testid": "taskboard-task-detail-priority-select", value: task.priority ?? "none", onValueChange: (v) => setPriority(v), disabled: !canEdit, options: priorities, className: "h-7 w-[140px] text-xs font-medium" }), !isPlanTask && project && (_jsx(TaskAssigneePicker, { projectId: project.project.projectId, assigneeType: task.assigneeType ?? null, value: task.assigneeId ?? null, displayValue: task.assigneeDisplayName ?? task.assigneeId ?? null, disabled: !canEdit, onChange: upsertAssignee, placeholder: "Assign user or agent", buttonTestId: "taskboard-task-detail-assignee-select" })), executionDisplay && (_jsxs(Badge, { variant: executionDisplay.variant, className: `h-5 gap-1 text-[10px] font-bold tracking-wider uppercase ${executionDisplay.className || ""}`, children: [executionDisplay.showSpinner && (_jsx(Loader2, { className: "h-2.5 w-2.5 animate-spin" })), executionDisplay.label] }))] })) : (_jsx("div", { className: "text-muted-foreground truncate text-sm italic", children: "No task selected" })), task ? (_jsx(TaskReviewActions, { task: task, agentId: getLinkedAgentId(task), canEdit: canEdit, onTaskChanged: onTaskChanged, className: "flex flex-wrap items-center gap-2 pt-2" })) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [task && canEdit && (_jsx(Button, { variant: "ghost", size: "icon", onClick: handleDelete, className: "hover:text-destructive hover:bg-destructive/5 h-8 w-8 text-slate-400", title: "Delete task", "data-testid": "taskboard-task-detail-delete-button", children: _jsx(Trash2, { className: "h-4 w-4" }) })), _jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, className: "h-8 w-8 text-slate-400 hover:bg-slate-100 hover:text-slate-600", title: "Close", "data-testid": "taskboard-task-detail-close-button", children: _jsx(X, { className: "h-4 w-4" }) })] })] }) }), _jsx("div", { className: compactPanel
337
381
  ? "min-h-0 flex-1 overflow-auto bg-slate-50/30 p-4"
338
- : "min-h-0 flex-1 overflow-auto bg-slate-50/30 p-6", children: !task ? (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm italic", children: "Select a task to view details." })) : (_jsxs("div", { className: compactPanel ? "grid gap-6" : "grid gap-8", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Description" }), _jsx(Textarea, { "data-testid": "taskboard-task-detail-description", value: localDescription, onChange: (e) => setLocalDescription(e.target.value), onBlur: () => void saveDescription(), rows: compactPanel ? 2 : 3, placeholder: "Add a description\u2026", disabled: !canEdit, className: "resize-none bg-white text-[13px] leading-relaxed shadow-sm focus-visible:ring-1" })] }), isPlanTask && (_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Plan" }), _jsx(Textarea, { "data-testid": "taskboard-task-detail-plan", value: localResultData, onChange: (e) => setLocalResultData(e.target.value), onBlur: () => void saveResultData(), rows: compactPanel ? 6 : 10, placeholder: "Write the plan\u2026", disabled: !canEdit, className: "min-h-[200px] bg-white font-mono text-[12px] leading-relaxed shadow-sm focus-visible:ring-1" }), _jsxs("div", { className: "rounded border border-blue-100 bg-blue-50/50 px-2 py-1.5 text-[11px] text-slate-500", "data-testid": "taskboard-task-plan-approval-hint", children: [_jsx("span", { className: "font-semibold text-blue-700", children: "Approval:" }), " ", "Move this plan task to", " ", _jsx("span", { className: "font-bold text-blue-800", children: "Done" }), " to approve."] })] })), compactPanel && (_jsxs("div", { className: "grid gap-6 border-t border-slate-200/60 pt-6", children: [_jsxs("div", { className: "grid gap-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Subtasks ", childTasks.length > 0 && `(${childTasks.length})`, canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsCreateSubtaskOpen(true), title: "Add subtask", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), childTasks.length > 0 ? (_jsx("div", { className: "grid gap-1.5", children: childTasks.map((child) => (_jsxs("button", { type: "button", onClick: () => onSelectTask(child.taskId), className: "group flex items-center gap-2 truncate rounded-md border border-slate-200 bg-white px-3 py-2 text-left text-xs transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: child.taskKey || child.taskId.slice(0, 4) }), _jsx("span", { className: "truncate font-medium text-slate-700", children: child.title })] }, child.taskId))) })) : (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No subtasks." }))] }), _jsxs("div", { className: "grid gap-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Dependencies", canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsAddDependencyOpen(true), title: "Add relationship", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), blockedByTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocked By" }), _jsx("div", { className: "grid gap-1.5", children: blockedByTasks.map((blocking) => (_jsxs("button", { type: "button", onClick: () => onSelectTask(blocking.taskId), className: "group flex items-center gap-2 truncate rounded-md border border-slate-200 bg-white px-3 py-2 text-left text-xs transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: blocking.taskKey || blocking.taskId.slice(0, 4) }), _jsx("span", { className: "truncate font-medium text-slate-700", children: blocking.title }), blocking.status === "Done" && (_jsx(CheckCircle2, { className: "ml-auto h-3.5 w-3.5 shrink-0 text-emerald-600" }))] }, blocking.taskId))) })] })), blockingTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocks" }), _jsx("div", { className: "grid gap-1.5", children: blockingTasks.map((blocked) => (_jsxs("button", { type: "button", onClick: () => onSelectTask(blocked.taskId), className: "group flex items-center gap-2 truncate rounded-md border border-slate-200 bg-white px-3 py-2 text-left text-xs transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: blocked.taskKey || blocked.taskId.slice(0, 4) }), _jsx("span", { className: "truncate font-medium text-slate-700", children: blocked.title }), blocked.status === "Done" && (_jsx(CheckCircle2, { className: "ml-auto h-3.5 w-3.5 shrink-0 text-emerald-600" }))] }, blocked.taskId))) })] })), relatedTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Related To" }), _jsx("div", { className: "grid gap-1.5", children: relatedTasks.map((related) => (_jsxs("button", { type: "button", onClick: () => onSelectTask(related.taskId), className: "group flex items-center gap-2 truncate rounded-md border border-slate-200 bg-white px-3 py-2 text-left text-xs transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: related.taskKey || related.taskId.slice(0, 4) }), _jsx("span", { className: "truncate font-medium text-slate-700", children: related.title }), related.status === "Done" && (_jsx(CheckCircle2, { className: "ml-auto h-3.5 w-3.5 shrink-0 text-emerald-600" }))] }, related.taskId))) })] })), blockedByTasks.length === 0 &&
382
+ : "min-h-0 flex-1 overflow-auto bg-slate-50/30 p-6", children: !task ? (_jsx("div", { className: "text-muted-foreground flex h-full items-center justify-center text-sm italic", children: "Select a task to view details." })) : (_jsxs("div", { className: compactPanel ? "grid gap-6" : "grid gap-8", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Description" }), _jsx(Textarea, { "data-testid": "taskboard-task-detail-description", value: localDescription, onChange: (e) => setLocalDescription(e.target.value), onBlur: () => void saveDescription(), rows: compactPanel ? 2 : 3, placeholder: "Add a description\u2026", disabled: !canEdit, className: "resize-none bg-white text-[13px] leading-relaxed shadow-sm focus-visible:ring-1" })] }), isPlanTask && (_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Plan" }), _jsx(Textarea, { "data-testid": "taskboard-task-detail-plan", value: localResultData, onChange: (e) => setLocalResultData(e.target.value), onBlur: () => void saveResultData(), rows: compactPanel ? 6 : 10, placeholder: "Write the plan\u2026", disabled: !canEdit, className: "min-h-[200px] bg-white font-mono text-[12px] leading-relaxed shadow-sm focus-visible:ring-1" }), _jsxs("div", { className: "rounded border border-blue-100 bg-blue-50/50 px-2 py-1.5 text-[11px] text-slate-500", "data-testid": "taskboard-task-plan-approval-hint", children: [_jsx("span", { className: "font-semibold text-blue-700", children: "Approval:" }), " ", "Move this plan task to", " ", _jsx("span", { className: "font-bold text-blue-800", children: "Done" }), " to approve."] })] })), compactPanel && (_jsxs("div", { className: "grid gap-6 border-t border-slate-200/60 pt-6", children: [_jsxs("div", { className: "grid gap-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Subtasks ", childTasks.length > 0 && `(${childTasks.length})`, canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsCreateSubtaskOpen(true), title: "Add subtask", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), childTasks.length > 0 ? (_jsx("div", { className: "grid gap-1.5", children: childTasks.map((child) => (_jsxs("button", { type: "button", onClick: () => onSelectTask(child.taskId), className: "group flex items-center gap-2 truncate rounded-md border border-slate-200 bg-white px-3 py-2 text-left text-xs transition-colors hover:border-slate-300 hover:bg-slate-50", children: [_jsx(Badge, { variant: "outline", className: "h-4 border-slate-200 bg-slate-50 px-1 text-[8px] font-bold text-slate-400 group-hover:border-slate-300", children: child.taskKey || child.taskId.slice(0, 4) }), _jsx("span", { className: "truncate font-medium text-slate-700", children: child.title })] }, child.taskId))) })) : (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No subtasks." }))] }), _jsxs("div", { className: "grid gap-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Dependencies", canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsAddDependencyOpen(true), title: "Add relationship", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), blockedByTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocked By" }), _jsx("div", { className: "grid gap-1.5", children: blockedByTasks.map((blocking) => (_jsx(RelationshipRow, { entry: blocking, compact: true, canEdit: canEdit, isRemoving: removingDependencyId ===
383
+ blocking.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(blocking.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, blocking.dependency.dependencyId))) })] })), blockingTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocks" }), _jsx("div", { className: "grid gap-1.5", children: blockingTasks.map((blocked) => (_jsx(RelationshipRow, { entry: blocked, compact: true, canEdit: canEdit, isRemoving: removingDependencyId ===
384
+ blocked.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(blocked.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, blocked.dependency.dependencyId))) })] })), relatedTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Related To" }), _jsx("div", { className: "grid gap-1.5", children: relatedTasks.map((related) => (_jsx(RelationshipRow, { entry: related, compact: true, canEdit: canEdit, isRemoving: removingDependencyId ===
385
+ related.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(related.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, related.dependency.dependencyId))) })] })), blockedByTasks.length === 0 &&
339
386
  blockingTasks.length === 0 &&
340
- relatedTasks.length === 0 && (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No dependencies." }))] })] })), !compactPanel && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Parent Task" }), _jsx(Select, { value: currentParentValue, onValueChange: setParent, disabled: !canEdit, options: parentOptions, className: "bg-white text-[13px] shadow-sm" })] }), _jsxs("div", { className: "grid gap-2 pt-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Subtasks ", childTasks.length > 0 && `(${childTasks.length})`, canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsCreateSubtaskOpen(true), title: "Add subtask", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), childTasks.length > 0 ? (_jsx("div", { className: "grid gap-2", children: childTasks.map((child) => (_jsx(TaskCard, { task: child, selected: false, onClick: () => onSelectTask(child.taskId), dependencyTaskIds: getDependencyTaskIds(child.taskId) }, child.taskId))) })) : (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No subtasks." }))] }), _jsxs("div", { className: "grid gap-4 border-t border-slate-200/60 pt-6", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Relationships", canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsAddDependencyOpen(true), title: "Add relationship", children: _jsx(LinkIcon, { className: "h-3 w-3" }) }))] }), _jsxs("div", { className: "grid gap-6", children: [blockedByTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocked By" }), _jsx("div", { className: "grid gap-2", children: blockedByTasks.map((blocking) => (_jsx(TaskCard, { task: blocking, selected: false, onClick: () => onSelectTask(blocking.taskId), dependencyTaskIds: getDependencyTaskIds(blocking.taskId), showDoneCheckmark: true }, blocking.taskId))) })] })), blockingTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocks" }), _jsx("div", { className: "grid gap-2", children: blockingTasks.map((blocked) => (_jsx(TaskCard, { task: blocked, selected: false, onClick: () => onSelectTask(blocked.taskId), dependencyTaskIds: getDependencyTaskIds(blocked.taskId), showDoneCheckmark: true }, blocked.taskId))) })] })), relatedTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Related To" }), _jsx("div", { className: "grid gap-2", children: relatedTasks.map((related) => (_jsx(TaskCard, { task: related, selected: false, onClick: () => onSelectTask(related.taskId), dependencyTaskIds: getDependencyTaskIds(related.taskId), showDoneCheckmark: true }, related.taskId))) })] })), blockedByTasks.length === 0 &&
387
+ relatedTasks.length === 0 && (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No dependencies." }))] })] })), !compactPanel && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Parent Task" }), _jsx(Select, { value: currentParentValue, onValueChange: setParent, disabled: !canEdit, options: parentOptions, className: "bg-white text-[13px] shadow-sm" })] }), _jsxs("div", { className: "grid gap-2 pt-2", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Subtasks ", childTasks.length > 0 && `(${childTasks.length})`, canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsCreateSubtaskOpen(true), title: "Add subtask", children: _jsx(Plus, { className: "h-3 w-3" }) }))] }), childTasks.length > 0 ? (_jsx("div", { className: "grid gap-2", children: childTasks.map((child) => (_jsx(TaskCard, { task: child, selected: false, onClick: () => onSelectTask(child.taskId), dependencyTaskIds: getDependencyTaskIds(child.taskId) }, child.taskId))) })) : (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No subtasks." }))] }), _jsxs("div", { className: "grid gap-4 border-t border-slate-200/60 pt-6", children: [_jsxs(Label, { className: "flex items-center justify-between text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: ["Relationships", canEdit && (_jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-slate-400 hover:text-slate-600", onClick: () => setIsAddDependencyOpen(true), title: "Add relationship", children: _jsx(LinkIcon, { className: "h-3 w-3" }) }))] }), _jsxs("div", { className: "grid gap-6", children: [blockedByTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocked By" }), _jsx("div", { className: "grid gap-2", children: blockedByTasks.map((blocking) => (_jsx(RelationshipRow, { entry: blocking, compact: false, canEdit: canEdit, isRemoving: removingDependencyId ===
388
+ blocking.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(blocking.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, blocking.dependency.dependencyId))) })] })), blockingTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Blocks" }), _jsx("div", { className: "grid gap-2", children: blockingTasks.map((blocked) => (_jsx(RelationshipRow, { entry: blocked, compact: false, canEdit: canEdit, isRemoving: removingDependencyId ===
389
+ blocked.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(blocked.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, blocked.dependency.dependencyId))) })] })), relatedTasks.length > 0 && (_jsxs("div", { className: "grid gap-2", children: [_jsx("div", { className: "text-[10px] font-bold tracking-wider text-slate-400 uppercase", children: "Related To" }), _jsx("div", { className: "grid gap-2", children: relatedTasks.map((related) => (_jsx(RelationshipRow, { entry: related, compact: false, canEdit: canEdit, isRemoving: removingDependencyId ===
390
+ related.dependency.dependencyId, dependencyTaskIds: getDependencyTaskIds(related.task.taskId), onSelectTask: onSelectTask, onRemove: removeRelationship }, related.dependency.dependencyId))) })] })), blockedByTasks.length === 0 &&
341
391
  blockingTasks.length === 0 &&
342
392
  relatedTasks.length === 0 && (_jsx("div", { className: "text-[11px] text-slate-400 italic", children: "No relationships defined." }))] })] })] })), _jsx(TaskAttachmentsSection, { task: task, canEdit: canEdit, onTaskChanged: onTaskChanged }), _jsxs("div", { className: "grid gap-4 border-t border-slate-200/60 pt-6", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(MessageSquare, { className: "h-4 w-4 text-slate-400" }), _jsx("span", { className: "text-[11px] font-bold tracking-wider text-slate-500 uppercase", children: "Add Comment" })] }), _jsxs("div", { className: "grid gap-3", children: [_jsx(Textarea, { value: commentText, onChange: (e) => setCommentText(e.target.value), rows: 3, placeholder: "Write a comment\u2026", disabled: !canEdit, className: "resize-none bg-white text-[13px] leading-relaxed shadow-sm transition-all focus-visible:ring-1 focus-visible:ring-slate-300" }), _jsx("div", { className: "flex justify-end", children: _jsx(Button, { size: "sm", onClick: submitComment, disabled: !canEdit || !commentText.trim(), className: "h-8 px-4 text-xs font-semibold", children: "Post comment" }) })] }), _jsx("div", { className: "mt-2", children: _jsx(CommentsList, { taskId: task.taskId, refreshKey: commentRefreshKey, currentUsername: editContext?.user?.name ?? null }) })] })] })) }), task && project && (_jsxs(_Fragment, { children: [_jsx(CreateTaskDialog, { open: isCreateSubtaskOpen, onOpenChange: setIsCreateSubtaskOpen, projectId: project.project.projectId, parentTaskId: task.taskId, availableParentTasks: allTasks, onCreated: onTaskChanged }), _jsx(AddDependencyDialog, { open: isAddDependencyOpen, onOpenChange: setIsAddDependencyOpen, task: task, allTasks: allTasks, onCreated: onTaskChanged })] }))] }));
343
393
  }