@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.
- package/README.md +13 -0
- package/out/main/index.js +2257 -159
- package/out/preload/index.js +55 -0
- package/out/renderer/assets/{index-iDdc8OMS.css → index-B2t12qbx.css} +514 -1
- package/out/renderer/assets/{index-BayYTupF.js → index-Be3u7LN6.js} +1009 -67
- package/out/renderer/index.html +2 -2
- package/package.json +1 -1
|
@@ -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.
|
|
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 *
|
|
76243
|
-
|
|
76244
|
-
|
|
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
|
-
|
|
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
|
|
76288
|
-
const maxForTwo = available -
|
|
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 (
|
|
76299
|
-
|
|
76300
|
-
|
|
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 (
|
|
76308
|
-
else if (
|
|
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 /
|
|
76322
|
-
|
|
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
|
|
77235
|
+
let newNextHeight = start[nextPanel] - totalDelta;
|
|
76325
77236
|
if (newFilesHeight < MIN_CONTENT_HEIGHT) {
|
|
76326
77237
|
newFilesHeight = MIN_CONTENT_HEIGHT;
|
|
76327
|
-
|
|
77238
|
+
newNextHeight = start[nextPanel] + (start.files - MIN_CONTENT_HEIGHT);
|
|
76328
77239
|
}
|
|
76329
|
-
if (
|
|
76330
|
-
|
|
76331
|
-
newFilesHeight = start.files + (start
|
|
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 +
|
|
76334
|
-
const excess = newFilesHeight +
|
|
77244
|
+
if (newFilesHeight + newNextHeight > maxForFilesAndNext) {
|
|
77245
|
+
const excess = newFilesHeight + newNextHeight - maxForFilesAndNext;
|
|
76335
77246
|
if (totalDelta > 0) {
|
|
76336
|
-
|
|
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(
|
|
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
|
-
|
|
76364
|
-
|
|
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.
|
|
78204
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "app-badge-version", children: "0.2.4" })
|
|
77263
78205
|
]
|
|
77264
78206
|
}
|
|
77265
78207
|
),
|