@emberai-engg/task-board 0.5.0 → 0.6.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.
package/dist/index.d.mts CHANGED
@@ -27,6 +27,8 @@ interface StructuredDescription {
27
27
  * Not rendered in the current detail UI.
28
28
  */
29
29
  open_questions: string;
30
+ /** Long-form markdown rendered under the Technical Details tab on the detail page. */
31
+ technical_details?: string;
30
32
  /** Per-section review status, e.g. `{ problem: "approved" }`. Defaults to draft when absent. */
31
33
  section_status?: Record<string, SectionStatus>;
32
34
  }
@@ -41,11 +43,25 @@ interface Task {
41
43
  created_by: string;
42
44
  created_by_name: string;
43
45
  comment_count: number;
46
+ /** Legacy free-form tag slugs (read-only on new tasks). Prefer `applied_tag_ids`. */
44
47
  tags?: string[];
48
+ /** Workspace tag pool IDs applied to this task. */
49
+ applied_tag_ids?: string[];
45
50
  created_at: string;
46
51
  updated_at: string;
47
52
  has_unread?: boolean;
48
53
  }
54
+ /**
55
+ * A workspace-level tag definition. Tasks reference these by `applied_tag_ids`
56
+ * so a rename instantly affects every task that carries the tag.
57
+ */
58
+ interface Tag {
59
+ id: string;
60
+ name: string;
61
+ /** Tailwind class string (e.g. `"bg-red-100 text-red-700"`). */
62
+ color: string;
63
+ created_at?: string;
64
+ }
49
65
  interface ActivityEntry {
50
66
  id: string;
51
67
  type: string;
@@ -218,7 +234,8 @@ interface CreateTaskPayload {
218
234
  description?: StructuredDescription;
219
235
  priority: string;
220
236
  status: string;
221
- tags: string[];
237
+ tags?: string[];
238
+ applied_tag_ids?: string[];
222
239
  }
223
240
  interface UpdateTaskPayload {
224
241
  title?: string;
@@ -227,6 +244,44 @@ interface UpdateTaskPayload {
227
244
  status?: string;
228
245
  position?: number;
229
246
  tags?: string[];
247
+ applied_tag_ids?: string[];
248
+ }
249
+ interface CreateTagPayload {
250
+ name: string;
251
+ color?: string;
252
+ }
253
+ interface UpdateTagPayload {
254
+ name?: string;
255
+ color?: string;
256
+ }
257
+ /**
258
+ * Activity entry enriched with parent task metadata for the Overview feed.
259
+ * The detail page uses the plainer `ActivityEntry` instead.
260
+ */
261
+ interface ActivityFeedItem {
262
+ id: string;
263
+ type: string;
264
+ task_id: string;
265
+ task_title: string;
266
+ project_slug: string;
267
+ from_status?: string | null;
268
+ to_status?: string | null;
269
+ user: string;
270
+ user_name: string;
271
+ created_at: string;
272
+ }
273
+ /** Outstanding question enriched with parent task metadata. */
274
+ interface OutstandingQuestion {
275
+ id: string;
276
+ task_id: string;
277
+ task_title: string;
278
+ project_slug: string;
279
+ text: string;
280
+ status: QuestionStatus;
281
+ asked_by: string;
282
+ asked_by_name: string;
283
+ created_at: string;
284
+ updated_at: string;
230
285
  }
231
286
  interface CreateCommentPayload {
232
287
  content: string;
@@ -293,6 +348,17 @@ interface TaskCardProps {
293
348
  onClick: () => void;
294
349
  onShare: (e: React__default.MouseEvent) => void;
295
350
  copied: boolean;
351
+ /**
352
+ * Workspace tag pool, keyed by ID. When provided, `task.applied_tag_ids` are
353
+ * resolved through this map; otherwise the card falls back to the legacy
354
+ * string-based `task.tags` field.
355
+ */
356
+ tagsById?: Map<string, Tag>;
357
+ /**
358
+ * Optional handler for the dashed "+" tag button on the card. When omitted
359
+ * the button is hidden — keeps existing consumers backwards-compatible.
360
+ */
361
+ onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
296
362
  }
297
363
  declare const TaskCard: React__default.NamedExoticComponent<TaskCardProps>;
298
364
 
@@ -307,17 +373,26 @@ interface KanbanColumnProps {
307
373
  onTaskShare: (taskId: string, e: React__default.MouseEvent) => void;
308
374
  copiedTaskId: string | null;
309
375
  onLoadMore: () => void;
376
+ /** Workspace tag pool keyed by ID. Forwarded to each TaskCard. */
377
+ tagsById?: Map<string, Tag>;
378
+ /** Click handler for the dashed "+" tag button on each card. */
379
+ onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
310
380
  }
311
- declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
381
+ declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, tagsById, onAddTag, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
312
382
 
313
383
  interface FilterBarProps {
314
384
  projects: Project[];
315
385
  selectedProject: string;
316
386
  onSelectProject: (slug: string) => void;
317
- filterTags: string[];
318
- onSetFilterTags: (tags: string[]) => void;
387
+ /** Workspace tag pool — filter dropdown lists every tag in here. */
388
+ tagPool?: Tag[];
389
+ /** Selected workspace tag IDs that the filter is currently active for. */
390
+ filterTagIds?: string[];
391
+ onSetFilterTagIds?: (ids: string[]) => void;
392
+ /** Extra controls rendered on the right of the bar (e.g. layout toggle). */
393
+ rightSlot?: React__default.ReactNode;
319
394
  }
320
- declare function FilterBar({ projects, selectedProject, onSelectProject, filterTags, onSetFilterTags, }: FilterBarProps): react_jsx_runtime.JSX.Element;
395
+ declare function FilterBar({ projects, selectedProject, onSelectProject, tagPool, filterTagIds, onSetFilterTagIds, rightSlot, }: FilterBarProps): react_jsx_runtime.JSX.Element;
321
396
 
322
397
  interface NotificationBellProps {
323
398
  onOpenTask: (taskId: string, projectSlug: string) => void;
@@ -345,14 +420,21 @@ interface TagBadgeProps {
345
420
  }
346
421
  declare function TagBadge({ tag, onRemove, size }: TagBadgeProps): react_jsx_runtime.JSX.Element;
347
422
 
348
- /** Renders text with @mentions highlighted as styled badges. */
423
+ /**
424
+ * Renders text with `@[Name](username)` mention markup highlighted as
425
+ * styled badges. Plain text is rendered verbatim.
426
+ *
427
+ * Splitting and stripping go through hand-written `indexOf` scanners in
428
+ * `utils/mentions` to keep parsing linear-time on adversarial input
429
+ * (CodeQL js/polynomial-redos).
430
+ */
349
431
  declare function MentionText({ text, className }: {
350
432
  text: string;
351
433
  className?: string;
352
434
  }): react_jsx_runtime.JSX.Element | null;
353
- /** Convert stored @[Name](username) to display @Name for textarea */
435
+ /** Convert stored `@[Name](username)` to display `@Name` for textarea. */
354
436
  declare function toDisplayText(stored: string): string;
355
- /** Convert display @Name back to stored @[Name](username) using a mention map */
437
+ /** Convert display `@Name` back to stored `@[Name](username)` using a mention map. */
356
438
  declare function toStoredText(display: string, mentionMap: Map<string, string>): string;
357
439
 
358
440
  interface MentionTextareaProps {
@@ -769,6 +851,46 @@ interface HighlightBubbleProps {
769
851
  */
770
852
  declare function HighlightBubble({ bubble, onComment }: HighlightBubbleProps): react_jsx_runtime.JSX.Element | null;
771
853
 
854
+ interface TagManagerPopoverProps {
855
+ /** Trigger button rect (viewport coords). Used for fixed positioning. */
856
+ anchor: DOMRect;
857
+ /** IDs of tags currently applied to this task. */
858
+ appliedTagIds: string[];
859
+ /** The full workspace tag pool. */
860
+ pool: Tag[];
861
+ /** Persist the next set of applied tag IDs. */
862
+ onApplyTagIds: (nextIds: string[]) => void;
863
+ /** Create a new pool tag and resolve with its persisted form. */
864
+ onCreateTag: (name: string) => Promise<Tag | null>;
865
+ /** Rename a pool tag (propagates everywhere). */
866
+ onRenameTag: (id: string, newName: string) => void;
867
+ onClose: () => void;
868
+ }
869
+ declare function TagManagerPopover({ anchor, appliedTagIds, pool, onApplyTagIds, onCreateTag, onRenameTag, onClose, }: TagManagerPopoverProps): react_jsx_runtime.JSX.Element;
870
+
871
+ interface OverviewPanelProps {
872
+ /** Projects the current user has access to (drives the filter dropdown). */
873
+ availableProjects: Project[];
874
+ /** Initial project filter — defaults to "all". */
875
+ initialProjectSlug?: string;
876
+ /** Open a task in the consumer's preferred way (route push, slide-over, etc). */
877
+ onOpenTask?: (taskId: string, projectSlug: string) => void;
878
+ /** Optional column registry — used to render coloured status pills in moves. */
879
+ columns?: ColumnConfig[];
880
+ }
881
+ declare function OverviewPanel({ availableProjects, initialProjectSlug, onOpenTask, columns: columnsOverride, }: OverviewPanelProps): react_jsx_runtime.JSX.Element;
882
+
883
+ interface ListLayoutProps {
884
+ tasks: Record<string, Task[]>;
885
+ columnTotals: Record<string, number>;
886
+ filterTagIds: string[];
887
+ tagsById: Map<string, Tag>;
888
+ onTaskClick: (task: Task) => void;
889
+ onAddTag: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
890
+ onAddTaskToColumn: (statusKey: string) => void;
891
+ }
892
+ declare function ListLayout({ tasks, columnTotals, filterTagIds, tagsById, onTaskClick, onAddTag, onAddTaskToColumn, }: ListLayoutProps): react_jsx_runtime.JSX.Element;
893
+
772
894
  interface TaskBoardService {
773
895
  listTasks(projectSlug: string, perColumn?: number): Promise<Record<string, ColumnResponse>>;
774
896
  listColumnTasks(projectSlug: string, statusKey: string, offset: number, limit: number): Promise<Task[]>;
@@ -801,6 +923,12 @@ interface TaskBoardService {
801
923
  listNotifications(limit?: number): Promise<Notification[]>;
802
924
  markNotificationRead(notificationId: string): Promise<void>;
803
925
  markAllNotificationsRead(): Promise<void>;
926
+ listTags(): Promise<Tag[]>;
927
+ createTag(data: CreateTagPayload): Promise<Tag>;
928
+ updateTag(tagId: string, data: UpdateTagPayload): Promise<Tag>;
929
+ deleteTag(tagId: string): Promise<void>;
930
+ listActivityFeed(projectSlug?: string, limit?: number): Promise<ActivityFeedItem[]>;
931
+ listOutstandingQuestions(projectSlug?: string, statusFilter?: QuestionStatus, limit?: number): Promise<OutstandingQuestion[]>;
804
932
  }
805
933
  declare function createTaskBoardService(apiClient: ApiClient, basePath?: string): TaskBoardService;
806
934
 
@@ -946,6 +1074,29 @@ interface UseTaskAttachmentsResult {
946
1074
  */
947
1075
  declare function useTaskAttachments(taskId: string | null, initial?: Attachment[]): UseTaskAttachmentsResult;
948
1076
 
1077
+ /**
1078
+ * Workspace-level tag pool. Every consumer reads from the same server-backed
1079
+ * list and mutates through the same CRUD endpoints, so a rename or create on
1080
+ * one surface (e.g. the board's tag popover) is instantly reflected on every
1081
+ * other surface (e.g. the task detail page) on the next render.
1082
+ */
1083
+ interface TagPool {
1084
+ tags: Tag[];
1085
+ byId: Map<string, Tag>;
1086
+ loading: boolean;
1087
+ refresh: () => Promise<void>;
1088
+ /** Create a pool tag by name (idempotent — returns the existing one if the name matches). */
1089
+ create: (name: string, color?: string) => Promise<Tag | null>;
1090
+ /** Rename and/or recolor an existing pool tag. */
1091
+ update: (id: string, body: {
1092
+ name?: string;
1093
+ color?: string;
1094
+ }) => Promise<Tag | null>;
1095
+ /** Delete a pool tag (and remove it from every task that references it). */
1096
+ remove: (id: string) => Promise<boolean>;
1097
+ }
1098
+ declare function useTagPool(): TagPool;
1099
+
949
1100
  declare function getPriorityStyle(priority: string): PriorityConfig;
950
1101
  declare function getTagStyle(tag: string): TagConfig;
951
1102
  declare function getInitials(name: string): string;
@@ -1032,4 +1183,4 @@ declare const HistoryIcon: React__default.FC<IconProps>;
1032
1183
  /** Sidebar-toggle icon used to collapse / re-open the threads panel. */
1033
1184
  declare const SidebarToggleIcon: React__default.FC<IconProps>;
1034
1185
 
1035
- export { type ActivityEntry, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, TagBadge, type TagBadgeProps, type TagConfig, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
1186
+ export { type ActivityEntry, type ActivityFeedItem, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, type CreateTagPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListLayout, type ListLayoutProps, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, type OutstandingQuestion, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, OverviewPanel, type OverviewPanelProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, type Tag, TagBadge, type TagBadgeProps, type TagConfig, TagManagerPopover, type TagManagerPopoverProps, type TagPool, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTagPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTagPool, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
package/dist/index.d.ts CHANGED
@@ -27,6 +27,8 @@ interface StructuredDescription {
27
27
  * Not rendered in the current detail UI.
28
28
  */
29
29
  open_questions: string;
30
+ /** Long-form markdown rendered under the Technical Details tab on the detail page. */
31
+ technical_details?: string;
30
32
  /** Per-section review status, e.g. `{ problem: "approved" }`. Defaults to draft when absent. */
31
33
  section_status?: Record<string, SectionStatus>;
32
34
  }
@@ -41,11 +43,25 @@ interface Task {
41
43
  created_by: string;
42
44
  created_by_name: string;
43
45
  comment_count: number;
46
+ /** Legacy free-form tag slugs (read-only on new tasks). Prefer `applied_tag_ids`. */
44
47
  tags?: string[];
48
+ /** Workspace tag pool IDs applied to this task. */
49
+ applied_tag_ids?: string[];
45
50
  created_at: string;
46
51
  updated_at: string;
47
52
  has_unread?: boolean;
48
53
  }
54
+ /**
55
+ * A workspace-level tag definition. Tasks reference these by `applied_tag_ids`
56
+ * so a rename instantly affects every task that carries the tag.
57
+ */
58
+ interface Tag {
59
+ id: string;
60
+ name: string;
61
+ /** Tailwind class string (e.g. `"bg-red-100 text-red-700"`). */
62
+ color: string;
63
+ created_at?: string;
64
+ }
49
65
  interface ActivityEntry {
50
66
  id: string;
51
67
  type: string;
@@ -218,7 +234,8 @@ interface CreateTaskPayload {
218
234
  description?: StructuredDescription;
219
235
  priority: string;
220
236
  status: string;
221
- tags: string[];
237
+ tags?: string[];
238
+ applied_tag_ids?: string[];
222
239
  }
223
240
  interface UpdateTaskPayload {
224
241
  title?: string;
@@ -227,6 +244,44 @@ interface UpdateTaskPayload {
227
244
  status?: string;
228
245
  position?: number;
229
246
  tags?: string[];
247
+ applied_tag_ids?: string[];
248
+ }
249
+ interface CreateTagPayload {
250
+ name: string;
251
+ color?: string;
252
+ }
253
+ interface UpdateTagPayload {
254
+ name?: string;
255
+ color?: string;
256
+ }
257
+ /**
258
+ * Activity entry enriched with parent task metadata for the Overview feed.
259
+ * The detail page uses the plainer `ActivityEntry` instead.
260
+ */
261
+ interface ActivityFeedItem {
262
+ id: string;
263
+ type: string;
264
+ task_id: string;
265
+ task_title: string;
266
+ project_slug: string;
267
+ from_status?: string | null;
268
+ to_status?: string | null;
269
+ user: string;
270
+ user_name: string;
271
+ created_at: string;
272
+ }
273
+ /** Outstanding question enriched with parent task metadata. */
274
+ interface OutstandingQuestion {
275
+ id: string;
276
+ task_id: string;
277
+ task_title: string;
278
+ project_slug: string;
279
+ text: string;
280
+ status: QuestionStatus;
281
+ asked_by: string;
282
+ asked_by_name: string;
283
+ created_at: string;
284
+ updated_at: string;
230
285
  }
231
286
  interface CreateCommentPayload {
232
287
  content: string;
@@ -293,6 +348,17 @@ interface TaskCardProps {
293
348
  onClick: () => void;
294
349
  onShare: (e: React__default.MouseEvent) => void;
295
350
  copied: boolean;
351
+ /**
352
+ * Workspace tag pool, keyed by ID. When provided, `task.applied_tag_ids` are
353
+ * resolved through this map; otherwise the card falls back to the legacy
354
+ * string-based `task.tags` field.
355
+ */
356
+ tagsById?: Map<string, Tag>;
357
+ /**
358
+ * Optional handler for the dashed "+" tag button on the card. When omitted
359
+ * the button is hidden — keeps existing consumers backwards-compatible.
360
+ */
361
+ onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
296
362
  }
297
363
  declare const TaskCard: React__default.NamedExoticComponent<TaskCardProps>;
298
364
 
@@ -307,17 +373,26 @@ interface KanbanColumnProps {
307
373
  onTaskShare: (taskId: string, e: React__default.MouseEvent) => void;
308
374
  copiedTaskId: string | null;
309
375
  onLoadMore: () => void;
376
+ /** Workspace tag pool keyed by ID. Forwarded to each TaskCard. */
377
+ tagsById?: Map<string, Tag>;
378
+ /** Click handler for the dashed "+" tag button on each card. */
379
+ onAddTag?: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
310
380
  }
311
- declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
381
+ declare function KanbanColumn({ column, tasks, totalCount, unreadCount, loadingMore, onAddTask, onTaskClick, onTaskShare, copiedTaskId, onLoadMore, tagsById, onAddTag, }: KanbanColumnProps): react_jsx_runtime.JSX.Element;
312
382
 
313
383
  interface FilterBarProps {
314
384
  projects: Project[];
315
385
  selectedProject: string;
316
386
  onSelectProject: (slug: string) => void;
317
- filterTags: string[];
318
- onSetFilterTags: (tags: string[]) => void;
387
+ /** Workspace tag pool — filter dropdown lists every tag in here. */
388
+ tagPool?: Tag[];
389
+ /** Selected workspace tag IDs that the filter is currently active for. */
390
+ filterTagIds?: string[];
391
+ onSetFilterTagIds?: (ids: string[]) => void;
392
+ /** Extra controls rendered on the right of the bar (e.g. layout toggle). */
393
+ rightSlot?: React__default.ReactNode;
319
394
  }
320
- declare function FilterBar({ projects, selectedProject, onSelectProject, filterTags, onSetFilterTags, }: FilterBarProps): react_jsx_runtime.JSX.Element;
395
+ declare function FilterBar({ projects, selectedProject, onSelectProject, tagPool, filterTagIds, onSetFilterTagIds, rightSlot, }: FilterBarProps): react_jsx_runtime.JSX.Element;
321
396
 
322
397
  interface NotificationBellProps {
323
398
  onOpenTask: (taskId: string, projectSlug: string) => void;
@@ -345,14 +420,21 @@ interface TagBadgeProps {
345
420
  }
346
421
  declare function TagBadge({ tag, onRemove, size }: TagBadgeProps): react_jsx_runtime.JSX.Element;
347
422
 
348
- /** Renders text with @mentions highlighted as styled badges. */
423
+ /**
424
+ * Renders text with `@[Name](username)` mention markup highlighted as
425
+ * styled badges. Plain text is rendered verbatim.
426
+ *
427
+ * Splitting and stripping go through hand-written `indexOf` scanners in
428
+ * `utils/mentions` to keep parsing linear-time on adversarial input
429
+ * (CodeQL js/polynomial-redos).
430
+ */
349
431
  declare function MentionText({ text, className }: {
350
432
  text: string;
351
433
  className?: string;
352
434
  }): react_jsx_runtime.JSX.Element | null;
353
- /** Convert stored @[Name](username) to display @Name for textarea */
435
+ /** Convert stored `@[Name](username)` to display `@Name` for textarea. */
354
436
  declare function toDisplayText(stored: string): string;
355
- /** Convert display @Name back to stored @[Name](username) using a mention map */
437
+ /** Convert display `@Name` back to stored `@[Name](username)` using a mention map. */
356
438
  declare function toStoredText(display: string, mentionMap: Map<string, string>): string;
357
439
 
358
440
  interface MentionTextareaProps {
@@ -769,6 +851,46 @@ interface HighlightBubbleProps {
769
851
  */
770
852
  declare function HighlightBubble({ bubble, onComment }: HighlightBubbleProps): react_jsx_runtime.JSX.Element | null;
771
853
 
854
+ interface TagManagerPopoverProps {
855
+ /** Trigger button rect (viewport coords). Used for fixed positioning. */
856
+ anchor: DOMRect;
857
+ /** IDs of tags currently applied to this task. */
858
+ appliedTagIds: string[];
859
+ /** The full workspace tag pool. */
860
+ pool: Tag[];
861
+ /** Persist the next set of applied tag IDs. */
862
+ onApplyTagIds: (nextIds: string[]) => void;
863
+ /** Create a new pool tag and resolve with its persisted form. */
864
+ onCreateTag: (name: string) => Promise<Tag | null>;
865
+ /** Rename a pool tag (propagates everywhere). */
866
+ onRenameTag: (id: string, newName: string) => void;
867
+ onClose: () => void;
868
+ }
869
+ declare function TagManagerPopover({ anchor, appliedTagIds, pool, onApplyTagIds, onCreateTag, onRenameTag, onClose, }: TagManagerPopoverProps): react_jsx_runtime.JSX.Element;
870
+
871
+ interface OverviewPanelProps {
872
+ /** Projects the current user has access to (drives the filter dropdown). */
873
+ availableProjects: Project[];
874
+ /** Initial project filter — defaults to "all". */
875
+ initialProjectSlug?: string;
876
+ /** Open a task in the consumer's preferred way (route push, slide-over, etc). */
877
+ onOpenTask?: (taskId: string, projectSlug: string) => void;
878
+ /** Optional column registry — used to render coloured status pills in moves. */
879
+ columns?: ColumnConfig[];
880
+ }
881
+ declare function OverviewPanel({ availableProjects, initialProjectSlug, onOpenTask, columns: columnsOverride, }: OverviewPanelProps): react_jsx_runtime.JSX.Element;
882
+
883
+ interface ListLayoutProps {
884
+ tasks: Record<string, Task[]>;
885
+ columnTotals: Record<string, number>;
886
+ filterTagIds: string[];
887
+ tagsById: Map<string, Tag>;
888
+ onTaskClick: (task: Task) => void;
889
+ onAddTag: (e: React__default.MouseEvent<HTMLButtonElement>, taskId: string) => void;
890
+ onAddTaskToColumn: (statusKey: string) => void;
891
+ }
892
+ declare function ListLayout({ tasks, columnTotals, filterTagIds, tagsById, onTaskClick, onAddTag, onAddTaskToColumn, }: ListLayoutProps): react_jsx_runtime.JSX.Element;
893
+
772
894
  interface TaskBoardService {
773
895
  listTasks(projectSlug: string, perColumn?: number): Promise<Record<string, ColumnResponse>>;
774
896
  listColumnTasks(projectSlug: string, statusKey: string, offset: number, limit: number): Promise<Task[]>;
@@ -801,6 +923,12 @@ interface TaskBoardService {
801
923
  listNotifications(limit?: number): Promise<Notification[]>;
802
924
  markNotificationRead(notificationId: string): Promise<void>;
803
925
  markAllNotificationsRead(): Promise<void>;
926
+ listTags(): Promise<Tag[]>;
927
+ createTag(data: CreateTagPayload): Promise<Tag>;
928
+ updateTag(tagId: string, data: UpdateTagPayload): Promise<Tag>;
929
+ deleteTag(tagId: string): Promise<void>;
930
+ listActivityFeed(projectSlug?: string, limit?: number): Promise<ActivityFeedItem[]>;
931
+ listOutstandingQuestions(projectSlug?: string, statusFilter?: QuestionStatus, limit?: number): Promise<OutstandingQuestion[]>;
804
932
  }
805
933
  declare function createTaskBoardService(apiClient: ApiClient, basePath?: string): TaskBoardService;
806
934
 
@@ -946,6 +1074,29 @@ interface UseTaskAttachmentsResult {
946
1074
  */
947
1075
  declare function useTaskAttachments(taskId: string | null, initial?: Attachment[]): UseTaskAttachmentsResult;
948
1076
 
1077
+ /**
1078
+ * Workspace-level tag pool. Every consumer reads from the same server-backed
1079
+ * list and mutates through the same CRUD endpoints, so a rename or create on
1080
+ * one surface (e.g. the board's tag popover) is instantly reflected on every
1081
+ * other surface (e.g. the task detail page) on the next render.
1082
+ */
1083
+ interface TagPool {
1084
+ tags: Tag[];
1085
+ byId: Map<string, Tag>;
1086
+ loading: boolean;
1087
+ refresh: () => Promise<void>;
1088
+ /** Create a pool tag by name (idempotent — returns the existing one if the name matches). */
1089
+ create: (name: string, color?: string) => Promise<Tag | null>;
1090
+ /** Rename and/or recolor an existing pool tag. */
1091
+ update: (id: string, body: {
1092
+ name?: string;
1093
+ color?: string;
1094
+ }) => Promise<Tag | null>;
1095
+ /** Delete a pool tag (and remove it from every task that references it). */
1096
+ remove: (id: string) => Promise<boolean>;
1097
+ }
1098
+ declare function useTagPool(): TagPool;
1099
+
949
1100
  declare function getPriorityStyle(priority: string): PriorityConfig;
950
1101
  declare function getTagStyle(tag: string): TagConfig;
951
1102
  declare function getInitials(name: string): string;
@@ -1032,4 +1183,4 @@ declare const HistoryIcon: React__default.FC<IconProps>;
1032
1183
  /** Sidebar-toggle icon used to collapse / re-open the threads panel. */
1033
1184
  declare const SidebarToggleIcon: React__default.FC<IconProps>;
1034
1185
 
1035
- export { type ActivityEntry, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, TagBadge, type TagBadgeProps, type TagConfig, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };
1186
+ export { type ActivityEntry, type ActivityFeedItem, ActivityList, type ActivityListProps, type ApiClient, type ApiClientConfig, ArrowLeftIcon, type Attachment, type AttachmentKind, AttachmentsSection, type AttachmentsSectionProps, BellIcon, BoardSkeleton, Bold, type BubbleState, ChatDotsIcon, CheckCircle2Icon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, Code, type ColumnConfig, type ColumnResponse, type ColumnTotals, type ColumnUnreads, type Comment, ContextPill, type ContextPillProps, type ContextPillVariant, CornerUpLeftIcon, type CreateCommentPayload, type CreateLinkAttachmentPayload, type CreateQuestionPayload, type CreateQuestionReplyPayload, type CreateTagPayload, CreateTaskModal, type CreateTaskModalProps, type CreateTaskPayload, DEFAULT_COLUMNS, DEFAULT_INTERNAL_LABEL, DEFAULT_PAGE_SIZE, DEFAULT_PRIORITIES, DESCRIPTION_SECTIONS, DescriptionSection, type DescriptionSectionConfig, type DescriptionSectionProps, EMPTY_DESCRIPTION, type EditCommentPayload, ExternalLinkIcon, FeedbackIcon, FileTextIcon, FilterBar, type FilterBarProps, FilterIcon, Heading2, HelpCircleIcon, HighlightBubble, type HighlightBubbleProps, HistoryIcon, ImageIcon, Italic, KanbanColumn, type KanbanColumnProps, KanbanIcon, Link2Icon, LinkIcon, List, ListLayout, type ListLayoutProps, ListOrdered, LockIcon, MarkdownEditor, type MarkdownEditorProps, MarkdownView, MentionText, MentionTextarea, type MentionTextareaProps, type MentionUser, MessageSquareIcon, MoreVerticalIcon, type Notification, NotificationBell, type NotificationBellProps, type NotificationCountResponse, type OutstandingQuestion, OutstandingQuestionsSection, type OutstandingQuestionsSectionProps, OverviewPanel, type OverviewPanelProps, POSITION_GAP, PREDEFINED_TAGS, PencilIcon, PlusIcon, PriorityBadge, type PriorityBadgeProps, type PriorityConfig, type Project, type Question, type QuestionReply, type QuestionStatus, Quote, RotateCcwIcon, type SectionKey, type SectionStatus, Share2Icon, SidebarToggleIcon, SkeletonCard, SkeletonPulse, type StructuredDescription, type Tag, TagBadge, type TagBadgeProps, type TagConfig, TagManagerPopover, type TagManagerPopoverProps, type TagPool, type Task, TaskBoard, type TaskBoardConfig, type TaskBoardContextValue, type TaskBoardProps, TaskBoardProvider, type TaskBoardService, type TaskBoardUser, TaskCard, type TaskCardProps, TaskDetailPanel, type TaskDetailPanelProps, type TaskDetailResponse, TaskDetailView, type TaskDetailViewProps, type TasksByStatus, type Thread, type ThreadAnchor, ThreadCard, type ThreadCardProps, ThreadComposer, type ThreadComposerProps, ThreadDetailView, type ThreadDetailViewProps, type ThreadReply, type ThreadStatus, ThreadsPanel, type ThreadsPanelProps, TrashIcon, type UpdateQuestionPayload, type UpdateTagPayload, type UpdateTaskPayload, type UpdateThreadPayload, type UseHighlightAnchorResult, type UseTaskAttachmentsResult, type UseTaskQuestionsResult, UserAvatar, type UserAvatarProps, XIcon, createTaskBoardService, deriveThreads, formatDate, formatDateTime, formatTaskId, getDescriptionPreview, getInitials, getPriorityStyle, getTagStyle, getUserProjects, hasDescription, htmlToMd, mdToHtml, parseDate, sectionLabel, timeAgo, toDisplayText, toStoredText, useHighlightAnchor, useShareLink, useTagPool, useTaskActions, useTaskAttachments, useTaskBoard, useTaskBoardContext, useTaskDetail, useTaskQuestions };