@flamingo-stack/openframe-frontend-core 0.0.207 → 0.0.208
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/{chunk-Z3GQGR5E.js → chunk-2HMZSCJY.js} +3158 -2074
- package/dist/chunk-2HMZSCJY.js.map +1 -0
- package/dist/chunk-4XLJWX2N.js +12 -0
- package/dist/chunk-4XLJWX2N.js.map +1 -0
- package/dist/{chunk-APM6KBPU.cjs → chunk-C5EC5AZM.cjs} +1644 -560
- package/dist/chunk-C5EC5AZM.cjs.map +1 -0
- package/dist/chunk-VFKQMAUF.cjs +12 -0
- package/dist/chunk-VFKQMAUF.cjs.map +1 -0
- package/dist/components/chat/embeddable-chat.d.ts +35 -2
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
- package/dist/components/chat/hooks/index.d.ts +3 -0
- package/dist/components/chat/hooks/index.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-embedded-chat.d.ts +10 -169
- package/dist/components/chat/hooks/use-embedded-chat.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +85 -0
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +124 -0
- package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-unified-chat.d.ts +33 -0
- package/dist/components/chat/hooks/use-unified-chat.d.ts.map +1 -0
- package/dist/components/chat/index.cjs +8 -2
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +11 -5
- package/dist/components/chat/types/index.d.ts +1 -0
- package/dist/components/chat/types/index.d.ts.map +1 -1
- package/dist/components/chat/types/unified-chat-state.types.d.ts +185 -0
- package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -0
- package/dist/components/features/index.cjs +3 -2
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +2 -1
- package/dist/components/index.cjs +26 -2
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +27 -3
- package/dist/components/navigation/index.cjs +3 -2
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.js +2 -1
- package/dist/components/shared/delivery/delivery-lists.d.ts +16 -0
- package/dist/components/shared/delivery/delivery-lists.d.ts.map +1 -0
- package/dist/components/shared/delivery/delivery-table.d.ts +12 -0
- package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -0
- package/dist/components/shared/delivery/index.d.ts +3 -0
- package/dist/components/shared/delivery/index.d.ts.map +1 -0
- package/dist/components/shared/dev-section/dev-section-page.d.ts +31 -0
- package/dist/components/shared/dev-section/dev-section-page.d.ts.map +1 -0
- package/dist/components/shared/dev-section/dev-section-view.d.ts +34 -0
- package/dist/components/shared/dev-section/dev-section-view.d.ts.map +1 -0
- package/dist/components/shared/dev-section/index.d.ts +3 -0
- package/dist/components/shared/dev-section/index.d.ts.map +1 -0
- package/dist/components/shared/legal-document/index.d.ts +10 -0
- package/dist/components/shared/legal-document/index.d.ts.map +1 -0
- package/dist/components/shared/legal-document/legal-document-page.d.ts +66 -0
- package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -0
- package/dist/components/shared/legal-document/use-legal-docs.d.ts +40 -0
- package/dist/components/shared/legal-document/use-legal-docs.d.ts.map +1 -0
- package/dist/components/shared/product-release/index.d.ts +2 -1
- package/dist/components/shared/product-release/index.d.ts.map +1 -1
- package/dist/components/shared/product-release/release-detail-page.d.ts +11 -7
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/shared/roadmap/index.d.ts +18 -0
- package/dist/components/shared/roadmap/index.d.ts.map +1 -0
- package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts +24 -0
- package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts.map +1 -0
- package/dist/components/shared/roadmap/roadmap-grid.d.ts +18 -0
- package/dist/components/shared/roadmap/roadmap-grid.d.ts.map +1 -0
- package/dist/components/shared/roadmap/use-roadmap-voting.d.ts +25 -0
- package/dist/components/shared/roadmap/use-roadmap-voting.d.ts.map +1 -0
- package/dist/components/ui/index.cjs +8 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +11 -5
- package/dist/components/ui/release-changelog-section.d.ts +13 -2
- package/dist/components/ui/release-changelog-section.d.ts.map +1 -1
- package/dist/embed-shims/index.cjs +1 -6
- package/dist/embed-shims/index.cjs.map +1 -1
- package/dist/embed-shims/index.js +1 -6
- package/dist/embed-shims/index.js.map +1 -1
- package/dist/index.cjs +18 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -3
- package/dist/types/delivery.d.ts +49 -0
- package/dist/types/delivery.d.ts.map +1 -0
- package/dist/types/index.cjs +13 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +12 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/dev-sections/index.d.ts +11 -0
- package/dist/utils/dev-sections/index.d.ts.map +1 -0
- package/dist/utils/dev-sections/openframe-dev-sections.d.ts +209 -0
- package/dist/utils/dev-sections/openframe-dev-sections.d.ts.map +1 -0
- package/dist/utils/index.cjs +82 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +81 -2
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/embeddable-chat.tsx +123 -8
- package/src/components/chat/hooks/index.ts +9 -2
- package/src/components/chat/hooks/use-embedded-chat.ts +18 -1016
- package/src/components/chat/hooks/use-nats-chat-adapter.ts +372 -0
- package/src/components/chat/hooks/use-sse-chat-adapter.ts +1058 -0
- package/src/components/chat/hooks/use-unified-chat.ts +171 -0
- package/src/components/chat/types/index.ts +1 -0
- package/src/components/chat/types/unified-chat-state.types.ts +215 -0
- package/src/components/index.ts +8 -0
- package/src/components/shared/delivery/delivery-lists.tsx +199 -0
- package/src/components/shared/delivery/delivery-table.tsx +174 -0
- package/src/components/shared/delivery/index.ts +9 -0
- package/src/components/shared/dev-section/dev-section-page.tsx +72 -0
- package/src/components/shared/dev-section/dev-section-view.tsx +129 -0
- package/src/components/shared/dev-section/index.ts +2 -0
- package/src/components/shared/legal-document/index.ts +19 -0
- package/src/components/shared/legal-document/legal-document-page.tsx +178 -0
- package/src/components/shared/legal-document/use-legal-docs.ts +123 -0
- package/src/components/shared/product-release/index.ts +14 -3
- package/src/components/shared/product-release/release-detail-page.tsx +45 -7
- package/src/components/shared/roadmap/index.ts +23 -0
- package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +74 -0
- package/src/components/shared/roadmap/roadmap-grid.tsx +106 -0
- package/src/components/shared/roadmap/use-roadmap-voting.ts +163 -0
- package/src/components/ui/release-changelog-section.tsx +113 -32
- package/src/stories/EmbeddableChat.stories.tsx +186 -0
- package/src/types/delivery.ts +54 -0
- package/src/types/index.ts +1 -0
- package/src/utils/dev-sections/index.ts +17 -0
- package/src/utils/dev-sections/openframe-dev-sections.ts +148 -0
- package/src/utils/index.ts +6 -1
- package/dist/chunk-APM6KBPU.cjs.map +0 -1
- package/dist/chunk-Z3GQGR5E.js.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery (ClickUp Bug-fixes & Enhancements) wire types — shared between the
|
|
3
|
+
* hub's `/api/delivery*` route shapes and the lib's `DeliveryTable`/`DeliveryLists`/
|
|
4
|
+
* `DeliverySection` components.
|
|
5
|
+
*
|
|
6
|
+
* Lifted from hub `types/delivery.ts` so embedders consuming the lib's
|
|
7
|
+
* delivery surfaces and the lib's own `ReleaseDetailPage` (which renders
|
|
8
|
+
* related delivery items) share one canonical shape.
|
|
9
|
+
*/
|
|
10
|
+
export interface DeliveryItem {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
status: string;
|
|
15
|
+
statusColor: string;
|
|
16
|
+
taskType: 'Request' | 'Bug' | string;
|
|
17
|
+
/**
|
|
18
|
+
* Canonical ClickUp custom_item_id (1008 = Bug, 1009 = Request, …).
|
|
19
|
+
* Surfaced here so the chat's compact card can render a type-specific
|
|
20
|
+
* lucide icon via `TaskTypeIcon` instead of the two-letter initials
|
|
21
|
+
* fallback. Single source of truth lives in
|
|
22
|
+
* `lib/utils/clickup-task-type-utils.ts` (hub-side).
|
|
23
|
+
*/
|
|
24
|
+
customItemId: number | null;
|
|
25
|
+
/**
|
|
26
|
+
* Every ClickUp list the task is associated with (home list + ClickUp's
|
|
27
|
+
* "Tasks in Multiple Lists" locations). UI joins these for display.
|
|
28
|
+
* Falls back to a single-element array containing the home list when
|
|
29
|
+
* there are no additional locations.
|
|
30
|
+
*/
|
|
31
|
+
listNames: string[];
|
|
32
|
+
dateOpened: number;
|
|
33
|
+
dateUpdated: number;
|
|
34
|
+
dateClosed: number | null;
|
|
35
|
+
clickupUrl: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DeliveryResponse {
|
|
38
|
+
completed: DeliveryItem[];
|
|
39
|
+
inProgress: DeliveryItem[];
|
|
40
|
+
}
|
|
41
|
+
export declare const TASK_TYPE_LABELS: {
|
|
42
|
+
readonly Request: "ENHANCEMENT";
|
|
43
|
+
readonly Bug: "BUG-FIX";
|
|
44
|
+
};
|
|
45
|
+
export declare const TASK_TYPE_TEXT_COLORS: {
|
|
46
|
+
readonly Request: "";
|
|
47
|
+
readonly Bug: "text-[var(--ods-attention-red-error)]";
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/types/delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAGD,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAGX,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC"}
|
package/dist/types/index.cjs
CHANGED
|
@@ -44,6 +44,17 @@ var changelogLabels = {
|
|
|
44
44
|
};
|
|
45
45
|
var SEMVER_REGEX = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/;
|
|
46
46
|
|
|
47
|
+
// src/types/delivery.ts
|
|
48
|
+
var TASK_TYPE_LABELS = {
|
|
49
|
+
Request: "ENHANCEMENT",
|
|
50
|
+
Bug: "BUG-FIX"
|
|
51
|
+
};
|
|
52
|
+
var TASK_TYPE_TEXT_COLORS = {
|
|
53
|
+
Request: "",
|
|
54
|
+
// Default white/grey
|
|
55
|
+
Bug: "text-[var(--ods-attention-red-error)]"
|
|
56
|
+
};
|
|
57
|
+
|
|
47
58
|
// src/types/tool.types.ts
|
|
48
59
|
var ToolTypeValues = {
|
|
49
60
|
TACTICAL_RMM: "TACTICAL_RMM",
|
|
@@ -457,6 +468,8 @@ exports.OS_TYPES = OS_TYPES;
|
|
|
457
468
|
exports.SEMVER_REGEX = SEMVER_REGEX;
|
|
458
469
|
exports.SHELL_TYPES = SHELL_TYPES;
|
|
459
470
|
exports.ShellTypeValues = ShellTypeValues;
|
|
471
|
+
exports.TASK_TYPE_LABELS = TASK_TYPE_LABELS;
|
|
472
|
+
exports.TASK_TYPE_TEXT_COLORS = TASK_TYPE_TEXT_COLORS;
|
|
460
473
|
exports.TMCG_ROLES = TMCG_ROLES;
|
|
461
474
|
exports.TMCG_ROLE_DISPLAY_NAMES = TMCG_ROLE_DISPLAY_NAMES;
|
|
462
475
|
exports.TMCG_SOCIAL_PLATFORMS = TMCG_SOCIAL_PLATFORMS;
|
package/dist/types/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/announcement.ts","../../src/types/product-release.ts","../../src/types/tool.types.ts","../../src/components/icons-v2-generated/brand-logos/powershell-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/python-logo-icon.tsx","../../src/components/icons/shell-icon.tsx","../../src/utils/cn.ts","../../src/components/icons/cmd-icon.tsx","../../src/components/icons/bash-icon.tsx","../../src/components/icons/nushell-icon.tsx","../../src/components/icons/deno-icon.tsx","../../src/types/shell.types.ts","../../src/components/icons-v2-generated/brand-logos/apple-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/linux-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/windows-logo-icon.tsx","../../src/types/os.types.ts","../../src/types/tmcg.ts"],"names":["jsxs","jsx","extendTailwindMerge"],"mappings":"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","file":"index.cjs","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter, PlatformRecord } from './platform';\n\n// For backward compatibility, maintain the old Platform type temporarily\nexport type IconType = 'svg' | 'png';\n\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n platform?: PlatformRecord; // Joined platform data\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_type?: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id?: string; // Foreign key to platforms table\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\nexport interface AnnouncementResponse {\n announcement: Announcement;\n}\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name: string;\n icon_png_file?: File;\n platform_id: string; // Foreign key to platforms table\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_svg_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_svg_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n announcement?: Announcement;\n onDismiss?: (announcementId: string) => void;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; ","// Product Release Types\n// Following the blog.ts pattern for consistency\n\nimport type { PlatformRecord } from './platform'\nimport type { BlogTag } from './blog'\nimport type { VideoTeaser, TranscriptWord, SpeakerMapping } from './video-processing'\n\nexport interface ChangelogEntry {\n title: string\n description?: string\n /**\n * Per-entry visibility flag. Optional so product releases (which always render\n * publicly) remain backwards compatible. Investor updates require this field\n * because each entry can be marked internal — see investor-update-utils.ts.\n */\n visibility?: 'public' | 'internal'\n}\n\nexport interface ReleaseMedia {\n id: number\n release_id: number\n media_type: 'image' | 'video' | 'screenshot' | 'demo'\n media_url: string\n display_order: number | null\n title: string | null\n description: string | null\n created_at: string\n updated_at: string\n created_by: string\n}\n\nexport interface ProductReleaseGitHubLink {\n id: number\n release_id: number\n github_release_url: string // Full URL (e.g., https://github.com/org/repo/releases/tag/v2.0.0)\n display_order: number | null\n created_at: string\n}\n\nexport interface KnowledgeBaseLink {\n id: number\n release_id: number\n kb_article_path: string // Relative path (e.g., /api/authentication/api-keys.md)\n display_order: number | null\n created_at: string\n}\n\nexport interface ClickUpRoadmapTask {\n id: number\n release_id: number\n clickup_task_id: string // Just the task ID - details from roadmap folder\n display_order: number | null\n created_at: string\n}\n\nexport interface ClickUpDeliveryTask {\n id: number\n release_id: number\n clickup_task_id: string // Just the task ID - details from delivery list\n display_order: number | null\n created_at: string\n}\n\nexport interface ProductRelease {\n id: number\n title: string\n slug: string\n version: string\n summary: string | null\n content: string | null\n\n // Release metadata\n release_type: 'major' | 'minor' | 'patch' | 'beta' | 'alpha'\n release_status: 'alpha' | 'beta' | 'stable' | 'deprecated'\n release_date: string\n\n // Changelog (JSONB arrays)\n features_added: ChangelogEntry[]\n bugs_fixed: ChangelogEntry[]\n improvements: ChangelogEntry[]\n breaking_changes: ChangelogEntry[]\n\n // External relationships (one-to-many)\n github_releases?: ProductReleaseGitHubLink[]\n knowledge_base_links?: KnowledgeBaseLink[]\n clickup_roadmap_tasks?: ClickUpRoadmapTask[]\n clickup_delivery_tasks?: ClickUpDeliveryTask[]\n release_media?: ReleaseMedia[]\n\n // Media (keeping featured_image for hero)\n featured_image: string | null\n\n // Documentation\n migration_guide_url: string | null\n documentation_url: string | null\n\n // Video (youtube_url for embeds, main_video_url for AI processing)\n youtube_url: string | null\n main_video_url: string | null\n transcript: string | null\n transcript_words_data?: TranscriptWord[]\n srt_content?: string | null\n video_summary: string | null // AI-generated summary from video transcription\n video_bites: VideoTeaser[] // JSONB array of extracted video clips\n highlight_video_url: string | null\n highlight_video_thumbnail: string | null\n highlight_video_duration_ms: number | null\n highlight_video_source: 'manual' | 'ai_generated' | null\n main_video_thumbnail: string | null\n ai_transcript_formatted?: string\n speaker_mapping?: SpeakerMapping\n ai_confidence_transcript: number | null\n ai_confidence_video_summary: number | null // Confidence for video-generated summary\n ai_confidence_summary: number | null // Confidence for entity summary (Release Content Generation)\n\n // SEO\n seo_title: string | null\n seo_description: string | null\n seo_keywords: string | null\n og_image_url: string | null\n\n // Publishing\n status: 'draft' | 'published' | 'archived'\n published_at: string | null\n author_id: string | null\n /**\n * Hydrated by `getRelease` (detail) and `getReleases` (list) via\n * `hydrateAuthor` in the hub DAL. Optional so admin form + every existing\n * consumer that doesn't read author stay backward-compatible.\n */\n author?: {\n id: string\n full_name: string\n avatar_url: string | null\n job_title: string | null\n email?: string | null\n }\n\n // Timestamps\n created_at: string\n updated_at: string\n\n // Editor-provided AI generation instructions (steers Generate Content prompt)\n custom_instructions: string | null\n\n // Analytics\n view_count: number\n download_count: number\n\n // Relations (populated by joins)\n platforms?: PlatformRecord[]\n tags?: BlogTag[]\n product_release_platforms?: Array<{\n platform_id: string\n is_featured: boolean\n featured_order: number | null\n }>\n product_release_tags?: Array<{\n tag_id: number\n }>\n blog_tags?: BlogTag[]\n}\n\nexport interface CreateProductReleaseData {\n title: string\n slug: string\n version: string\n summary?: string\n content?: string\n release_type: 'major' | 'minor' | 'patch' | 'beta' | 'alpha'\n release_status: 'alpha' | 'beta' | 'stable' | 'deprecated'\n release_date: string\n features_added?: ChangelogEntry[]\n bugs_fixed?: ChangelogEntry[]\n improvements?: ChangelogEntry[]\n breaking_changes?: ChangelogEntry[]\n github_releases?: Array<{ github_release_url: string; display_order?: number }>\n knowledge_base_links?: Array<{ kb_article_path: string; display_order?: number }>\n clickup_roadmap_tasks?: Array<{ clickup_task_id: string; display_order?: number }>\n clickup_delivery_tasks?: Array<{ clickup_task_id: string; display_order?: number }>\n release_media?: Array<{ media_type: 'image' | 'video' | 'screenshot' | 'demo'; media_url: string; title?: string; description?: string; display_order?: number }>\n featured_image?: string\n migration_guide_url?: string\n documentation_url?: string\n youtube_url?: string\n main_video_url?: string\n transcript?: string\n srt_content?: string | null\n video_summary?: string // AI-generated summary from video transcription\n video_bites?: VideoTeaser[]\n highlight_video_url?: string | null\n highlight_video_thumbnail?: string | null\n highlight_video_duration_ms?: number | null\n highlight_video_source?: 'manual' | 'ai_generated' | null\n main_video_thumbnail?: string | null\n seo_title?: string\n seo_description?: string\n seo_keywords?: string\n og_image_url?: string\n status: 'draft' | 'published' | 'archived'\n published_at?: string | null\n author_id: string\n platforms: string[] // Array of platform IDs (UUIDs)\n featured_platform?: string // Platform ID for featured\n tags: number[] // Array of tag IDs\n custom_instructions?: string | null\n}\n\nexport type UpdateProductReleaseData = Partial<CreateProductReleaseData>\n\nexport interface ProductReleaseFilters {\n platform?: string | 'all'\n tags?: string[]\n version?: string\n release_type?: ('major' | 'minor' | 'patch' | 'beta' | 'alpha')[]\n release_status?: ('alpha' | 'beta' | 'stable' | 'deprecated')[]\n has_breaking_changes?: boolean\n search?: string\n featured?: boolean\n status?: string\n limit?: number\n offset?: number\n ids?: (number | string)[]\n}\n\nexport interface ProductReleaseListResponse {\n data: ProductRelease[]\n count: number\n}\n\n// GitHub Release interface (for wizard)\nexport interface GitHubRelease {\n id: string\n tag_name: string\n name: string\n body: string\n published_at: string\n html_url: string\n prerelease: boolean\n draft: boolean\n}\n\n// Release type options for dropdowns\nexport const releaseTypeOptions = [\n { value: 'major', label: 'Major Release', description: 'Breaking changes, new architecture', color: 'red' },\n { value: 'minor', label: 'Minor Release', description: 'New features, backward compatible', color: 'blue' },\n { value: 'patch', label: 'Patch Release', description: 'Bug fixes only', color: 'green' },\n { value: 'beta', label: 'Beta Release', description: 'Pre-release testing version', color: 'yellow' },\n { value: 'alpha', label: 'Alpha Release', description: 'Early testing version', color: 'orange' }\n] as const\n\n// Release status options\nexport const releaseStatusOptions = [\n { value: 'alpha', label: 'Alpha', description: 'Early development, unstable', color: 'orange' },\n { value: 'beta', label: 'Beta', description: 'Feature complete, testing', color: 'yellow' },\n { value: 'stable', label: 'Stable', description: 'Production ready', color: 'green' },\n { value: 'deprecated', label: 'Deprecated', description: 'No longer supported', color: 'gray' }\n] as const\n\n// Changelog category labels\nexport const changelogLabels = {\n features_added: 'Features Added',\n bugs_fixed: 'Bugs Fixed',\n improvements: 'Improvements',\n breaking_changes: 'Breaking Changes'\n} as const\n\n// Semantic versioning validation regex\nexport const SEMVER_REGEX = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/\n","/**\n * Centralized Tool Types\n *\n * Single source of truth for all tool-related types across the entire platform.\n * Used by ToolBadge, ToolIcon, and any component that needs tool type information.\n */\n\nexport const ToolTypeValues = {\n TACTICAL_RMM: 'TACTICAL_RMM',\n FLEET_MDM: 'FLEET_MDM',\n MESHCENTRAL: 'MESHCENTRAL',\n AUTHENTIK: 'AUTHENTIK',\n OPENFRAME: 'OPENFRAME',\n OPENFRAME_CHAT: 'OPENFRAME_CHAT',\n OPENFRAME_CLIENT: 'OPENFRAME_CLIENT',\n OSQUERY: 'OSQUERY',\n SYSTEM: 'SYSTEM'\n} as const\n\nexport type ToolType = (typeof ToolTypeValues)[keyof typeof ToolTypeValues]\n\n/**\n * Maps tool types to display labels\n */\nexport const toolLabels: Record<ToolType, string> = {\n TACTICAL_RMM: 'Tactical',\n FLEET_MDM: 'Fleet',\n MESHCENTRAL: 'MeshCentral',\n AUTHENTIK: 'Authentik',\n OPENFRAME: 'OpenFrame',\n OPENFRAME_CHAT: 'OpenFrame Chat',\n OPENFRAME_CLIENT: 'OpenFrame Client',\n OSQUERY: 'Osquery',\n SYSTEM: 'System'\n}\n","import type { SVGProps } from \"react\";\nexport interface PowershellLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PowershellLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PowershellLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n fillRule=\"evenodd\"\n d=\"M10.274 19.708c-2.345 0-4.69.01-7.034-.005-1.19-.008-1.405-.286-1.138-1.442.908-3.919 1.844-7.83 2.732-11.754C5.07 5.455 5.584 4.99 6.719 5c4.69.043 9.379.014 14.068.019 1.176 0 1.374.25 1.11 1.436-.858 3.848-1.72 7.694-2.598 11.537-.328 1.438-.706 1.713-2.23 1.716-2.265.005-4.53.001-6.795 0\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"#212121\"\n fillRule=\"evenodd\"\n d=\"M12.269 12.029c-.157-.184-.33-.395-.513-.596-1.036-1.144-2.063-2.297-3.118-3.423C8.155 7.494 8 6.993 8.58 6.484c.573-.503 1.136-.458 1.661.12 1.464 1.612 2.925 3.225 4.413 4.815.556.593.426.997-.185 1.437a937 937 0 0 0-7.016 5.106c-.525.385-1.024.481-1.448-.087-.467-.626-.035-1 .45-1.35a764 764 0 0 0 5.186-3.782c.24-.177.584-.28.627-.714M13.012 18.09c-.632 0-1.264.02-1.894-.008-.502-.022-.805-.301-.798-.827.006-.497.258-.871.76-.885a90 90 0 0 1 4.142-.002c.438.009.762.293.76.747-.004.52-.28.925-.841.958-.708.043-1.42.01-2.13.01z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface PythonLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PythonLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PythonLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M11.966 2C7.244 2 7.193 3.833 7.193 4.21V6.5h4.864v.687H5.26C3.816 7.187 2 8.067 2 11.96c0 3.577 1.417 4.96 2.847 4.96h1.698v-2.386c0-.998.495-2.847 2.802-2.847h4.823c.71 0 2.71-.308 2.71-2.619V4.665C16.88 4.09 16.784 2 11.967 2M9.284 3.54a.874.874 0 1 1 0 1.75.874.874 0 1 1 0-1.75\"\n />\n <path\n fill={color}\n d=\"M12.034 22c4.72 0 4.778-1.867 4.778-2.21V17.5h-4.869v-.687h6.795c1.457 0 3.262-.901 3.262-4.773 0-4.24-1.916-4.96-2.847-4.96h-1.699v2.386c0 .998-.478 2.847-2.8 2.847H9.828c-.707 0-2.71.344-2.71 2.619v4.403c0 .951.581 2.665 4.915 2.665m2.682-1.54a.874.874 0 1 1-.002-1.748.874.874 0 0 1 .002 1.748\"\n />\n </svg>\n );\n}\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function ShellIcon({ className = \"w-5 h-5\", size = 22, color = 'white' }: { className?: string; size?: number; color?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 48 48\" >\n <path\n fill='transparent'\n stroke={color}\n d=\"M6.5 8.4a2 2 0 0 0-2 2v27.2a2 2 0 0 0 2 2h35a2 2 0 0 0 2-2V10.4a2 2 0 0 0-2-2zM9 23.16l7.72 6L9 35.13v-12zm20.46 11.97h-11\" />\n </svg >\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge<'ods-typography'>({\n extend: {\n classGroups: {\n 'ods-typography': ['text-h1', 'text-h2', 'text-h3', 'text-h4', 'text-h5', 'text-h6'],\n },\n },\n})\n\n/**\n * Combine class names with Tailwind's merge utility\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Platform URL mappings for production (with environment variable overrides)\n */\nexport function getPlatformProductionUrl(platform: string): string {\n switch (platform) {\n // *-hub platforms — env var convention: NEXT_PUBLIC_<NAME>_HUB_URL\n case 'marketing-hub':\n return process.env.NEXT_PUBLIC_MARKETING_HUB_URL || 'https://marketing-hub.flamingo.so';\n case 'company-hub':\n return process.env.NEXT_PUBLIC_COMPANY_HUB_URL || 'https://company-hub.flamingo.so';\n case 'product-hub':\n return process.env.NEXT_PUBLIC_PRODUCT_HUB_URL || 'https://product-hub.flamingo.so';\n case 'revenue-hub':\n return process.env.NEXT_PUBLIC_REVENUE_HUB_URL || 'https://revenue-hub.flamingo.so';\n case 'people-hub':\n return process.env.NEXT_PUBLIC_PEOPLE_HUB_URL || 'https://people-hub.flamingo.so';\n // Standalone platforms — env var convention: NEXT_PUBLIC_<NAME>_URL\n case 'openmsp':\n return process.env.NEXT_PUBLIC_OPENMSP_URL || 'https://www.openmsp.ai';\n case 'flamingo':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'tmcg':\n return process.env.NEXT_PUBLIC_TMCG_URL || 'https://www.tmcg.miami';\n case 'flamingo-teaser':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'openframe':\n return process.env.NEXT_PUBLIC_OPENFRAME_URL || 'https://openframe.ai';\n case 'universal':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n default:\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n }\n}\n\n/**\n * Get ALL unique base domains from getPlatformProductionUrl\n *\n * Extracts domains by calling getPlatformProductionUrl for each platform identifier.\n * Platform identifiers match the switch cases in getPlatformProductionUrl.\n *\n * Handles 3 cases:\n * 1. LOCALHOST DEBUG - No domain (hostname-specific cookies)\n * 2. VERCEL PREVIEW (*.vercel.app) - Use vercel.app domain\n * 3. PRODUCTION - Extract from ALL platform URLs via getPlatformProductionUrl\n *\n * @returns Array of all unique base domains (with and without wildcard)\n */\nexport function getAllPlatformBaseDomains(): string[] {\n if (typeof window === 'undefined') return []\n\n const hostname = window.location.hostname\n\n // Case 1: LOCALHOST DEBUG - no domains needed\n if (hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.startsWith('127.')) {\n return []\n }\n\n // Case 2: VERCEL PREVIEW - use vercel.app domain\n const isVercelPreview = process.env.VERCEL_ENV === 'preview' ||\n process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview' ||\n hostname.includes('.vercel.app')\n\n if (isVercelPreview) {\n return ['.vercel.app', 'vercel.app']\n }\n\n // Case 3: PRODUCTION - extract from ALL platforms using getPlatformProductionUrl\n // Platform identifiers MUST match switch cases in getPlatformProductionUrl —\n // otherwise the corresponding domain is omitted from cookie scope.\n const platformIdentifiers = [\n 'marketing-hub', 'company-hub', 'product-hub', 'revenue-hub', 'people-hub',\n 'openmsp', 'flamingo', 'tmcg', 'flamingo-teaser', 'openframe', 'universal'\n ]\n\n const baseDomains = new Set<string>()\n\n platformIdentifiers.forEach(platform => {\n try {\n const url = getPlatformProductionUrl(platform)\n const urlHostname = new URL(url).hostname\n const parts = urlHostname.split('.')\n\n if (parts.length >= 2) {\n const baseDomain = parts.slice(-2).join('.')\n baseDomains.add(`.${baseDomain}`) // Wildcard\n baseDomains.add(baseDomain) // Non-wildcard\n }\n } catch (error) {\n console.warn('[Platform Domains] Failed to parse URL for platform:', platform, error)\n }\n })\n\n return Array.from(baseDomains)\n}\n\n/**\n * Get the application base URL for the current environment\n *\n * @param platform - Optional platform name (openmsp, flamingo, tmcg, openframe, etc.)\n * @returns The base URL with protocol (https:// or http://)\n *\n * Priority order:\n * 1. Environment variable override (NEXT_PUBLIC_*_URL)\n * 2. Platform-specific URL (if platform parameter provided)\n * 3. VERCEL_PROJECT_PRODUCTION_URL (Vercel production domain)\n * 4. Production fallback (current app or openmsp)\n * 5. Development (http://localhost:3000)\n *\n * Environment Variables (optional overrides — only set when production domain\n * differs from the hardcoded default):\n *\n * Hub deployments (NEXT_PUBLIC_<NAME>_HUB_URL):\n * - NEXT_PUBLIC_MARKETING_HUB_URL -> marketing-hub.flamingo.so\n * - NEXT_PUBLIC_COMPANY_HUB_URL -> company-hub.flamingo.so\n * - NEXT_PUBLIC_PRODUCT_HUB_URL -> product-hub.flamingo.so\n * - NEXT_PUBLIC_REVENUE_HUB_URL -> revenue-hub.flamingo.so\n * - NEXT_PUBLIC_PEOPLE_HUB_URL -> people-hub.flamingo.so\n *\n * Standalone platforms (NEXT_PUBLIC_<NAME>_URL):\n * - NEXT_PUBLIC_OPENMSP_URL -> www.openmsp.ai\n * - NEXT_PUBLIC_FLAMINGO_URL -> www.flamingo.run\n * - NEXT_PUBLIC_TMCG_URL -> www.tmcg.miami\n * - NEXT_PUBLIC_FLAMINGO_TEASER_URL -> www.flamingo.cx\n * - NEXT_PUBLIC_OPENFRAME_URL -> openframe.ai\n *\n * @example\n * getBaseUrl() // Current app URL\n * getBaseUrl('flamingo') // https://www.flamingo.run (production) or http://localhost:3000 (dev)\n * getBaseUrl('openmsp') // https://www.openmsp.ai (or NEXT_PUBLIC_OPENMSP_URL if set)\n */\nexport function getBaseUrl(platform?: string): string {\n // In development, always use localhost (regardless of platform)\n if (process.env.NODE_ENV !== 'production') {\n return process.env.NEXT_PUBLIC_DEV_URL || 'http://localhost:3000'\n }\n\n // If platform is specified, return its production URL with env variable override support\n if (platform) {\n return getPlatformProductionUrl(platform)\n }\n\n // Production: Use Vercel domain if available\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL) {\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`\n }\n\n // Production fallback: Use canonical www domain to avoid Google \"Page with redirect\" issue.\n // openmsp.ai redirects to www.openmsp.ai, so we set the base URL to the\n // final destination to ensure canonical URLs do not require a redirect.\n return 'https://www.openmsp.ai'\n}\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface CmdIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const CmdIcon: React.FC<CmdIconProps> = ({ size = 16, className = '', color='white'}) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M3 4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4Z\"\n stroke={color}\n />\n <text\n x=\"12\"\n y=\"16\"\n textAnchor=\"middle\"\n fill={color}\n fontSize=\"10\"\n fontFamily=\"monospace\"\n fontWeight=\"bold\"\n >\n \\>\n </text>\n </svg>\n )\n}\n\nCmdIcon.displayName = 'CmdIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface BashIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const BashIcon: React.FC<BashIconProps> = ({ size = 16, className = '' , color = 'white'}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path fill={color}\n d=\"M5 9h2.31l.32-3h2l-.32 3h2l.32-3h2l-.32 3H15v2h-1.9l-.2 2H15v2h-2.31l-.32 3h-2l.32-3h-2l-.32 3h-2l.32-3H5v-2h1.9l.2-2H5zm4.1 2l-.2 2h2l.2-2M19 6h-2v8h2m0 2h-2v2h2Z\" />\n </svg>\n )\n}\n\nBashIcon.displayName = 'BashIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface NushellIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const NushellIcon: React.FC<NushellIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path\n fill={color}\n d=\"M0 16.338h1.25v-5.7c.417-.624 1.205-1.309 2.127-1.309c1.176 0 1.34.64 1.34 2.247v4.762h1.25v-5.685c0-1.458-.67-2.32-2.202-2.32c-.923 0-1.964.46-2.59 1.264l-.103-1.1H0Zm10.177-7.842h-1.25v5.698c0 1.46.745 2.307 2.263 2.307c.921 0 1.889-.431 2.514-1.22l.104 1.057h1.072V8.496h-1.25v5.773c-.432.67-1.265 1.25-2.129 1.25c-.907 0-1.324-.446-1.324-1.458zm8.11-.997l-.61.952l5.251 3.229l-5.251 3.244l.669.922L24 12.32v-1.28z\" />\n </svg>\n )\n}\n\nNushellIcon.displayName = 'NushellIcon'\n","import React from 'react'\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface DenoIconProps {\n size?: number\n className?: string\n color?: string\n}\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const DenoIcon: React.FC<DenoIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg\n version=\"1.1\"\n width={size}\n height={size}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 122.87 122.88\">\n <g>\n <path\n fill={color}\n d=\"M56.6,0.03c-0.29,0.03-1.21,0.14-2.04,0.21C42.74,1.48,31.11,6.48,21.62,14.43c-1.75,1.45-5.74,5.44-7.19,7.19 C6.57,31.01,1.98,41.54,0.28,54.01c-0.38,2.77-0.38,12.1,0,14.87c1.69,12.47,6.29,23,14.14,32.38c1.45,1.75,5.44,5.74,7.19,7.19 C31,116.31,41.54,120.9,54,122.6c2.77,0.38,12.1,0.38,14.87,0c12.47-1.69,23-6.29,32.38-14.14c1.75-1.45,5.74-5.44,7.19-7.19 c7.86-9.38,12.45-19.92,14.14-32.38c0.38-2.77,0.38-12.1,0-14.87c-1.69-12.47-6.29-23-14.14-32.38c-1.45-1.75-5.44-5.74-7.19-7.19 C91.9,6.6,81.26,1.95,68.96,0.3c-1.33-0.18-3.26-0.26-6.85-0.29C59.38-0.01,56.89,0,56.6,0.03L56.6,0.03z M57.36,6.56 c0,1.77,0.12,5.61,0.29,9.25c0.09,1.78,0.2,4.34,0.24,5.67c0.17,4.71,0.67,17.09,0.74,18.19l0.08,1.1l-0.68-0.08 c-0.38-0.03-0.73-0.12-0.79-0.17c-0.05-0.06-0.15-1.1-0.21-2.33c-0.27-5.38-1.16-26.25-1.25-29.3l-0.09-3.35l0.42-0.06 c0.23-0.03,0.6-0.08,0.85-0.09l0.41-0.01L57.36,6.56L57.36,6.56L57.36,6.56z M71.82,6.2c0.02,0.02,0.06,4.58,0.11,10.14 c0.06,5.58,0.14,10.58,0.18,11.12c0.05,0.56,0.03,1.04-0.05,1.07c-0.06,0.05-0.44,0.05-0.82,0l-0.7-0.06l-0.11-4.4 c-0.06-2.43-0.14-5.12-0.17-6c-0.12-2.67-0.23-11.76-0.14-11.98C70.2,5.93,70.37,5.91,71,6.02C71.44,6.11,71.8,6.18,71.82,6.2 L71.82,6.2L71.82,6.2z M36.87,11.26c0.09,0.14,0.8,8.46,1.68,19.36c0.29,3.7,0.57,7.09,0.62,7.51c0.08,0.77,0.06,0.8-0.42,1.1 c-0.27,0.17-0.54,0.3-0.6,0.3c-0.05,0-0.14-0.39-0.18-0.88c-0.21-1.96-1.03-11.45-1.6-18.31c-0.33-4.03-0.63-7.65-0.68-8.04 c-0.08-0.67-0.06-0.73,0.33-0.94C36.49,11.11,36.76,11.06,36.87,11.26L36.87,11.26L36.87,11.26z M78.47,14.3 c0.42,0.15,0.47,0.23,0.56,1.09c0.15,1.51,0.11,8.73-0.06,8.73c-0.44,0-1.35-0.51-1.42-0.8c-0.05-0.18-0.09-2.33-0.09-4.76 C77.45,13.65,77.39,13.93,78.47,14.3L78.47,14.3z M50.56,15.01c0,0.41,0.11,2.66,0.23,5.03c0.12,2.37,0.26,5.38,0.32,6.68 c0.11,2.63,0.14,2.54-0.88,2.6c-0.5,0.02-0.5,0.02-0.53-0.74c-0.03-0.42-0.11-1.74-0.2-2.95c-0.08-1.21-0.26-3.82-0.38-5.82 c-0.12-1.99-0.27-3.97-0.32-4.4c-0.09-0.76-0.08-0.79,0.33-0.94c0.24-0.09,0.67-0.17,0.94-0.17C50.56,14.3,50.56,14.3,50.56,15.01 L50.56,15.01L50.56,15.01z M92.47,17.08l0.51,0.21l0.11,2.02c0.05,1.1,0.08,3.49,0.05,5.29l-0.05,3.29l-0.63-0.32l-0.63-0.3 l-0.05-5.02c-0.03-2.77-0.02-5.11,0.02-5.21C91.85,16.82,91.85,16.82,92.47,17.08L92.47,17.08L92.47,17.08z M64.88,19.06 c0.09,0.09,0.3,7.42,0.32,11.14l0.02,2.24l-0.71-0.11c-0.41-0.05-0.74-0.09-0.76-0.11c-0.05-0.03-0.5-11.23-0.5-12.32v-1.12 l0.77,0.09C64.46,18.94,64.84,19.01,64.88,19.06L64.88,19.06L64.88,19.06z M99.68,20.13c0.18,0.21,0.21,3.52,0.26,21.77 c0.05,20.96,0.05,21.5-0.23,21.5c-0.17,0-0.39-0.09-0.53-0.2c-0.23-0.17-0.26-1.99-0.33-19.9c-0.06-10.85-0.14-20.7-0.18-21.9 l-0.09-2.18l0.44,0.32C99.27,19.74,99.56,19.99,99.68,20.13L99.68,20.13L99.68,20.13z M86.13,23.23c0.08,0.06,0.15,0.92,0.17,1.9 c0.08,3.34,0.09,23.81,0.02,23.88c-0.03,0.03-0.3-0.05-0.6-0.17l-0.54-0.23l0-25.7L85.58,23C85.81,23.06,86.05,23.15,86.13,23.23 L86.13,23.23L86.13,23.23z M44.42,24.07c0.05,0.41,0.12,1.33,0.17,2.09c0.05,0.74,0.15,2.43,0.24,3.75 c0.18,2.66,0.15,2.83-0.71,2.83c-0.45,0-0.51-0.05-0.57-0.5c-0.15-0.89-0.68-8.33-0.6-8.45c0.08-0.11,0.86-0.38,1.22-0.41 C44.26,23.36,44.38,23.68,44.42,24.07L44.42,24.07z M19.43,27.93c0.17,1.6,0.5,4.96,0.74,7.45c0.26,2.49,0.47,4.61,0.47,4.7 c0,0.18-1.16,0.76-1.28,0.63c-0.08-0.08-1.59-13.45-1.59-14.05c0-0.36,1.16-1.89,1.31-1.72C19.13,24.96,19.28,26.31,19.43,27.93 L19.43,27.93z M78.68,29.51l0.44,0.26l0.02,3.26c0.01,1.78,0.05,3.78,0.05,4.43c0.03,1.36-0.14,1.59-0.95,1.3l-0.47-0.17v-1.3 c0-0.73-0.05-2.83-0.11-4.68l-0.09-3.35h0.35C78.09,29.26,78.44,29.38,78.68,29.51L78.68,29.51L78.68,29.51z M26.06,35.38 c0.27,2.9,0.71,7.8,1,10.88l0.51,5.59l-0.59,0.59l-0.57,0.59l-0.11-1.19c-0.06-0.67-0.36-3.75-0.68-6.86 c-0.32-3.11-0.77-7.63-1-10.03l-0.42-4.35l0.59-0.54c0.53-0.5,0.59-0.51,0.7-0.24C25.55,29.95,25.81,32.46,26.06,35.38L26.06,35.38 L26.06,35.38z M14.74,37.2c0.33,2.98,1.21,10.89,1.96,17.59c0.76,6.69,1.47,13.15,1.6,14.36c0.12,1.21,0.33,3.04,0.45,4.08 c0.21,1.77,0.21,1.89-0.03,2.07c-0.36,0.27-0.51,0.24-0.51-0.08c0-0.14-0.14-1.28-0.3-2.52c-0.27-2.07-0.73-5.58-1.74-13.45 c-0.21-1.59-0.62-4.74-0.91-7.03c-0.3-2.28-0.74-5.68-0.98-7.56c-0.24-1.87-0.65-5.08-0.91-7.15c-0.27-2.05-0.44-3.88-0.39-4.08 c0.11-0.41,1-1.83,1.09-1.74C14.11,31.75,14.41,34.21,14.74,37.2L14.74,37.2L14.74,37.2z M10.12,43.72 c0.23,1.81,0.65,5.12,0.94,7.37c0.29,2.24,0.65,5.03,0.82,6.2l0.29,2.12l-0.32,0.27c-0.18,0.15-0.36,0.21-0.42,0.15 c-0.06-0.06-0.18-0.67-0.27-1.33c-0.09-0.67-0.65-4.55-1.25-8.61l-1.07-7.4l0.35-1.03c0.18-0.56,0.38-1.01,0.42-1.01 C9.65,40.44,9.88,41.92,10.12,43.72L10.12,43.72L10.12,43.72z M93.08,41.74c0.21,0.21,0.24,1.15,0.24,8.08v7.84H92.9 c-0.92,0-0.91,0.23-0.97-8.36l-0.05-7.81h0.48C92.63,41.5,92.96,41.6,93.08,41.74L93.08,41.74z M60,44.44 c3.41,0.51,6.39,1.47,9.34,2.98c1.9,0.98,2.81,1.66,4.93,3.69c3.14,3.01,5.08,5.64,6.89,9.35c2.64,5.41,3.67,10.2,4.97,23.04 c0.59,5.76,1.36,16.2,1.53,20.48c0.05,1.24,0.15,3.28,0.24,4.53c0.17,2.66,0.36,2.3-1.98,3.43c-3.25,1.57-6.38,2.66-10.5,3.67 c-5.05,1.24-8.31,1.63-13.3,1.65l-3.63,0.01l0.03-1.74c0-0.95,0.09-3.17,0.18-4.91c0.45-8.42,0.36-19.04-0.23-24.93 c-0.33-3.38-0.98-7.49-1.35-8.4c-0.08-0.2,0.27-0.36,1.77-0.88c2.74-0.95,5.11-2.15,5.47-2.73c0.65-1.12-0.51-2.72-1.99-2.72 c-0.26,0-1.03,0.27-1.74,0.59c-3.39,1.56-10.17,3.39-14.08,3.79c-2.7,0.29-6.91,0.12-9.82-0.41c-1.59-0.29-4.43-1.36-6.8-2.58 c-2.73-1.42-4.41-3.31-4.91-5.55c-0.27-1.21-0.2-3.63,0.15-4.99c0.38-1.5,1.44-3.67,2.4-4.94c4.31-5.67,13.19-10.58,22.3-12.3 C52.78,44.03,56.89,43.97,60,44.44L60,44.44L60,44.44z M106.62,44.91c0.54,0.23,0.6,0.29,0.6,0.8c0.03,4.13-0.06,13.55-0.14,13.95 c-0.02,0.14-0.8,0.15-1.13,0.03c-0.21-0.08-0.24-0.89-0.24-7.56c0-4.77,0.06-7.46,0.15-7.46 C105.94,44.67,106.29,44.77,106.62,44.91L106.62,44.91z M113.22,53.21l0.54,0.23l-0.11,12.51c-0.12,15.94-0.14,16.41-0.71,17.79 c-0.94,2.25-0.89,2.7-0.8-7.18c0.03-4.94,0.11-9.94,0.14-11.11c0.03-1.16,0.06-4.44,0.08-7.3c0-3.45,0.05-5.17,0.15-5.17 C112.6,52.98,112.92,53.09,113.22,53.21L113.22,53.21z M22.34,56.97c0.09,1.22,0.06,1.35-0.38,2.31l-0.48,1.03L21.3,58.8 c-0.29-2.42-0.29-2.52,0.29-2.89c0.26-0.18,0.53-0.3,0.57-0.27C22.21,55.67,22.3,56.27,22.34,56.97L22.34,56.97z M13.01,66.08 c0.14,1.24,1.19,9.46,1.74,13.49c0.82,6.24,0.88,7.13,0.51,6.75c-0.05-0.05-0.39-2.15-0.76-4.67c-2.36-16.29-2.34-16.18-2.15-16.3 C12.76,65.08,12.9,65.23,13.01,66.08L13.01,66.08L13.01,66.08z M23.89,73c0.09,0.38,0.53,4.47,0.53,4.97 c0,0.42-0.54,0.82-0.79,0.57c-0.08-0.08-0.27-1.36-0.42-2.84c-0.17-1.5-0.33-3.05-0.38-3.46l-0.09-0.76l0.53,0.6 C23.57,72.43,23.84,72.84,23.89,73L23.89,73L23.89,73z M36.08,78.7c0.17,0.15,0.27,0.76,0.41,2.39c0.23,2.95,0.26,2.72-0.36,2.72 c-0.63,0-0.62,0.05-0.83-2.61c-0.21-2.7-0.21-2.67,0.2-2.67C35.69,78.52,35.94,78.61,36.08,78.7L36.08,78.7z M48.05,78.93 c0.03,0.15,0.11,1.06,0.17,2.01c0.05,0.95,0.18,3.1,0.3,4.76c0.42,6.1,0.44,6.88,0.18,6.88c-0.29,0-0.32-0.23-0.65-4.53 c-0.12-1.78-0.35-4.59-0.5-6.24c-0.14-1.65-0.23-3.02-0.18-3.05C47.54,78.56,47.97,78.7,48.05,78.93L48.05,78.93L48.05,78.93z M19.64,81.83c0.09,0.14,0.67,4.97,1.37,11.57c0.21,1.99,0.42,3.91,0.47,4.28l0.08,0.65l-0.38-0.24c-0.29-0.2-0.39-0.39-0.39-0.74 c0-0.95-0.65-7.22-1.15-11.06c-0.29-2.18-0.51-4.09-0.51-4.28C19.13,81.69,19.49,81.57,19.64,81.83L19.64,81.83z M106.85,88.14 l-0.11,6.32l-0.38,0.56c-0.86,1.27-0.82,1.51-0.77-5.56l0.03-6.48l0.56-0.57c0.3-0.3,0.6-0.56,0.67-0.56 C106.89,81.84,106.89,84.68,106.85,88.14L106.85,88.14L106.85,88.14z M92.87,98.16c0.08,8.78,0.06,9.46-0.18,9.73 c-0.15,0.17-0.29,0.27-0.33,0.23c-0.11-0.12-0.26-19.27-0.14-19.37c0.06-0.06,0.21-0.09,0.35-0.08 C92.76,88.72,92.81,89.79,92.87,98.16L92.87,98.16L92.87,98.16z M43.52,92.15c0.11,0.94,0.48,5.42,0.63,7.54 c0.09,1.42,0.09,1.47-0.24,1.57c-0.18,0.06-0.39,0.05-0.45-0.03c-0.11-0.11-0.44-3.46-0.85-8.63l-0.11-1.24h0.47 C43.41,91.36,43.44,91.39,43.52,92.15L43.52,92.15z M31.64,97.44c0.11,0.11,0.18,0.48,0.18,0.86c0,0.39,0.18,2.43,0.38,4.55 c0.57,5.79,0.62,6.57,0.36,6.42c-0.39-0.23-0.74-0.57-0.67-0.67c0.03-0.06-0.03-0.82-0.15-1.68c-0.11-0.88-0.24-2.3-0.3-3.17 c-0.06-0.88-0.2-2.48-0.32-3.55c-0.29-2.64-0.27-2.95,0.06-2.95C31.34,97.25,31.53,97.33,31.64,97.44L31.64,97.44L31.64,97.44z M38.79,107.61c0.05,0.33,0.14,1.57,0.2,2.75c0.11,2.27,0.06,2.43-0.56,1.96c-0.18-0.14-0.3-0.71-0.48-2.43 c-0.32-3.11-0.33-2.99,0.26-2.93C38.63,107,38.7,107.06,38.79,107.61L38.79,107.61L38.79,107.61z\" />\n <path\n fill={color}\n d=\"M33.39,51.68c-1.57,0.68-1.69,2.81-0.21,3.57c1.07,0.54,2.16,0.29,2.72-0.65 C36.96,52.87,35.23,50.88,33.39,51.68L33.39,51.68L33.39,51.68z M43.64,53.13c-1.45,0.89-1.45,3.04,0,3.93 c1.44,0.86,3.29-0.27,3.29-1.99C46.93,53.4,45.03,52.29,43.64,53.13L43.64,53.13z\" />\n </g>\n </svg>\n )\n}\nDenoIcon.displayName = 'DenoIcon'","/**\n * Centralized Shell Types\n *\n * Single source of truth for all shell/script type information across the platform.\n * Based on Tactical RMM supported shell types.\n */\nimport { PowershellLogoIcon } from '../components/icons-v2-generated/brand-logos/powershell-logo-icon'\nimport { PythonLogoIcon } from '../components/icons-v2-generated/brand-logos/python-logo-icon'\nimport {\n BashIcon,\n CmdIcon,\n DenoIcon,\n NushellIcon,\n ShellIcon\n} from '../components/icons'\nimport type { IconProps } from './icons'\n\n\n\nexport const ShellTypeValues = {\n POWERSHELL: 'POWERSHELL',\n CMD: 'CMD',\n BASH: 'BASH',\n PYTHON: 'PYTHON',\n NUSHELL: 'NUSHELL',\n DENO: 'DENO',\n SHELL: 'SHELL'\n} as const\n\nexport type ShellType = (typeof ShellTypeValues)[keyof typeof ShellTypeValues]\n\n/**\n * Shell type definition with all metadata\n */\nexport interface ShellTypeDefinition {\n id: ShellType\n label: string\n value: string\n icon: React.ComponentType<IconProps>\n}\n\n/**\n * Complete list of all shell types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const SHELL_TYPES: ShellTypeDefinition[] = [\n { id: ShellTypeValues.POWERSHELL, label: 'PowerShell', value: 'powershell', icon: PowershellLogoIcon },\n { id: ShellTypeValues.CMD, label: 'Batch', value: 'cmd', icon: CmdIcon },\n { id: ShellTypeValues.BASH, label: 'Bash', value: 'bash', icon: BashIcon },\n { id: ShellTypeValues.PYTHON, label: 'Python', value: 'python', icon: PythonLogoIcon },\n { id: ShellTypeValues.NUSHELL, label: 'Nu', value: 'nushell', icon: NushellIcon },\n { id: ShellTypeValues.DENO, label: 'Deno', value: 'deno', icon: DenoIcon },\n { id: ShellTypeValues.SHELL, label: 'Shell', value: 'shell', icon: ShellIcon },\n]\n\n/**\n * Maps shell types to display labels\n */\nexport const shellLabels: Record<ShellType, string> = {\n [ShellTypeValues.POWERSHELL]: 'PowerShell',\n [ShellTypeValues.CMD]: 'Batch',\n [ShellTypeValues.BASH]: 'Bash',\n [ShellTypeValues.PYTHON]: 'Python',\n [ShellTypeValues.NUSHELL]: 'Nu',\n [ShellTypeValues.DENO]: 'Deno',\n [ShellTypeValues.SHELL]: 'Shell'\n}\n","import type { SVGProps } from \"react\";\nexport interface AppleLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function AppleLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: AppleLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M17.57 12.628c-.024-2.531 2.062-3.747 2.156-3.805-1.174-1.72-2.999-1.957-3.649-1.983-1.552-.16-3.03.917-3.82.917s-2.005-.895-3.293-.869c-1.694.024-3.257.987-4.13 2.507-1.758 3.054-.448 7.59 1.268 10.073.84 1.213 1.837 2.581 3.151 2.53 1.266-.05 1.743-.82 3.269-.82s1.957.82 3.293.796c1.36-.026 2.222-1.24 3.054-2.458.958-1.411 1.356-2.775 1.38-2.847-.032-.012-2.65-1.018-2.68-4.041Zm-2.51-7.434c.697-.846 1.167-2.021 1.039-3.194-1.004.041-2.22.67-2.94 1.518-.644.748-1.21 1.944-1.056 3.093 1.115.086 2.26-.572 2.956-1.417Z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface LinuxLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function LinuxLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: LinuxLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M19.567 18.314c-.528-.217-.963-.558-.931-1.213.03-.653-.467-1.086-.467-1.086s.435-1.43.031-2.612c-.403-1.183-1.737-3.078-2.76-4.507-1.023-1.43-.155-3.08-1.085-5.192-.932-2.113-3.351-1.99-4.654-1.087-1.304.9-.901 3.137-.84 4.196.062 1.056.028 1.808-.092 2.082-.123.273-.962 1.276-1.52 2.114-.559.84-.962 2.58-1.367 3.295-.403.715-.124 1.368-.124 1.368s-.28.092-.497.56c-.217.465-.65.683-1.427.837-.775.155-.775.655-.59 1.214.187.559.001.871-.216 1.585-.217.713.869.932 1.923 1.054 1.055.126 2.234.81 3.228.934.992.125 1.303-.683 1.303-.683s1.116-.25 2.294-.28c1.18-.031 2.295.249 2.295.249s.218.497.62.714c.405.218 1.273.25 1.832-.34.559-.592 2.048-1.337 2.885-1.804.84-.468.686-1.182.159-1.398M12.306 4.606c.532 0 .961.528.961 1.18 0 .463-.215.862-.53 1.056l-.254-.11c.19-.094.324-.335.324-.617 0-.367-.227-.666-.507-.666-.277 0-.505.3-.505.666a.8.8 0 0 0 .088.373 27 27 0 0 0-.437-.172 1.4 1.4 0 0 1-.102-.53c0-.652.43-1.18.962-1.18m-.07 2.488c.267.093.562.266.532.438-.032.172-.172.172-.531.393-.36.218-1.142.703-1.392.735-.251.031-.39-.11-.657-.281-.266-.173-.766-.582-.64-.8 0 0 .39-.298.561-.455s.61-.532.876-.483c.266.045.986.36 1.252.453ZM9.84 4.793c.42 0 .76.5.76 1.118q0 .168-.032.32a1 1 0 0 0-.307.177 4 4 0 0 0-.14.12.8.8 0 0 0 .063-.49c-.056-.337-.28-.583-.503-.547-.221.038-.355.341-.299.68.057.34.28.585.502.548l.038-.01a3 3 0 0 1-.31.27c-.307-.143-.532-.567-.532-1.07 0-.617.34-1.116.76-1.116M9.019 20.5c-.098.445-.62.77-.62.77-.471.148-1.784-.423-2.38-.673-.593-.247-2.106-.324-2.305-.544-.197-.226.099-.722.175-1.192.073-.474-.148-.77-.075-1.094.075-.322 1.042-.322 1.412-.545.373-.225.447-.87.745-1.044.297-.175.842.446 1.065.795.222.346 1.066 1.837 1.412 2.21.348.372.67.87.572 1.317Zm5.488-4.332c-.09.438-.09 2.021-.09 2.021s-.961 1.335-2.452 1.554c-1.49.219-2.234.061-2.234.061l-.838-.962s.65-.095.559-.747c-.094-.653-1.985-1.555-2.327-2.363-.34-.808-.062-2.177.373-2.86.434-.684.712-2.175 1.147-2.674.434-.495.774-1.553.62-2.02 0 0 .93 1.12 1.58.935.652-.188 2.112-1.276 2.328-1.089s2.078 4.29 2.263 5.595-.125 2.3-.125 2.3-.712-.187-.804.249m4.761 2.928c-.29.267-1.902.92-2.386 1.428-.48.505-1.109.916-1.493.796-.387-.122-.724-.652-.555-1.426.168-.771.314-1.617.29-2.1s-.122-1.137 0-1.233c.12-.094.312-.047.312-.047s-.095.916.458 1.16c.554.239 1.35-.097 1.59-.34.243-.24.412-.602.412-.602s.24.122.216.507c-.024.386.168.943.531 1.135.36.19.915.458.625.722\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface WindowsLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function WindowsLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: WindowsLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"m2 4.832 8.173-1.11.004 7.86-8.17.046zm8.17 7.655.006 7.867-8.17-1.12v-6.8zm.99-8.91L21.997 2v9.482l-10.837.085zM22 12.56 21.997 22 11.16 20.475l-.015-7.932z\"\n />\n </svg>\n );\n}\n","/**\n * Centralized OS Types\n *\n * Single source of truth for all operating system type information across the platform.\n * Handles normalization of OS values from various sources (Fleet MDM, Tactical RMM, GraphQL).\n */\n\nimport { AppleLogoIcon } from '../components/icons-v2-generated/brand-logos/apple-logo-icon'\nimport { LinuxLogoIcon } from '../components/icons-v2-generated/brand-logos/linux-logo-icon'\nimport { WindowsLogoIcon } from '../components/icons-v2-generated/brand-logos/windows-logo-icon'\nimport React from 'react'\nimport type { OSPlatformId } from '../utils/os-platforms'\n\nexport const OSTypeValues = {\n WINDOWS: 'WINDOWS',\n MACOS: 'MACOS',\n LINUX: 'LINUX'\n} as const\n\nexport type OSType = (typeof OSTypeValues)[keyof typeof OSTypeValues]\n\n/**\n * OS type definition with all metadata\n */\nexport interface OSTypeDefinition {\n id: OSType\n label: string\n value: string\n icon: React.ComponentType<any>\n platformId: OSPlatformId\n aliases: string[] // Alternative names/values that map to this OS\n}\n\n/**\n * Complete list of all OS types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const OS_TYPES: OSTypeDefinition[] = [\n {\n id: OSTypeValues.MACOS,\n label: 'macOS',\n value: OSTypeValues.MACOS,\n icon: AppleLogoIcon,\n platformId: 'darwin',\n aliases: ['darwin', 'macos', 'mac os', 'osx', 'os x', 'mac'] // Put more specific ones first, 'mac' last to avoid false matches\n },\n {\n id: OSTypeValues.WINDOWS,\n label: 'Windows',\n value: OSTypeValues.WINDOWS,\n icon: WindowsLogoIcon,\n platformId: 'windows',\n aliases: ['windows', 'win32', 'win64', 'win'] // 'win' last since it's shortest\n },\n {\n id: OSTypeValues.LINUX,\n label: 'Linux',\n value: OSTypeValues.LINUX,\n icon: LinuxLogoIcon,\n platformId: 'linux',\n aliases: ['linux', 'ubuntu', 'debian', 'centos', 'redhat', 'fedora', 'pop', 'pop!_os', 'arch', 'manjaro']\n }\n]\n\n/**\n * Maps OS types to display labels\n */\nexport const osLabels: Record<OSType, string> = {\n [OSTypeValues.WINDOWS]: 'Windows',\n [OSTypeValues.MACOS]: 'macOS',\n [OSTypeValues.LINUX]: 'Linux'\n}\n","/**\n * TMCG (The Miami Cyber Gang) related types and interfaces\n */\n\nexport interface TMCGMemberSocialLink {\n platform: string\n url: string\n username?: string\n}\n\nexport interface TMCGMember {\n id: string\n full_name: string\n avatar_url?: string | null\n company?: string | null\n about?: string | null\n job_title?: string | null\n tmcg_roles: string[]\n social_links: TMCGMemberSocialLink[]\n created_at: string\n updated_at: string\n}\n\nexport interface TMCGMembersResponse {\n success: boolean\n data: {\n members: TMCGMember[]\n count: number\n }\n error?: string\n}\n\nexport interface TMCGMemberResponse {\n success: boolean\n data: TMCGMember\n error?: string\n}\n\n/**\n * TMCG Member Card Props\n */\nexport interface TMCGMemberCardProps {\n member: TMCGMember\n className?: string\n compact?: boolean\n}\n\n/**\n * TMCG Members Grid Props\n */\nexport interface TMCGMembersGridProps {\n members: TMCGMember[]\n isLoading?: boolean\n error?: string | null\n className?: string\n}\n\n/**\n * TMCG Social Links Props\n */\nexport interface TMCGSocialLinksProps {\n socialLinks: TMCGMemberSocialLink[]\n className?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\n/**\n * Hook return types\n */\nexport interface UseTMCGMembersResult {\n members: TMCGMember[]\n isLoading: boolean\n error: string | null\n refetch: () => void\n}\n\nexport interface UseTMCGMemberResult {\n member: TMCGMember | null\n isLoading: boolean\n error: string | null\n refetch: () => void\n}\n\n/**\n * TMCG specific constants\n */\nexport const TMCG_ROLES = {\n FOUNDER: 'founder',\n ORGANIZER: 'organizer',\n MEMBER: 'member',\n CONTRIBUTOR: 'contributor',\n SPEAKER: 'speaker',\n MENTOR: 'mentor'\n} as const\n\nexport type TMCGRole = typeof TMCG_ROLES[keyof typeof TMCG_ROLES]\n\n/**\n * TMCG role display names\n */\nexport const TMCG_ROLE_DISPLAY_NAMES: Record<string, string> = {\n [TMCG_ROLES.FOUNDER]: 'Founder',\n [TMCG_ROLES.ORGANIZER]: 'Organizer',\n [TMCG_ROLES.MEMBER]: 'Member',\n [TMCG_ROLES.CONTRIBUTOR]: 'Contributor',\n [TMCG_ROLES.SPEAKER]: 'Speaker',\n [TMCG_ROLES.MENTOR]: 'Mentor'\n}\n\n/**\n * Social platform icon mapping for TMCG context\n */\nexport const TMCG_SOCIAL_PLATFORMS = {\n linkedin: 'LinkedIn',\n twitter: 'Twitter',\n github: 'GitHub',\n website: 'Website',\n youtube: 'YouTube',\n instagram: 'Instagram',\n facebook: 'Facebook',\n discord: 'Discord',\n telegram: 'Telegram',\n slack: 'Slack'\n} as const\n\nexport type TMCGSocialPlatform = keyof typeof TMCG_SOCIAL_PLATFORMS"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types/announcement.ts","../../src/types/product-release.ts","../../src/types/delivery.ts","../../src/types/tool.types.ts","../../src/components/icons-v2-generated/brand-logos/powershell-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/python-logo-icon.tsx","../../src/components/icons/shell-icon.tsx","../../src/utils/cn.ts","../../src/components/icons/cmd-icon.tsx","../../src/components/icons/bash-icon.tsx","../../src/components/icons/nushell-icon.tsx","../../src/components/icons/deno-icon.tsx","../../src/types/shell.types.ts","../../src/components/icons-v2-generated/brand-logos/apple-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/linux-logo-icon.tsx","../../src/components/icons-v2-generated/brand-logos/windows-logo-icon.tsx","../../src/types/os.types.ts","../../src/types/tmcg.ts"],"names":["jsxs","jsx","extendTailwindMerge"],"mappings":"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","file":"index.cjs","sourcesContent":["// Announcement system TypeScript types\nimport type { LegacyPlatform, PlatformFilter, PlatformRecord } from './platform';\n\n// For backward compatibility, maintain the old Platform type temporarily\nexport type IconType = 'svg' | 'png';\n\n// Database Models\nexport interface Announcement {\n id: string;\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n platform?: PlatformRecord; // Joined platform data\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n // Custom CTA button colors (hex codes like #FFFFFF). Optional.\n cta_button_background_color?: string | null;\n cta_button_text_color?: string | null;\n /** Additional props to spread onto the CTA icon component */\n cta_icon_props?: Record<string, any>;\n created_at: string;\n updated_at: string;\n created_by?: string;\n created_by_user?: {\n id: string;\n email: string;\n full_name?: string;\n };\n announcement_assets?: AnnouncementAsset[];\n}\n\nexport interface AnnouncementAsset {\n id: string;\n announcement_id: string;\n file_name: string;\n file_url: string;\n file_size: number;\n mime_type: string;\n upload_path: string;\n created_at: string;\n}\n\n// API Request/Response Types\nexport interface CreateAnnouncementData {\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id: string; // Foreign key to platforms table\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n created_by: string;\n}\n\nexport interface UpdateAnnouncementData {\n title?: string;\n description?: string;\n background_color?: string;\n icon_type?: IconType;\n icon_svg_name?: string;\n icon_png_url?: string;\n /** Extra props for the main bar/icon */\n icon_svg_props?: Record<string, any>;\n platform_id?: string; // Foreign key to platforms table\n is_active?: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled?: boolean;\n cta_text?: string;\n cta_icon?: string;\n cta_show_icon?: boolean;\n cta_url?: string;\n cta_target?: '_self' | '_blank';\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: Record<string, any>;\n}\n\nexport interface AnnouncementListResponse {\n announcements: Announcement[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n };\n filters?: {\n platform?: LegacyPlatform;\n is_active?: boolean;\n };\n}\n\nexport interface AnnouncementResponse {\n announcement: Announcement;\n}\n\n// Form Data Types\nexport interface AnnouncementFormData {\n title: string;\n description: string;\n background_color: string;\n icon_type: IconType;\n icon_svg_name: string;\n icon_png_file?: File;\n platform_id: string; // Foreign key to platforms table\n is_active: boolean;\n // CTA (Call-To-Action) fields\n cta_enabled: boolean;\n cta_text: string;\n cta_icon: string;\n cta_show_icon: boolean;\n cta_url: string;\n cta_target: '_self' | '_blank';\n // New CTA button custom colors\n cta_button_background_color?: string;\n cta_button_text_color?: string;\n cta_icon_props?: string; // JSON string in form\n /** Extra props for the main bar/icon */\n icon_svg_props?: string;\n}\n\n// API Query Parameters\nexport interface GetAnnouncementsOptions {\n platform?: PlatformFilter; // Changed from Platform to PlatformFilter to include 'all'\n is_active?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: 'created_at' | 'updated_at' | 'title';\n sortOrder?: 'asc' | 'desc';\n}\n\n// File Upload Types\nexport interface IconUploadResponse {\n success: boolean;\n file_url?: string;\n file_name?: string;\n file_size?: number;\n error?: string;\n}\n\nexport interface IconUploadData {\n file: File;\n announcement_id?: string;\n}\n\n// Available SVG Icons (extend as needed)\nexport interface AvailableSvgIcon {\n name: string;\n display_name: string;\n component_name: string;\n}\n\n// Error Types\nexport interface AnnouncementError {\n code: string;\n message: string;\n details?: string;\n}\n\n// Validation Types\nexport interface AnnouncementValidation {\n title: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n description: {\n required: boolean;\n minLength: number;\n maxLength: number;\n };\n background_color: {\n required: boolean;\n pattern: RegExp;\n };\n icon_svg_name: {\n required: boolean;\n validOptions: string[];\n };\n platform: {\n required: boolean;\n validOptions: LegacyPlatform[];\n };\n}\n\n// Import unified platform configuration (removed duplicate definition)\nexport type { PlatformConfig } from './platform';\n\n// Admin Dashboard Types\nexport interface AnnouncementStats {\n total_announcements: number;\n active_announcements: number;\n announcements_by_platform: Record<LegacyPlatform, number>;\n recent_announcements: Announcement[];\n}\n\n// Component Props Types\nexport interface AnnouncementBarProps {\n announcement?: Announcement;\n onDismiss?: (announcementId: string) => void;\n className?: string;\n}\n\nexport interface AnnouncementFormProps {\n announcement?: Announcement;\n onSubmit: (data: AnnouncementFormData) => Promise<void>;\n onCancel: () => void;\n isLoading?: boolean;\n availableIcons: AvailableSvgIcon[];\n}\n\nexport interface AnnouncementListProps {\n announcements: Announcement[];\n onEdit: (announcement: Announcement) => void;\n onDelete: (announcementId: string) => void;\n onToggleActive: (announcementId: string, isActive: boolean) => void;\n isLoading?: boolean;\n}\n\n// Database Utility Types\nexport interface AnnouncementFilters {\n platform?: LegacyPlatform;\n is_active?: boolean;\n created_by?: string;\n search?: string;\n}\n\nexport interface AnnouncementSortOptions {\n field: 'created_at' | 'updated_at' | 'title' | 'platform';\n direction: 'asc' | 'desc';\n}\n\n// SVG Icon Type\nexport interface SvgIcon {\n name: string;\n label: string;\n component: any;\n}\n\n// Platform display configuration\n// PLATFORM_CONFIGS removed - all platform data now comes from database via getPlatformsConfig()\n\n// Available SVG icons configuration\nexport const AVAILABLE_SVG_ICONS: SvgIcon[] = [\n // OpenFrame Logo Options\n { name: 'openframe-logo', label: 'OpenFrame Logo', component: null as any },\n \n // Platform Logos\n { name: 'openmsp-logo', label: 'OpenMSP Logo', component: null as any },\n { name: 'flamingo-logo', label: 'Flamingo Logo', component: null as any },\n \n // Lucide Icons\n { name: 'megaphone', label: 'Megaphone', component: null as any },\n { name: 'bell', label: 'Bell', component: null as any },\n { name: 'info', label: 'Information', component: null as any },\n { name: 'star', label: 'Star', component: null as any },\n { name: 'rocket', label: 'Rocket', component: null as any },\n { name: 'package', label: 'Package', component: null as any }\n]; ","// Product Release Types\n// Following the blog.ts pattern for consistency\n\nimport type { PlatformRecord } from './platform'\nimport type { BlogTag } from './blog'\nimport type { VideoTeaser, TranscriptWord, SpeakerMapping } from './video-processing'\n\nexport interface ChangelogEntry {\n title: string\n description?: string\n /**\n * Per-entry visibility flag. Optional so product releases (which always render\n * publicly) remain backwards compatible. Investor updates require this field\n * because each entry can be marked internal — see investor-update-utils.ts.\n */\n visibility?: 'public' | 'internal'\n}\n\nexport interface ReleaseMedia {\n id: number\n release_id: number\n media_type: 'image' | 'video' | 'screenshot' | 'demo'\n media_url: string\n display_order: number | null\n title: string | null\n description: string | null\n created_at: string\n updated_at: string\n created_by: string\n}\n\nexport interface ProductReleaseGitHubLink {\n id: number\n release_id: number\n github_release_url: string // Full URL (e.g., https://github.com/org/repo/releases/tag/v2.0.0)\n display_order: number | null\n created_at: string\n}\n\nexport interface KnowledgeBaseLink {\n id: number\n release_id: number\n kb_article_path: string // Relative path (e.g., /api/authentication/api-keys.md)\n display_order: number | null\n created_at: string\n}\n\nexport interface ClickUpRoadmapTask {\n id: number\n release_id: number\n clickup_task_id: string // Just the task ID - details from roadmap folder\n display_order: number | null\n created_at: string\n}\n\nexport interface ClickUpDeliveryTask {\n id: number\n release_id: number\n clickup_task_id: string // Just the task ID - details from delivery list\n display_order: number | null\n created_at: string\n}\n\nexport interface ProductRelease {\n id: number\n title: string\n slug: string\n version: string\n summary: string | null\n content: string | null\n\n // Release metadata\n release_type: 'major' | 'minor' | 'patch' | 'beta' | 'alpha'\n release_status: 'alpha' | 'beta' | 'stable' | 'deprecated'\n release_date: string\n\n // Changelog (JSONB arrays)\n features_added: ChangelogEntry[]\n bugs_fixed: ChangelogEntry[]\n improvements: ChangelogEntry[]\n breaking_changes: ChangelogEntry[]\n\n // External relationships (one-to-many)\n github_releases?: ProductReleaseGitHubLink[]\n knowledge_base_links?: KnowledgeBaseLink[]\n clickup_roadmap_tasks?: ClickUpRoadmapTask[]\n clickup_delivery_tasks?: ClickUpDeliveryTask[]\n release_media?: ReleaseMedia[]\n\n // Media (keeping featured_image for hero)\n featured_image: string | null\n\n // Documentation\n migration_guide_url: string | null\n documentation_url: string | null\n\n // Video (youtube_url for embeds, main_video_url for AI processing)\n youtube_url: string | null\n main_video_url: string | null\n transcript: string | null\n transcript_words_data?: TranscriptWord[]\n srt_content?: string | null\n video_summary: string | null // AI-generated summary from video transcription\n video_bites: VideoTeaser[] // JSONB array of extracted video clips\n highlight_video_url: string | null\n highlight_video_thumbnail: string | null\n highlight_video_duration_ms: number | null\n highlight_video_source: 'manual' | 'ai_generated' | null\n main_video_thumbnail: string | null\n ai_transcript_formatted?: string\n speaker_mapping?: SpeakerMapping\n ai_confidence_transcript: number | null\n ai_confidence_video_summary: number | null // Confidence for video-generated summary\n ai_confidence_summary: number | null // Confidence for entity summary (Release Content Generation)\n\n // SEO\n seo_title: string | null\n seo_description: string | null\n seo_keywords: string | null\n og_image_url: string | null\n\n // Publishing\n status: 'draft' | 'published' | 'archived'\n published_at: string | null\n author_id: string | null\n /**\n * Hydrated by `getRelease` (detail) and `getReleases` (list) via\n * `hydrateAuthor` in the hub DAL. Optional so admin form + every existing\n * consumer that doesn't read author stay backward-compatible.\n */\n author?: {\n id: string\n full_name: string\n avatar_url: string | null\n job_title: string | null\n email?: string | null\n }\n\n // Timestamps\n created_at: string\n updated_at: string\n\n // Editor-provided AI generation instructions (steers Generate Content prompt)\n custom_instructions: string | null\n\n // Analytics\n view_count: number\n download_count: number\n\n // Relations (populated by joins)\n platforms?: PlatformRecord[]\n tags?: BlogTag[]\n product_release_platforms?: Array<{\n platform_id: string\n is_featured: boolean\n featured_order: number | null\n }>\n product_release_tags?: Array<{\n tag_id: number\n }>\n blog_tags?: BlogTag[]\n}\n\nexport interface CreateProductReleaseData {\n title: string\n slug: string\n version: string\n summary?: string\n content?: string\n release_type: 'major' | 'minor' | 'patch' | 'beta' | 'alpha'\n release_status: 'alpha' | 'beta' | 'stable' | 'deprecated'\n release_date: string\n features_added?: ChangelogEntry[]\n bugs_fixed?: ChangelogEntry[]\n improvements?: ChangelogEntry[]\n breaking_changes?: ChangelogEntry[]\n github_releases?: Array<{ github_release_url: string; display_order?: number }>\n knowledge_base_links?: Array<{ kb_article_path: string; display_order?: number }>\n clickup_roadmap_tasks?: Array<{ clickup_task_id: string; display_order?: number }>\n clickup_delivery_tasks?: Array<{ clickup_task_id: string; display_order?: number }>\n release_media?: Array<{ media_type: 'image' | 'video' | 'screenshot' | 'demo'; media_url: string; title?: string; description?: string; display_order?: number }>\n featured_image?: string\n migration_guide_url?: string\n documentation_url?: string\n youtube_url?: string\n main_video_url?: string\n transcript?: string\n srt_content?: string | null\n video_summary?: string // AI-generated summary from video transcription\n video_bites?: VideoTeaser[]\n highlight_video_url?: string | null\n highlight_video_thumbnail?: string | null\n highlight_video_duration_ms?: number | null\n highlight_video_source?: 'manual' | 'ai_generated' | null\n main_video_thumbnail?: string | null\n seo_title?: string\n seo_description?: string\n seo_keywords?: string\n og_image_url?: string\n status: 'draft' | 'published' | 'archived'\n published_at?: string | null\n author_id: string\n platforms: string[] // Array of platform IDs (UUIDs)\n featured_platform?: string // Platform ID for featured\n tags: number[] // Array of tag IDs\n custom_instructions?: string | null\n}\n\nexport type UpdateProductReleaseData = Partial<CreateProductReleaseData>\n\nexport interface ProductReleaseFilters {\n platform?: string | 'all'\n tags?: string[]\n version?: string\n release_type?: ('major' | 'minor' | 'patch' | 'beta' | 'alpha')[]\n release_status?: ('alpha' | 'beta' | 'stable' | 'deprecated')[]\n has_breaking_changes?: boolean\n search?: string\n featured?: boolean\n status?: string\n limit?: number\n offset?: number\n ids?: (number | string)[]\n}\n\nexport interface ProductReleaseListResponse {\n data: ProductRelease[]\n count: number\n}\n\n// GitHub Release interface (for wizard)\nexport interface GitHubRelease {\n id: string\n tag_name: string\n name: string\n body: string\n published_at: string\n html_url: string\n prerelease: boolean\n draft: boolean\n}\n\n// Release type options for dropdowns\nexport const releaseTypeOptions = [\n { value: 'major', label: 'Major Release', description: 'Breaking changes, new architecture', color: 'red' },\n { value: 'minor', label: 'Minor Release', description: 'New features, backward compatible', color: 'blue' },\n { value: 'patch', label: 'Patch Release', description: 'Bug fixes only', color: 'green' },\n { value: 'beta', label: 'Beta Release', description: 'Pre-release testing version', color: 'yellow' },\n { value: 'alpha', label: 'Alpha Release', description: 'Early testing version', color: 'orange' }\n] as const\n\n// Release status options\nexport const releaseStatusOptions = [\n { value: 'alpha', label: 'Alpha', description: 'Early development, unstable', color: 'orange' },\n { value: 'beta', label: 'Beta', description: 'Feature complete, testing', color: 'yellow' },\n { value: 'stable', label: 'Stable', description: 'Production ready', color: 'green' },\n { value: 'deprecated', label: 'Deprecated', description: 'No longer supported', color: 'gray' }\n] as const\n\n// Changelog category labels\nexport const changelogLabels = {\n features_added: 'Features Added',\n bugs_fixed: 'Bugs Fixed',\n improvements: 'Improvements',\n breaking_changes: 'Breaking Changes'\n} as const\n\n// Semantic versioning validation regex\nexport const SEMVER_REGEX = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/\n","/**\n * Delivery (ClickUp Bug-fixes & Enhancements) wire types — shared between the\n * hub's `/api/delivery*` route shapes and the lib's `DeliveryTable`/`DeliveryLists`/\n * `DeliverySection` components.\n *\n * Lifted from hub `types/delivery.ts` so embedders consuming the lib's\n * delivery surfaces and the lib's own `ReleaseDetailPage` (which renders\n * related delivery items) share one canonical shape.\n */\n\nexport interface DeliveryItem {\n id: string;\n title: string;\n description: string;\n status: string;\n statusColor: string; // ClickUp status color\n taskType: 'Request' | 'Bug' | string; // ClickUp task type\n /**\n * Canonical ClickUp custom_item_id (1008 = Bug, 1009 = Request, …).\n * Surfaced here so the chat's compact card can render a type-specific\n * lucide icon via `TaskTypeIcon` instead of the two-letter initials\n * fallback. Single source of truth lives in\n * `lib/utils/clickup-task-type-utils.ts` (hub-side).\n */\n customItemId: number | null;\n /**\n * Every ClickUp list the task is associated with (home list + ClickUp's\n * \"Tasks in Multiple Lists\" locations). UI joins these for display.\n * Falls back to a single-element array containing the home list when\n * there are no additional locations.\n */\n listNames: string[];\n dateOpened: number; // Unix timestamp\n dateUpdated: number; // Unix timestamp\n dateClosed: number | null; // Unix timestamp or null if not closed\n clickupUrl: string;\n}\n\nexport interface DeliveryResponse {\n completed: DeliveryItem[];\n inProgress: DeliveryItem[];\n}\n\n// Task type to badge label mapping\nexport const TASK_TYPE_LABELS = {\n Request: 'ENHANCEMENT',\n Bug: 'BUG-FIX',\n} as const;\n\n// Task type to badge text-color mapping (ODS attention-red for Bug; default for others)\nexport const TASK_TYPE_TEXT_COLORS = {\n Request: '', // Default white/grey\n Bug: 'text-[var(--ods-attention-red-error)]',\n} as const;\n","/**\n * Centralized Tool Types\n *\n * Single source of truth for all tool-related types across the entire platform.\n * Used by ToolBadge, ToolIcon, and any component that needs tool type information.\n */\n\nexport const ToolTypeValues = {\n TACTICAL_RMM: 'TACTICAL_RMM',\n FLEET_MDM: 'FLEET_MDM',\n MESHCENTRAL: 'MESHCENTRAL',\n AUTHENTIK: 'AUTHENTIK',\n OPENFRAME: 'OPENFRAME',\n OPENFRAME_CHAT: 'OPENFRAME_CHAT',\n OPENFRAME_CLIENT: 'OPENFRAME_CLIENT',\n OSQUERY: 'OSQUERY',\n SYSTEM: 'SYSTEM'\n} as const\n\nexport type ToolType = (typeof ToolTypeValues)[keyof typeof ToolTypeValues]\n\n/**\n * Maps tool types to display labels\n */\nexport const toolLabels: Record<ToolType, string> = {\n TACTICAL_RMM: 'Tactical',\n FLEET_MDM: 'Fleet',\n MESHCENTRAL: 'MeshCentral',\n AUTHENTIK: 'Authentik',\n OPENFRAME: 'OpenFrame',\n OPENFRAME_CHAT: 'OpenFrame Chat',\n OPENFRAME_CLIENT: 'OpenFrame Client',\n OSQUERY: 'Osquery',\n SYSTEM: 'System'\n}\n","import type { SVGProps } from \"react\";\nexport interface PowershellLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PowershellLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PowershellLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n fillRule=\"evenodd\"\n d=\"M10.274 19.708c-2.345 0-4.69.01-7.034-.005-1.19-.008-1.405-.286-1.138-1.442.908-3.919 1.844-7.83 2.732-11.754C5.07 5.455 5.584 4.99 6.719 5c4.69.043 9.379.014 14.068.019 1.176 0 1.374.25 1.11 1.436-.858 3.848-1.72 7.694-2.598 11.537-.328 1.438-.706 1.713-2.23 1.716-2.265.005-4.53.001-6.795 0\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"#212121\"\n fillRule=\"evenodd\"\n d=\"M12.269 12.029c-.157-.184-.33-.395-.513-.596-1.036-1.144-2.063-2.297-3.118-3.423C8.155 7.494 8 6.993 8.58 6.484c.573-.503 1.136-.458 1.661.12 1.464 1.612 2.925 3.225 4.413 4.815.556.593.426.997-.185 1.437a937 937 0 0 0-7.016 5.106c-.525.385-1.024.481-1.448-.087-.467-.626-.035-1 .45-1.35a764 764 0 0 0 5.186-3.782c.24-.177.584-.28.627-.714M13.012 18.09c-.632 0-1.264.02-1.894-.008-.502-.022-.805-.301-.798-.827.006-.497.258-.871.76-.885a90 90 0 0 1 4.142-.002c.438.009.762.293.76.747-.004.52-.28.925-.841.958-.708.043-1.42.01-2.13.01z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface PythonLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function PythonLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: PythonLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M11.966 2C7.244 2 7.193 3.833 7.193 4.21V6.5h4.864v.687H5.26C3.816 7.187 2 8.067 2 11.96c0 3.577 1.417 4.96 2.847 4.96h1.698v-2.386c0-.998.495-2.847 2.802-2.847h4.823c.71 0 2.71-.308 2.71-2.619V4.665C16.88 4.09 16.784 2 11.967 2M9.284 3.54a.874.874 0 1 1 0 1.75.874.874 0 1 1 0-1.75\"\n />\n <path\n fill={color}\n d=\"M12.034 22c4.72 0 4.778-1.867 4.778-2.21V17.5h-4.869v-.687h6.795c1.457 0 3.262-.901 3.262-4.773 0-4.24-1.916-4.96-2.847-4.96h-1.699v2.386c0 .998-.478 2.847-2.8 2.847H9.828c-.707 0-2.71.344-2.71 2.619v4.403c0 .951.581 2.665 4.915 2.665m2.682-1.54a.874.874 0 1 1-.002-1.748.874.874 0 0 1 .002 1.748\"\n />\n </svg>\n );\n}\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport function ShellIcon({ className = \"w-5 h-5\", size = 22, color = 'white' }: { className?: string; size?: number; color?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 48 48\" >\n <path\n fill='transparent'\n stroke={color}\n d=\"M6.5 8.4a2 2 0 0 0-2 2v27.2a2 2 0 0 0 2 2h35a2 2 0 0 0 2-2V10.4a2 2 0 0 0-2-2zM9 23.16l7.72 6L9 35.13v-12zm20.46 11.97h-11\" />\n </svg >\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge<'ods-typography'>({\n extend: {\n classGroups: {\n 'ods-typography': ['text-h1', 'text-h2', 'text-h3', 'text-h4', 'text-h5', 'text-h6'],\n },\n },\n})\n\n/**\n * Combine class names with Tailwind's merge utility\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Platform URL mappings for production (with environment variable overrides)\n */\nexport function getPlatformProductionUrl(platform: string): string {\n switch (platform) {\n // *-hub platforms — env var convention: NEXT_PUBLIC_<NAME>_HUB_URL\n case 'marketing-hub':\n return process.env.NEXT_PUBLIC_MARKETING_HUB_URL || 'https://marketing-hub.flamingo.so';\n case 'company-hub':\n return process.env.NEXT_PUBLIC_COMPANY_HUB_URL || 'https://company-hub.flamingo.so';\n case 'product-hub':\n return process.env.NEXT_PUBLIC_PRODUCT_HUB_URL || 'https://product-hub.flamingo.so';\n case 'revenue-hub':\n return process.env.NEXT_PUBLIC_REVENUE_HUB_URL || 'https://revenue-hub.flamingo.so';\n case 'people-hub':\n return process.env.NEXT_PUBLIC_PEOPLE_HUB_URL || 'https://people-hub.flamingo.so';\n // Standalone platforms — env var convention: NEXT_PUBLIC_<NAME>_URL\n case 'openmsp':\n return process.env.NEXT_PUBLIC_OPENMSP_URL || 'https://www.openmsp.ai';\n case 'flamingo':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'tmcg':\n return process.env.NEXT_PUBLIC_TMCG_URL || 'https://www.tmcg.miami';\n case 'flamingo-teaser':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n case 'openframe':\n return process.env.NEXT_PUBLIC_OPENFRAME_URL || 'https://openframe.ai';\n case 'universal':\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n default:\n return process.env.NEXT_PUBLIC_FLAMINGO_URL || 'https://www.flamingo.run';\n }\n}\n\n/**\n * Get ALL unique base domains from getPlatformProductionUrl\n *\n * Extracts domains by calling getPlatformProductionUrl for each platform identifier.\n * Platform identifiers match the switch cases in getPlatformProductionUrl.\n *\n * Handles 3 cases:\n * 1. LOCALHOST DEBUG - No domain (hostname-specific cookies)\n * 2. VERCEL PREVIEW (*.vercel.app) - Use vercel.app domain\n * 3. PRODUCTION - Extract from ALL platform URLs via getPlatformProductionUrl\n *\n * @returns Array of all unique base domains (with and without wildcard)\n */\nexport function getAllPlatformBaseDomains(): string[] {\n if (typeof window === 'undefined') return []\n\n const hostname = window.location.hostname\n\n // Case 1: LOCALHOST DEBUG - no domains needed\n if (hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.startsWith('127.')) {\n return []\n }\n\n // Case 2: VERCEL PREVIEW - use vercel.app domain\n const isVercelPreview = process.env.VERCEL_ENV === 'preview' ||\n process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview' ||\n hostname.includes('.vercel.app')\n\n if (isVercelPreview) {\n return ['.vercel.app', 'vercel.app']\n }\n\n // Case 3: PRODUCTION - extract from ALL platforms using getPlatformProductionUrl\n // Platform identifiers MUST match switch cases in getPlatformProductionUrl —\n // otherwise the corresponding domain is omitted from cookie scope.\n const platformIdentifiers = [\n 'marketing-hub', 'company-hub', 'product-hub', 'revenue-hub', 'people-hub',\n 'openmsp', 'flamingo', 'tmcg', 'flamingo-teaser', 'openframe', 'universal'\n ]\n\n const baseDomains = new Set<string>()\n\n platformIdentifiers.forEach(platform => {\n try {\n const url = getPlatformProductionUrl(platform)\n const urlHostname = new URL(url).hostname\n const parts = urlHostname.split('.')\n\n if (parts.length >= 2) {\n const baseDomain = parts.slice(-2).join('.')\n baseDomains.add(`.${baseDomain}`) // Wildcard\n baseDomains.add(baseDomain) // Non-wildcard\n }\n } catch (error) {\n console.warn('[Platform Domains] Failed to parse URL for platform:', platform, error)\n }\n })\n\n return Array.from(baseDomains)\n}\n\n/**\n * Get the application base URL for the current environment\n *\n * @param platform - Optional platform name (openmsp, flamingo, tmcg, openframe, etc.)\n * @returns The base URL with protocol (https:// or http://)\n *\n * Priority order:\n * 1. Environment variable override (NEXT_PUBLIC_*_URL)\n * 2. Platform-specific URL (if platform parameter provided)\n * 3. VERCEL_PROJECT_PRODUCTION_URL (Vercel production domain)\n * 4. Production fallback (current app or openmsp)\n * 5. Development (http://localhost:3000)\n *\n * Environment Variables (optional overrides — only set when production domain\n * differs from the hardcoded default):\n *\n * Hub deployments (NEXT_PUBLIC_<NAME>_HUB_URL):\n * - NEXT_PUBLIC_MARKETING_HUB_URL -> marketing-hub.flamingo.so\n * - NEXT_PUBLIC_COMPANY_HUB_URL -> company-hub.flamingo.so\n * - NEXT_PUBLIC_PRODUCT_HUB_URL -> product-hub.flamingo.so\n * - NEXT_PUBLIC_REVENUE_HUB_URL -> revenue-hub.flamingo.so\n * - NEXT_PUBLIC_PEOPLE_HUB_URL -> people-hub.flamingo.so\n *\n * Standalone platforms (NEXT_PUBLIC_<NAME>_URL):\n * - NEXT_PUBLIC_OPENMSP_URL -> www.openmsp.ai\n * - NEXT_PUBLIC_FLAMINGO_URL -> www.flamingo.run\n * - NEXT_PUBLIC_TMCG_URL -> www.tmcg.miami\n * - NEXT_PUBLIC_FLAMINGO_TEASER_URL -> www.flamingo.cx\n * - NEXT_PUBLIC_OPENFRAME_URL -> openframe.ai\n *\n * @example\n * getBaseUrl() // Current app URL\n * getBaseUrl('flamingo') // https://www.flamingo.run (production) or http://localhost:3000 (dev)\n * getBaseUrl('openmsp') // https://www.openmsp.ai (or NEXT_PUBLIC_OPENMSP_URL if set)\n */\nexport function getBaseUrl(platform?: string): string {\n // In development, always use localhost (regardless of platform)\n if (process.env.NODE_ENV !== 'production') {\n return process.env.NEXT_PUBLIC_DEV_URL || 'http://localhost:3000'\n }\n\n // If platform is specified, return its production URL with env variable override support\n if (platform) {\n return getPlatformProductionUrl(platform)\n }\n\n // Production: Use Vercel domain if available\n if (process.env.VERCEL_PROJECT_PRODUCTION_URL) {\n return `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`\n }\n\n // Production fallback: Use canonical www domain to avoid Google \"Page with redirect\" issue.\n // openmsp.ai redirects to www.openmsp.ai, so we set the base URL to the\n // final destination to ensure canonical URLs do not require a redirect.\n return 'https://www.openmsp.ai'\n}\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface CmdIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const CmdIcon: React.FC<CmdIconProps> = ({ size = 16, className = '', color='white'}) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M3 4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4Z\"\n stroke={color}\n />\n <text\n x=\"12\"\n y=\"16\"\n textAnchor=\"middle\"\n fill={color}\n fontSize=\"10\"\n fontFamily=\"monospace\"\n fontWeight=\"bold\"\n >\n \\>\n </text>\n </svg>\n )\n}\n\nCmdIcon.displayName = 'CmdIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface BashIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const BashIcon: React.FC<BashIconProps> = ({ size = 16, className = '' , color = 'white'}) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path fill={color}\n d=\"M5 9h2.31l.32-3h2l-.32 3h2l.32-3h2l-.32 3H15v2h-1.9l-.2 2H15v2h-2.31l-.32 3h-2l.32-3h-2l-.32 3h-2l.32-3H5v-2h1.9l.2-2H5zm4.1 2l-.2 2h2l.2-2M19 6h-2v8h2m0 2h-2v2h2Z\" />\n </svg>\n )\n}\n\nBashIcon.displayName = 'BashIcon'\n","import React from 'react'\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface NushellIconProps {\n size?: number\n className?: string\n color?: string\n}\n\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const NushellIcon: React.FC<NushellIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n className={className}\n viewBox=\"0 0 24 24\">\n <path\n fill={color}\n d=\"M0 16.338h1.25v-5.7c.417-.624 1.205-1.309 2.127-1.309c1.176 0 1.34.64 1.34 2.247v4.762h1.25v-5.685c0-1.458-.67-2.32-2.202-2.32c-.923 0-1.964.46-2.59 1.264l-.103-1.1H0Zm10.177-7.842h-1.25v5.698c0 1.46.745 2.307 2.263 2.307c.921 0 1.889-.431 2.514-1.22l.104 1.057h1.072V8.496h-1.25v5.773c-.432.67-1.265 1.25-2.129 1.25c-.907 0-1.324-.446-1.324-1.458zm8.11-.997l-.61.952l5.251 3.229l-5.251 3.244l.669.922L24 12.32v-1.28z\" />\n </svg>\n )\n}\n\nNushellIcon.displayName = 'NushellIcon'\n","import React from 'react'\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport interface DenoIconProps {\n size?: number\n className?: string\n color?: string\n}\n/** @deprecated Use icons from icons-v2-generated instead. */\nexport const DenoIcon: React.FC<DenoIconProps> = ({ size = 16, className = '', color = 'white' }) => {\n return (\n <svg\n version=\"1.1\"\n width={size}\n height={size}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 122.87 122.88\">\n <g>\n <path\n fill={color}\n d=\"M56.6,0.03c-0.29,0.03-1.21,0.14-2.04,0.21C42.74,1.48,31.11,6.48,21.62,14.43c-1.75,1.45-5.74,5.44-7.19,7.19 C6.57,31.01,1.98,41.54,0.28,54.01c-0.38,2.77-0.38,12.1,0,14.87c1.69,12.47,6.29,23,14.14,32.38c1.45,1.75,5.44,5.74,7.19,7.19 C31,116.31,41.54,120.9,54,122.6c2.77,0.38,12.1,0.38,14.87,0c12.47-1.69,23-6.29,32.38-14.14c1.75-1.45,5.74-5.44,7.19-7.19 c7.86-9.38,12.45-19.92,14.14-32.38c0.38-2.77,0.38-12.1,0-14.87c-1.69-12.47-6.29-23-14.14-32.38c-1.45-1.75-5.44-5.74-7.19-7.19 C91.9,6.6,81.26,1.95,68.96,0.3c-1.33-0.18-3.26-0.26-6.85-0.29C59.38-0.01,56.89,0,56.6,0.03L56.6,0.03z M57.36,6.56 c0,1.77,0.12,5.61,0.29,9.25c0.09,1.78,0.2,4.34,0.24,5.67c0.17,4.71,0.67,17.09,0.74,18.19l0.08,1.1l-0.68-0.08 c-0.38-0.03-0.73-0.12-0.79-0.17c-0.05-0.06-0.15-1.1-0.21-2.33c-0.27-5.38-1.16-26.25-1.25-29.3l-0.09-3.35l0.42-0.06 c0.23-0.03,0.6-0.08,0.85-0.09l0.41-0.01L57.36,6.56L57.36,6.56L57.36,6.56z M71.82,6.2c0.02,0.02,0.06,4.58,0.11,10.14 c0.06,5.58,0.14,10.58,0.18,11.12c0.05,0.56,0.03,1.04-0.05,1.07c-0.06,0.05-0.44,0.05-0.82,0l-0.7-0.06l-0.11-4.4 c-0.06-2.43-0.14-5.12-0.17-6c-0.12-2.67-0.23-11.76-0.14-11.98C70.2,5.93,70.37,5.91,71,6.02C71.44,6.11,71.8,6.18,71.82,6.2 L71.82,6.2L71.82,6.2z M36.87,11.26c0.09,0.14,0.8,8.46,1.68,19.36c0.29,3.7,0.57,7.09,0.62,7.51c0.08,0.77,0.06,0.8-0.42,1.1 c-0.27,0.17-0.54,0.3-0.6,0.3c-0.05,0-0.14-0.39-0.18-0.88c-0.21-1.96-1.03-11.45-1.6-18.31c-0.33-4.03-0.63-7.65-0.68-8.04 c-0.08-0.67-0.06-0.73,0.33-0.94C36.49,11.11,36.76,11.06,36.87,11.26L36.87,11.26L36.87,11.26z M78.47,14.3 c0.42,0.15,0.47,0.23,0.56,1.09c0.15,1.51,0.11,8.73-0.06,8.73c-0.44,0-1.35-0.51-1.42-0.8c-0.05-0.18-0.09-2.33-0.09-4.76 C77.45,13.65,77.39,13.93,78.47,14.3L78.47,14.3z M50.56,15.01c0,0.41,0.11,2.66,0.23,5.03c0.12,2.37,0.26,5.38,0.32,6.68 c0.11,2.63,0.14,2.54-0.88,2.6c-0.5,0.02-0.5,0.02-0.53-0.74c-0.03-0.42-0.11-1.74-0.2-2.95c-0.08-1.21-0.26-3.82-0.38-5.82 c-0.12-1.99-0.27-3.97-0.32-4.4c-0.09-0.76-0.08-0.79,0.33-0.94c0.24-0.09,0.67-0.17,0.94-0.17C50.56,14.3,50.56,14.3,50.56,15.01 L50.56,15.01L50.56,15.01z M92.47,17.08l0.51,0.21l0.11,2.02c0.05,1.1,0.08,3.49,0.05,5.29l-0.05,3.29l-0.63-0.32l-0.63-0.3 l-0.05-5.02c-0.03-2.77-0.02-5.11,0.02-5.21C91.85,16.82,91.85,16.82,92.47,17.08L92.47,17.08L92.47,17.08z M64.88,19.06 c0.09,0.09,0.3,7.42,0.32,11.14l0.02,2.24l-0.71-0.11c-0.41-0.05-0.74-0.09-0.76-0.11c-0.05-0.03-0.5-11.23-0.5-12.32v-1.12 l0.77,0.09C64.46,18.94,64.84,19.01,64.88,19.06L64.88,19.06L64.88,19.06z M99.68,20.13c0.18,0.21,0.21,3.52,0.26,21.77 c0.05,20.96,0.05,21.5-0.23,21.5c-0.17,0-0.39-0.09-0.53-0.2c-0.23-0.17-0.26-1.99-0.33-19.9c-0.06-10.85-0.14-20.7-0.18-21.9 l-0.09-2.18l0.44,0.32C99.27,19.74,99.56,19.99,99.68,20.13L99.68,20.13L99.68,20.13z M86.13,23.23c0.08,0.06,0.15,0.92,0.17,1.9 c0.08,3.34,0.09,23.81,0.02,23.88c-0.03,0.03-0.3-0.05-0.6-0.17l-0.54-0.23l0-25.7L85.58,23C85.81,23.06,86.05,23.15,86.13,23.23 L86.13,23.23L86.13,23.23z M44.42,24.07c0.05,0.41,0.12,1.33,0.17,2.09c0.05,0.74,0.15,2.43,0.24,3.75 c0.18,2.66,0.15,2.83-0.71,2.83c-0.45,0-0.51-0.05-0.57-0.5c-0.15-0.89-0.68-8.33-0.6-8.45c0.08-0.11,0.86-0.38,1.22-0.41 C44.26,23.36,44.38,23.68,44.42,24.07L44.42,24.07z M19.43,27.93c0.17,1.6,0.5,4.96,0.74,7.45c0.26,2.49,0.47,4.61,0.47,4.7 c0,0.18-1.16,0.76-1.28,0.63c-0.08-0.08-1.59-13.45-1.59-14.05c0-0.36,1.16-1.89,1.31-1.72C19.13,24.96,19.28,26.31,19.43,27.93 L19.43,27.93z M78.68,29.51l0.44,0.26l0.02,3.26c0.01,1.78,0.05,3.78,0.05,4.43c0.03,1.36-0.14,1.59-0.95,1.3l-0.47-0.17v-1.3 c0-0.73-0.05-2.83-0.11-4.68l-0.09-3.35h0.35C78.09,29.26,78.44,29.38,78.68,29.51L78.68,29.51L78.68,29.51z M26.06,35.38 c0.27,2.9,0.71,7.8,1,10.88l0.51,5.59l-0.59,0.59l-0.57,0.59l-0.11-1.19c-0.06-0.67-0.36-3.75-0.68-6.86 c-0.32-3.11-0.77-7.63-1-10.03l-0.42-4.35l0.59-0.54c0.53-0.5,0.59-0.51,0.7-0.24C25.55,29.95,25.81,32.46,26.06,35.38L26.06,35.38 L26.06,35.38z M14.74,37.2c0.33,2.98,1.21,10.89,1.96,17.59c0.76,6.69,1.47,13.15,1.6,14.36c0.12,1.21,0.33,3.04,0.45,4.08 c0.21,1.77,0.21,1.89-0.03,2.07c-0.36,0.27-0.51,0.24-0.51-0.08c0-0.14-0.14-1.28-0.3-2.52c-0.27-2.07-0.73-5.58-1.74-13.45 c-0.21-1.59-0.62-4.74-0.91-7.03c-0.3-2.28-0.74-5.68-0.98-7.56c-0.24-1.87-0.65-5.08-0.91-7.15c-0.27-2.05-0.44-3.88-0.39-4.08 c0.11-0.41,1-1.83,1.09-1.74C14.11,31.75,14.41,34.21,14.74,37.2L14.74,37.2L14.74,37.2z M10.12,43.72 c0.23,1.81,0.65,5.12,0.94,7.37c0.29,2.24,0.65,5.03,0.82,6.2l0.29,2.12l-0.32,0.27c-0.18,0.15-0.36,0.21-0.42,0.15 c-0.06-0.06-0.18-0.67-0.27-1.33c-0.09-0.67-0.65-4.55-1.25-8.61l-1.07-7.4l0.35-1.03c0.18-0.56,0.38-1.01,0.42-1.01 C9.65,40.44,9.88,41.92,10.12,43.72L10.12,43.72L10.12,43.72z M93.08,41.74c0.21,0.21,0.24,1.15,0.24,8.08v7.84H92.9 c-0.92,0-0.91,0.23-0.97-8.36l-0.05-7.81h0.48C92.63,41.5,92.96,41.6,93.08,41.74L93.08,41.74z M60,44.44 c3.41,0.51,6.39,1.47,9.34,2.98c1.9,0.98,2.81,1.66,4.93,3.69c3.14,3.01,5.08,5.64,6.89,9.35c2.64,5.41,3.67,10.2,4.97,23.04 c0.59,5.76,1.36,16.2,1.53,20.48c0.05,1.24,0.15,3.28,0.24,4.53c0.17,2.66,0.36,2.3-1.98,3.43c-3.25,1.57-6.38,2.66-10.5,3.67 c-5.05,1.24-8.31,1.63-13.3,1.65l-3.63,0.01l0.03-1.74c0-0.95,0.09-3.17,0.18-4.91c0.45-8.42,0.36-19.04-0.23-24.93 c-0.33-3.38-0.98-7.49-1.35-8.4c-0.08-0.2,0.27-0.36,1.77-0.88c2.74-0.95,5.11-2.15,5.47-2.73c0.65-1.12-0.51-2.72-1.99-2.72 c-0.26,0-1.03,0.27-1.74,0.59c-3.39,1.56-10.17,3.39-14.08,3.79c-2.7,0.29-6.91,0.12-9.82-0.41c-1.59-0.29-4.43-1.36-6.8-2.58 c-2.73-1.42-4.41-3.31-4.91-5.55c-0.27-1.21-0.2-3.63,0.15-4.99c0.38-1.5,1.44-3.67,2.4-4.94c4.31-5.67,13.19-10.58,22.3-12.3 C52.78,44.03,56.89,43.97,60,44.44L60,44.44L60,44.44z M106.62,44.91c0.54,0.23,0.6,0.29,0.6,0.8c0.03,4.13-0.06,13.55-0.14,13.95 c-0.02,0.14-0.8,0.15-1.13,0.03c-0.21-0.08-0.24-0.89-0.24-7.56c0-4.77,0.06-7.46,0.15-7.46 C105.94,44.67,106.29,44.77,106.62,44.91L106.62,44.91z M113.22,53.21l0.54,0.23l-0.11,12.51c-0.12,15.94-0.14,16.41-0.71,17.79 c-0.94,2.25-0.89,2.7-0.8-7.18c0.03-4.94,0.11-9.94,0.14-11.11c0.03-1.16,0.06-4.44,0.08-7.3c0-3.45,0.05-5.17,0.15-5.17 C112.6,52.98,112.92,53.09,113.22,53.21L113.22,53.21z M22.34,56.97c0.09,1.22,0.06,1.35-0.38,2.31l-0.48,1.03L21.3,58.8 c-0.29-2.42-0.29-2.52,0.29-2.89c0.26-0.18,0.53-0.3,0.57-0.27C22.21,55.67,22.3,56.27,22.34,56.97L22.34,56.97z M13.01,66.08 c0.14,1.24,1.19,9.46,1.74,13.49c0.82,6.24,0.88,7.13,0.51,6.75c-0.05-0.05-0.39-2.15-0.76-4.67c-2.36-16.29-2.34-16.18-2.15-16.3 C12.76,65.08,12.9,65.23,13.01,66.08L13.01,66.08L13.01,66.08z M23.89,73c0.09,0.38,0.53,4.47,0.53,4.97 c0,0.42-0.54,0.82-0.79,0.57c-0.08-0.08-0.27-1.36-0.42-2.84c-0.17-1.5-0.33-3.05-0.38-3.46l-0.09-0.76l0.53,0.6 C23.57,72.43,23.84,72.84,23.89,73L23.89,73L23.89,73z M36.08,78.7c0.17,0.15,0.27,0.76,0.41,2.39c0.23,2.95,0.26,2.72-0.36,2.72 c-0.63,0-0.62,0.05-0.83-2.61c-0.21-2.7-0.21-2.67,0.2-2.67C35.69,78.52,35.94,78.61,36.08,78.7L36.08,78.7z M48.05,78.93 c0.03,0.15,0.11,1.06,0.17,2.01c0.05,0.95,0.18,3.1,0.3,4.76c0.42,6.1,0.44,6.88,0.18,6.88c-0.29,0-0.32-0.23-0.65-4.53 c-0.12-1.78-0.35-4.59-0.5-6.24c-0.14-1.65-0.23-3.02-0.18-3.05C47.54,78.56,47.97,78.7,48.05,78.93L48.05,78.93L48.05,78.93z M19.64,81.83c0.09,0.14,0.67,4.97,1.37,11.57c0.21,1.99,0.42,3.91,0.47,4.28l0.08,0.65l-0.38-0.24c-0.29-0.2-0.39-0.39-0.39-0.74 c0-0.95-0.65-7.22-1.15-11.06c-0.29-2.18-0.51-4.09-0.51-4.28C19.13,81.69,19.49,81.57,19.64,81.83L19.64,81.83z M106.85,88.14 l-0.11,6.32l-0.38,0.56c-0.86,1.27-0.82,1.51-0.77-5.56l0.03-6.48l0.56-0.57c0.3-0.3,0.6-0.56,0.67-0.56 C106.89,81.84,106.89,84.68,106.85,88.14L106.85,88.14L106.85,88.14z M92.87,98.16c0.08,8.78,0.06,9.46-0.18,9.73 c-0.15,0.17-0.29,0.27-0.33,0.23c-0.11-0.12-0.26-19.27-0.14-19.37c0.06-0.06,0.21-0.09,0.35-0.08 C92.76,88.72,92.81,89.79,92.87,98.16L92.87,98.16L92.87,98.16z M43.52,92.15c0.11,0.94,0.48,5.42,0.63,7.54 c0.09,1.42,0.09,1.47-0.24,1.57c-0.18,0.06-0.39,0.05-0.45-0.03c-0.11-0.11-0.44-3.46-0.85-8.63l-0.11-1.24h0.47 C43.41,91.36,43.44,91.39,43.52,92.15L43.52,92.15z M31.64,97.44c0.11,0.11,0.18,0.48,0.18,0.86c0,0.39,0.18,2.43,0.38,4.55 c0.57,5.79,0.62,6.57,0.36,6.42c-0.39-0.23-0.74-0.57-0.67-0.67c0.03-0.06-0.03-0.82-0.15-1.68c-0.11-0.88-0.24-2.3-0.3-3.17 c-0.06-0.88-0.2-2.48-0.32-3.55c-0.29-2.64-0.27-2.95,0.06-2.95C31.34,97.25,31.53,97.33,31.64,97.44L31.64,97.44L31.64,97.44z M38.79,107.61c0.05,0.33,0.14,1.57,0.2,2.75c0.11,2.27,0.06,2.43-0.56,1.96c-0.18-0.14-0.3-0.71-0.48-2.43 c-0.32-3.11-0.33-2.99,0.26-2.93C38.63,107,38.7,107.06,38.79,107.61L38.79,107.61L38.79,107.61z\" />\n <path\n fill={color}\n d=\"M33.39,51.68c-1.57,0.68-1.69,2.81-0.21,3.57c1.07,0.54,2.16,0.29,2.72-0.65 C36.96,52.87,35.23,50.88,33.39,51.68L33.39,51.68L33.39,51.68z M43.64,53.13c-1.45,0.89-1.45,3.04,0,3.93 c1.44,0.86,3.29-0.27,3.29-1.99C46.93,53.4,45.03,52.29,43.64,53.13L43.64,53.13z\" />\n </g>\n </svg>\n )\n}\nDenoIcon.displayName = 'DenoIcon'","/**\n * Centralized Shell Types\n *\n * Single source of truth for all shell/script type information across the platform.\n * Based on Tactical RMM supported shell types.\n */\nimport { PowershellLogoIcon } from '../components/icons-v2-generated/brand-logos/powershell-logo-icon'\nimport { PythonLogoIcon } from '../components/icons-v2-generated/brand-logos/python-logo-icon'\nimport {\n BashIcon,\n CmdIcon,\n DenoIcon,\n NushellIcon,\n ShellIcon\n} from '../components/icons'\nimport type { IconProps } from './icons'\n\n\n\nexport const ShellTypeValues = {\n POWERSHELL: 'POWERSHELL',\n CMD: 'CMD',\n BASH: 'BASH',\n PYTHON: 'PYTHON',\n NUSHELL: 'NUSHELL',\n DENO: 'DENO',\n SHELL: 'SHELL'\n} as const\n\nexport type ShellType = (typeof ShellTypeValues)[keyof typeof ShellTypeValues]\n\n/**\n * Shell type definition with all metadata\n */\nexport interface ShellTypeDefinition {\n id: ShellType\n label: string\n value: string\n icon: React.ComponentType<IconProps>\n}\n\n/**\n * Complete list of all shell types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const SHELL_TYPES: ShellTypeDefinition[] = [\n { id: ShellTypeValues.POWERSHELL, label: 'PowerShell', value: 'powershell', icon: PowershellLogoIcon },\n { id: ShellTypeValues.CMD, label: 'Batch', value: 'cmd', icon: CmdIcon },\n { id: ShellTypeValues.BASH, label: 'Bash', value: 'bash', icon: BashIcon },\n { id: ShellTypeValues.PYTHON, label: 'Python', value: 'python', icon: PythonLogoIcon },\n { id: ShellTypeValues.NUSHELL, label: 'Nu', value: 'nushell', icon: NushellIcon },\n { id: ShellTypeValues.DENO, label: 'Deno', value: 'deno', icon: DenoIcon },\n { id: ShellTypeValues.SHELL, label: 'Shell', value: 'shell', icon: ShellIcon },\n]\n\n/**\n * Maps shell types to display labels\n */\nexport const shellLabels: Record<ShellType, string> = {\n [ShellTypeValues.POWERSHELL]: 'PowerShell',\n [ShellTypeValues.CMD]: 'Batch',\n [ShellTypeValues.BASH]: 'Bash',\n [ShellTypeValues.PYTHON]: 'Python',\n [ShellTypeValues.NUSHELL]: 'Nu',\n [ShellTypeValues.DENO]: 'Deno',\n [ShellTypeValues.SHELL]: 'Shell'\n}\n","import type { SVGProps } from \"react\";\nexport interface AppleLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function AppleLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: AppleLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M17.57 12.628c-.024-2.531 2.062-3.747 2.156-3.805-1.174-1.72-2.999-1.957-3.649-1.983-1.552-.16-3.03.917-3.82.917s-2.005-.895-3.293-.869c-1.694.024-3.257.987-4.13 2.507-1.758 3.054-.448 7.59 1.268 10.073.84 1.213 1.837 2.581 3.151 2.53 1.266-.05 1.743-.82 3.269-.82s1.957.82 3.293.796c1.36-.026 2.222-1.24 3.054-2.458.958-1.411 1.356-2.775 1.38-2.847-.032-.012-2.65-1.018-2.68-4.041Zm-2.51-7.434c.697-.846 1.167-2.021 1.039-3.194-1.004.041-2.22.67-2.94 1.518-.644.748-1.21 1.944-1.056 3.093 1.115.086 2.26-.572 2.956-1.417Z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface LinuxLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function LinuxLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: LinuxLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"M19.567 18.314c-.528-.217-.963-.558-.931-1.213.03-.653-.467-1.086-.467-1.086s.435-1.43.031-2.612c-.403-1.183-1.737-3.078-2.76-4.507-1.023-1.43-.155-3.08-1.085-5.192-.932-2.113-3.351-1.99-4.654-1.087-1.304.9-.901 3.137-.84 4.196.062 1.056.028 1.808-.092 2.082-.123.273-.962 1.276-1.52 2.114-.559.84-.962 2.58-1.367 3.295-.403.715-.124 1.368-.124 1.368s-.28.092-.497.56c-.217.465-.65.683-1.427.837-.775.155-.775.655-.59 1.214.187.559.001.871-.216 1.585-.217.713.869.932 1.923 1.054 1.055.126 2.234.81 3.228.934.992.125 1.303-.683 1.303-.683s1.116-.25 2.294-.28c1.18-.031 2.295.249 2.295.249s.218.497.62.714c.405.218 1.273.25 1.832-.34.559-.592 2.048-1.337 2.885-1.804.84-.468.686-1.182.159-1.398M12.306 4.606c.532 0 .961.528.961 1.18 0 .463-.215.862-.53 1.056l-.254-.11c.19-.094.324-.335.324-.617 0-.367-.227-.666-.507-.666-.277 0-.505.3-.505.666a.8.8 0 0 0 .088.373 27 27 0 0 0-.437-.172 1.4 1.4 0 0 1-.102-.53c0-.652.43-1.18.962-1.18m-.07 2.488c.267.093.562.266.532.438-.032.172-.172.172-.531.393-.36.218-1.142.703-1.392.735-.251.031-.39-.11-.657-.281-.266-.173-.766-.582-.64-.8 0 0 .39-.298.561-.455s.61-.532.876-.483c.266.045.986.36 1.252.453ZM9.84 4.793c.42 0 .76.5.76 1.118q0 .168-.032.32a1 1 0 0 0-.307.177 4 4 0 0 0-.14.12.8.8 0 0 0 .063-.49c-.056-.337-.28-.583-.503-.547-.221.038-.355.341-.299.68.057.34.28.585.502.548l.038-.01a3 3 0 0 1-.31.27c-.307-.143-.532-.567-.532-1.07 0-.617.34-1.116.76-1.116M9.019 20.5c-.098.445-.62.77-.62.77-.471.148-1.784-.423-2.38-.673-.593-.247-2.106-.324-2.305-.544-.197-.226.099-.722.175-1.192.073-.474-.148-.77-.075-1.094.075-.322 1.042-.322 1.412-.545.373-.225.447-.87.745-1.044.297-.175.842.446 1.065.795.222.346 1.066 1.837 1.412 2.21.348.372.67.87.572 1.317Zm5.488-4.332c-.09.438-.09 2.021-.09 2.021s-.961 1.335-2.452 1.554c-1.49.219-2.234.061-2.234.061l-.838-.962s.65-.095.559-.747c-.094-.653-1.985-1.555-2.327-2.363-.34-.808-.062-2.177.373-2.86.434-.684.712-2.175 1.147-2.674.434-.495.774-1.553.62-2.02 0 0 .93 1.12 1.58.935.652-.188 2.112-1.276 2.328-1.089s2.078 4.29 2.263 5.595-.125 2.3-.125 2.3-.712-.187-.804.249m4.761 2.928c-.29.267-1.902.92-2.386 1.428-.48.505-1.109.916-1.493.796-.387-.122-.724-.652-.555-1.426.168-.771.314-1.617.29-2.1s-.122-1.137 0-1.233c.12-.094.312-.047.312-.047s-.095.916.458 1.16c.554.239 1.35-.097 1.59-.34.243-.24.412-.602.412-.602s.24.122.216.507c-.024.386.168.943.531 1.135.36.19.915.458.625.722\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\nexport interface WindowsLogoIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"width\" | \"height\"> {\n className?: string;\n size?: number;\n color?: string;\n}\nexport function WindowsLogoIcon({\n className = \"\",\n size = 24,\n color = \"currentColor\",\n ...props\n}: WindowsLogoIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={className}\n {...props}\n >\n <path\n fill={color}\n d=\"m2 4.832 8.173-1.11.004 7.86-8.17.046zm8.17 7.655.006 7.867-8.17-1.12v-6.8zm.99-8.91L21.997 2v9.482l-10.837.085zM22 12.56 21.997 22 11.16 20.475l-.015-7.932z\"\n />\n </svg>\n );\n}\n","/**\n * Centralized OS Types\n *\n * Single source of truth for all operating system type information across the platform.\n * Handles normalization of OS values from various sources (Fleet MDM, Tactical RMM, GraphQL).\n */\n\nimport { AppleLogoIcon } from '../components/icons-v2-generated/brand-logos/apple-logo-icon'\nimport { LinuxLogoIcon } from '../components/icons-v2-generated/brand-logos/linux-logo-icon'\nimport { WindowsLogoIcon } from '../components/icons-v2-generated/brand-logos/windows-logo-icon'\nimport React from 'react'\nimport type { OSPlatformId } from '../utils/os-platforms'\n\nexport const OSTypeValues = {\n WINDOWS: 'WINDOWS',\n MACOS: 'MACOS',\n LINUX: 'LINUX'\n} as const\n\nexport type OSType = (typeof OSTypeValues)[keyof typeof OSTypeValues]\n\n/**\n * OS type definition with all metadata\n */\nexport interface OSTypeDefinition {\n id: OSType\n label: string\n value: string\n icon: React.ComponentType<any>\n platformId: OSPlatformId\n aliases: string[] // Alternative names/values that map to this OS\n}\n\n/**\n * Complete list of all OS types with icons and labels\n * SINGLE SOURCE OF TRUTH - Use this everywhere\n */\nexport const OS_TYPES: OSTypeDefinition[] = [\n {\n id: OSTypeValues.MACOS,\n label: 'macOS',\n value: OSTypeValues.MACOS,\n icon: AppleLogoIcon,\n platformId: 'darwin',\n aliases: ['darwin', 'macos', 'mac os', 'osx', 'os x', 'mac'] // Put more specific ones first, 'mac' last to avoid false matches\n },\n {\n id: OSTypeValues.WINDOWS,\n label: 'Windows',\n value: OSTypeValues.WINDOWS,\n icon: WindowsLogoIcon,\n platformId: 'windows',\n aliases: ['windows', 'win32', 'win64', 'win'] // 'win' last since it's shortest\n },\n {\n id: OSTypeValues.LINUX,\n label: 'Linux',\n value: OSTypeValues.LINUX,\n icon: LinuxLogoIcon,\n platformId: 'linux',\n aliases: ['linux', 'ubuntu', 'debian', 'centos', 'redhat', 'fedora', 'pop', 'pop!_os', 'arch', 'manjaro']\n }\n]\n\n/**\n * Maps OS types to display labels\n */\nexport const osLabels: Record<OSType, string> = {\n [OSTypeValues.WINDOWS]: 'Windows',\n [OSTypeValues.MACOS]: 'macOS',\n [OSTypeValues.LINUX]: 'Linux'\n}\n","/**\n * TMCG (The Miami Cyber Gang) related types and interfaces\n */\n\nexport interface TMCGMemberSocialLink {\n platform: string\n url: string\n username?: string\n}\n\nexport interface TMCGMember {\n id: string\n full_name: string\n avatar_url?: string | null\n company?: string | null\n about?: string | null\n job_title?: string | null\n tmcg_roles: string[]\n social_links: TMCGMemberSocialLink[]\n created_at: string\n updated_at: string\n}\n\nexport interface TMCGMembersResponse {\n success: boolean\n data: {\n members: TMCGMember[]\n count: number\n }\n error?: string\n}\n\nexport interface TMCGMemberResponse {\n success: boolean\n data: TMCGMember\n error?: string\n}\n\n/**\n * TMCG Member Card Props\n */\nexport interface TMCGMemberCardProps {\n member: TMCGMember\n className?: string\n compact?: boolean\n}\n\n/**\n * TMCG Members Grid Props\n */\nexport interface TMCGMembersGridProps {\n members: TMCGMember[]\n isLoading?: boolean\n error?: string | null\n className?: string\n}\n\n/**\n * TMCG Social Links Props\n */\nexport interface TMCGSocialLinksProps {\n socialLinks: TMCGMemberSocialLink[]\n className?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\n/**\n * Hook return types\n */\nexport interface UseTMCGMembersResult {\n members: TMCGMember[]\n isLoading: boolean\n error: string | null\n refetch: () => void\n}\n\nexport interface UseTMCGMemberResult {\n member: TMCGMember | null\n isLoading: boolean\n error: string | null\n refetch: () => void\n}\n\n/**\n * TMCG specific constants\n */\nexport const TMCG_ROLES = {\n FOUNDER: 'founder',\n ORGANIZER: 'organizer',\n MEMBER: 'member',\n CONTRIBUTOR: 'contributor',\n SPEAKER: 'speaker',\n MENTOR: 'mentor'\n} as const\n\nexport type TMCGRole = typeof TMCG_ROLES[keyof typeof TMCG_ROLES]\n\n/**\n * TMCG role display names\n */\nexport const TMCG_ROLE_DISPLAY_NAMES: Record<string, string> = {\n [TMCG_ROLES.FOUNDER]: 'Founder',\n [TMCG_ROLES.ORGANIZER]: 'Organizer',\n [TMCG_ROLES.MEMBER]: 'Member',\n [TMCG_ROLES.CONTRIBUTOR]: 'Contributor',\n [TMCG_ROLES.SPEAKER]: 'Speaker',\n [TMCG_ROLES.MENTOR]: 'Mentor'\n}\n\n/**\n * Social platform icon mapping for TMCG context\n */\nexport const TMCG_SOCIAL_PLATFORMS = {\n linkedin: 'LinkedIn',\n twitter: 'Twitter',\n github: 'GitHub',\n website: 'Website',\n youtube: 'YouTube',\n instagram: 'Instagram',\n facebook: 'Facebook',\n discord: 'Discord',\n telegram: 'Telegram',\n slack: 'Slack'\n} as const\n\nexport type TMCGSocialPlatform = keyof typeof TMCG_SOCIAL_PLATFORMS"]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * from './customer-interview';
|
|
|
11
11
|
export * from './customer-interview-ai.types';
|
|
12
12
|
export * from './luma';
|
|
13
13
|
export * from './product-release';
|
|
14
|
+
export * from './delivery';
|
|
14
15
|
export * from './vendor';
|
|
15
16
|
export * from './vendor-links';
|
|
16
17
|
export * from './video-processing';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtF,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,IAAI,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGjK,cAAc,YAAY,CAAA;AAG1B,cAAc,QAAQ,CAAA;AAGtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,QAAQ,CAAA;AACtB,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAGlC,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AAGtB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAG1B,cAAc,OAAO,CAAA;AACrB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AAGvB,cAAc,cAAc,CAAA;AAG5B,cAAc,cAAc,CAAA;AAG5B,cAAc,eAAe,CAAA;AAG7B,cAAc,YAAY,CAAA;AAG1B,cAAc,aAAa,CAAA;AAE3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACtF,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,IAAI,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGjK,cAAc,YAAY,CAAA;AAG1B,cAAc,QAAQ,CAAA;AAGtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,QAAQ,CAAA;AACtB,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAGlC,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AAGtB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAG1B,cAAc,OAAO,CAAA;AACrB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AAGvB,cAAc,cAAc,CAAA;AAG5B,cAAc,cAAc,CAAA;AAG5B,cAAc,eAAe,CAAA;AAG7B,cAAc,YAAY,CAAA;AAG1B,cAAc,aAAa,CAAA;AAE3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA"}
|
package/dist/types/index.js
CHANGED
|
@@ -42,6 +42,17 @@ var changelogLabels = {
|
|
|
42
42
|
};
|
|
43
43
|
var SEMVER_REGEX = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/;
|
|
44
44
|
|
|
45
|
+
// src/types/delivery.ts
|
|
46
|
+
var TASK_TYPE_LABELS = {
|
|
47
|
+
Request: "ENHANCEMENT",
|
|
48
|
+
Bug: "BUG-FIX"
|
|
49
|
+
};
|
|
50
|
+
var TASK_TYPE_TEXT_COLORS = {
|
|
51
|
+
Request: "",
|
|
52
|
+
// Default white/grey
|
|
53
|
+
Bug: "text-[var(--ods-attention-red-error)]"
|
|
54
|
+
};
|
|
55
|
+
|
|
45
56
|
// src/types/tool.types.ts
|
|
46
57
|
var ToolTypeValues = {
|
|
47
58
|
TACTICAL_RMM: "TACTICAL_RMM",
|
|
@@ -449,6 +460,6 @@ var TMCG_SOCIAL_PLATFORMS = {
|
|
|
449
460
|
slack: "Slack"
|
|
450
461
|
};
|
|
451
462
|
|
|
452
|
-
export { AVAILABLE_SVG_ICONS, OSTypeValues, OS_TYPES, SEMVER_REGEX, SHELL_TYPES, ShellTypeValues, TMCG_ROLES, TMCG_ROLE_DISPLAY_NAMES, TMCG_SOCIAL_PLATFORMS, ToolTypeValues, changelogLabels, osLabels, releaseStatusOptions, releaseTypeOptions, shellLabels, toolLabels };
|
|
463
|
+
export { AVAILABLE_SVG_ICONS, OSTypeValues, OS_TYPES, SEMVER_REGEX, SHELL_TYPES, ShellTypeValues, TASK_TYPE_LABELS, TASK_TYPE_TEXT_COLORS, TMCG_ROLES, TMCG_ROLE_DISPLAY_NAMES, TMCG_SOCIAL_PLATFORMS, ToolTypeValues, changelogLabels, osLabels, releaseStatusOptions, releaseTypeOptions, shellLabels, toolLabels };
|
|
453
464
|
//# sourceMappingURL=index.js.map
|
|
454
465
|
//# sourceMappingURL=index.js.map
|