@parhelia/core 0.1.12430 → 0.1.12436

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 (63) hide show
  1. package/dist/config/config.js +9 -2
  2. package/dist/config/config.js.map +1 -1
  3. package/dist/editor/PictureCropper.js +45 -41
  4. package/dist/editor/PictureCropper.js.map +1 -1
  5. package/dist/editor/ai/AgentTerminal.js +32 -5
  6. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  7. package/dist/editor/ai/AgentTerminalStatusBar.js +65 -0
  8. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  9. package/dist/editor/ai/Agents.js +19 -0
  10. package/dist/editor/ai/Agents.js.map +1 -1
  11. package/dist/editor/ai/ContentInspectorPopover.d.ts +1 -0
  12. package/dist/editor/ai/ContentInspectorPopover.js +22 -8
  13. package/dist/editor/ai/ContentInspectorPopover.js.map +1 -1
  14. package/dist/editor/ai/dialogs/AgentDialogHandler.js +32 -3
  15. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  16. package/dist/editor/services/agentService.d.ts +27 -0
  17. package/dist/editor/services/agentService.js +11 -2
  18. package/dist/editor/services/agentService.js.map +1 -1
  19. package/dist/editor/services/aiService.js +54 -3
  20. package/dist/editor/services/aiService.js.map +1 -1
  21. package/dist/editor/settings/About.js +40 -4
  22. package/dist/editor/settings/About.js.map +1 -1
  23. package/dist/editor/settings/panels/PersistentLogsPanel.d.ts +2 -0
  24. package/dist/editor/settings/panels/PersistentLogsPanel.js +221 -0
  25. package/dist/editor/settings/panels/PersistentLogsPanel.js.map +1 -0
  26. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +22 -0
  27. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  28. package/dist/editor/settings/panels/index.d.ts +1 -0
  29. package/dist/editor/settings/panels/index.js +1 -0
  30. package/dist/editor/settings/panels/index.js.map +1 -1
  31. package/dist/licensing/LicenseContext.js +40 -4
  32. package/dist/licensing/LicenseContext.js.map +1 -1
  33. package/dist/licensing/LicenseOverlay.js +1 -1
  34. package/dist/licensing/LicenseOverlay.js.map +1 -1
  35. package/dist/licensing/types.d.ts +3 -1
  36. package/dist/licensing/types.js.map +1 -1
  37. package/dist/revision.d.ts +2 -2
  38. package/dist/revision.js +2 -2
  39. package/dist/task-board/TaskBoardWorkspace.js +13 -265
  40. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  41. package/dist/task-board/components/ProjectDashboard.js +2 -1
  42. package/dist/task-board/components/ProjectDashboard.js.map +1 -1
  43. package/dist/task-board/components/TaskAgentPanel.d.ts +1 -0
  44. package/dist/task-board/components/TaskAgentPanel.js +2 -2
  45. package/dist/task-board/components/TaskAgentPanel.js.map +1 -1
  46. package/dist/task-board/components/TaskDetailPanel.js +2 -1
  47. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  48. package/dist/task-board/components/TaskboardPersistentLogPanel.d.ts +11 -0
  49. package/dist/task-board/components/TaskboardPersistentLogPanel.js +114 -0
  50. package/dist/task-board/components/TaskboardPersistentLogPanel.js.map +1 -0
  51. package/dist/task-board/components/WizardTaskDetailsPanel.js +2 -1
  52. package/dist/task-board/components/WizardTaskDetailsPanel.js.map +1 -1
  53. package/dist/task-board/persistentLogLabels.d.ts +38 -0
  54. package/dist/task-board/persistentLogLabels.js +189 -0
  55. package/dist/task-board/persistentLogLabels.js.map +1 -0
  56. package/dist/task-board/services/taskService.d.ts +12 -1
  57. package/dist/task-board/services/taskService.js +47 -0
  58. package/dist/task-board/services/taskService.js.map +1 -1
  59. package/dist/task-board/types.d.ts +48 -0
  60. package/dist/task-board/useTaskBoardAgentPanelState.d.ts +34 -0
  61. package/dist/task-board/useTaskBoardAgentPanelState.js +283 -0
  62. package/dist/task-board/useTaskBoardAgentPanelState.js.map +1 -0
  63. package/package.json +1 -1
@@ -4,7 +4,6 @@ import { toast } from "sonner";
4
4
  import { cn } from "../lib/utils";
5
5
  import { Splitter } from "../editor/ui/Splitter";
6
6
  import { deleteProject, getExecutionState, getGraphLayout, getProjects, getTasks, getDependencies, runOrchestrator, triggerPlanning, updateProject, updateTask, } from "./services/taskService";
7
- import { getAgent, } from "../editor/services/agentService";
8
7
  import { loadAiProfiles } from "../editor/services/aiService";
9
8
  import { useEditContext } from "../editor/client/editContext";
10
9
  import { KanbanView } from "./views/KanbanView";
@@ -13,7 +12,7 @@ import { DependencyGraphView } from "./views/DependencyGraphView";
13
12
  import { WizardView } from "./views/WizardView";
14
13
  import { SimpleTabs } from "../editor/ui/SimpleTabs";
15
14
  import { TaskDetailPanel } from "./components/TaskDetailPanel";
16
- import { TaskAgentPanel, } from "./components/TaskAgentPanel";
15
+ import { TaskAgentPanel } from "./components/TaskAgentPanel";
17
16
  import { ProjectDashboard, } from "./components/ProjectDashboard";
18
17
  import { CreateTaskDialog } from "./components/CreateTaskDialog";
19
18
  import { AssignAgentDialog } from "./components/AssignAgentDialog";
@@ -36,6 +35,7 @@ import { WizardCommunicationCenter } from "./components/WizardCommunicationCente
36
35
  import { Button } from "../components/ui/button";
37
36
  import { Loader2, Plus } from "lucide-react";
38
37
  import { MainContentTree } from "../editor/sidebar/MainContentTree";
38
+ import { useTaskBoardAgentPanelState } from "./useTaskBoardAgentPanelState";
39
39
  function TaskboardPreviewEditor({ itemDescriptor, }) {
40
40
  const slotContext = useEditorSlotContext({
41
41
  slotId: "taskboard-preview-slot",
@@ -161,11 +161,6 @@ export function TaskBoardWorkspace() {
161
161
  const [subprojectTasksByProjectId, setSubprojectTasksByProjectId] = useState({});
162
162
  const [subprojectExecutionRecordsByProjectId, setSubprojectExecutionRecordsByProjectId,] = useState({});
163
163
  const [subprojectCountsLoading, setSubprojectCountsLoading] = useState(false);
164
- const [previewItemName, setPreviewItemName] = useState("");
165
- const [previewItemPath, setPreviewItemPath] = useState("");
166
- const [agentContextItems, setAgentContextItems] = useState([]);
167
- const [contextItemNamesByKey, setContextItemNamesByKey] = useState({});
168
- const [contextItemPathsByKey, setContextItemPathsByKey] = useState({});
169
164
  const [wizardPinnedTaskId, setWizardPinnedTaskId] = useState(null);
170
165
  const [, setWizardPinnedTaskSource] = useState(null);
171
166
  const [wizardForceOverview, setWizardForceOverview] = useState(false);
@@ -411,95 +406,16 @@ export function TaskBoardWorkspace() {
411
406
  return selectedProject;
412
407
  return (projects.find((project) => project.project.projectId === selectedTask.projectId) ?? selectedProject);
413
408
  }, [projects, selectedProject, selectedTask]);
414
- const selectedTaskIsPlan = useMemo(() => {
415
- const taskType = String(selectedTask?.taskType ?? "").toLowerCase();
416
- return taskType === "plan" || selectedTask?.title === "Project Plan";
417
- }, [selectedTask]);
418
- const selectedTaskIsBlocked = useMemo(() => {
419
- if (!selectedTask)
420
- return false;
421
- if ((selectedTask.executionBlockedByProjectIds?.length ?? 0) > 0)
422
- return true;
423
- return selectedTask.executionState === "WaitingForDependency";
424
- }, [
425
- selectedTask,
426
- ]);
427
- const selectedTaskHasAssignedAgentProfile = useMemo(() => {
428
- if (!selectedTask)
429
- return false;
430
- return selectedTask.assigneeType === "Agent" && !!selectedTask.assigneeId;
431
- }, [selectedTask]);
432
- const canRunAssignedAgent = useMemo(() => {
433
- return !selectedTaskIsBlocked;
434
- }, [selectedTaskIsBlocked]);
435
- const runAssignedAgentDisabledReason = useMemo(() => {
436
- if (selectedTaskIsBlocked) {
437
- return "This task is blocked by unfinished dependencies.";
438
- }
439
- return undefined;
440
- }, [selectedTaskIsBlocked]);
441
- // ── current agent ID and panel mode for the right panel ──
442
- const currentAgentId = useMemo(() => {
443
- return getLinkedAgentId(selectedTask);
444
- }, [selectedTask]);
445
- const selectedTaskStatus = useMemo(() => {
446
- if (!selectedTask)
447
- return null;
448
- return normalizeTaskStatus(selectedTask.status, selectedTask.executionState);
449
- }, [selectedTask]);
450
- const selectedTaskHasResultData = useMemo(() => {
451
- return !!selectedTask?.resultData?.trim();
452
- }, [selectedTask?.resultData]);
453
- const shouldHideAgentPanelForSelectedTask = useMemo(() => {
454
- return (!!selectedTask &&
455
- selectedTaskIsPlan &&
456
- selectedTaskStatus === "Done" &&
457
- selectedTaskHasResultData);
458
- }, [
409
+ const { agentPanelMode, canRunAssignedAgent, contextItemOptions, displayAgentId, handleSelectContextItem, hasMultipleContextItems, previewItemName, previewItemPath, previewItemVersion, runAssignedAgentDisabledReason, selectedContextItemValue, selectedTaskHasAssignedAgentProfile, selectedTaskIsBlocked, selectedTaskIsPlan, shouldHideAgentPanelForSelectedTask, } = useTaskBoardAgentPanelState({
410
+ currentItemDescriptor,
411
+ editContext,
412
+ isMobile,
413
+ mobileActiveTab,
459
414
  selectedTask,
460
- selectedTaskIsPlan,
461
- selectedTaskStatus,
462
- selectedTaskHasResultData,
463
- ]);
464
- const displayAgentId = useMemo(() => {
465
- return currentAgentId;
466
- }, [currentAgentId]);
467
- useEffect(() => {
468
- if (isMobile && selectedTaskId) {
469
- setMobileActiveTab(1); // Task tab
470
- }
471
- }, [selectedTaskId, isMobile]);
472
- useEffect(() => {
473
- if (isMobile && displayAgentId && !shouldHideAgentPanelForSelectedTask) {
474
- setMobileActiveTab(2); // Agent tab
475
- }
476
- }, [displayAgentId, isMobile, shouldHideAgentPanelForSelectedTask]);
477
- useEffect(() => {
478
- if (!isMobile)
479
- return;
480
- if (!shouldHideAgentPanelForSelectedTask)
481
- return;
482
- if (mobileActiveTab !== 2)
483
- return;
484
- setMobileActiveTab(1);
485
- }, [isMobile, mobileActiveTab, shouldHideAgentPanelForSelectedTask]);
486
- useEffect(() => {
487
- if (!showEditorPanel && mobileActiveTab === 3) {
488
- setMobileActiveTab(0);
489
- }
490
- }, [showEditorPanel, mobileActiveTab]);
491
- const currentItemKey = useMemo(() => {
492
- if (!currentItemDescriptor)
493
- return "";
494
- return `${currentItemDescriptor.id}|${currentItemDescriptor.language}|${currentItemDescriptor.version}`;
495
- }, [currentItemDescriptor]);
496
- const agentPanelMode = useMemo(() => {
497
- if (!selectedTask)
498
- return "no-task-selected";
499
- if (displayAgentId)
500
- return "agent";
501
- return "no-agent";
502
- }, [selectedTask, displayAgentId]);
415
+ selectedTaskId,
416
+ setMobileActiveTab,
417
+ showEditorPanel,
418
+ });
503
419
  const wizardAttentionState = useMemo(() => {
504
420
  const openTasks = orderedWizardTasks.filter((task) => normalizeTaskStatus(task.status, task.executionState) !== "Done");
505
421
  let runningCount = 0;
@@ -597,19 +513,6 @@ export function TaskBoardWorkspace() {
597
513
  wizardForceOverview,
598
514
  wizardPinnedTaskId,
599
515
  ]);
600
- useEffect(() => {
601
- if (!wizardDisplayedTask ||
602
- (wizardDisplayedExecutionDisplay?.label !== "Questions" &&
603
- wizardDisplayedTask.executionState !== "WaitingForInput" &&
604
- wizardDisplayedTask.executionState !== "WaitingForUser")) {
605
- return;
606
- }
607
- }, [
608
- wizardDisplayedTask,
609
- wizardDisplayedAgentId,
610
- wizardDisplayedExecutionDisplay?.label,
611
- selectedProjectId,
612
- ]);
613
516
  const clearWizardCloseTransitionTimeout = useCallback(() => {
614
517
  if (wizardCloseTransitionTimeoutRef.current !== null) {
615
518
  window.clearTimeout(wizardCloseTransitionTimeoutRef.current);
@@ -1692,7 +1595,7 @@ export function TaskBoardWorkspace() {
1692
1595
  return (_jsx("div", { className: "flex h-full min-h-[240px] items-center justify-center rounded-lg border border-dashed border-slate-200 bg-slate-50/70", "data-testid": "taskboard-project-loading-state", children: _jsxs("div", { className: "text-muted-foreground flex flex-col items-center gap-3 text-sm", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin" }), _jsx("div", { children: "Loading project..." })] }) }));
1693
1596
  }
1694
1597
  if (!selectedProjectId || (!selectedProject && !isProjectsLoading)) {
1695
- return (_jsx("div", { className: "flex min-h-full w-full flex-col p-4 md:p-8", children: _jsx("div", { className: "mx-auto flex h-full w-full max-w-7xl flex-1 min-h-0", children: _jsx(ProjectOverviewContent, { nav: nav }) }) }));
1598
+ return (_jsx("div", { className: "flex min-h-full w-full flex-col p-4 md:p-8", children: _jsx("div", { className: "mx-auto flex h-full min-h-0 w-full max-w-7xl flex-1", children: _jsx(ProjectOverviewContent, { nav: nav }) }) }));
1696
1599
  }
1697
1600
  if (isWizardMode) {
1698
1601
  return (_jsx(WizardView, { projectId: selectedProjectId, tasks: tasksWithDisplayAssignees, projectTasksLoading: isTasksLoading, dependencies: dependencies, subprojectTaskLists: wizardSubprojectTaskLists, subprojectTasksLoading: subprojectCountsLoading, selectedTaskId: wizardDisplayedTask?.taskId ?? null, onSelectTask: (id) => {
@@ -1790,161 +1693,6 @@ export function TaskBoardWorkspace() {
1790
1693
  selectedTask,
1791
1694
  handleReopenSelectedTask,
1792
1695
  ]);
1793
- const previewItemVersion = useMemo(() => {
1794
- if (!currentItemDescriptor)
1795
- return null;
1796
- return currentItemDescriptor.version === 0
1797
- ? (editContext?.item?.version ?? null)
1798
- : currentItemDescriptor.version;
1799
- }, [currentItemDescriptor, editContext?.item?.version]);
1800
- const contextItemOptions = useMemo(() => {
1801
- return agentContextItems.map((contextItem) => {
1802
- const key = `${contextItem.id}|${contextItem.language}|${contextItem.version}`;
1803
- const name = contextItemNamesByKey[key] || contextItem.name || contextItem.id;
1804
- const path = contextItemPathsByKey[key] || contextItem.path || "";
1805
- return {
1806
- value: key,
1807
- label: name,
1808
- description: `${path || contextItem.id} (${contextItem.language}/v${contextItem.version})`,
1809
- };
1810
- });
1811
- }, [agentContextItems, contextItemNamesByKey, contextItemPathsByKey]);
1812
- const selectedContextItemValue = useMemo(() => {
1813
- if (currentItemKey)
1814
- return currentItemKey;
1815
- const first = agentContextItems[0];
1816
- if (!first)
1817
- return "";
1818
- return `${first.id}|${first.language}|${first.version}`;
1819
- }, [currentItemKey, agentContextItems]);
1820
- const hasMultipleContextItems = contextItemOptions.length > 1;
1821
- useEffect(() => {
1822
- if (!currentAgentId) {
1823
- setAgentContextItems([]);
1824
- return;
1825
- }
1826
- let cancelled = false;
1827
- getAgent(currentAgentId)
1828
- .then((agent) => {
1829
- if (cancelled)
1830
- return;
1831
- const rawContext = agent?.agentContext;
1832
- if (!rawContext) {
1833
- setAgentContextItems([]);
1834
- return;
1835
- }
1836
- let parsed = null;
1837
- try {
1838
- parsed = JSON.parse(rawContext);
1839
- }
1840
- catch {
1841
- parsed = null;
1842
- }
1843
- const items = (parsed?.items || []).filter((x) => !!x?.id && !!x?.language && typeof x?.version === "number");
1844
- setAgentContextItems(items);
1845
- })
1846
- .catch(() => {
1847
- if (cancelled)
1848
- return;
1849
- setAgentContextItems([]);
1850
- });
1851
- return () => {
1852
- cancelled = true;
1853
- };
1854
- }, [currentAgentId]);
1855
- useEffect(() => {
1856
- if (!editContext || agentContextItems.length === 0) {
1857
- setContextItemNamesByKey({});
1858
- setContextItemPathsByKey({});
1859
- return;
1860
- }
1861
- let cancelled = false;
1862
- Promise.all(agentContextItems.map(async (contextItem) => {
1863
- const key = `${contextItem.id}|${contextItem.language}|${contextItem.version}`;
1864
- const descriptor = {
1865
- id: contextItem.id,
1866
- language: contextItem.language,
1867
- version: contextItem.version,
1868
- };
1869
- const item = await editContext.itemsRepository.getItem(descriptor);
1870
- return {
1871
- key,
1872
- name: item?.name || contextItem.name || "",
1873
- path: item?.path || contextItem.path || "",
1874
- };
1875
- }))
1876
- .then((results) => {
1877
- if (cancelled)
1878
- return;
1879
- const nextNames = {};
1880
- const nextPaths = {};
1881
- for (const result of results) {
1882
- nextNames[result.key] = result.name;
1883
- nextPaths[result.key] = result.path;
1884
- }
1885
- setContextItemNamesByKey(nextNames);
1886
- setContextItemPathsByKey(nextPaths);
1887
- })
1888
- .catch(() => {
1889
- if (cancelled)
1890
- return;
1891
- setContextItemNamesByKey({});
1892
- setContextItemPathsByKey({});
1893
- });
1894
- return () => {
1895
- cancelled = true;
1896
- };
1897
- }, [editContext, agentContextItems]);
1898
- const handleSelectContextItem = useCallback((value) => {
1899
- const [id, language, versionText] = value.split("|");
1900
- const version = Number(versionText);
1901
- if (!id || !language || Number.isNaN(version) || !editContext?.loadItem)
1902
- return;
1903
- void editContext.loadItem({ id, language, version });
1904
- }, [editContext]);
1905
- useEffect(() => {
1906
- if (!editContext || !currentItemDescriptor) {
1907
- setPreviewItemName("");
1908
- setPreviewItemPath("");
1909
- return;
1910
- }
1911
- const activeItem = editContext.item;
1912
- const itemMatchesDescriptor = activeItem?.id === currentItemDescriptor.id &&
1913
- activeItem?.language === currentItemDescriptor.language;
1914
- if (itemMatchesDescriptor) {
1915
- setPreviewItemName(activeItem?.name || "");
1916
- setPreviewItemPath(activeItem?.path || "");
1917
- return;
1918
- }
1919
- let cancelled = false;
1920
- editContext.itemsRepository
1921
- .getItem(currentItemDescriptor)
1922
- .then((item) => {
1923
- if (cancelled)
1924
- return;
1925
- setPreviewItemName(item?.name || "");
1926
- setPreviewItemPath(item?.path || "");
1927
- })
1928
- .catch(() => {
1929
- if (cancelled)
1930
- return;
1931
- setPreviewItemName("");
1932
- setPreviewItemPath("");
1933
- });
1934
- return () => {
1935
- cancelled = true;
1936
- };
1937
- }, [
1938
- editContext,
1939
- currentItemDescriptor,
1940
- currentItemDescriptor?.id,
1941
- currentItemDescriptor?.language,
1942
- currentItemDescriptor?.version,
1943
- editContext?.item?.id,
1944
- editContext?.item?.language,
1945
- editContext?.item?.name,
1946
- editContext?.item?.path,
1947
- ]);
1948
1696
  const itemPreviewPanel = useMemo(() => {
1949
1697
  const hasCurrentItem = !!currentItemDescriptor;
1950
1698
  const previewSidebar = (_jsx("div", { className: "relative z-10 flex h-full min-h-0 flex-col bg-white", children: _jsx("div", { className: "min-h-0 flex-1", children: _jsx(MainContentTree, { mode: "normal" }) }) }));
@@ -2117,7 +1865,7 @@ export function TaskBoardWorkspace() {
2117
1865
  id: "agent",
2118
1866
  label: "Agent",
2119
1867
  content: null,
2120
- disabled: !currentAgentId || shouldHideAgentPanelForSelectedTask,
1868
+ disabled: !displayAgentId || shouldHideAgentPanelForSelectedTask,
2121
1869
  },
2122
1870
  ...(showEditorPanel
2123
1871
  ? [{ id: "editor", label: "Editor", content: null }]