@uniqueli/openwork 0.2.2 → 0.2.4

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.
@@ -12785,6 +12785,24 @@ const Music = createLucideIcon("Music", [
12785
12785
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
12786
12786
  ["circle", { cx: "18", cy: "16", r: "3", key: "1hluhg" }]
12787
12787
  ]);
12788
+ const PenTool = createLucideIcon("PenTool", [
12789
+ [
12790
+ "path",
12791
+ {
12792
+ d: "M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z",
12793
+ key: "nt11vn"
12794
+ }
12795
+ ],
12796
+ [
12797
+ "path",
12798
+ {
12799
+ d: "m18 13-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18",
12800
+ key: "15qc1e"
12801
+ }
12802
+ ],
12803
+ ["path", { d: "m2.3 2.3 7.286 7.286", key: "1wuzzi" }],
12804
+ ["circle", { cx: "11", cy: "11", r: "2", key: "xmgehs" }]
12805
+ ]);
12788
12806
  const Pencil = createLucideIcon("Pencil", [
12789
12807
  [
12790
12808
  "path",
@@ -12817,6 +12835,19 @@ const Send = createLucideIcon("Send", [
12817
12835
  ],
12818
12836
  ["path", { d: "m21.854 2.147-10.94 10.939", key: "12cjpa" }]
12819
12837
  ]);
12838
+ const Sparkles = createLucideIcon("Sparkles", [
12839
+ [
12840
+ "path",
12841
+ {
12842
+ d: "M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",
12843
+ key: "4pj2yx"
12844
+ }
12845
+ ],
12846
+ ["path", { d: "M20 3v4", key: "1olli1" }],
12847
+ ["path", { d: "M22 5h-4", key: "1gvqau" }],
12848
+ ["path", { d: "M4 17v2", key: "vumght" }],
12849
+ ["path", { d: "M5 18H3", key: "zchphs" }]
12850
+ ]);
12820
12851
  const SquarePen = createLucideIcon("SquarePen", [
12821
12852
  ["path", { d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7", key: "1m0v6g" }],
12822
12853
  [
@@ -75828,6 +75859,76 @@ function ContextUsageIndicator({
75828
75859
  ] }) })
75829
75860
  ] });
75830
75861
  }
75862
+ const Card = reactExports.forwardRef(
75863
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
75864
+ "div",
75865
+ {
75866
+ ref,
75867
+ className: cn("rounded-sm border border-border bg-card text-card-foreground", className),
75868
+ ...props
75869
+ }
75870
+ )
75871
+ );
75872
+ Card.displayName = "Card";
75873
+ const CardHeader = reactExports.forwardRef(
75874
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex flex-col space-y-1.5 p-4", className), ...props })
75875
+ );
75876
+ CardHeader.displayName = "CardHeader";
75877
+ const CardTitle = reactExports.forwardRef(
75878
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { ref, className: cn("text-section-header", className), ...props })
75879
+ );
75880
+ CardTitle.displayName = "CardTitle";
75881
+ const CardDescription = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("p", { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
75882
+ CardDescription.displayName = "CardDescription";
75883
+ const CardContent = reactExports.forwardRef(
75884
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("p-4 pt-0", className), ...props })
75885
+ );
75886
+ CardContent.displayName = "CardContent";
75887
+ const CardFooter = reactExports.forwardRef(
75888
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex items-center p-4 pt-0", className), ...props })
75889
+ );
75890
+ CardFooter.displayName = "CardFooter";
75891
+ const ICON_MAP = {
75892
+ FolderOpen,
75893
+ PenTool,
75894
+ FileText
75895
+ };
75896
+ const DEFAULT_SUGGESTIONS = [
75897
+ {
75898
+ icon: "FolderOpen",
75899
+ title: "文件整理",
75900
+ description: "智能整理和管理本地文件"
75901
+ },
75902
+ {
75903
+ icon: "PenTool",
75904
+ title: "内容创作",
75905
+ description: "创建演示文稿、文档和多媒体内容"
75906
+ },
75907
+ {
75908
+ icon: "FileText",
75909
+ title: "文档处理",
75910
+ description: "处理和分析文档数据"
75911
+ }
75912
+ ];
75913
+ function SuggestionCards({ onSelect }) {
75914
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "data-testid": "suggestion-cards", className: "grid grid-cols-3 gap-3 mt-6 w-full max-w-lg", children: DEFAULT_SUGGESTIONS.map((suggestion) => {
75915
+ const IconComponent = ICON_MAP[suggestion.icon];
75916
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
75917
+ Card,
75918
+ {
75919
+ className: "cursor-pointer transition-colors hover:bg-accent/50",
75920
+ onClick: () => onSelect(suggestion),
75921
+ "data-testid": "suggestion-card",
75922
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "p-4 flex flex-col items-start gap-2", children: [
75923
+ IconComponent && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg bg-accent/30 p-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconComponent, { className: "size-5 text-muted-foreground" }) }),
75924
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold", children: suggestion.title }),
75925
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: suggestion.description })
75926
+ ] })
75927
+ },
75928
+ suggestion.title
75929
+ );
75930
+ }) });
75931
+ }
75831
75932
  function ChatContainer({ threadId }) {
75832
75933
  const inputRef = reactExports.useRef(null);
75833
75934
  const scrollRef = reactExports.useRef(null);
@@ -76042,11 +76143,33 @@ function ChatContainer({ threadId }) {
76042
76143
  await selectWorkspaceFolder(threadId, setWorkspacePath, setWorkspaceFiles, () => {
76043
76144
  }, void 0);
76044
76145
  };
76146
+ const handleSuggestionSelect = async (suggestion) => {
76147
+ if (isLoading || !stream || !workspacePath) return;
76148
+ const message = suggestion.title;
76149
+ const userMessage = {
76150
+ id: crypto.randomUUID(),
76151
+ role: "user",
76152
+ content: message,
76153
+ created_at: /* @__PURE__ */ new Date()
76154
+ };
76155
+ appendMessage(userMessage);
76156
+ const currentThread = threads.find((t) => t.thread_id === threadId);
76157
+ if (currentThread?.title?.startsWith("Thread ")) {
76158
+ generateTitleForFirstMessage(threadId, message);
76159
+ }
76160
+ await stream.submit(
76161
+ { messages: [{ type: "human", content: message }] },
76162
+ { config: { configurable: { thread_id: threadId, model_id: currentModel } } }
76163
+ );
76164
+ };
76045
76165
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 flex-col min-h-0 overflow-hidden", children: [
76046
76166
  /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1 min-h-0", ref: scrollRef, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-3xl mx-auto space-y-4", children: [
76047
76167
  displayMessages.length === 0 && !isLoading && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-20 text-muted-foreground", children: [
76048
76168
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-section-header mb-2", children: "NEW THREAD" }),
76049
- workspacePath ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm", children: "Start a conversation with the agent" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-sm text-center space-y-3", children: [
76169
+ workspacePath ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
76170
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm", children: "Start a conversation with the agent" }),
76171
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SuggestionCards, { onSelect: handleSuggestionSelect })
76172
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-sm text-center space-y-3", children: [
76050
76173
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76051
76174
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-amber-500", children: "Select a workspace folder" }),
76052
76175
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-xs mt-1 opacity-75", children: "The agent needs a workspace to create and modify files" })
@@ -76155,6 +76278,781 @@ function TabbedPanel({ threadId, showTabBar = true }) {
76155
76278
  ) })
76156
76279
  ] });
76157
76280
  }
76281
+ function Switch({ checked = false, onCheckedChange, disabled = false, className, onClick, ...props }) {
76282
+ const handleClick = (e) => {
76283
+ onClick?.(e);
76284
+ if (!disabled) {
76285
+ onCheckedChange?.(!checked);
76286
+ }
76287
+ };
76288
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
76289
+ "button",
76290
+ {
76291
+ type: "button",
76292
+ role: "switch",
76293
+ "aria-checked": checked,
76294
+ disabled,
76295
+ onClick: handleClick,
76296
+ className: cn(
76297
+ "relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-white/20 focus:ring-offset-2 focus:ring-offset-[#0D0D0F] disabled:cursor-not-allowed disabled:opacity-50",
76298
+ checked ? "bg-blue-500" : "bg-white/10",
76299
+ className
76300
+ ),
76301
+ ...props,
76302
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
76303
+ "span",
76304
+ {
76305
+ className: cn(
76306
+ "pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out",
76307
+ checked ? "translate-x-4" : "translate-x-0"
76308
+ )
76309
+ }
76310
+ )
76311
+ }
76312
+ );
76313
+ }
76314
+ const SKILL_TEMPLATES = [
76315
+ {
76316
+ id: "custom-code-language",
76317
+ name: "Programming Language Expert",
76318
+ description: "Create a skill for a specific programming language",
76319
+ category: "coding",
76320
+ prompt: `You are an expert in {{LANGUAGE}} programming. Your expertise includes:
76321
+
76322
+ ## Core {{LANGUAGE}} Knowledge
76323
+ - Language syntax and best practices
76324
+ - Standard library and common frameworks
76325
+ - Idiomatic {{LANGUAGE}} code patterns
76326
+ - Performance considerations specific to {{LANGUAGE}}
76327
+
76328
+ ## Code Style
76329
+ - Follow {{LANGUAGE}} community conventions
76330
+ - Write clear, readable code
76331
+ - Use meaningful variable and function names
76332
+ - Add comments only when necessary
76333
+
76334
+ ## Common Patterns
76335
+ {{COMMON_PATTERNS}}
76336
+
76337
+ ## Best Practices
76338
+ {{BEST_PRACTICES}}
76339
+
76340
+ ## Testing
76341
+ - Testing frameworks for {{LANGUAGE}}
76342
+ - Writing testable code
76343
+ - Test organization and structure
76344
+
76345
+ When helping with {{LANGUAGE}}:
76346
+ 1. Follow modern {{LANGUAGE}} conventions
76347
+ 2. Use appropriate libraries and frameworks
76348
+ 3. Write idiomatic, clean code
76349
+ 4. Explain {{LANGUAGE}}-specific concepts`,
76350
+ variables: [
76351
+ {
76352
+ name: "LANGUAGE",
76353
+ label: "Programming Language",
76354
+ placeholder: "e.g., Rust, Go, Ruby, PHP",
76355
+ required: true
76356
+ },
76357
+ {
76358
+ name: "COMMON_PATTERNS",
76359
+ label: "Common Patterns",
76360
+ placeholder: "Describe common patterns in this language...",
76361
+ required: false
76362
+ },
76363
+ {
76364
+ name: "BEST_PRACTICES",
76365
+ label: "Best Practices",
76366
+ placeholder: "Describe best practices for this language...",
76367
+ required: false
76368
+ }
76369
+ ]
76370
+ },
76371
+ {
76372
+ id: "custom-framework",
76373
+ name: "Framework Expert",
76374
+ description: "Create a skill for a specific framework (React, Vue, Django, etc.)",
76375
+ category: "coding",
76376
+ prompt: `You are an expert in {{FRAMEWORK}} development. Your expertise includes:
76377
+
76378
+ ## {{FRAMEWORK}} Fundamentals
76379
+ - Framework architecture and design patterns
76380
+ - Component/model/view/controller structure
76381
+ - State management approaches
76382
+ - Routing and navigation
76383
+
76384
+ ## Best Practices
76385
+ - {{FRAMEWORK}} conventions and patterns
76386
+ - Performance optimization
76387
+ - Code organization and structure
76388
+ - Testing strategies
76389
+
76390
+ ## Common Tasks
76391
+ {{COMMON_TASKS}}
76392
+
76393
+ ## Ecosystem
76394
+ - Popular libraries and tools
76395
+ - Development workflow
76396
+ - Build and deployment
76397
+
76398
+ When working with {{FRAMEWORK}}:
76399
+ 1. Follow framework conventions
76400
+ 2. Use recommended patterns
76401
+ 3. Consider performance implications
76402
+ 4. Write maintainable code`,
76403
+ variables: [
76404
+ {
76405
+ name: "FRAMEWORK",
76406
+ label: "Framework Name",
76407
+ placeholder: "e.g., Laravel, Spring Boot, Express.js",
76408
+ required: true
76409
+ },
76410
+ {
76411
+ name: "COMMON_TASKS",
76412
+ label: "Common Tasks",
76413
+ placeholder: "List common tasks for this framework...",
76414
+ required: false
76415
+ }
76416
+ ]
76417
+ },
76418
+ {
76419
+ id: "custom-domain",
76420
+ name: "Domain Expert",
76421
+ description: "Create a skill for a specific domain (finance, healthcare, education, etc.)",
76422
+ category: "custom",
76423
+ prompt: `You are an expert in {{DOMAIN}}. Your expertise includes:
76424
+
76425
+ ## Domain Knowledge
76426
+ - {{DOMAIN}} terminology and concepts
76427
+ - Industry standards and regulations
76428
+ - Best practices and workflows
76429
+ - Common tools and technologies
76430
+
76431
+ ## Problem Solving
76432
+ - Typical {{DOMAIN}} challenges
76433
+ - Analytical approaches
76434
+ - Solution strategies
76435
+ - Decision-making frameworks
76436
+
76437
+ ## Communication
76438
+ - Explain {{DOMAIN}} concepts clearly
76439
+ - Use appropriate terminology
76440
+ - Provide context for technical decisions
76441
+ - Consider stakeholder needs
76442
+
76443
+ When helping with {{DOMAIN}}:
76444
+ 1. Understand the specific context
76445
+ 2. Apply domain-relevant knowledge
76446
+ 3. Consider industry standards
76447
+ 4. Explain domain-specific concepts`,
76448
+ variables: [
76449
+ {
76450
+ name: "DOMAIN",
76451
+ label: "Domain Name",
76452
+ placeholder: "e.g., Finance, Healthcare, E-commerce",
76453
+ required: true
76454
+ }
76455
+ ]
76456
+ },
76457
+ {
76458
+ id: "custom-tool",
76459
+ name: "Tool/CLI Expert",
76460
+ description: "Create a skill for a specific command-line tool or software",
76461
+ category: "system",
76462
+ prompt: `You are an expert in {{TOOL_NAME}}. Your expertise includes:
76463
+
76464
+ ## {{TOOL_NAME}} Overview
76465
+ - Tool purpose and use cases
76466
+ - Installation and setup
76467
+ - Basic commands and operations
76468
+ - Advanced features
76469
+
76470
+ ## Common Commands
76471
+ {{COMMON_COMMANDS}}
76472
+
76473
+ ## Best Practices
76474
+ - Efficient workflows
76475
+ - Common pitfalls and how to avoid them
76476
+ - Performance considerations
76477
+ - Integration with other tools
76478
+
76479
+ ## Troubleshooting
76480
+ - Common issues and solutions
76481
+ - Debugging techniques
76482
+ - Error interpretation
76483
+
76484
+ When helping with {{TOOL_NAME}}:
76485
+ 1. Provide clear command examples
76486
+ 2. Explain flags and options
76487
+ 3. Show expected output
76488
+ 4. Include troubleshooting tips`,
76489
+ variables: [
76490
+ {
76491
+ name: "TOOL_NAME",
76492
+ label: "Tool Name",
76493
+ placeholder: "e.g., Docker, Kubernetes, Git",
76494
+ required: true
76495
+ },
76496
+ {
76497
+ name: "COMMON_COMMANDS",
76498
+ label: "Common Commands",
76499
+ placeholder: "List common commands with examples...",
76500
+ required: false
76501
+ }
76502
+ ]
76503
+ },
76504
+ {
76505
+ id: "custom-language-learning",
76506
+ name: "Language Learning Assistant",
76507
+ description: "Create a skill for learning a human language",
76508
+ category: "creative",
76509
+ prompt: `You are a {{LANGUAGE}} language learning assistant. Your expertise includes:
76510
+
76511
+ ## Language Skills
76512
+ - {{LANGUAGE}} grammar and syntax
76513
+ - Vocabulary and expressions
76514
+ - Pronunciation guidance
76515
+ - Cultural context and nuances
76516
+
76517
+ ## Teaching Approach
76518
+ - Explain concepts clearly
76519
+ - Provide examples and practice
76520
+ - Correct mistakes gently
76521
+ - Encourage conversation practice
76522
+
76523
+ ## Learning Resources
76524
+ - Common learning materials
76525
+ - Practice exercises
76526
+ - Real-world usage examples
76527
+ - Tips for effective learning
76528
+
76529
+ When helping with {{LANGUAGE}}:
76530
+ 1. Assess current skill level
76531
+ 2. Provide appropriate level instruction
76532
+ 3. Use natural examples
76533
+ 4. Encourage practice and immersion`,
76534
+ variables: [
76535
+ {
76536
+ name: "LANGUAGE",
76537
+ label: "Language",
76538
+ placeholder: "e.g., Spanish, Japanese, German",
76539
+ required: true
76540
+ }
76541
+ ]
76542
+ }
76543
+ ];
76544
+ function renderTemplate(template, values) {
76545
+ let rendered = template.prompt;
76546
+ for (const variable of template.variables || []) {
76547
+ const value = values[variable.name] || "";
76548
+ const placeholder = `{{${variable.name}}}`;
76549
+ rendered = rendered.replace(new RegExp(placeholder, "g"), value);
76550
+ }
76551
+ return rendered;
76552
+ }
76553
+ const categories = [
76554
+ { value: "coding", label: "Coding", description: "Programming and development tasks" },
76555
+ { value: "analysis", label: "Analysis", description: "Data analysis and research" },
76556
+ { value: "creative", label: "Creative", description: "Writing and creative work" },
76557
+ { value: "data", label: "Data", description: "Database and data management" },
76558
+ { value: "system", label: "System", description: "System operations and debugging" },
76559
+ { value: "custom", label: "Custom", description: "Other specialized skills" }
76560
+ ];
76561
+ function CreateSkillDialog({ open, onClose, onCreate }) {
76562
+ const [mode, setMode] = reactExports.useState("custom");
76563
+ const [selectedTemplate, setSelectedTemplate] = reactExports.useState(null);
76564
+ const [templateValues, setTemplateValues] = reactExports.useState({});
76565
+ const [name2, setName] = reactExports.useState("");
76566
+ const [description, setDescription] = reactExports.useState("");
76567
+ const [category, setCategory] = reactExports.useState("custom");
76568
+ const [prompt, setPrompt] = reactExports.useState("");
76569
+ reactExports.useEffect(() => {
76570
+ if (!open) {
76571
+ setMode("custom");
76572
+ setSelectedTemplate(null);
76573
+ setTemplateValues({});
76574
+ setName("");
76575
+ setDescription("");
76576
+ setCategory("custom");
76577
+ setPrompt("");
76578
+ }
76579
+ }, [open]);
76580
+ reactExports.useEffect(() => {
76581
+ if (mode === "template" && selectedTemplate) {
76582
+ const template = SKILL_TEMPLATES.find((t) => t.id === selectedTemplate);
76583
+ if (template) {
76584
+ setCategory(template.category);
76585
+ setName(template.name.replace(/{{.*?}}/g, "Custom"));
76586
+ setDescription(template.description);
76587
+ setPrompt(template.prompt);
76588
+ }
76589
+ }
76590
+ }, [selectedTemplate, mode]);
76591
+ const handleSubmit = (e) => {
76592
+ e.preventDefault();
76593
+ const finalPrompt = mode === "template" && selectedTemplate ? renderTemplate(SKILL_TEMPLATES.find((t) => t.id === selectedTemplate), templateValues) : prompt;
76594
+ if (!name2.trim() || !description.trim() || !finalPrompt.trim()) {
76595
+ return;
76596
+ }
76597
+ onCreate({
76598
+ name: name2.trim(),
76599
+ description: description.trim(),
76600
+ category,
76601
+ prompt: finalPrompt.trim()
76602
+ });
76603
+ setMode("custom");
76604
+ setSelectedTemplate(null);
76605
+ setTemplateValues({});
76606
+ setName("");
76607
+ setDescription("");
76608
+ setCategory("custom");
76609
+ setPrompt("");
76610
+ onClose();
76611
+ };
76612
+ const currentTemplate = SKILL_TEMPLATES.find((t) => t.id === selectedTemplate);
76613
+ if (!open) return null;
76614
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-full max-w-3xl mx-4 bg-[#1A1A1D] rounded-lg shadow-xl border border-white/10", children: [
76615
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-white/5", children: [
76616
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-white", children: "Create Custom Skill" }),
76617
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76618
+ "button",
76619
+ {
76620
+ onClick: onClose,
76621
+ className: "text-gray-400 hover:text-white transition-colors",
76622
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
76623
+ }
76624
+ )
76625
+ ] }),
76626
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-6 py-3 border-b border-white/5", children: [
76627
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76628
+ "button",
76629
+ {
76630
+ type: "button",
76631
+ onClick: () => setMode("custom"),
76632
+ className: `px-4 py-2 text-sm font-medium rounded-md transition-colors ${mode === "custom" ? "bg-blue-500 text-white" : "bg-white/5 text-gray-400 hover:bg-white/10"}`,
76633
+ children: "Custom"
76634
+ }
76635
+ ),
76636
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76637
+ "button",
76638
+ {
76639
+ type: "button",
76640
+ onClick: () => setMode("template"),
76641
+ className: `px-4 py-2 text-sm font-medium rounded-md transition-colors ${mode === "template" ? "bg-blue-500 text-white" : "bg-white/5 text-gray-400 hover:bg-white/10"}`,
76642
+ children: "From Template"
76643
+ }
76644
+ )
76645
+ ] }),
76646
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, className: "p-6 space-y-4", children: [
76647
+ mode === "template" && /* Template Selection */
76648
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76649
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-sm font-medium text-gray-300 mb-2", children: "Choose Template" }),
76650
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-2 gap-2 max-h-48 overflow-y-auto", children: SKILL_TEMPLATES.map((template) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
76651
+ "button",
76652
+ {
76653
+ type: "button",
76654
+ onClick: () => setSelectedTemplate(template.id),
76655
+ className: `px-3 py-2 text-left text-sm rounded-md transition-colors ${selectedTemplate === template.id ? "bg-blue-500/20 text-blue-400 border border-blue-500/50" : "bg-white/5 text-gray-400 border border-white/10 hover:bg-white/10"}`,
76656
+ children: [
76657
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: template.name }),
76658
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs opacity-75", children: template.description })
76659
+ ]
76660
+ },
76661
+ template.id
76662
+ )) })
76663
+ ] }),
76664
+ mode === "template" && currentTemplate && currentTemplate.variables && currentTemplate.variables.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 p-4 bg-white/5 rounded-lg border border-white/10", children: [
76665
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium text-white", children: "Customize Template" }),
76666
+ currentTemplate.variables.map((variable) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76667
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "block text-sm text-gray-300 mb-1", children: [
76668
+ variable.label,
76669
+ variable.required && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-red-500", children: " *" })
76670
+ ] }),
76671
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76672
+ "input",
76673
+ {
76674
+ type: "text",
76675
+ value: templateValues[variable.name] || "",
76676
+ onChange: (e) => setTemplateValues({ ...templateValues, [variable.name]: e.target.value }),
76677
+ placeholder: variable.placeholder,
76678
+ className: "w-full px-3 py-2 text-sm text-white placeholder-gray-500 bg-white/5 border border-white/10 rounded-md focus:outline-none focus:border-blue-500",
76679
+ required: variable.required
76680
+ }
76681
+ )
76682
+ ] }, variable.name))
76683
+ ] }),
76684
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76685
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "block text-sm font-medium text-gray-300 mb-1", children: [
76686
+ "Skill Name ",
76687
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-red-500", children: "*" })
76688
+ ] }),
76689
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76690
+ "input",
76691
+ {
76692
+ type: "text",
76693
+ value: name2,
76694
+ onChange: (e) => setName(e.target.value),
76695
+ placeholder: "e.g., React Expert, Python Specialist",
76696
+ className: "w-full px-3 py-2 text-sm text-white placeholder-gray-500 bg-white/5 border border-white/10 rounded-md focus:outline-none focus:border-blue-500",
76697
+ required: true
76698
+ }
76699
+ )
76700
+ ] }),
76701
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76702
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "block text-sm font-medium text-gray-300 mb-1", children: [
76703
+ "Description ",
76704
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-red-500", children: "*" })
76705
+ ] }),
76706
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76707
+ "input",
76708
+ {
76709
+ type: "text",
76710
+ value: description,
76711
+ onChange: (e) => setDescription(e.target.value),
76712
+ placeholder: "Brief description of what this skill does",
76713
+ className: "w-full px-3 py-2 text-sm text-white placeholder-gray-500 bg-white/5 border border-white/10 rounded-md focus:outline-none focus:border-blue-500",
76714
+ required: true
76715
+ }
76716
+ )
76717
+ ] }),
76718
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76719
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-sm font-medium text-gray-300 mb-2", children: "Category" }),
76720
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-3 gap-2", children: categories.map((cat) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
76721
+ "button",
76722
+ {
76723
+ type: "button",
76724
+ onClick: () => setCategory(cat.value),
76725
+ className: `px-3 py-2 text-left text-sm rounded-md transition-colors ${category === cat.value ? "bg-blue-500/20 text-blue-400 border border-blue-500/50" : "bg-white/5 text-gray-400 border border-white/10 hover:bg-white/10"}`,
76726
+ children: [
76727
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: cat.label }),
76728
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs opacity-75", children: cat.description })
76729
+ ]
76730
+ },
76731
+ cat.value
76732
+ )) })
76733
+ ] }),
76734
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76735
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "block text-sm font-medium text-gray-300 mb-1", children: [
76736
+ "Specialized Prompt ",
76737
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-red-500", children: "*" })
76738
+ ] }),
76739
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76740
+ "textarea",
76741
+ {
76742
+ value: prompt,
76743
+ onChange: (e) => setPrompt(e.target.value),
76744
+ placeholder: "Enter the specialized instructions and expertise for this skill...",
76745
+ rows: 8,
76746
+ className: "w-full px-3 py-2 text-sm text-white placeholder-gray-500 bg-white/5 border border-white/10 rounded-md focus:outline-none focus:border-blue-500 resize-none",
76747
+ required: true
76748
+ }
76749
+ ),
76750
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-xs text-gray-500", children: "This prompt will be loaded when the agent activates this skill, providing specialized knowledge and instructions." })
76751
+ ] }),
76752
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-end gap-3 pt-4 border-t border-white/5", children: [
76753
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76754
+ "button",
76755
+ {
76756
+ type: "button",
76757
+ onClick: onClose,
76758
+ className: "px-4 py-2 text-sm text-gray-400 hover:text-white transition-colors",
76759
+ children: "Cancel"
76760
+ }
76761
+ ),
76762
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76763
+ "button",
76764
+ {
76765
+ type: "submit",
76766
+ disabled: !name2.trim() || !description.trim() || !prompt.trim(),
76767
+ className: "px-4 py-2 text-sm text-white bg-blue-500 hover:bg-blue-600 disabled:bg-gray-600 disabled:cursor-not-allowed rounded-md transition-colors",
76768
+ children: "Create Skill"
76769
+ }
76770
+ )
76771
+ ] })
76772
+ ] })
76773
+ ] }) });
76774
+ }
76775
+ const categoryColors = {
76776
+ coding: "bg-blue-500/10 text-blue-500 border-blue-500/20",
76777
+ analysis: "bg-purple-500/10 text-purple-500 border-purple-500/20",
76778
+ creative: "bg-pink-500/10 text-pink-500 border-pink-500/20",
76779
+ data: "bg-green-500/10 text-green-500 border-green-500/20",
76780
+ system: "bg-orange-500/10 text-orange-500 border-orange-500/20",
76781
+ custom: "bg-cyan-500/10 text-cyan-500 border-cyan-500/20"
76782
+ };
76783
+ function SkillDetailDialog({ skill, open, onClose, onToggle, onDelete }) {
76784
+ if (!open) return null;
76785
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-full max-w-3xl mx-4 max-h-[80vh] bg-[#1A1A1D] rounded-lg shadow-xl border border-white/10 flex flex-col", children: [
76786
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between px-6 py-4 border-b border-white/5", children: [
76787
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1", children: [
76788
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
76789
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold text-white", children: skill.name }),
76790
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76791
+ "span",
76792
+ {
76793
+ className: `px-2 py-0.5 text-xs font-medium rounded border ${categoryColors[skill.category] || categoryColors.custom}`,
76794
+ children: skill.category
76795
+ }
76796
+ ),
76797
+ skill.isBuiltin && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "px-2 py-0.5 text-xs font-medium rounded bg-white/5 text-gray-400 border border-white/10", children: "Built-in" })
76798
+ ] }),
76799
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-gray-400", children: skill.description })
76800
+ ] }),
76801
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76802
+ "button",
76803
+ {
76804
+ onClick: onClose,
76805
+ className: "ml-4 text-gray-400 hover:text-white transition-colors",
76806
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
76807
+ }
76808
+ )
76809
+ ] }),
76810
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto px-6 py-4", children: [
76811
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4 mb-6", children: [
76812
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/5 rounded-lg p-3 border border-white/5", children: [
76813
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-gray-500 mb-1", children: "Status" }),
76814
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium text-white", children: skill.enabled ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-green-400", children: "Enabled" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-gray-400", children: "Disabled" }) })
76815
+ ] }),
76816
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/5 rounded-lg p-3 border border-white/5", children: [
76817
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-gray-500 mb-1", children: "Type" }),
76818
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium text-white", children: skill.isBuiltin ? "Built-in Skill" : "Custom Skill" })
76819
+ ] })
76820
+ ] }),
76821
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4", children: [
76822
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium text-gray-300 mb-2", children: "Specialized Prompt" }),
76823
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/5 rounded-lg p-4 border border-white/5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "text-sm text-gray-300 whitespace-pre-wrap font-mono", children: skill.prompt }) })
76824
+ ] }),
76825
+ skill.subSkills && skill.subSkills.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76826
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium text-gray-300 mb-2", children: "Sub Skills" }),
76827
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: skill.subSkills.map((subSkill) => /* @__PURE__ */ jsxRuntimeExports.jsx(
76828
+ "span",
76829
+ {
76830
+ className: "px-3 py-1 text-sm bg-white/5 text-gray-300 rounded-md border border-white/10",
76831
+ children: subSkill
76832
+ },
76833
+ subSkill
76834
+ )) })
76835
+ ] })
76836
+ ] }),
76837
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-t border-white/5", children: [
76838
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-gray-500", children: [
76839
+ "Created: ",
76840
+ new Date(skill.createdAt).toLocaleDateString(),
76841
+ " • Updated:",
76842
+ " ",
76843
+ new Date(skill.updatedAt).toLocaleDateString()
76844
+ ] }),
76845
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
76846
+ !skill.isBuiltin && onDelete && /* @__PURE__ */ jsxRuntimeExports.jsx(
76847
+ "button",
76848
+ {
76849
+ onClick: () => {
76850
+ if (confirm(`Are you sure you want to delete "${skill.name}"?`)) {
76851
+ onDelete(skill.id);
76852
+ onClose();
76853
+ }
76854
+ },
76855
+ className: "px-4 py-2 text-sm text-red-400 hover:text-red-300 hover:bg-red-500/10 rounded-md transition-colors",
76856
+ children: "Delete"
76857
+ }
76858
+ ),
76859
+ onToggle && /* @__PURE__ */ jsxRuntimeExports.jsx(
76860
+ "button",
76861
+ {
76862
+ onClick: () => onToggle(skill.id, !skill.enabled),
76863
+ className: `px-4 py-2 text-sm rounded-md transition-colors ${skill.enabled ? "bg-white/10 text-gray-300 hover:bg-white/15" : "bg-blue-500 text-white hover:bg-blue-600"}`,
76864
+ children: skill.enabled ? "Disable" : "Enable"
76865
+ }
76866
+ ),
76867
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76868
+ "button",
76869
+ {
76870
+ onClick: onClose,
76871
+ className: "px-4 py-2 text-sm text-white bg-white/10 hover:bg-white/15 rounded-md transition-colors",
76872
+ children: "Close"
76873
+ }
76874
+ )
76875
+ ] })
76876
+ ] })
76877
+ ] }) });
76878
+ }
76879
+ function SkillsPanel(_props) {
76880
+ const [skills, setSkills] = reactExports.useState([]);
76881
+ const [loading, setLoading] = reactExports.useState(true);
76882
+ const [filter, setFilter] = reactExports.useState("all");
76883
+ const [searchQuery, setSearchQuery] = reactExports.useState("");
76884
+ const [showCreateDialog, setShowCreateDialog] = reactExports.useState(false);
76885
+ const [selectedSkill, setSelectedSkill] = reactExports.useState(null);
76886
+ reactExports.useEffect(() => {
76887
+ loadSkills();
76888
+ }, []);
76889
+ const loadSkills = async () => {
76890
+ setLoading(true);
76891
+ try {
76892
+ const result = await window.api.skills.list();
76893
+ if (result.success && result.skills) {
76894
+ setSkills(result.skills);
76895
+ }
76896
+ } catch (error) {
76897
+ console.error("Failed to load skills:", error);
76898
+ } finally {
76899
+ setLoading(false);
76900
+ }
76901
+ };
76902
+ const toggleSkill = async (skillId, enabled) => {
76903
+ const result = await window.api.skills.toggle(skillId, enabled);
76904
+ if (result.success) {
76905
+ setSkills(
76906
+ (prev) => prev.map((s2) => s2.id === skillId ? { ...s2, enabled: result.enabled ?? false } : s2)
76907
+ );
76908
+ }
76909
+ };
76910
+ const handleCreateSkill = async (skill) => {
76911
+ const result = await window.api.skills.create(skill);
76912
+ if (result.success) {
76913
+ loadSkills();
76914
+ }
76915
+ };
76916
+ const handleDeleteSkill = async (skillId) => {
76917
+ const result = await window.api.skills.delete(skillId);
76918
+ if (result.success) {
76919
+ loadSkills();
76920
+ }
76921
+ };
76922
+ const filteredSkills = skills.filter((skill) => {
76923
+ if (searchQuery) {
76924
+ const query = searchQuery.toLowerCase();
76925
+ if (!skill.name.toLowerCase().includes(query) && !skill.description.toLowerCase().includes(query)) {
76926
+ return false;
76927
+ }
76928
+ }
76929
+ if (filter === "enabled") return skill.enabled;
76930
+ if (filter === "builtin") return skill.isBuiltin;
76931
+ if (filter === "user") return !skill.isBuiltin;
76932
+ return true;
76933
+ });
76934
+ const groupedSkills = filteredSkills.reduce(
76935
+ (acc, skill) => {
76936
+ if (!acc[skill.category]) {
76937
+ acc[skill.category] = [];
76938
+ }
76939
+ acc[skill.category].push(skill);
76940
+ return acc;
76941
+ },
76942
+ {}
76943
+ );
76944
+ const categoryColors2 = {
76945
+ coding: "bg-blue-500/10 text-blue-500",
76946
+ analysis: "bg-purple-500/10 text-purple-500",
76947
+ creative: "bg-pink-500/10 text-pink-500",
76948
+ data: "bg-green-500/10 text-green-500",
76949
+ system: "bg-orange-500/10 text-orange-500",
76950
+ custom: "bg-cyan-500/10 text-cyan-500"
76951
+ };
76952
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
76953
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-[#0D0D0F]", children: [
76954
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-white/5", children: [
76955
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-white", children: "Skills" }),
76956
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
76957
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76958
+ "button",
76959
+ {
76960
+ onClick: () => setShowCreateDialog(true),
76961
+ className: "px-3 py-1 text-xs font-medium text-white bg-blue-500 hover:bg-blue-600 rounded-md transition-colors",
76962
+ children: "+ New Skill"
76963
+ }
76964
+ ),
76965
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm text-gray-400", children: [
76966
+ skills.filter((s2) => s2.enabled).length,
76967
+ " / ",
76968
+ skills.length,
76969
+ " enabled"
76970
+ ] })
76971
+ ] })
76972
+ ] }),
76973
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 px-4 py-3 border-b border-white/5", children: [
76974
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
76975
+ "input",
76976
+ {
76977
+ type: "text",
76978
+ placeholder: "Search skills...",
76979
+ value: searchQuery,
76980
+ onChange: (e) => setSearchQuery(e.target.value),
76981
+ className: "w-full px-3 py-2 text-sm text-white placeholder-gray-500 bg-white/5 border border-white/10 rounded-md focus:outline-none focus:border-white/20"
76982
+ }
76983
+ ),
76984
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-2", children: ["all", "enabled", "builtin", "user"].map((f2) => /* @__PURE__ */ jsxRuntimeExports.jsx(
76985
+ "button",
76986
+ {
76987
+ onClick: () => setFilter(f2),
76988
+ className: `px-3 py-1 text-xs rounded-md transition-colors ${filter === f2 ? "bg-white/10 text-white" : "text-gray-400 hover:text-white hover:bg-white/5"}`,
76989
+ children: f2.charAt(0).toUpperCase() + f2.slice(1)
76990
+ },
76991
+ f2
76992
+ )) })
76993
+ ] }),
76994
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4", children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-32", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-gray-400", children: "Loading skills..." }) }) : filteredSkills.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col items-center justify-center h-32 text-gray-400", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", children: "No skills found" }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: Object.entries(groupedSkills).map(([category, categorySkills]) => {
76995
+ const skillsList = categorySkills;
76996
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
76997
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium text-gray-300 mb-2 capitalize", children: category }),
76998
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2", children: skillsList.map((skill) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
76999
+ "div",
77000
+ {
77001
+ onClick: () => setSelectedSkill(skill),
77002
+ className: "flex items-start justify-between p-3 rounded-lg bg-white/5 hover:bg-white/10 transition-colors cursor-pointer",
77003
+ children: [
77004
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
77005
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
77006
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium text-white", children: skill.name }),
77007
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77008
+ Badge,
77009
+ {
77010
+ className: categoryColors2[skill.category] || categoryColors2.custom,
77011
+ children: skill.category
77012
+ }
77013
+ ),
77014
+ skill.isBuiltin && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { className: "bg-white/5 text-gray-400 text-xs", children: "Built-in" })
77015
+ ] }),
77016
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-gray-400 line-clamp-2", children: skill.description })
77017
+ ] }),
77018
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77019
+ Switch,
77020
+ {
77021
+ checked: skill.enabled,
77022
+ onCheckedChange: (checked) => {
77023
+ toggleSkill(skill.id, checked);
77024
+ },
77025
+ onClick: (e) => e.stopPropagation(),
77026
+ className: "ml-3 flex-shrink-0"
77027
+ }
77028
+ )
77029
+ ]
77030
+ },
77031
+ skill.id
77032
+ )) })
77033
+ ] }, category);
77034
+ }) }) }) })
77035
+ ] }),
77036
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77037
+ CreateSkillDialog,
77038
+ {
77039
+ open: showCreateDialog,
77040
+ onClose: () => setShowCreateDialog(false),
77041
+ onCreate: handleCreateSkill
77042
+ }
77043
+ ),
77044
+ selectedSkill && /* @__PURE__ */ jsxRuntimeExports.jsx(
77045
+ SkillDetailDialog,
77046
+ {
77047
+ skill: selectedSkill,
77048
+ open: !!selectedSkill,
77049
+ onClose: () => setSelectedSkill(null),
77050
+ onToggle: toggleSkill,
77051
+ onDelete: handleDeleteSkill
77052
+ }
77053
+ )
77054
+ ] });
77055
+ }
76158
77056
  const HEADER_HEIGHT = 40;
76159
77057
  const HANDLE_HEIGHT = 6;
76160
77058
  const MIN_CONTENT_HEIGHT = 60;
@@ -76232,38 +77130,43 @@ function RightPanel() {
76232
77130
  const [tasksOpen, setTasksOpen] = reactExports.useState(true);
76233
77131
  const [filesOpen, setFilesOpen] = reactExports.useState(true);
76234
77132
  const [agentsOpen, setAgentsOpen] = reactExports.useState(true);
77133
+ const [skillsOpen, setSkillsOpen] = reactExports.useState(false);
76235
77134
  const [tasksHeight, setTasksHeight] = reactExports.useState(null);
76236
77135
  const [filesHeight, setFilesHeight] = reactExports.useState(null);
76237
77136
  const [agentsHeight, setAgentsHeight] = reactExports.useState(null);
77137
+ const [skillsHeight, setSkillsHeight] = reactExports.useState(null);
76238
77138
  const dragStartHeights = reactExports.useRef(null);
76239
77139
  const getAvailableContentHeight = reactExports.useCallback(() => {
76240
77140
  if (!containerRef.current) return 0;
76241
77141
  const totalHeight = containerRef.current.clientHeight;
76242
- let used = HEADER_HEIGHT * 3;
76243
- if (tasksOpen && (filesOpen || agentsOpen)) used += HANDLE_HEIGHT;
76244
- if (filesOpen && agentsOpen) used += HANDLE_HEIGHT;
77142
+ let used = HEADER_HEIGHT * 4;
77143
+ const openPanels = [tasksOpen, filesOpen, agentsOpen, skillsOpen].filter(Boolean).length;
77144
+ used += HANDLE_HEIGHT * (openPanels - 1);
76245
77145
  return Math.max(0, totalHeight - used);
76246
- }, [tasksOpen, filesOpen, agentsOpen]);
77146
+ }, [tasksOpen, filesOpen, agentsOpen, skillsOpen]);
76247
77147
  const getContentHeights = reactExports.useCallback(() => {
76248
77148
  const available = getAvailableContentHeight();
76249
- const openCount = [tasksOpen, filesOpen, agentsOpen].filter(Boolean).length;
77149
+ const openCount = [tasksOpen, filesOpen, agentsOpen, skillsOpen].filter(Boolean).length;
76250
77150
  if (openCount === 0) {
76251
- return { tasks: 0, files: 0, agents: 0 };
77151
+ return { tasks: 0, files: 0, agents: 0, skills: 0 };
76252
77152
  }
76253
77153
  const defaultHeight = available / openCount;
76254
77154
  return {
76255
77155
  tasks: tasksOpen ? tasksHeight ?? defaultHeight : 0,
76256
77156
  files: filesOpen ? filesHeight ?? defaultHeight : 0,
76257
- agents: agentsOpen ? agentsHeight ?? defaultHeight : 0
77157
+ agents: agentsOpen ? agentsHeight ?? defaultHeight : 0,
77158
+ skills: skillsOpen ? skillsHeight ?? defaultHeight : 0
76258
77159
  };
76259
77160
  }, [
76260
77161
  getAvailableContentHeight,
76261
77162
  tasksOpen,
76262
77163
  filesOpen,
76263
77164
  agentsOpen,
77165
+ skillsOpen,
76264
77166
  tasksHeight,
76265
77167
  filesHeight,
76266
- agentsHeight
77168
+ agentsHeight,
77169
+ skillsHeight
76267
77170
  ]);
76268
77171
  const handleTasksResize = reactExports.useCallback(
76269
77172
  (totalDelta) => {
@@ -76273,7 +77176,12 @@ function RightPanel() {
76273
77176
  }
76274
77177
  const start = dragStartHeights.current;
76275
77178
  const available = getAvailableContentHeight();
76276
- const otherStart = filesOpen ? start.files : start.agents;
77179
+ let nextPanel = null;
77180
+ if (filesOpen) nextPanel = "files";
77181
+ else if (agentsOpen) nextPanel = "agents";
77182
+ else if (skillsOpen) nextPanel = "skills";
77183
+ if (!nextPanel) return;
77184
+ const otherStart = start[nextPanel];
76277
77185
  let newTasksHeight = start.tasks + totalDelta;
76278
77186
  let newOtherHeight = otherStart - totalDelta;
76279
77187
  if (newTasksHeight < MIN_CONTENT_HEIGHT) {
@@ -76284,8 +77192,8 @@ function RightPanel() {
76284
77192
  newOtherHeight = MIN_CONTENT_HEIGHT;
76285
77193
  newTasksHeight = start.tasks + (otherStart - MIN_CONTENT_HEIGHT);
76286
77194
  }
76287
- const thirdPanelHeight = filesOpen && agentsOpen ? agentsHeight ?? available / 3 : 0;
76288
- const maxForTwo = available - thirdPanelHeight;
77195
+ const belowHeight = nextPanel === "files" && (agentsOpen || skillsOpen) ? (agentsOpen ? agentsHeight ?? available / 4 : 0) + (skillsOpen ? skillsHeight ?? available / 4 : 0) : nextPanel === "agents" && skillsOpen ? skillsHeight ?? available / 4 : 0;
77196
+ const maxForTwo = available - belowHeight;
76289
77197
  if (newTasksHeight + newOtherHeight > maxForTwo) {
76290
77198
  const excess = newTasksHeight + newOtherHeight - maxForTwo;
76291
77199
  if (totalDelta > 0) {
@@ -76295,20 +77203,19 @@ function RightPanel() {
76295
77203
  }
76296
77204
  }
76297
77205
  setTasksHeight(newTasksHeight);
76298
- if (filesOpen) {
76299
- setFilesHeight(newOtherHeight);
76300
- } else if (agentsOpen) {
76301
- setAgentsHeight(newOtherHeight);
76302
- }
77206
+ if (nextPanel === "files") setFilesHeight(newOtherHeight);
77207
+ else if (nextPanel === "agents") setAgentsHeight(newOtherHeight);
77208
+ else if (nextPanel === "skills") setSkillsHeight(newOtherHeight);
76303
77209
  if (newTasksHeight < COLLAPSE_THRESHOLD) {
76304
77210
  setTasksOpen(false);
76305
77211
  }
76306
77212
  if (newOtherHeight < COLLAPSE_THRESHOLD) {
76307
- if (filesOpen) setFilesOpen(false);
76308
- else if (agentsOpen) setAgentsOpen(false);
77213
+ if (nextPanel === "files") setFilesOpen(false);
77214
+ else if (nextPanel === "agents") setAgentsOpen(false);
77215
+ else if (nextPanel === "skills") setSkillsOpen(false);
76309
77216
  }
76310
77217
  },
76311
- [getContentHeights, getAvailableContentHeight, filesOpen, agentsOpen, agentsHeight]
77218
+ [getContentHeights, getAvailableContentHeight, filesOpen, agentsOpen, skillsOpen, agentsHeight, skillsHeight]
76312
77219
  );
76313
77220
  const handleFilesResize = reactExports.useCallback(
76314
77221
  (totalDelta) => {
@@ -76318,36 +77225,83 @@ function RightPanel() {
76318
77225
  }
76319
77226
  const start = dragStartHeights.current;
76320
77227
  const available = getAvailableContentHeight();
76321
- const tasksH = tasksOpen ? tasksHeight ?? available / 3 : 0;
76322
- const maxForFilesAndAgents = available - tasksH;
77228
+ const tasksH = tasksOpen ? tasksHeight ?? available / 4 : 0;
77229
+ let nextPanel = null;
77230
+ if (agentsOpen) nextPanel = "agents";
77231
+ else if (skillsOpen) nextPanel = "skills";
77232
+ if (!nextPanel) return;
77233
+ const maxForFilesAndNext = available - tasksH;
76323
77234
  let newFilesHeight = start.files + totalDelta;
76324
- let newAgentsHeight = start.agents - totalDelta;
77235
+ let newNextHeight = start[nextPanel] - totalDelta;
76325
77236
  if (newFilesHeight < MIN_CONTENT_HEIGHT) {
76326
77237
  newFilesHeight = MIN_CONTENT_HEIGHT;
76327
- newAgentsHeight = start.agents + (start.files - MIN_CONTENT_HEIGHT);
77238
+ newNextHeight = start[nextPanel] + (start.files - MIN_CONTENT_HEIGHT);
76328
77239
  }
76329
- if (newAgentsHeight < MIN_CONTENT_HEIGHT) {
76330
- newAgentsHeight = MIN_CONTENT_HEIGHT;
76331
- newFilesHeight = start.files + (start.agents - MIN_CONTENT_HEIGHT);
77240
+ if (newNextHeight < MIN_CONTENT_HEIGHT) {
77241
+ newNextHeight = MIN_CONTENT_HEIGHT;
77242
+ newFilesHeight = start.files + (start[nextPanel] - MIN_CONTENT_HEIGHT);
76332
77243
  }
76333
- if (newFilesHeight + newAgentsHeight > maxForFilesAndAgents) {
76334
- const excess = newFilesHeight + newAgentsHeight - maxForFilesAndAgents;
77244
+ if (newFilesHeight + newNextHeight > maxForFilesAndNext) {
77245
+ const excess = newFilesHeight + newNextHeight - maxForFilesAndNext;
76335
77246
  if (totalDelta > 0) {
76336
- newAgentsHeight = Math.max(MIN_CONTENT_HEIGHT, newAgentsHeight - excess);
77247
+ newNextHeight = Math.max(MIN_CONTENT_HEIGHT, newNextHeight - excess);
76337
77248
  } else {
76338
77249
  newFilesHeight = Math.max(MIN_CONTENT_HEIGHT, newFilesHeight - excess);
76339
77250
  }
76340
77251
  }
76341
77252
  setFilesHeight(newFilesHeight);
76342
- setAgentsHeight(newAgentsHeight);
77253
+ if (nextPanel === "agents") setAgentsHeight(newNextHeight);
77254
+ else if (nextPanel === "skills") setSkillsHeight(newNextHeight);
76343
77255
  if (newFilesHeight < COLLAPSE_THRESHOLD) {
76344
77256
  setFilesOpen(false);
76345
77257
  }
77258
+ if (newNextHeight < COLLAPSE_THRESHOLD) {
77259
+ if (nextPanel === "agents") setAgentsOpen(false);
77260
+ else if (nextPanel === "skills") setSkillsOpen(false);
77261
+ }
77262
+ },
77263
+ [getContentHeights, getAvailableContentHeight, tasksOpen, tasksHeight, agentsOpen, skillsOpen]
77264
+ );
77265
+ const handleAgentsResize = reactExports.useCallback(
77266
+ (totalDelta) => {
77267
+ if (!dragStartHeights.current) {
77268
+ const heights2 = getContentHeights();
77269
+ dragStartHeights.current = { ...heights2 };
77270
+ }
77271
+ const start = dragStartHeights.current;
77272
+ const available = getAvailableContentHeight();
77273
+ const tasksH = tasksOpen ? tasksHeight ?? available / 4 : 0;
77274
+ const filesH = filesOpen ? filesHeight ?? available / 4 : 0;
77275
+ const aboveHeight = tasksH + filesH;
77276
+ const maxForAgentsAndSkills = available - aboveHeight;
77277
+ let newAgentsHeight = start.agents + totalDelta;
77278
+ let newSkillsHeight = start.skills - totalDelta;
77279
+ if (newAgentsHeight < MIN_CONTENT_HEIGHT) {
77280
+ newAgentsHeight = MIN_CONTENT_HEIGHT;
77281
+ newSkillsHeight = start.skills + (start.agents - MIN_CONTENT_HEIGHT);
77282
+ }
77283
+ if (newSkillsHeight < MIN_CONTENT_HEIGHT) {
77284
+ newSkillsHeight = MIN_CONTENT_HEIGHT;
77285
+ newAgentsHeight = start.agents + (start.skills - MIN_CONTENT_HEIGHT);
77286
+ }
77287
+ if (newAgentsHeight + newSkillsHeight > maxForAgentsAndSkills) {
77288
+ const excess = newAgentsHeight + newSkillsHeight - maxForAgentsAndSkills;
77289
+ if (totalDelta > 0) {
77290
+ newSkillsHeight = Math.max(MIN_CONTENT_HEIGHT, newSkillsHeight - excess);
77291
+ } else {
77292
+ newAgentsHeight = Math.max(MIN_CONTENT_HEIGHT, newAgentsHeight - excess);
77293
+ }
77294
+ }
77295
+ setAgentsHeight(newAgentsHeight);
77296
+ setSkillsHeight(newSkillsHeight);
76346
77297
  if (newAgentsHeight < COLLAPSE_THRESHOLD) {
76347
77298
  setAgentsOpen(false);
76348
77299
  }
77300
+ if (newSkillsHeight < COLLAPSE_THRESHOLD) {
77301
+ setSkillsOpen(false);
77302
+ }
76349
77303
  },
76350
- [getContentHeights, getAvailableContentHeight, tasksOpen, tasksHeight]
77304
+ [getContentHeights, getAvailableContentHeight, tasksOpen, filesOpen, tasksHeight, filesHeight]
76351
77305
  );
76352
77306
  reactExports.useEffect(() => {
76353
77307
  const handleMouseUp = () => {
@@ -76360,8 +77314,9 @@ function RightPanel() {
76360
77314
  setTasksHeight(null);
76361
77315
  setFilesHeight(null);
76362
77316
  setAgentsHeight(null);
76363
- }, [tasksOpen, filesOpen, agentsOpen]);
76364
- const [heights, setHeights] = reactExports.useState({ tasks: 0, files: 0, agents: 0 });
77317
+ setSkillsHeight(null);
77318
+ }, [tasksOpen, filesOpen, agentsOpen, skillsOpen]);
77319
+ const [heights, setHeights] = reactExports.useState({ tasks: 0, files: 0, agents: 0, skills: 0 });
76365
77320
  reactExports.useEffect(() => {
76366
77321
  setHeights(getContentHeights());
76367
77322
  }, [getContentHeights]);
@@ -76384,7 +77339,7 @@ function RightPanel() {
76384
77339
  ),
76385
77340
  tasksOpen && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-auto", style: { height: heights.tasks }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(TasksContent, {}) })
76386
77341
  ] }),
76387
- tasksOpen && (filesOpen || agentsOpen) && /* @__PURE__ */ jsxRuntimeExports.jsx(ResizeHandle$1, { onDrag: handleTasksResize }),
77342
+ tasksOpen && (filesOpen || agentsOpen || skillsOpen) && /* @__PURE__ */ jsxRuntimeExports.jsx(ResizeHandle$1, { onDrag: handleTasksResize }),
76388
77343
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col shrink-0 border-b border-border", children: [
76389
77344
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76390
77345
  SectionHeader,
@@ -76398,8 +77353,8 @@ function RightPanel() {
76398
77353
  ),
76399
77354
  filesOpen && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-auto", style: { height: heights.files }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(FilesContent, {}) })
76400
77355
  ] }),
76401
- filesOpen && agentsOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(ResizeHandle$1, { onDrag: handleFilesResize }),
76402
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col shrink-0", children: [
77356
+ filesOpen && (agentsOpen || skillsOpen) && /* @__PURE__ */ jsxRuntimeExports.jsx(ResizeHandle$1, { onDrag: handleFilesResize }),
77357
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col shrink-0 border-b border-border", children: [
76403
77358
  /* @__PURE__ */ jsxRuntimeExports.jsx(
76404
77359
  SectionHeader,
76405
77360
  {
@@ -76411,6 +77366,19 @@ function RightPanel() {
76411
77366
  }
76412
77367
  ),
76413
77368
  agentsOpen && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-auto", style: { height: heights.agents }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(AgentsContent, {}) })
77369
+ ] }),
77370
+ agentsOpen && skillsOpen && /* @__PURE__ */ jsxRuntimeExports.jsx(ResizeHandle$1, { onDrag: handleAgentsResize }),
77371
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col shrink-0", children: [
77372
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77373
+ SectionHeader,
77374
+ {
77375
+ title: "SKILLS",
77376
+ icon: Sparkles,
77377
+ isOpen: skillsOpen,
77378
+ onToggle: () => setSkillsOpen((prev) => !prev)
77379
+ }
77380
+ ),
77381
+ skillsOpen && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-auto", style: { height: heights.skills }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsContent, {}) })
76414
77382
  ] })
76415
77383
  ]
76416
77384
  }
@@ -76832,6 +77800,9 @@ function AgentsContent() {
76832
77800
  agent.description && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground mt-1", children: agent.description })
76833
77801
  ] }, agent.id)) });
76834
77802
  }
77803
+ function SkillsContent() {
77804
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsPanel, {});
77805
+ }
76835
77806
  function formatSize(bytes) {
76836
77807
  if (bytes < 1024) return `${bytes}B`;
76837
77808
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
@@ -76867,35 +77838,6 @@ function KanbanColumn({
76867
77838
  }
76868
77839
  );
76869
77840
  }
76870
- const Card = reactExports.forwardRef(
76871
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(
76872
- "div",
76873
- {
76874
- ref,
76875
- className: cn("rounded-sm border border-border bg-card text-card-foreground", className),
76876
- ...props
76877
- }
76878
- )
76879
- );
76880
- Card.displayName = "Card";
76881
- const CardHeader = reactExports.forwardRef(
76882
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex flex-col space-y-1.5 p-4", className), ...props })
76883
- );
76884
- CardHeader.displayName = "CardHeader";
76885
- const CardTitle = reactExports.forwardRef(
76886
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { ref, className: cn("text-section-header", className), ...props })
76887
- );
76888
- CardTitle.displayName = "CardTitle";
76889
- const CardDescription = reactExports.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("p", { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
76890
- CardDescription.displayName = "CardDescription";
76891
- const CardContent = reactExports.forwardRef(
76892
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("p-4 pt-0", className), ...props })
76893
- );
76894
- CardContent.displayName = "CardContent";
76895
- const CardFooter = reactExports.forwardRef(
76896
- ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex items-center p-4 pt-0", className), ...props })
76897
- );
76898
- CardFooter.displayName = "CardFooter";
76899
77841
  function ThreadStatusIcon({ threadId }) {
76900
77842
  const { isLoading } = useThreadStream(threadId);
76901
77843
  if (isLoading) {
@@ -77259,7 +78201,7 @@ function App() {
77259
78201
  },
77260
78202
  children: [
77261
78203
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "app-badge-name", children: "OPENWORK" }),
77262
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "app-badge-version", children: "0.2.2" })
78204
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "app-badge-version", children: "0.2.4" })
77263
78205
  ]
77264
78206
  }
77265
78207
  ),