@echothink-ui/project 0.1.0

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 (55) hide show
  1. package/README.md +5 -0
  2. package/dist/components/ProjectActivityTimeline.d.ts +5 -0
  3. package/dist/components/ProjectAppDomainPanel.d.ts +8 -0
  4. package/dist/components/ProjectCard.d.ts +8 -0
  5. package/dist/components/ProjectCreateForm.d.ts +7 -0
  6. package/dist/components/ProjectDashboardTemplate.d.ts +11 -0
  7. package/dist/components/ProjectManagementPage.d.ts +17 -0
  8. package/dist/components/ProjectMembersPanel.d.ts +9 -0
  9. package/dist/components/ProjectModelConfigPanel.d.ts +9 -0
  10. package/dist/components/ProjectPermissionPanel.d.ts +9 -0
  11. package/dist/components/ProjectResourcePanel.d.ts +6 -0
  12. package/dist/components/ProjectScopeSelector.d.ts +7 -0
  13. package/dist/components/ProjectSettingsPanel.d.ts +6 -0
  14. package/dist/components/ProjectStatusSummary.d.ts +6 -0
  15. package/dist/components/ProjectSummaryPanel.d.ts +5 -0
  16. package/dist/components/ProjectTab.d.ts +3 -0
  17. package/dist/components/ProjectTabGroup.d.ts +12 -0
  18. package/dist/components/ProjectTable.d.ts +9 -0
  19. package/dist/index.cjs +2112 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.css +2059 -0
  22. package/dist/index.css.map +1 -0
  23. package/dist/index.d.ts +21 -0
  24. package/dist/index.js +2098 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/types.d.ts +99 -0
  27. package/dist/utils.d.ts +288 -0
  28. package/package.json +45 -0
  29. package/src/components/ProjectActivityTimeline.test.tsx +43 -0
  30. package/src/components/ProjectActivityTimeline.tsx +118 -0
  31. package/src/components/ProjectAppDomainPanel.tsx +147 -0
  32. package/src/components/ProjectCard.tsx +117 -0
  33. package/src/components/ProjectCreateForm.test.tsx +45 -0
  34. package/src/components/ProjectCreateForm.tsx +176 -0
  35. package/src/components/ProjectDashboardTemplate.tsx +107 -0
  36. package/src/components/ProjectManagementPage.tsx +112 -0
  37. package/src/components/ProjectMembersPanel.tsx +181 -0
  38. package/src/components/ProjectModelConfigPanel.tsx +294 -0
  39. package/src/components/ProjectPermissionPanel.tsx +174 -0
  40. package/src/components/ProjectResourcePanel.tsx +154 -0
  41. package/src/components/ProjectScopeSelector.test.tsx +50 -0
  42. package/src/components/ProjectScopeSelector.tsx +92 -0
  43. package/src/components/ProjectSettingsPanel.test.tsx +25 -0
  44. package/src/components/ProjectSettingsPanel.tsx +244 -0
  45. package/src/components/ProjectStatusSummary.tsx +165 -0
  46. package/src/components/ProjectSummaryPanel.test.tsx +37 -0
  47. package/src/components/ProjectSummaryPanel.tsx +85 -0
  48. package/src/components/ProjectTab.tsx +8 -0
  49. package/src/components/ProjectTabGroup.tsx +38 -0
  50. package/src/components/ProjectTable.tsx +138 -0
  51. package/src/index.test.tsx +337 -0
  52. package/src/index.tsx +41 -0
  53. package/src/styles.css +2431 -0
  54. package/src/types.ts +111 -0
  55. package/src/utils.ts +96 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ProjectManagementPage.tsx","../src/utils.ts","../src/components/ProjectStatusSummary.tsx","../src/components/ProjectTable.tsx","../src/components/ProjectCard.tsx","../src/components/ProjectTab.tsx","../src/components/ProjectCreateForm.tsx","../src/components/ProjectSummaryPanel.tsx","../src/components/ProjectSettingsPanel.tsx","../src/components/ProjectScopeSelector.tsx","../src/components/ProjectResourcePanel.tsx","../src/components/ProjectActivityTimeline.tsx","../src/components/ProjectTabGroup.tsx","../src/components/ProjectMembersPanel.tsx","../src/components/ProjectPermissionPanel.tsx","../src/components/ProjectAppDomainPanel.tsx","../src/components/ProjectModelConfigPanel.tsx","../src/components/ProjectDashboardTemplate.tsx","../src/index.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Button, EmptyState, type EthAction } from \"@echothink-ui/core\";\nimport { PageHeader } from \"@echothink-ui/layouts\";\nimport type { ProjectBaseProps, ProjectSummary } from \"../types\";\nimport { projectHtmlProps } from \"../utils\";\nimport { ProjectStatusSummary } from \"./ProjectStatusSummary\";\nimport { ProjectTable } from \"./ProjectTable\";\n\nexport interface ProjectManagementPageProps extends ProjectBaseProps {\n projects?: ProjectSummary[];\n onCreate?: () => void;\n onSelect?: (projectId: string) => void;\n onFilterSelect?: (filterId: string) => void;\n filters?: Array<{ id: string; label: React.ReactNode; active?: boolean }>;\n activeProjectId?: string;\n actions?: EthAction[];\n}\n\nexport function ProjectManagementPage({\n projects = [],\n onCreate,\n onSelect,\n onFilterSelect,\n filters = [],\n activeProjectId,\n title = \"Projects\",\n subtitle = \"Manage project workspaces, resources, and installed app domains.\",\n className,\n actions,\n ...props\n}: ProjectManagementPageProps) {\n const headerActions = React.useMemo<EthAction[]>(() => {\n const providedActions = actions ?? [];\n const hasCreateAction = providedActions.some((action) => {\n if (action.id === \"new-project\") return true;\n return (\n typeof action.label === \"string\" &&\n action.label.trim().toLowerCase() === \"new project\"\n );\n });\n\n if (!onCreate || hasCreateAction) return providedActions;\n\n return [\n ...providedActions,\n {\n id: \"new-project\",\n label: \"New project\",\n intent: \"primary\",\n onSelect: onCreate\n }\n ];\n }, [actions, onCreate]);\n\n return (\n <main\n {...projectHtmlProps(props)}\n className={`eth-project-management-page ${className ?? \"\"}`}\n data-eth-component=\"ProjectManagementPage\"\n >\n <PageHeader title={title} subtitle={subtitle} actions={headerActions} />\n\n {filters.length ? (\n <div\n className=\"eth-project-management-page__filters\"\n role=\"group\"\n aria-label=\"Project filters\"\n >\n {filters.map((filter) => (\n <button\n key={filter.id}\n type=\"button\"\n className={`eth-project-management-page__filter ${\n filter.active ? \"eth-project-management-page__filter--active\" : \"\"\n }`}\n aria-pressed={Boolean(filter.active)}\n aria-disabled={!onFilterSelect ? true : undefined}\n tabIndex={!onFilterSelect ? -1 : undefined}\n onClick={onFilterSelect ? () => onFilterSelect(filter.id) : undefined}\n >\n {filter.label}\n </button>\n ))}\n </div>\n ) : null}\n\n {projects.length ? (\n <>\n <ProjectStatusSummary projects={projects} />\n <ProjectTable\n projects={projects}\n onRowSelect={onSelect}\n selectedProjectId={activeProjectId}\n aria-label={activeProjectId ? `Projects, active ${activeProjectId}` : \"Projects\"}\n />\n </>\n ) : (\n <EmptyState\n title=\"No projects yet\"\n description=\"Create a project to connect resources, members, model settings, and app domains.\"\n action={\n onCreate ? (\n <Button intent=\"primary\" onClick={onCreate}>\n New project\n </Button>\n ) : undefined\n }\n />\n )}\n </main>\n );\n}\n","import type { EthOperationalStatus, EthSeverity } from \"@echothink-ui/core\";\nimport type {\n ProjectHealthStatus,\n ProjectBaseProps,\n ProjectPermissionEntity,\n ProjectStatusSummaryData,\n ProjectSummary\n} from \"./types\";\n\nexport function classNames(...values: Array<string | false | null | undefined>) {\n return values.filter(Boolean).join(\" \");\n}\n\nexport function healthToStatus(health?: ProjectHealthStatus): EthOperationalStatus {\n if (health === \"critical\") return \"failed\";\n if (health === \"warning\") return \"warning\";\n return \"synced\";\n}\n\nexport function healthLabel(health?: ProjectHealthStatus) {\n if (health === \"critical\") return \"Critical\";\n if (health === \"warning\") return \"Warning\";\n return \"Healthy\";\n}\n\nexport function statusToSeverity(status: EthOperationalStatus): EthSeverity {\n if ([\"failed\", \"blocked\", \"approval-required\"].includes(status)) return \"danger\";\n if ([\"warning\", \"stale\", \"pending-approval\"].includes(status)) return \"warning\";\n if ([\"succeeded\", \"completed\", \"synced\", \"active\"].includes(status)) return \"success\";\n if ([\"inactive\", \"not-started\", \"paused\"].includes(status)) return \"neutral\";\n return \"info\";\n}\n\nexport function summarizeProjects(projects: ProjectSummary[]): ProjectStatusSummaryData {\n const byStatus: ProjectStatusSummaryData[\"byStatus\"] = {};\n let healthyCount = 0;\n let blockedCount = 0;\n\n for (const project of projects) {\n byStatus[project.status] = (byStatus[project.status] ?? 0) + 1;\n if (\n project.healthStatus === \"healthy\" ||\n [\"completed\", \"succeeded\", \"synced\", \"active\"].includes(project.status)\n ) {\n healthyCount += 1;\n }\n if ([\"blocked\", \"failed\", \"approval-required\"].includes(project.status)) {\n blockedCount += 1;\n }\n }\n\n return {\n byStatus,\n healthyPercent: projects.length ? Math.round((healthyCount / projects.length) * 100) : 0,\n blockedCount\n };\n}\n\nexport function entityId(entity: ProjectPermissionEntity) {\n return typeof entity === \"string\" ? entity : entity.id;\n}\n\nexport function entityLabel(entity: ProjectPermissionEntity) {\n return typeof entity === \"string\" ? entity : entity.label;\n}\n\nexport function permissionKey(\n subject: ProjectPermissionEntity,\n resource: ProjectPermissionEntity,\n action: ProjectPermissionEntity\n) {\n return `${entityId(subject)}:${entityId(resource)}:${entityId(action)}`;\n}\n\nexport function formatNumber(value: number | undefined) {\n return new Intl.NumberFormat(\"en-US\").format(value ?? 0);\n}\n\nexport function projectHtmlProps(props: ProjectBaseProps) {\n const {\n title,\n subtitle,\n description,\n eyebrow,\n density,\n status,\n severity,\n loading,\n empty,\n error,\n footer,\n children,\n ...htmlProps\n } = props;\n return htmlProps;\n}\n","import * as React from \"react\";\nimport {\n Badge,\n StatusDot,\n statusLabel,\n type EthOperationalStatus,\n type EthSeverity\n} from \"@echothink-ui/core\";\nimport { KPIBlock } from \"@echothink-ui/charts\";\nimport type { ProjectBaseProps, ProjectStatusSummaryData, ProjectSummary } from \"../types\";\nimport { classNames, projectHtmlProps, summarizeProjects } from \"../utils\";\n\nexport interface ProjectStatusSummaryProps extends ProjectBaseProps {\n projects?: ProjectSummary[];\n summary?: ProjectStatusSummaryData;\n}\n\nconst priorityStatuses: EthOperationalStatus[] = [\n \"running\",\n \"in-progress\",\n \"approval-required\",\n \"blocked\",\n \"failed\",\n \"queued\",\n \"pending-approval\",\n \"warning\",\n \"stale\",\n \"paused\",\n \"completed\",\n \"succeeded\",\n \"synced\",\n \"active\",\n \"not-started\",\n \"inactive\"\n];\n\nconst statusClassNames: Partial<Record<EthOperationalStatus, string>> = {\n \"approval-required\": \"eth-project-status-summary__bar-segment--attention\",\n \"pending-approval\": \"eth-project-status-summary__bar-segment--warning\",\n \"in-progress\": \"eth-project-status-summary__bar-segment--inflight\",\n blocked: \"eth-project-status-summary__bar-segment--attention\",\n failed: \"eth-project-status-summary__bar-segment--attention\",\n running: \"eth-project-status-summary__bar-segment--inflight\",\n queued: \"eth-project-status-summary__bar-segment--queued\",\n warning: \"eth-project-status-summary__bar-segment--warning\",\n stale: \"eth-project-status-summary__bar-segment--warning\",\n paused: \"eth-project-status-summary__bar-segment--paused\",\n completed: \"eth-project-status-summary__bar-segment--complete\",\n succeeded: \"eth-project-status-summary__bar-segment--complete\",\n synced: \"eth-project-status-summary__bar-segment--complete\",\n active: \"eth-project-status-summary__bar-segment--complete\",\n \"not-started\": \"eth-project-status-summary__bar-segment--queued\",\n inactive: \"eth-project-status-summary__bar-segment--queued\"\n};\n\nexport function ProjectStatusSummary({\n projects = [],\n summary,\n title = \"Project status\",\n className,\n ...props\n}: ProjectStatusSummaryProps) {\n const headingId = React.useId();\n const computed = summary ?? summarizeProjects(projects);\n const total = Object.values(computed.byStatus).reduce((sum, value) => sum + (value ?? 0), 0);\n const activeCount = (computed.byStatus.running ?? 0) + (computed.byStatus[\"in-progress\"] ?? 0);\n const prioritizedStatuses = priorityStatuses.filter((status) => computed.byStatus[status]);\n const additionalStatuses = Object.keys(computed.byStatus).filter(\n (status): status is EthOperationalStatus =>\n !priorityStatuses.includes(status as EthOperationalStatus) &&\n Boolean(computed.byStatus[status as EthOperationalStatus])\n );\n const displayedStatuses = [...prioritizedStatuses, ...additionalStatuses];\n const statusSummary = total\n ? `${total} project${total === 1 ? \"\" : \"s\"} across ${displayedStatuses.length} status${\n displayedStatuses.length === 1 ? \"\" : \"es\"\n }`\n : \"No tracked projects\";\n const attentionLabel = total\n ? computed.blockedCount\n ? `${computed.blockedCount} needs attention`\n : \"Operational\"\n : \"No projects\";\n const attentionSeverity: EthSeverity = total\n ? computed.blockedCount\n ? \"danger\"\n : \"success\"\n : \"neutral\";\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-status-summary\", className)}\n data-eth-component=\"ProjectStatusSummary\"\n role=\"region\"\n aria-labelledby={headingId}\n tabIndex={-1}\n >\n <header className=\"eth-project-status-summary__header\">\n <div className=\"eth-project-status-summary__heading\">\n <h3 id={headingId}>{title}</h3>\n <p>{statusSummary}</p>\n </div>\n <Badge severity={attentionSeverity}>{attentionLabel}</Badge>\n </header>\n\n <div className=\"eth-project-status-summary__kpis\">\n <KPIBlock title=\"Projects\" value={total} description=\"Total tracked\" />\n <KPIBlock title=\"Healthy\" value={`${computed.healthyPercent}%`} description=\"Operational\" />\n <KPIBlock title=\"Active\" value={activeCount} description=\"Running or in progress\" />\n <KPIBlock title=\"Blocked\" value={computed.blockedCount} description=\"Needs attention\" />\n </div>\n\n <div className=\"eth-project-status-summary__distribution\">\n <div\n className=\"eth-project-status-summary__bar\"\n aria-label=\"Project status distribution\"\n role=\"list\"\n >\n {displayedStatuses.length ? (\n displayedStatuses.map((status) => {\n const count = computed.byStatus[status] ?? 0;\n return (\n <span\n key={status}\n aria-label={`${statusLabel(status)}: ${count}`}\n className={classNames(\n \"eth-project-status-summary__bar-segment\",\n statusClassNames[status],\n `eth-project-status-summary__bar-segment--${status}`\n )}\n role=\"listitem\"\n style={{ flexGrow: count }}\n title={`${statusLabel(status)}: ${count}`}\n />\n );\n })\n ) : (\n <span\n aria-label=\"No project status data\"\n className=\"eth-project-status-summary__bar-segment\"\n role=\"listitem\"\n style={{ flexGrow: 1 }}\n />\n )}\n </div>\n\n {displayedStatuses.length ? (\n <div className=\"eth-project-status-summary__legend\" role=\"list\">\n {displayedStatuses.map((status) => (\n <span key={status} role=\"listitem\">\n <StatusDot\n status={status}\n label={`${statusLabel(status)} ${computed.byStatus[status]}`}\n />\n </span>\n ))}\n </div>\n ) : (\n <p className=\"eth-project-status-summary__empty\">No project status data</p>\n )}\n </div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport {\n Badge,\n Button,\n EmptyState,\n statusLabel,\n type EthAction\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { ProjectBaseProps, ProjectSummary } from \"../types\";\nimport {\n formatNumber,\n projectHtmlProps,\n statusToSeverity\n} from \"../utils\";\n\nexport interface ProjectTableProps extends ProjectBaseProps {\n projects?: ProjectSummary[];\n onRowSelect?: (projectId: string) => void;\n selectedProjectId?: string;\n rowActions?: (project: ProjectSummary) => EthAction[];\n}\n\nexport function ProjectTable({\n projects = [],\n onRowSelect,\n selectedProjectId,\n rowActions,\n density = \"compact\",\n className,\n ...props\n}: ProjectTableProps) {\n const columns = React.useMemo<DataColumn<ProjectSummary>[]>(\n () => [\n {\n key: \"name\",\n header: \"Name\",\n width: \"34%\",\n render: (project) => (\n <div className=\"eth-project-table__name\">\n {onRowSelect ? (\n <Button\n className=\"eth-project-table__title eth-project-table__title-button\"\n intent=\"ghost\"\n onClick={() => onRowSelect(project.id)}\n >\n {project.name}\n </Button>\n ) : (\n <strong className=\"eth-project-table__title\">{project.name}</strong>\n )}\n {project.description ? (\n <small className=\"eth-project-table__description\">{project.description}</small>\n ) : null}\n </div>\n )\n },\n {\n key: \"status\",\n header: \"Status\",\n width: \"10rem\",\n render: (project) => (\n <span className=\"eth-project-table__status\">\n <Badge severity={statusToSeverity(project.status)}>{statusLabel(project.status)}</Badge>\n </span>\n )\n },\n {\n key: \"ownerLabel\",\n header: \"Owner\",\n width: \"7rem\",\n render: (project) => (\n <span className=\"eth-project-table__owner\">{project.ownerLabel ?? \"Unassigned\"}</span>\n )\n },\n {\n key: \"appDomainsCount\",\n header: \"App domains\",\n width: \"7.5rem\",\n align: \"end\",\n render: (project) => (\n <span className=\"eth-project-table__metric\">\n {formatNumber(project.appDomainsCount)}\n </span>\n )\n },\n {\n key: \"openTasksCount\",\n header: \"Open tasks\",\n width: \"7.5rem\",\n align: \"end\",\n render: (project) => (\n <span className=\"eth-project-table__metric\">\n {formatNumber(project.openTasksCount)}\n </span>\n )\n },\n {\n key: \"updatedAt\",\n header: \"Updated\",\n width: \"7.5rem\",\n render: (project) => (\n <span className=\"eth-project-table__updated\">{project.updatedAt ?? \"-\"}</span>\n )\n }\n ],\n [onRowSelect]\n );\n const htmlProps = projectHtmlProps(props);\n\n return (\n <section\n {...htmlProps}\n className={`eth-project-table ${className ?? \"\"}`}\n data-eth-component=\"ProjectTable\"\n role=\"region\"\n aria-label={htmlProps[\"aria-label\"] ?? \"Project list\"}\n tabIndex={-1}\n >\n <DataTable\n aria-label=\"Project list\"\n className=\"eth-project-table__table\"\n density={density}\n rows={projects}\n columns={columns}\n rowKey=\"id\"\n selectedRows={selectedProjectId ? [selectedProjectId] : []}\n rowActions={rowActions}\n emptyState={\n <EmptyState\n title=\"No projects\"\n description=\"Create a project to start organizing resources and app domains.\"\n />\n }\n />\n </section>\n );\n}\n","import * as React from \"react\";\nimport {\n ActionGroup,\n Badge,\n Button,\n StatusDot,\n statusLabel,\n type EthAction\n} from \"@echothink-ui/core\";\nimport type { ProjectBaseProps, ProjectSummary } from \"../types\";\nimport {\n classNames,\n formatNumber,\n healthLabel,\n healthToStatus,\n projectHtmlProps,\n statusToSeverity\n} from \"../utils\";\n\nexport interface ProjectCardProps extends ProjectBaseProps {\n project?: ProjectSummary;\n onSelect?: (projectId: string) => void;\n actions?: EthAction[];\n}\n\nexport function ProjectCard({\n project,\n onSelect,\n actions,\n className,\n ...props\n}: ProjectCardProps) {\n const resolvedProject: ProjectSummary = project ?? {\n id: \"project\",\n name: \"Project\",\n status: \"not-started\",\n description: \"Project summary\"\n };\n const titleId = `${resolvedProject.id}-title`;\n const descriptionId = resolvedProject.description\n ? `${resolvedProject.id}-description`\n : undefined;\n\n return (\n <article\n {...projectHtmlProps(props)}\n className={classNames(\n \"eth-project-card\",\n `eth-project-card--${resolvedProject.status}`,\n className\n )}\n data-eth-component=\"ProjectCard\"\n data-status={resolvedProject.status}\n role=\"region\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n tabIndex={-1}\n >\n <header className=\"eth-project-card__header\">\n <div className=\"eth-project-card__heading\">\n <h3 id={titleId}>{resolvedProject.name}</h3>\n {resolvedProject.description ? (\n <p id={descriptionId}>{resolvedProject.description}</p>\n ) : null}\n </div>\n <div className=\"eth-project-card__status\">\n <Badge severity={statusToSeverity(resolvedProject.status)}>\n {statusLabel(resolvedProject.status)}\n </Badge>\n </div>\n </header>\n\n <dl className=\"eth-project-card__metadata\">\n <div>\n <dt>Owner</dt>\n <dd>{resolvedProject.ownerLabel ?? \"Unassigned\"}</dd>\n </div>\n <div>\n <dt>Updated</dt>\n <dd>{resolvedProject.updatedAt ?? \"Not updated\"}</dd>\n </div>\n <div>\n <dt>App domains</dt>\n <dd>{formatNumber(resolvedProject.appDomainsCount)}</dd>\n </div>\n <div>\n <dt>Open tasks</dt>\n <dd>{formatNumber(resolvedProject.openTasksCount)}</dd>\n </div>\n <div>\n <dt>Health</dt>\n <dd>\n <StatusDot\n status={healthToStatus(resolvedProject.healthStatus)}\n label={healthLabel(resolvedProject.healthStatus)}\n />\n </dd>\n </div>\n </dl>\n\n {onSelect || actions?.length ? (\n <footer className=\"eth-project-card__actions\">\n {onSelect ? (\n <Button\n intent=\"secondary\"\n density=\"compact\"\n onClick={() => onSelect(resolvedProject.id)}\n >\n Open project\n </Button>\n ) : null}\n <ActionGroup actions={actions} />\n </footer>\n ) : null}\n </article>\n );\n}\n","import { BrowserTab, type BrowserTabProps } from \"@echothink-ui/layouts\";\nimport { classNames } from \"../utils\";\n\nexport type ProjectTabProps = BrowserTabProps;\n\nexport function ProjectTab({ className, ...props }: ProjectTabProps) {\n return <BrowserTab {...props} className={classNames(\"eth-project-tab\", className)} />;\n}\n","import * as React from \"react\";\nimport {\n Button,\n FormField,\n FormSection,\n FormValidationMessage,\n Select,\n TextInput,\n Textarea\n} from \"@echothink-ui/core\";\nimport type { ProjectBaseProps, ProjectCreateValues } from \"../types\";\nimport { classNames, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectCreateFormProps extends ProjectBaseProps {\n defaults?: Partial<ProjectCreateValues>;\n onSubmit?: (values: ProjectCreateValues) => void;\n onCancel?: () => void;\n}\n\nconst templateOptions = [\n { value: \"blank\", label: \"Blank project\" },\n { value: \"software-delivery\", label: \"Software delivery\" },\n { value: \"research\", label: \"Research workspace\" },\n { value: \"operations\", label: \"Operations runbook\" }\n];\n\nexport function ProjectCreateForm({\n defaults,\n onSubmit,\n onCancel,\n title = \"Create project\",\n description = \"Start a project workspace with an owner, template, and operating context.\",\n className,\n ...props\n}: ProjectCreateFormProps) {\n const [values, setValues] = React.useState<ProjectCreateValues>({\n name: defaults?.name ?? \"\",\n description: defaults?.description ?? \"\",\n ownerLabel: defaults?.ownerLabel ?? \"\",\n template: defaults?.template ?? \"blank\"\n });\n const [nameError, setNameError] = React.useState<string>();\n const formId = React.useId().replace(/:/g, \"\");\n const titleId = `eth-project-create-form-${formId}-title`;\n const descriptionId = `eth-project-create-form-${formId}-description`;\n const htmlProps = projectHtmlProps(props);\n const describedBy =\n [htmlProps[\"aria-describedby\"], description ? descriptionId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const update = (field: keyof ProjectCreateValues, value: string) => {\n setValues((current) => ({ ...current, [field]: value }));\n if (field === \"name\" && value.trim()) setNameError(undefined);\n };\n\n const submit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!values.name.trim()) {\n setNameError(\"Project name is required.\");\n return;\n }\n onSubmit?.({ ...values, name: values.name.trim() });\n };\n\n return (\n <form\n {...htmlProps}\n className={classNames(\"eth-project-create-form\", className)}\n data-eth-component=\"ProjectCreateForm\"\n aria-labelledby={htmlProps[\"aria-labelledby\"] ?? (title ? titleId : undefined)}\n aria-describedby={describedBy}\n onSubmit={submit}\n noValidate\n >\n {title || description ? (\n <header className=\"eth-project-create-form__header\">\n {title ? (\n <h2 id={titleId} className=\"eth-project-create-form__title\">\n {title}\n </h2>\n ) : null}\n {description ? (\n <p id={descriptionId} className=\"eth-project-create-form__description\">\n {description}\n </p>\n ) : null}\n </header>\n ) : null}\n\n {nameError ? (\n <FormValidationMessage className=\"eth-project-create-form__validation\">\n {nameError}\n </FormValidationMessage>\n ) : null}\n\n <FormSection\n className=\"eth-project-create-form__section\"\n title=\"Project details\"\n description=\"Define the visible identity and initial scope for the workspace.\"\n >\n <div className=\"eth-project-create-form__grid\">\n <FormField\n id=\"project-name\"\n label=\"Name\"\n helperText=\"Shown in project lists, tabs, and approval trails.\"\n required\n error={nameError}\n className=\"eth-project-create-form__field\"\n >\n <TextInput\n value={values.name}\n onChange={(event) => update(\"name\", event.currentTarget.value)}\n autoFocus\n />\n </FormField>\n <FormField\n id=\"project-owner\"\n label=\"Owner\"\n helperText=\"Person or group accountable for project changes.\"\n className=\"eth-project-create-form__field\"\n >\n <TextInput\n value={values.ownerLabel}\n onChange={(event) => update(\"ownerLabel\", event.currentTarget.value)}\n />\n </FormField>\n <FormField\n id=\"project-description\"\n label=\"Description\"\n helperText=\"Summarize the purpose, key outputs, or operating window.\"\n className=\"eth-project-create-form__field eth-project-create-form__field--wide\"\n >\n <Textarea\n value={values.description}\n onChange={(event) => update(\"description\", event.currentTarget.value)}\n rows={4}\n />\n </FormField>\n </div>\n </FormSection>\n\n <FormSection\n className=\"eth-project-create-form__section\"\n title=\"Setup\"\n description=\"Select the starting structure for tasks, resources, and app-domain links.\"\n >\n <div className=\"eth-project-create-form__grid eth-project-create-form__grid--setup\">\n <FormField\n id=\"project-template\"\n label=\"Template\"\n helperText=\"Templates prefill common sections without locking future changes.\"\n className=\"eth-project-create-form__field\"\n >\n <Select\n options={templateOptions}\n value={values.template}\n onChange={(event) => update(\"template\", event.currentTarget.value)}\n />\n </FormField>\n </div>\n </FormSection>\n\n <footer className=\"eth-project-create-form__actions\">\n {onCancel ? (\n <Button intent=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"submit\" intent=\"primary\">\n Create project\n </Button>\n </footer>\n </form>\n );\n}\n","import * as React from \"react\";\nimport { Badge, StatusDot, statusLabel } from \"@echothink-ui/core\";\nimport type { ProjectBaseProps, ProjectSummary } from \"../types\";\nimport {\n classNames,\n formatNumber,\n healthLabel,\n healthToStatus,\n projectHtmlProps,\n statusToSeverity\n} from \"../utils\";\n\nexport interface ProjectSummaryPanelProps extends ProjectBaseProps {\n project?: ProjectSummary;\n}\n\nexport function ProjectSummaryPanel({ project, className, ...props }: ProjectSummaryPanelProps) {\n const resolvedProject: ProjectSummary = project ?? {\n id: \"project\",\n name: \"Project\",\n status: \"not-started\",\n description: \"Project summary\"\n };\n const titleId = `${resolvedProject.id}-summary-title`;\n const descriptionId = resolvedProject.description\n ? `${resolvedProject.id}-summary-description`\n : undefined;\n const metadataItems = [\n { label: \"Project ID\", value: resolvedProject.id },\n { label: \"Owner\", value: resolvedProject.ownerLabel ?? \"Unassigned\" },\n { label: \"Updated\", value: resolvedProject.updatedAt ?? \"Not updated\" },\n { label: \"App domains\", value: formatNumber(resolvedProject.appDomainsCount) },\n { label: \"Open tasks\", value: formatNumber(resolvedProject.openTasksCount) }\n ];\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\n \"eth-project-summary-panel\",\n `eth-project-summary-panel--${resolvedProject.status}`,\n className\n )}\n data-eth-component=\"ProjectSummaryPanel\"\n data-status={resolvedProject.status}\n role=\"region\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n tabIndex={-1}\n >\n <header className=\"eth-project-summary-panel__header\">\n <div className=\"eth-project-summary-panel__heading\">\n <h3 id={titleId}>{resolvedProject.name}</h3>\n {resolvedProject.description ? (\n <p id={descriptionId}>{resolvedProject.description}</p>\n ) : null}\n </div>\n <div className=\"eth-project-summary-panel__status\">\n <Badge severity={statusToSeverity(resolvedProject.status)}>\n {statusLabel(resolvedProject.status)}\n </Badge>\n </div>\n </header>\n <dl className=\"eth-project-summary-panel__metadata\">\n {metadataItems.map((item) => (\n <div className=\"eth-project-summary-panel__metadata-item\" key={item.label}>\n <dt>{item.label}</dt>\n <dd>{item.value}</dd>\n </div>\n ))}\n <div\n className=\"eth-project-summary-panel__metadata-item eth-project-summary-panel__metadata-item--health\"\n >\n <dt>Health</dt>\n <dd>\n <StatusDot\n status={healthToStatus(resolvedProject.healthStatus)}\n label={healthLabel(resolvedProject.healthStatus)}\n />\n </dd>\n </div>\n </dl>\n </section>\n );\n}\n","import * as React from \"react\";\nimport {\n FormField,\n FormSection,\n Select,\n TextInput,\n Textarea\n} from \"@echothink-ui/core\";\nimport type { ProjectBaseProps, ProjectSettings } from \"../types\";\nimport { classNames, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectSettingsPanelProps extends ProjectBaseProps {\n settings?: ProjectSettings;\n onChange?: (settings: ProjectSettings) => void;\n}\n\nconst permissionOptions = [\n { value: \"private\", label: \"Private\" },\n { value: \"team\", label: \"Team\" },\n { value: \"organization\", label: \"Organization\" }\n];\n\nconst roleOptions = [\n { value: \"viewer\", label: \"Viewer\" },\n { value: \"editor\", label: \"Editor\" },\n { value: \"owner\", label: \"Owner\" }\n];\n\nconst providerOptions = [\n { value: \"openai\", label: \"OpenAI\" },\n { value: \"azure-openai\", label: \"Azure OpenAI\" },\n { value: \"custom\", label: \"Custom provider\" }\n];\n\nconst modelOptions = [\n { value: \"gpt-4o\", label: \"GPT-4o\" },\n { value: \"gpt-5.4\", label: \"GPT-5.4\" },\n { value: \"gpt-5.4-mini\", label: \"GPT-5.4 mini\" },\n { value: \"custom\", label: \"Custom model\" }\n];\n\nfunction optionLabel(options: Array<{ value: string; label: string }>, value: string) {\n return options.find((option) => option.value === value)?.label ?? value;\n}\n\nfunction nodeText(node: React.ReactNode) {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n return \"member\";\n}\n\nfunction memberInitials(label: React.ReactNode) {\n const text = nodeText(label);\n const words = text.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0 || text === \"member\") return \"M\";\n return words\n .slice(0, 2)\n .map((word) => word.charAt(0).toUpperCase())\n .join(\"\");\n}\n\nfunction countLabel(count: number, singular: string, plural = `${singular}s`) {\n return `${count} ${count === 1 ? singular : plural}`;\n}\n\nexport function ProjectSettingsPanel({\n settings = {},\n onChange,\n className,\n ...props\n}: ProjectSettingsPanelProps) {\n const titleId = React.useId();\n const members = settings.members ?? [];\n const permissionMode = settings.permissionMode ?? \"private\";\n const defaultRole = settings.defaultRole ?? \"viewer\";\n const modelProvider = settings.modelProvider ?? \"openai\";\n const model = settings.model ?? \"gpt-5.4\";\n const update = (patch: Partial<ProjectSettings>) => {\n onChange?.({ ...settings, ...patch });\n };\n const updateMemberRole = (memberId: string, role: string) => {\n update({\n members: members.map((member) => (member.id === memberId ? { ...member, role } : member))\n });\n };\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-settings-panel\", className)}\n data-eth-component=\"ProjectSettingsPanel\"\n role=\"region\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <header className=\"eth-project-settings-panel__header\">\n <div className=\"eth-project-settings-panel__heading\">\n <p className=\"eth-project-settings-panel__eyebrow\">Project management</p>\n <h2 id={titleId}>Project settings</h2>\n <p>Manage identity, access defaults, members, and the project agent model.</p>\n </div>\n <dl className=\"eth-project-settings-panel__summary\" aria-label=\"Project settings summary\">\n <div>\n <dt>Visibility</dt>\n <dd>{optionLabel(permissionOptions, permissionMode)}</dd>\n </div>\n <div>\n <dt>Members</dt>\n <dd>{countLabel(members.length, \"member\")}</dd>\n </div>\n <div>\n <dt>Model</dt>\n <dd>{optionLabel(modelOptions, model)}</dd>\n </div>\n </dl>\n </header>\n\n <div className=\"eth-project-settings-panel__content\">\n <FormSection title=\"General\" description=\"Core project identity and description.\">\n <div className=\"eth-project-settings-panel__stack\">\n <FormField\n id=\"project-settings-name\"\n label=\"Project name\"\n helperText=\"Shown in project lists, audit records, and app-domain routing.\"\n >\n <TextInput\n value={settings.name ?? \"\"}\n onChange={(event) => update({ name: event.currentTarget.value })}\n />\n </FormField>\n <FormField\n id=\"project-settings-description\"\n label=\"Description\"\n helperText=\"Brief context for collaborators and project agents.\"\n >\n <Textarea\n value={settings.description ?? \"\"}\n rows={4}\n onChange={(event) => update({ description: event.currentTarget.value })}\n />\n </FormField>\n </div>\n </FormSection>\n\n <FormSection title=\"Members\" description=\"People who can work in this project.\">\n <div className=\"eth-project-settings-panel__members\">\n <div className=\"eth-project-settings-panel__member-meta\">\n <span>{countLabel(members.length, \"active member\")}</span>\n <span>Default role: {optionLabel(roleOptions, defaultRole)}</span>\n </div>\n {members.length ? (\n <div className=\"eth-project-settings-panel__member-list\" role=\"list\">\n {members.map((member) => {\n const label = nodeText(member.label);\n return (\n <article\n key={member.id}\n className=\"eth-project-settings-panel__member-row\"\n role=\"listitem\"\n >\n <span\n className=\"eth-project-settings-panel__member-avatar\"\n aria-hidden=\"true\"\n >\n {memberInitials(member.label)}\n </span>\n <div className=\"eth-project-settings-panel__member-main\">\n <strong>{member.label}</strong>\n <span>Project collaborator</span>\n </div>\n <Select\n aria-label={`Role for ${label}`}\n options={roleOptions}\n value={member.role ?? defaultRole}\n onChange={(event) => updateMemberRole(member.id, event.currentTarget.value)}\n />\n </article>\n );\n })}\n </div>\n ) : (\n <p className=\"eth-project-settings-panel__empty\">\n Members added to this project will appear here with their assigned role.\n </p>\n )}\n </div>\n </FormSection>\n\n <FormSection title=\"Permissions\" description=\"Default access policy for project resources.\">\n <div className=\"eth-project-settings-panel__field-grid\">\n <FormField\n id=\"project-settings-permission-mode\"\n label=\"Visibility\"\n helperText=\"Controls the default project audience.\"\n >\n <Select\n options={permissionOptions}\n value={permissionMode}\n onChange={(event) => update({ permissionMode: event.currentTarget.value })}\n />\n </FormField>\n <FormField\n id=\"project-settings-default-role\"\n label=\"Default member role\"\n helperText=\"Applied when a member has no explicit role.\"\n >\n <Select\n options={roleOptions}\n value={defaultRole}\n onChange={(event) => update({ defaultRole: event.currentTarget.value })}\n />\n </FormField>\n </div>\n </FormSection>\n\n <FormSection title=\"Model config\" description=\"Default provider and model for project agents.\">\n <div className=\"eth-project-settings-panel__field-grid\">\n <FormField\n id=\"project-settings-provider\"\n label=\"Provider\"\n helperText=\"Runtime provider for project-level agents.\"\n >\n <Select\n options={providerOptions}\n value={modelProvider}\n onChange={(event) => update({ modelProvider: event.currentTarget.value })}\n />\n </FormField>\n <FormField\n id=\"project-settings-model\"\n label=\"Model\"\n helperText=\"Used when an agent has no override.\"\n >\n <Select\n options={modelOptions}\n value={model}\n onChange={(event) => update({ model: event.currentTarget.value })}\n />\n </FormField>\n </div>\n </FormSection>\n </div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport { EmptyState, StatusDot, statusLabel } from \"@echothink-ui/core\";\nimport type { ProjectBaseProps, ProjectScope } from \"../types\";\nimport { classNames, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectScopeSelectorProps extends ProjectBaseProps {\n scopes?: ProjectScope[];\n activeScopeId?: string;\n onSelect?: (scopeId: string) => void;\n}\n\nconst kindLabels: Record<ProjectScope[\"kind\"], string> = {\n project: \"Project\",\n \"app-domain\": \"App domain\",\n resource: \"Resource\"\n};\n\nexport function ProjectScopeSelector({\n scopes = [],\n activeScopeId,\n onSelect,\n className,\n ...props\n}: ProjectScopeSelectorProps) {\n const groupName = React.useId();\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-scope-selector\", className)}\n data-eth-component=\"ProjectScopeSelector\"\n role=\"region\"\n aria-label=\"Project scopes\"\n tabIndex={-1}\n >\n {scopes.length ? (\n <div\n className=\"eth-project-scope-selector__group\"\n role=\"radiogroup\"\n aria-label=\"Target scope\"\n >\n {scopes.map((scope, index) => {\n const active = activeScopeId === scope.id;\n const inputId = `${groupName}-${index}`;\n\n return (\n <label\n key={scope.id}\n className={classNames(\n \"eth-project-scope-selector__item\",\n active && \"eth-project-scope-selector__item--active\",\n !onSelect && \"eth-project-scope-selector__item--readonly\"\n )}\n htmlFor={inputId}\n >\n <input\n id={inputId}\n className=\"eth-project-scope-selector__control\"\n type=\"radio\"\n name={groupName}\n value={scope.id}\n checked={active}\n readOnly={!onSelect}\n onChange={() => onSelect?.(scope.id)}\n />\n <span className=\"eth-project-scope-selector__content\">\n <span className=\"eth-project-scope-selector__title-row\">\n <span className=\"eth-project-scope-selector__label\">{scope.label}</span>\n {scope.status ? (\n <span className=\"eth-project-scope-selector__status\">\n <StatusDot status={scope.status} label={statusLabel(scope.status)} />\n </span>\n ) : null}\n </span>\n <span className=\"eth-project-scope-selector__kind\">\n {kindLabels[scope.kind]}\n </span>\n </span>\n </label>\n );\n })}\n </div>\n ) : (\n <EmptyState\n className=\"eth-project-scope-selector__empty\"\n title=\"No scopes\"\n description=\"Project, app-domain, and resource targets appear here.\"\n />\n )}\n </section>\n );\n}\n","import * as React from \"react\";\nimport {\n Badge,\n EmptyState,\n StatusDot,\n statusLabel,\n type EthAction\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { ProjectBaseProps, ProjectResource } from \"../types\";\nimport { classNames, formatNumber, projectHtmlProps } from \"../utils\";\n\nconst syncedStatuses = new Set([\"completed\", \"succeeded\", \"synced\", \"active\"]);\nconst attentionStatuses = new Set([\n \"blocked\",\n \"failed\",\n \"stale\",\n \"warning\",\n \"pending-approval\",\n \"approval-required\"\n]);\n\nexport interface ProjectResourcePanelProps extends ProjectBaseProps {\n resources?: ProjectResource[];\n onSelect?: (resourceId: string) => void;\n}\n\nexport function ProjectResourcePanel({\n resources = [],\n onSelect,\n className,\n title = \"Project resources\",\n ...props\n}: ProjectResourcePanelProps) {\n const syncedCount = resources.filter(\n (resource) => resource.status && syncedStatuses.has(resource.status)\n ).length;\n const attentionCount = resources.filter(\n (resource) => resource.status && attentionStatuses.has(resource.status)\n ).length;\n const hasRowActions = Boolean(onSelect);\n\n const columns = React.useMemo<DataColumn<ProjectResource>[]>(\n () => [\n {\n key: \"label\",\n header: \"Resource\",\n width: \"40%\",\n render: (resource) => (\n <div className=\"eth-project-resource-panel__resource\">\n <span className=\"eth-project-resource-panel__resource-icon\" aria-hidden=\"true\">\n {resourceKindInitial(resource.kind)}\n </span>\n <span className=\"eth-project-resource-panel__resource-copy\">\n <strong>{resource.label}</strong>\n <span>{resource.id}</span>\n </span>\n </div>\n )\n },\n {\n key: \"kind\",\n header: \"Kind\",\n width: \"14%\",\n render: (resource) => <Badge severity=\"neutral\">{resourceKindLabel(resource.kind)}</Badge>\n },\n {\n key: \"status\",\n header: \"Status\",\n width: \"20%\",\n render: (resource) =>\n resource.status ? (\n <StatusDot status={resource.status} label={statusLabel(resource.status)} />\n ) : (\n <span className=\"eth-project-resource-panel__muted\">Not tracked</span>\n )\n },\n {\n key: \"updatedAt\",\n header: \"Updated\",\n width: \"16%\",\n render: (resource) => (\n <span className=\"eth-project-resource-panel__updated\">\n {resource.updatedAt ?? \"Not updated\"}\n </span>\n )\n }\n ],\n []\n );\n\n const rowActions = React.useCallback(\n (resource: ProjectResource): EthAction[] =>\n onSelect ? [{ id: \"open\", label: \"Open\", onSelect: () => onSelect(resource.id) }] : [],\n [onSelect]\n );\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-resource-panel\", className)}\n data-eth-component=\"ProjectResourcePanel\"\n role=\"region\"\n aria-label={typeof title === \"string\" ? title : \"Project resources\"}\n tabIndex={-1}\n >\n {title ? (\n <header className=\"eth-project-resource-panel__header\">\n <h3>{title}</h3>\n <dl className=\"eth-project-resource-panel__summary\" aria-label=\"Resource summary\">\n <div>\n <dt>Resources</dt>\n <dd>{formatNumber(resources.length)}</dd>\n </div>\n <div>\n <dt>Synced</dt>\n <dd>{formatNumber(syncedCount)}</dd>\n </div>\n <div>\n <dt>Attention</dt>\n <dd>{formatNumber(attentionCount)}</dd>\n </div>\n </dl>\n </header>\n ) : null}\n <DataTable\n rows={resources}\n columns={columns}\n rowKey=\"id\"\n density=\"compact\"\n className=\"eth-project-resource-panel__table\"\n rowActions={hasRowActions ? rowActions : undefined}\n emptyState={\n <EmptyState\n title=\"No resources\"\n description=\"Linked files, documents, tables, and services appear here.\"\n />\n }\n />\n </section>\n );\n}\n\nfunction resourceKindLabel(kind: string) {\n return kind\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction resourceKindInitial(kind: string) {\n return resourceKindLabel(kind).charAt(0) || \"R\";\n}\n","import * as React from \"react\";\nimport { Badge, EmptyState, type EthSeverity } from \"@echothink-ui/core\";\nimport type { ProjectActivityEvent, ProjectBaseProps } from \"../types\";\nimport { classNames, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectActivityTimelineProps extends ProjectBaseProps {\n events?: ProjectActivityEvent[];\n}\n\nfunction getActivityKindTone(kind: string): EthSeverity {\n const normalized = kind.toLowerCase();\n\n if (/(approve|approved|approval|complete|completed|success|release)/.test(normalized)) {\n return \"success\";\n }\n\n if (/(block|blocked|fail|failed|error|reject|rejected|risk)/.test(normalized)) {\n return \"danger\";\n }\n\n if (/(pending|review|warning|needs|wait)/.test(normalized)) {\n return \"warning\";\n }\n\n if (/(draft|resource|domain|config|sync|agent|update)/.test(normalized)) {\n return \"info\";\n }\n\n return \"neutral\";\n}\n\nfunction getActivityTime(timestamp: string) {\n const value = timestamp.trim();\n const dateTimeMatch = value.match(\n /^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})(?::\\d{2}(?:\\.\\d{1,3})?)?(?:Z|[+-]\\d{2}:?\\d{2})?$/\n );\n\n if (dateTimeMatch) {\n return {\n dateTime: `${dateTimeMatch[1]}T${dateTimeMatch[2]}`,\n label: dateTimeMatch[2]\n };\n }\n\n if (/^\\d{2}:\\d{2}(?::\\d{2})?$/.test(value) || /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n return { dateTime: value, label: value };\n }\n\n return { dateTime: undefined, label: value };\n}\n\nexport function ProjectActivityTimeline({\n events = [],\n className,\n title = \"Activity\",\n ...props\n}: ProjectActivityTimelineProps) {\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-activity-timeline\", className)}\n data-eth-component=\"ProjectActivityTimeline\"\n role=\"region\"\n aria-label={typeof title === \"string\" ? title : \"Project activity\"}\n tabIndex={-1}\n >\n {title ? (\n <header className=\"eth-project-activity-timeline__header\">\n <h3>{title}</h3>\n </header>\n ) : null}\n {events.length ? (\n <ol className=\"eth-project-activity-timeline__list\">\n {events.map((event) => {\n const tone = getActivityKindTone(event.kind);\n const time = getActivityTime(event.timestamp);\n\n return (\n <li\n key={event.id}\n className={classNames(\n \"eth-project-activity-timeline__item\",\n `eth-project-activity-timeline__item--${tone}`\n )}\n data-kind={event.kind}\n >\n <time className=\"eth-project-activity-timeline__time\" dateTime={time.dateTime}>\n {time.label}\n </time>\n <div className=\"eth-project-activity-timeline__rail\" aria-hidden>\n <span className=\"eth-project-activity-timeline__marker\" />\n </div>\n <article className=\"eth-project-activity-timeline__event\">\n <header className=\"eth-project-activity-timeline__event-header\">\n <Badge severity={tone}>{event.kind}</Badge>\n {event.actor ? (\n <span className=\"eth-project-activity-timeline__actor\">\n By {event.actor}\n </span>\n ) : null}\n </header>\n <strong className=\"eth-project-activity-timeline__summary\">\n {event.summary}\n </strong>\n {event.details ? (\n <p className=\"eth-project-activity-timeline__details\">{event.details}</p>\n ) : null}\n </article>\n </li>\n );\n })}\n </ol>\n ) : (\n <EmptyState title=\"No activity\" description=\"Project changes and events appear here.\" />\n )}\n </section>\n );\n}\n","import * as React from \"react\";\nimport { ProjectTabCollection, type ProjectTabItem } from \"@echothink-ui/layouts\";\nimport type { ProjectBaseProps } from \"../types\";\nimport { classNames, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectTabGroupProps extends ProjectBaseProps {\n projectId: string;\n projectLabel: React.ReactNode;\n tabs: ProjectTabItem[];\n activeTabId?: string;\n onActivateTab?: (id: string) => void;\n onCloseTab?: (id: string) => void;\n}\n\nexport function ProjectTabGroup({\n projectId,\n projectLabel,\n tabs,\n activeTabId,\n onActivateTab,\n onCloseTab,\n className,\n ...props\n}: ProjectTabGroupProps) {\n return (\n <ProjectTabCollection\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-tab-group\", className)}\n data-eth-component=\"ProjectTabGroup\"\n projectId={projectId}\n projectLabel={projectLabel}\n tabs={tabs}\n activeTabId={activeTabId}\n onActivateTab={onActivateTab}\n onCloseTab={onCloseTab}\n />\n );\n}\n","import * as React from \"react\";\nimport {\n Button,\n EmptyState,\n Select,\n StatusDot,\n statusLabel,\n type EthAction,\n type EthOperationalStatus\n} from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport { PlusIcon } from \"@echothink-ui/icons\";\nimport type { ProjectBaseProps, ProjectMember } from \"../types\";\nimport { classNames, formatNumber, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectMembersPanelProps extends ProjectBaseProps {\n members?: ProjectMember[];\n roles?: string[];\n onAdd?: () => void;\n onRemove?: (memberId: string) => void;\n onChangeRole?: (memberId: string, role: string) => void;\n}\n\nconst defaultRoleValues = [\"owner\", \"editor\", \"viewer\"];\nconst defaultMemberStatus: EthOperationalStatus = \"active\";\nconst pendingMemberStatuses = new Set<EthOperationalStatus>([\n \"queued\",\n \"pending-approval\",\n \"not-started\"\n]);\n\nfunction roleLabel(role: string) {\n return role\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n}\n\nfunction memberInitials(label: React.ReactNode) {\n if (typeof label !== \"string\" && typeof label !== \"number\") return \"M\";\n const words = String(label).trim().split(/\\s+/).filter(Boolean);\n const first = words[0]?.charAt(0) ?? \"\";\n const last = words.length > 1 ? (words[words.length - 1]?.charAt(0) ?? \"\") : \"\";\n return `${first}${last}`.toUpperCase() || \"M\";\n}\n\nfunction memberStatus(member: ProjectMember) {\n return member.status ?? defaultMemberStatus;\n}\n\nfunction memberStatusLabel(status: EthOperationalStatus) {\n if (status === \"pending-approval\") return \"Pending invite\";\n if (status === \"not-started\" || status === \"queued\") return \"Invited\";\n return statusLabel(status);\n}\n\nexport function ProjectMembersPanel({\n members = [],\n roles = [],\n onAdd,\n onRemove,\n onChangeRole,\n className,\n title = \"Members\",\n ...props\n}: ProjectMembersPanelProps) {\n const roleOptions = React.useMemo(() => {\n const roleValues = new Set(roles.length ? roles : defaultRoleValues);\n for (const member of members) {\n roleValues.add(member.role);\n }\n return Array.from(roleValues).map((role) => ({ value: role, label: roleLabel(role) }));\n }, [members, roles]);\n\n const ownerCount = members.filter((member) => member.role.toLowerCase() === \"owner\").length;\n const pendingCount = members.filter((member) =>\n pendingMemberStatuses.has(memberStatus(member))\n ).length;\n\n const columns = React.useMemo<DataColumn<ProjectMember>[]>(\n () => [\n {\n key: \"label\",\n header: \"Member\",\n width: \"44%\",\n render: (member) => (\n <div className=\"eth-project-members-panel__member\">\n {member.avatar ? (\n <img className=\"eth-project-members-panel__avatar\" src={member.avatar} alt=\"\" />\n ) : (\n <span className=\"eth-project-members-panel__avatar\" aria-hidden=\"true\">\n {memberInitials(member.label)}\n </span>\n )}\n <strong>{member.label}</strong>\n </div>\n )\n },\n {\n key: \"role\",\n header: \"Role\",\n width: \"24%\",\n render: (member) =>\n onChangeRole ? (\n <Select\n aria-label={`Role for ${String(member.label)}`}\n className=\"eth-project-members-panel__role-select\"\n density=\"compact\"\n options={roleOptions}\n value={member.role}\n onChange={(event) => onChangeRole(member.id, event.currentTarget.value)}\n />\n ) : (\n <span className=\"eth-project-members-panel__role-badge\">{roleLabel(member.role)}</span>\n )\n },\n {\n key: \"status\",\n header: \"Status\",\n width: \"20%\",\n render: (member) => {\n const status = memberStatus(member);\n return <StatusDot status={status} label={memberStatusLabel(status)} />;\n }\n }\n ],\n [onChangeRole, roleOptions]\n );\n\n const rowActions = React.useCallback(\n (member: ProjectMember): EthAction[] =>\n onRemove\n ? [{ id: \"remove\", label: \"Remove\", intent: \"danger\", onSelect: () => onRemove(member.id) }]\n : [],\n [onRemove]\n );\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-members-panel\", className)}\n data-eth-component=\"ProjectMembersPanel\"\n role=\"region\"\n aria-label={typeof title === \"string\" ? title : \"Project members\"}\n tabIndex={-1}\n >\n <header className=\"eth-project-members-panel__header\">\n <div className=\"eth-project-members-panel__heading\">\n {title ? <h3>{title}</h3> : null}\n <dl className=\"eth-project-members-panel__summary\" aria-label=\"Member summary\">\n <div>\n <dt>Members</dt>\n <dd>{formatNumber(members.length)}</dd>\n </div>\n <div>\n <dt>Owners</dt>\n <dd>{formatNumber(ownerCount)}</dd>\n </div>\n <div>\n <dt>Pending</dt>\n <dd>{formatNumber(pendingCount)}</dd>\n </div>\n </dl>\n </div>\n {onAdd ? (\n <Button density=\"compact\" icon={<PlusIcon />} intent=\"primary\" onClick={onAdd}>\n Add member\n </Button>\n ) : null}\n </header>\n <DataTable\n rows={members}\n columns={columns}\n rowKey=\"id\"\n density=\"compact\"\n className=\"eth-project-members-panel__table\"\n rowActions={onRemove ? rowActions : undefined}\n emptyState={<EmptyState title=\"No members\" description=\"Project members appear here.\" />}\n />\n </section>\n );\n}\n","import * as React from \"react\";\nimport { Badge, Checkbox, EmptyState } from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { ProjectBaseProps, ProjectPermissionEntity } from \"../types\";\nimport { classNames, projectHtmlProps, entityId, entityLabel, permissionKey } from \"../utils\";\n\ninterface ProjectPermissionRow extends Record<string, unknown> {\n id: string;\n subject: ProjectPermissionEntity;\n resource: ProjectPermissionEntity;\n}\n\nexport interface ProjectPermissionPanelProps extends ProjectBaseProps {\n subjects?: ProjectPermissionEntity[];\n resources?: ProjectPermissionEntity[];\n actions?: ProjectPermissionEntity[];\n assignments?: Record<string, boolean>;\n onChange?: (key: string, granted: boolean) => void;\n}\n\nexport function ProjectPermissionPanel({\n subjects = [],\n resources = [],\n actions = [],\n assignments = {},\n onChange,\n title = \"Project permissions\",\n description = \"Review subject access by resource and action.\",\n density = \"compact\",\n className,\n ...props\n}: ProjectPermissionPanelProps) {\n const hasMatrix = subjects.length > 0 && resources.length > 0 && actions.length > 0;\n const editable = Boolean(onChange);\n const rows = React.useMemo<ProjectPermissionRow[]>(\n () =>\n subjects.flatMap((subject) =>\n resources.map((resource) => ({\n id: `${entityId(subject)}:${entityId(resource)}`,\n subject,\n resource\n }))\n ),\n [resources, subjects]\n );\n const totalPermissions = subjects.length * resources.length * actions.length;\n const grantedCount = React.useMemo(\n () =>\n subjects.reduce(\n (subjectTotal, subject) =>\n subjectTotal +\n resources.reduce(\n (resourceTotal, resource) =>\n resourceTotal +\n actions.filter((action) => assignments[permissionKey(subject, resource, action)])\n .length,\n 0\n ),\n 0\n ),\n [actions, assignments, resources, subjects]\n );\n const missingCount = Math.max(totalPermissions - grantedCount, 0);\n\n const columns = React.useMemo<DataColumn<ProjectPermissionRow>[]>(\n () => [\n {\n key: \"subject\",\n header: \"Subject\",\n width: \"12rem\",\n render: (row) => (\n <strong className=\"eth-project-permission-panel__subject\">\n {entityLabel(row.subject)}\n </strong>\n )\n },\n {\n key: \"resource\",\n header: \"Resource\",\n width: \"12rem\",\n render: (row) => (\n <span className=\"eth-project-permission-panel__resource\">\n {entityLabel(row.resource)}\n </span>\n )\n },\n ...actions.map<DataColumn<ProjectPermissionRow>>((action) => ({\n key: `permission-${entityId(action)}`,\n header: entityLabel(action),\n width: \"9rem\",\n align: \"center\",\n render: (row) => {\n const key = permissionKey(row.subject, row.resource, action);\n const granted = Boolean(assignments[key]);\n const label = `${entityText(action)} permission for ${entityText(\n row.subject\n )} on ${entityText(row.resource)}`;\n\n return editable ? (\n <Checkbox\n aria-label={label}\n className=\"eth-project-permission-panel__toggle\"\n hideLabel\n label={label}\n checked={granted}\n onChange={(event) => onChange?.(key, event.currentTarget.checked)}\n />\n ) : (\n <Badge\n className=\"eth-project-permission-panel__state\"\n severity={granted ? \"success\" : \"neutral\"}\n >\n {granted ? \"Granted\" : \"Not granted\"}\n </Badge>\n );\n }\n }))\n ],\n [actions, assignments, editable, onChange]\n );\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-permission-panel\", className)}\n data-eth-component=\"ProjectPermissionPanel\"\n role=\"region\"\n aria-label={typeof title === \"string\" && title ? title : \"Project permissions\"}\n tabIndex={-1}\n >\n <header className=\"eth-project-permission-panel__header\">\n <div className=\"eth-project-permission-panel__heading\">\n {title ? <h3>{title}</h3> : null}\n {description ? <p>{description}</p> : null}\n </div>\n {hasMatrix ? (\n <dl\n className=\"eth-project-permission-panel__summary\"\n aria-label=\"Project permission summary\"\n >\n <div>\n <dt>Granted</dt>\n <dd>{grantedCount}</dd>\n </div>\n <div>\n <dt>Not granted</dt>\n <dd>{missingCount}</dd>\n </div>\n <div>\n <dt>Actions</dt>\n <dd>{actions.length}</dd>\n </div>\n </dl>\n ) : null}\n </header>\n {hasMatrix ? (\n <DataTable rows={rows} columns={columns} rowKey=\"id\" density={density} />\n ) : (\n <div className=\"eth-project-permission-panel__empty\">\n <EmptyState\n title=\"No permissions\"\n description=\"Subjects, resources, and actions are required to render a permission matrix.\"\n />\n </div>\n )}\n </section>\n );\n}\n\nfunction entityText(entity: ProjectPermissionEntity) {\n const label = entityLabel(entity);\n if (typeof label === \"string\" || typeof label === \"number\") return String(label);\n return entityId(entity);\n}\n","import * as React from \"react\";\nimport { EmptyState, StatusDot, statusLabel, type EthAction } from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { ProjectAppDomainInstance, ProjectBaseProps } from \"../types\";\nimport {\n classNames,\n formatNumber,\n healthLabel,\n healthToStatus,\n projectHtmlProps\n} from \"../utils\";\n\nconst attentionStatuses = new Set([\"blocked\", \"failed\", \"stale\", \"warning\", \"approval-required\"]);\n\nexport interface ProjectAppDomainPanelProps extends ProjectBaseProps {\n instances?: ProjectAppDomainInstance[];\n onOpen?: (instanceId: string) => void;\n onConfigure?: (instanceId: string) => void;\n onRemove?: (instanceId: string) => void;\n}\n\nexport function ProjectAppDomainPanel({\n instances = [],\n onOpen,\n onConfigure,\n onRemove,\n className,\n title = \"App domains\",\n ...props\n}: ProjectAppDomainPanelProps) {\n const runningCount = instances.filter((instance) => instance.status === \"running\").length;\n const attentionCount = instances.filter(\n (instance) =>\n instance.health === \"warning\" ||\n instance.health === \"critical\" ||\n attentionStatuses.has(instance.status)\n ).length;\n const hasRowActions = Boolean(onOpen || onConfigure || onRemove);\n\n const columns = React.useMemo<DataColumn<ProjectAppDomainInstance>[]>(\n () => [\n {\n key: \"appDomainLabel\",\n header: \"App domain\",\n width: \"42%\",\n render: (instance) => (\n <div className=\"eth-project-app-domain-panel__domain\">\n <strong>{instance.appDomainLabel}</strong>\n <span>{instance.id}</span>\n </div>\n )\n },\n {\n key: \"status\",\n header: \"Status\",\n width: \"18%\",\n render: (instance) => (\n <StatusDot status={instance.status} label={statusLabel(instance.status)} />\n )\n },\n {\n key: \"health\",\n header: \"Health\",\n width: \"18%\",\n render: (instance) => (\n <StatusDot status={healthToStatus(instance.health)} label={healthLabel(instance.health)} />\n )\n }\n ],\n []\n );\n\n const rowActions = React.useCallback(\n (instance: ProjectAppDomainInstance): EthAction[] => {\n const actions: EthAction[] = [];\n if (onOpen) {\n actions.push({\n id: \"open\",\n label: \"Open\",\n onSelect: () => onOpen(instance.id)\n });\n }\n if (onConfigure) {\n actions.push({\n id: \"configure\",\n label: \"Configure\",\n onSelect: () => onConfigure(instance.id)\n });\n }\n if (onRemove) {\n actions.push({\n id: \"remove\",\n label: \"Remove\",\n intent: \"danger\",\n onSelect: () => onRemove(instance.id)\n });\n }\n return actions;\n },\n [onConfigure, onOpen, onRemove]\n );\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-app-domain-panel\", className)}\n data-eth-component=\"ProjectAppDomainPanel\"\n role=\"region\"\n aria-label={typeof title === \"string\" ? title : \"Project app domains\"}\n tabIndex={-1}\n >\n {title ? (\n <header className=\"eth-project-app-domain-panel__header\">\n <h3>{title}</h3>\n <dl className=\"eth-project-app-domain-panel__summary\" aria-label=\"App domain summary\">\n <div>\n <dt>Installed</dt>\n <dd>{formatNumber(instances.length)}</dd>\n </div>\n <div>\n <dt>Running</dt>\n <dd>{formatNumber(runningCount)}</dd>\n </div>\n <div>\n <dt>Attention</dt>\n <dd>{formatNumber(attentionCount)}</dd>\n </div>\n </dl>\n </header>\n ) : null}\n <DataTable\n rows={instances}\n columns={columns}\n rowKey=\"id\"\n density=\"compact\"\n className=\"eth-project-app-domain-panel__table\"\n rowActions={hasRowActions ? rowActions : undefined}\n emptyState={\n <EmptyState\n title=\"No app domains\"\n description=\"Installed and running project app domains appear here.\"\n />\n }\n />\n </section>\n );\n}\n","import * as React from \"react\";\nimport { FormField, NumberInput, Select, Slider } from \"@echothink-ui/core\";\nimport type {\n ProjectBaseProps,\n ProjectModelConfig,\n ProjectModelProvider\n} from \"../types\";\nimport { classNames, formatNumber, projectHtmlProps } from \"../utils\";\n\nexport interface ProjectModelConfigPanelProps extends ProjectBaseProps {\n providers?: Array<string | ProjectModelProvider>;\n selectedProvider?: string;\n model?: string;\n params?: ProjectModelConfig[\"params\"];\n onChange?: (config: ProjectModelConfig) => void;\n}\n\nfunction normalizeProvider(provider: string | ProjectModelProvider): ProjectModelProvider {\n return typeof provider === \"string\" ? { id: provider, label: provider } : provider;\n}\n\ntype ProjectModelParamKey = keyof NonNullable<ProjectModelConfig[\"params\"]>;\n\ninterface ProjectModelParamDefinition {\n key: ProjectModelParamKey;\n label: string;\n description: string;\n min: number;\n max: number;\n step: number;\n defaultValue: number;\n control: \"slider\" | \"number\";\n}\n\nconst PARAMETER_DEFINITIONS: ProjectModelParamDefinition[] = [\n {\n key: \"temperature\",\n label: \"Temperature\",\n description: \"Controls response randomness.\",\n min: 0,\n max: 2,\n step: 0.1,\n defaultValue: 0.2,\n control: \"slider\"\n },\n {\n key: \"topP\",\n label: \"Top P\",\n description: \"Limits nucleus sampling to a cumulative probability threshold.\",\n min: 0,\n max: 1,\n step: 0.05,\n defaultValue: 1,\n control: \"slider\"\n },\n {\n key: \"maxTokens\",\n label: \"Max tokens\",\n description: \"Caps the response length for project agent runs.\",\n min: 1,\n max: 200000,\n step: 1,\n defaultValue: 4096,\n control: \"number\"\n }\n];\n\nexport function ProjectModelConfigPanel({\n providers = [],\n selectedProvider,\n model,\n params = {},\n onChange,\n className,\n title = \"Project model configuration\",\n description = \"Default provider, model, and generation limits for project agents.\",\n ...props\n}: ProjectModelConfigPanelProps) {\n const generatedId = React.useId();\n const headingId = `eth-project-model-config-panel-${generatedId}`;\n const normalizedProviders = providers.map(normalizeProvider);\n const requestedProvider = selectedProvider ?? normalizedProviders[0]?.id ?? \"\";\n const activeProviderData =\n normalizedProviders.find((provider) => provider.id === requestedProvider) ??\n normalizedProviders[0];\n const activeProvider = activeProviderData?.id ?? requestedProvider;\n const modelOptions = activeProviderData?.models ?? [];\n const requestedModel = model ?? modelOptions[0]?.id ?? \"\";\n const activeModelData =\n modelOptions.find((option) => option.id === requestedModel) ?? modelOptions[0];\n const activeModel = activeModelData?.id ?? requestedModel;\n const providerOptions = normalizedProviders.length\n ? normalizedProviders.map((provider) => ({\n value: provider.id,\n label: provider.label\n }))\n : [{ value: \"\", label: \"No providers available\", disabled: true }];\n const modelSelectOptions = modelOptions.length\n ? modelOptions.map((option) => ({ value: option.id, label: option.label }))\n : [\n {\n value: \"\",\n label: activeProvider ? \"No models available\" : \"Select a provider first\",\n disabled: true\n }\n ];\n const providerHelperText = normalizedProviders.length\n ? `${normalizedProviders.length} configured ${\n normalizedProviders.length === 1 ? \"provider\" : \"providers\"\n }.`\n : \"Add a provider before selecting a project model.\";\n const modelHelperText = modelOptions.length\n ? `${modelOptions.length} available ${modelOptions.length === 1 ? \"model\" : \"models\"} for ${\n activeProviderData?.label ?? \"this provider\"\n }.`\n : \"No selectable models are configured for this provider.\";\n const tokenLimit = params.maxTokens ?? PARAMETER_DEFINITIONS[2].defaultValue;\n\n const emit = (patch: ProjectModelConfig) => {\n const hasProviderPatch = Object.prototype.hasOwnProperty.call(patch, \"provider\");\n const hasModelPatch = Object.prototype.hasOwnProperty.call(patch, \"model\");\n const nextParams = { ...params, ...patch.params };\n onChange?.({\n provider: hasProviderPatch ? patch.provider : activeProvider,\n model: hasModelPatch ? patch.model : activeModel,\n params: nextParams\n });\n };\n\n const updateParam = (key: ProjectModelParamKey, value: number | undefined) => {\n emit({ params: { [key]: value } as ProjectModelConfig[\"params\"] });\n };\n\n return (\n <section\n {...projectHtmlProps(props)}\n className={classNames(\"eth-project-model-config-panel\", className)}\n data-eth-component=\"ProjectModelConfigPanel\"\n role=\"region\"\n aria-labelledby={headingId}\n tabIndex={-1}\n >\n <header className=\"eth-project-model-config-panel__header\">\n <div className=\"eth-project-model-config-panel__heading\">\n <h3 id={headingId}>{title}</h3>\n {description ? <p>{description}</p> : null}\n </div>\n <dl className=\"eth-project-model-config-panel__summary\" aria-label=\"Selected model summary\">\n <div>\n <dt>Provider</dt>\n <dd>{activeProviderData?.label ?? \"Not configured\"}</dd>\n </div>\n <div>\n <dt>Model</dt>\n <dd>{activeModelData?.label ?? (activeModel || \"Default model\")}</dd>\n </div>\n <div>\n <dt>Max tokens</dt>\n <dd>{formatNumber(tokenLimit)}</dd>\n </div>\n </dl>\n </header>\n\n <div className=\"eth-project-model-config-panel__selectors\">\n <FormField id=\"project-model-provider\" label=\"Provider\" helperText={providerHelperText}>\n <Select\n options={providerOptions}\n value={activeProvider}\n disabled={!normalizedProviders.length}\n onChange={(event) => {\n const nextProvider = normalizedProviders.find(\n (provider) => provider.id === event.currentTarget.value\n );\n\n emit({\n provider: event.currentTarget.value,\n model: nextProvider?.models?.[0]?.id\n });\n }}\n />\n </FormField>\n <FormField id=\"project-model-model\" label=\"Model\" helperText={modelHelperText}>\n <Select\n options={modelSelectOptions}\n value={activeModel}\n disabled={!modelOptions.length}\n onChange={(event) => emit({ model: event.currentTarget.value })}\n />\n </FormField>\n </div>\n\n <div\n className=\"eth-project-model-config-panel__parameters\"\n role=\"group\"\n aria-label=\"Generation parameters\"\n >\n {PARAMETER_DEFINITIONS.map((definition) => (\n <ProjectModelParamControl\n key={definition.key}\n definition={definition}\n value={params[definition.key] ?? definition.defaultValue}\n onChange={(value) => updateParam(definition.key, value)}\n />\n ))}\n </div>\n </section>\n );\n}\n\nfunction ProjectModelParamControl({\n definition,\n value,\n onChange\n}: {\n definition: ProjectModelParamDefinition;\n value: number;\n onChange: (value: number | undefined) => void;\n}) {\n const id = `project-model-${definition.key}`;\n const labelId = `${id}-label`;\n const descriptionId = `${id}-description`;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = Number(event.currentTarget.value);\n if (Number.isFinite(nextValue)) onChange(nextValue);\n };\n\n const handleNumberChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue =\n event.currentTarget.value === \"\" ? undefined : Number(event.currentTarget.value);\n\n if (nextValue === undefined || Number.isFinite(nextValue)) onChange(nextValue);\n };\n\n return (\n <div className=\"eth-project-model-config-panel__parameter\">\n <div className=\"eth-project-model-config-panel__parameter-copy\">\n <h4 id={labelId}>{definition.label}</h4>\n <p id={descriptionId}>{definition.description}</p>\n <dl className=\"eth-project-model-config-panel__parameter-meta\">\n <div>\n <dt>Range</dt>\n <dd>\n {formatParamValue(definition.min, definition.step)} -{\" \"}\n {formatParamValue(definition.max, definition.step)}\n </dd>\n </div>\n <div>\n <dt>Current</dt>\n <dd>{formatParamValue(value, definition.step)}</dd>\n </div>\n </dl>\n </div>\n <div className=\"eth-project-model-config-panel__parameter-control\">\n {definition.control === \"number\" ? (\n <NumberInput\n id={`${id}-input`}\n aria-describedby={descriptionId}\n aria-labelledby={labelId}\n density=\"compact\"\n hideLabel\n labelText={definition.label}\n min={definition.min}\n max={definition.max}\n step={definition.step}\n value={value}\n onChange={handleNumberChange}\n />\n ) : (\n <Slider\n id={`${id}-slider`}\n aria-describedby={descriptionId}\n aria-labelledby={labelId}\n hideLabel\n labelText={definition.label}\n min={definition.min}\n max={definition.max}\n step={definition.step}\n value={value}\n onChange={handleChange}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction formatParamValue(value: number, step: number) {\n const maximumFractionDigits = step >= 1 ? 0 : String(step).split(\".\")[1]?.length ?? 2;\n\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits\n }).format(value);\n}\n","import * as React from \"react\";\nimport { StatusDot, type EthAction } from \"@echothink-ui/core\";\nimport { KPIBlock } from \"@echothink-ui/charts\";\nimport { PageHeader } from \"@echothink-ui/layouts\";\nimport type {\n ProjectActivityEvent,\n ProjectAppDomainInstance,\n ProjectBaseProps,\n ProjectResource,\n ProjectSummary\n} from \"../types\";\nimport { projectHtmlProps } from \"../utils\";\nimport { ProjectActivityTimeline } from \"./ProjectActivityTimeline\";\nimport { ProjectAppDomainPanel } from \"./ProjectAppDomainPanel\";\nimport { ProjectResourcePanel } from \"./ProjectResourcePanel\";\nimport { ProjectStatusSummary } from \"./ProjectStatusSummary\";\n\nexport interface ProjectDashboardTemplateProps extends ProjectBaseProps {\n project?: ProjectSummary;\n projects?: ProjectSummary[];\n events?: ProjectActivityEvent[];\n resources?: ProjectResource[];\n instances?: ProjectAppDomainInstance[];\n actions?: EthAction[];\n}\n\nconst demoProject: ProjectSummary = {\n id: \"project-demo\",\n name: \"Project dashboard\",\n status: \"in-progress\",\n description: \"Project overview for resources, tasks, activity, and app domains.\",\n ownerLabel: \"Operations\",\n updatedAt: \"Today\",\n appDomainsCount: 2,\n openTasksCount: 7,\n healthStatus: \"healthy\"\n};\n\nconst demoEvents: ProjectActivityEvent[] = [\n {\n id: \"event-1\",\n timestamp: \"2026-05-27 09:20\",\n actor: \"EchoThink\",\n kind: \"resource\",\n summary: \"Resource inventory refreshed\"\n },\n {\n id: \"event-2\",\n timestamp: \"2026-05-27 10:05\",\n actor: \"Project lead\",\n kind: \"app-domain\",\n summary: \"Analytics domain configured\"\n }\n];\n\nconst demoResources: ProjectResource[] = [\n { id: \"res-1\", label: \"Launch brief\", kind: \"document\", status: \"synced\", updatedAt: \"Today\" },\n { id: \"res-2\", label: \"Task backlog\", kind: \"table\", status: \"in-progress\", updatedAt: \"Today\" }\n];\n\nconst demoInstances: ProjectAppDomainInstance[] = [\n { id: \"inst-1\", appDomainLabel: \"Analytics\", status: \"running\", health: \"healthy\" },\n { id: \"inst-2\", appDomainLabel: \"Document review\", status: \"active\", health: \"warning\" }\n];\n\nexport function ProjectDashboardTemplate({\n project = demoProject,\n projects,\n events = demoEvents,\n resources = demoResources,\n instances = demoInstances,\n className,\n actions,\n ...props\n}: ProjectDashboardTemplateProps) {\n const projectSet = projects ?? [project];\n\n return (\n <main\n {...projectHtmlProps(props)}\n className={`eth-project-dashboard-template ${className ?? \"\"}`}\n data-eth-component=\"ProjectDashboardTemplate\"\n >\n <PageHeader\n title={project.name}\n subtitle={project.description}\n status={project.status}\n actions={actions}\n />\n <div className=\"eth-project-dashboard-template__kpis\" role=\"region\" aria-label=\"Project KPIs\">\n <KPIBlock title=\"Open tasks\" value={project.openTasksCount ?? 0} />\n <KPIBlock title=\"App domains\" value={project.appDomainsCount ?? 0} />\n <KPIBlock\n title=\"Health\"\n value={project.healthStatus ?? \"healthy\"}\n status={<StatusDot status=\"synced\" label=\"Operational\" />}\n />\n </div>\n <ProjectStatusSummary projects={projectSet} />\n <div className=\"eth-project-dashboard-template__grid\">\n <ProjectActivityTimeline events={events} />\n <ProjectResourcePanel resources={resources} />\n <ProjectAppDomainPanel instances={instances} />\n </div>\n </main>\n );\n}\n","import \"./styles.css\";\n\nexport * from \"./types\";\nexport * from \"./components/ProjectManagementPage\";\nexport * from \"./components/ProjectCard\";\nexport * from \"./components/ProjectTable\";\nexport * from \"./components/ProjectTab\";\nexport * from \"./components/ProjectStatusSummary\";\nexport * from \"./components/ProjectCreateForm\";\nexport * from \"./components/ProjectSummaryPanel\";\nexport * from \"./components/ProjectSettingsPanel\";\nexport * from \"./components/ProjectScopeSelector\";\nexport * from \"./components/ProjectResourcePanel\";\nexport * from \"./components/ProjectActivityTimeline\";\nexport * from \"./components/ProjectTabGroup\";\nexport * from \"./components/ProjectMembersPanel\";\nexport * from \"./components/ProjectPermissionPanel\";\nexport * from \"./components/ProjectAppDomainPanel\";\nexport * from \"./components/ProjectModelConfigPanel\";\nexport * from \"./components/ProjectDashboardTemplate\";\n\nexport const ProjectComponentNames = [\n \"ProjectManagementPage\",\n \"ProjectCard\",\n \"ProjectTable\",\n \"ProjectTab\",\n \"ProjectStatusSummary\",\n \"ProjectCreateForm\",\n \"ProjectSummaryPanel\",\n \"ProjectSettingsPanel\",\n \"ProjectScopeSelector\",\n \"ProjectResourcePanel\",\n \"ProjectActivityTimeline\",\n \"ProjectTabGroup\",\n \"ProjectMembersPanel\",\n \"ProjectPermissionPanel\",\n \"ProjectAppDomainPanel\",\n \"ProjectModelConfigPanel\",\n \"ProjectDashboardTemplate\"\n] as const;\nexport type ProjectComponentName = (typeof ProjectComponentNames)[number];\n"],"mappings":"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","names":["React","Button","EmptyState","React","Badge","statusLabel","jsx","jsxs","Badge","statusLabel","jsx","jsxs","EmptyState","Button","Badge","Button","StatusDot","statusLabel","jsx","jsxs","Badge","statusLabel","StatusDot","Button","jsx","React","Button","jsx","jsxs","Button","Badge","StatusDot","statusLabel","jsx","jsxs","Badge","statusLabel","StatusDot","React","FormField","FormSection","Select","TextInput","Textarea","jsx","jsxs","FormSection","FormField","TextInput","Textarea","Select","React","EmptyState","StatusDot","statusLabel","jsx","jsxs","StatusDot","statusLabel","EmptyState","React","Badge","EmptyState","StatusDot","statusLabel","DataTable","jsx","jsxs","Badge","StatusDot","statusLabel","DataTable","EmptyState","Badge","EmptyState","jsx","jsxs","Badge","EmptyState","jsx","React","Button","EmptyState","Select","StatusDot","statusLabel","DataTable","jsx","jsxs","memberInitials","statusLabel","roleOptions","Select","StatusDot","Button","DataTable","EmptyState","React","Badge","EmptyState","DataTable","jsx","jsxs","Badge","DataTable","EmptyState","React","EmptyState","StatusDot","statusLabel","DataTable","jsx","jsxs","attentionStatuses","StatusDot","statusLabel","DataTable","EmptyState","React","FormField","Select","jsx","jsxs","modelOptions","providerOptions","FormField","Select","StatusDot","KPIBlock","PageHeader","jsx","jsxs","PageHeader","KPIBlock","StatusDot"]}
@@ -0,0 +1,99 @@
1
+ import type * as React from "react";
2
+ import type { EthAction, EthOperationalStatus, SurfaceComponentProps } from "@echothink-ui/core";
3
+ export type ProjectHealthStatus = "healthy" | "warning" | "critical";
4
+ export interface ProjectSummary extends Record<string, unknown> {
5
+ id: string;
6
+ name: string;
7
+ status: EthOperationalStatus;
8
+ description?: React.ReactNode;
9
+ ownerLabel?: React.ReactNode;
10
+ updatedAt?: React.ReactNode;
11
+ appDomainsCount?: number;
12
+ openTasksCount?: number;
13
+ healthStatus?: ProjectHealthStatus;
14
+ }
15
+ export interface ProjectStatusSummaryData {
16
+ byStatus: Partial<Record<EthOperationalStatus, number>>;
17
+ healthyPercent: number;
18
+ blockedCount: number;
19
+ }
20
+ export interface ProjectCreateValues {
21
+ name: string;
22
+ description?: string;
23
+ ownerLabel?: string;
24
+ template: string;
25
+ }
26
+ export interface ProjectSettings {
27
+ name?: string;
28
+ description?: string;
29
+ members?: Array<{
30
+ id: string;
31
+ label: React.ReactNode;
32
+ role?: string;
33
+ }>;
34
+ permissionMode?: string;
35
+ defaultRole?: string;
36
+ modelProvider?: string;
37
+ model?: string;
38
+ }
39
+ export interface ProjectScope extends Record<string, unknown> {
40
+ id: string;
41
+ label: React.ReactNode;
42
+ kind: "project" | "app-domain" | "resource";
43
+ status?: EthOperationalStatus;
44
+ }
45
+ export interface ProjectResource extends Record<string, unknown> {
46
+ id: string;
47
+ kind: string;
48
+ label: React.ReactNode;
49
+ status?: EthOperationalStatus;
50
+ updatedAt?: React.ReactNode;
51
+ }
52
+ export interface ProjectActivityEvent {
53
+ id: string;
54
+ timestamp: string;
55
+ actor?: React.ReactNode;
56
+ kind: string;
57
+ summary: React.ReactNode;
58
+ details?: React.ReactNode;
59
+ }
60
+ export interface ProjectMember extends Record<string, unknown> {
61
+ id: string;
62
+ label: React.ReactNode;
63
+ role: string;
64
+ avatar?: string;
65
+ status?: EthOperationalStatus;
66
+ }
67
+ export type ProjectPermissionEntity = string | {
68
+ id: string;
69
+ label: React.ReactNode;
70
+ };
71
+ export interface ProjectAppDomainInstance extends Record<string, unknown> {
72
+ id: string;
73
+ appDomainLabel: React.ReactNode;
74
+ status: EthOperationalStatus;
75
+ health?: ProjectHealthStatus;
76
+ }
77
+ export interface ProjectModelProvider {
78
+ id: string;
79
+ label: string;
80
+ models?: Array<{
81
+ id: string;
82
+ label: string;
83
+ }>;
84
+ }
85
+ export interface ProjectModelConfig {
86
+ provider?: string;
87
+ model?: string;
88
+ params?: {
89
+ temperature?: number;
90
+ topP?: number;
91
+ maxTokens?: number;
92
+ };
93
+ }
94
+ export type ProjectBaseProps = Omit<SurfaceComponentProps, "actions" | "children" | "items" | "metadata" | "onChange" | "onSelect" | "onSubmit"> & {
95
+ children?: React.ReactNode;
96
+ };
97
+ export type ProjectActionProps = {
98
+ actions?: EthAction[];
99
+ };