apteva 0.4.32 → 0.4.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActivityPage.c48n83h2.js +3 -0
- package/dist/ApiDocsPage.yzcxx5ax.js +4 -0
- package/dist/App.09yb8t0b.js +1 -0
- package/dist/App.152mbs1r.js +4 -0
- package/dist/App.3a67nx9w.js +4 -0
- package/dist/App.9epx6785.js +4 -0
- package/dist/App.d8955awp.js +4 -0
- package/dist/App.drwb57jq.js +4 -0
- package/dist/App.gssbmajb.js +4 -0
- package/dist/App.qw70pc29.js +53 -0
- package/dist/App.qzbx5wtj.js +4 -0
- package/dist/App.r5serxkt.js +8 -0
- package/dist/App.tpmp9020.js +20 -0
- package/dist/App.v2wb4d7d.js +61 -0
- package/dist/App.vxmaaj0m.js +13 -0
- package/dist/App.w4p2tda9.js +4 -0
- package/dist/App.wv2ng55q.js +221 -0
- package/dist/App.yncnrn0f.js +4 -0
- package/dist/ConnectionsPage.k6cspyqq.js +3 -0
- package/dist/McpPage.cdxm48xj.js +3 -0
- package/dist/SettingsPage.evpv7c2y.js +3 -0
- package/dist/SkillsPage.pvzp6c1a.js +3 -0
- package/dist/TasksPage.6jnvbpsy.js +3 -0
- package/dist/TelemetryPage.t7vk24zc.js +3 -0
- package/dist/TestsPage.5x6658aa.js +3 -0
- package/dist/ThreadsPage.3fvhtevh.js +3 -0
- package/dist/apteva-kit.css +1 -1
- package/dist/index.html +1 -1
- package/dist/styles.css +1 -1
- package/package.json +10 -9
- package/src/crypto.ts +4 -3
- package/src/db.ts +171 -36
- package/src/integrations/agentdojo.ts +95 -12
- package/src/integrations/index.ts +7 -0
- package/src/mcp-platform.ts +870 -142
- package/src/openapi.ts +96 -0
- package/src/providers.ts +60 -34
- package/src/routes/api/agent-utils.ts +59 -47
- package/src/routes/api/agents.ts +71 -2
- package/src/routes/api/integrations.ts +11 -5
- package/src/routes/api/mcp.ts +5 -4
- package/src/routes/api/meta-agent.ts +37 -1
- package/src/routes/api/projects.ts +3 -3
- package/src/routes/api/providers.ts +121 -30
- package/src/routes/api/skills.ts +2 -3
- package/src/routes/api/system.ts +98 -14
- package/src/routes/api/telemetry.ts +19 -1
- package/src/routes/share.ts +85 -0
- package/src/server.ts +43 -32
- package/src/triggers/agentdojo.ts +2 -2
- package/src/web/App.tsx +107 -21
- package/src/web/components/activity/ActivityPage.tsx +242 -389
- package/src/web/components/agents/AgentCard.tsx +19 -27
- package/src/web/components/agents/AgentPanel.tsx +358 -198
- package/src/web/components/agents/AgentsView.tsx +4 -4
- package/src/web/components/agents/CreateAgentModal.tsx +21 -79
- package/src/web/components/api/ApiDocsPage.tsx +66 -66
- package/src/web/components/auth/CreateAccountStep.tsx +16 -16
- package/src/web/components/auth/LoginPage.tsx +10 -10
- package/src/web/components/common/Icons.tsx +8 -0
- package/src/web/components/common/LoadingSpinner.tsx +2 -2
- package/src/web/components/common/Modal.tsx +8 -8
- package/src/web/components/common/Select.tsx +11 -10
- package/src/web/components/connections/ConnectionsPage.tsx +4 -4
- package/src/web/components/connections/IntegrationsTab.tsx +18 -18
- package/src/web/components/connections/OverviewTab.tsx +13 -13
- package/src/web/components/connections/TriggersTab.tsx +99 -99
- package/src/web/components/dashboard/Dashboard.tsx +177 -52
- package/src/web/components/index.ts +1 -1
- package/src/web/components/layout/Header.tsx +50 -34
- package/src/web/components/layout/Sidebar.tsx +41 -16
- package/src/web/components/mcp/IntegrationsPanel.tsx +160 -69
- package/src/web/components/mcp/McpPage.tsx +218 -209
- package/src/web/components/meta-agent/MetaAgent.tsx +15 -11
- package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
- package/src/web/components/settings/SettingsPage.tsx +389 -221
- package/src/web/components/skills/SkillsPage.tsx +88 -88
- package/src/web/components/tasks/TasksPage.tsx +385 -68
- package/src/web/components/telemetry/TelemetryPage.tsx +294 -39
- package/src/web/components/tests/TestsPage.tsx +50 -50
- package/src/web/components/threads/ThreadsPage.tsx +315 -0
- package/src/web/context/AuthContext.tsx +3 -3
- package/src/web/context/ProjectContext.tsx +8 -3
- package/src/web/context/TelemetryContext.tsx +24 -6
- package/src/web/context/ThemeContext.tsx +69 -0
- package/src/web/context/index.ts +3 -1
- package/src/web/styles.css +25 -7
- package/src/web/themes.ts +99 -0
- package/src/web/types.ts +4 -7
- package/dist/ActivityPage.41nbye4r.js +0 -3
- package/dist/ApiDocsPage.4smnt8m3.js +0 -4
- package/dist/App.0sbax9et.js +0 -4
- package/dist/App.0ws427h8.js +0 -4
- package/dist/App.6q6bar8b.js +0 -4
- package/dist/App.80301vdb.js +0 -4
- package/dist/App.af2wg84v.js +0 -267
- package/dist/App.ca1rz1ph.js +0 -4
- package/dist/App.ensa6z0r.js +0 -4
- package/dist/App.f8g7tych.js +0 -13
- package/dist/App.mvtqv6qc.js +0 -20
- package/dist/App.ncgc9cxy.js +0 -4
- package/dist/App.p02f4ret.js +0 -1
- package/dist/App.p0fb1pds.js +0 -4
- package/dist/App.pmaq48sj.js +0 -4
- package/dist/App.yv87t9m5.js +0 -4
- package/dist/App.zjmfm8p6.js +0 -4
- package/dist/ConnectionsPage.anb3rv9a.js +0 -3
- package/dist/McpPage.y396h6fy.js +0 -3
- package/dist/SettingsPage.p1hc60gk.js +0 -3
- package/dist/SkillsPage.yj3xdsay.js +0 -3
- package/dist/TasksPage.sjv0khtv.js +0 -3
- package/dist/TelemetryPage.2qm4w16r.js +0 -3
- package/dist/TestsPage.zzs4qfj8.js +0 -3
|
@@ -293,7 +293,7 @@ export function SkillsPage() {
|
|
|
293
293
|
<div className="flex items-center justify-between mb-6">
|
|
294
294
|
<div>
|
|
295
295
|
<h1 className="text-2xl font-semibold mb-1">Skills</h1>
|
|
296
|
-
<p className="text-[
|
|
296
|
+
<p className="text-[var(--color-text-muted)]">
|
|
297
297
|
Manage agent skills - instructions that teach agents how to perform tasks.
|
|
298
298
|
</p>
|
|
299
299
|
</div>
|
|
@@ -301,13 +301,13 @@ export function SkillsPage() {
|
|
|
301
301
|
<div className="flex gap-2">
|
|
302
302
|
<button
|
|
303
303
|
onClick={() => setShowImport(true)}
|
|
304
|
-
className="bg-[
|
|
304
|
+
className="bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] text-white px-4 py-2 rounded font-medium transition border border-[var(--color-border-light)]"
|
|
305
305
|
>
|
|
306
306
|
Import
|
|
307
307
|
</button>
|
|
308
308
|
<button
|
|
309
309
|
onClick={() => setShowCreate(true)}
|
|
310
|
-
className="bg-[
|
|
310
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
|
|
311
311
|
>
|
|
312
312
|
+ Create Skill
|
|
313
313
|
</button>
|
|
@@ -316,13 +316,13 @@ export function SkillsPage() {
|
|
|
316
316
|
</div>
|
|
317
317
|
|
|
318
318
|
{/* Tabs */}
|
|
319
|
-
<div className="flex gap-1 mb-6 bg-[
|
|
319
|
+
<div className="flex gap-1 mb-6 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-1 w-fit">
|
|
320
320
|
<button
|
|
321
321
|
onClick={() => setActiveTab("installed")}
|
|
322
322
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
323
323
|
activeTab === "installed"
|
|
324
|
-
? "bg-[
|
|
325
|
-
: "text-[
|
|
324
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
325
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
326
326
|
}`}
|
|
327
327
|
>
|
|
328
328
|
Installed ({filteredSkills.length})
|
|
@@ -331,8 +331,8 @@ export function SkillsPage() {
|
|
|
331
331
|
onClick={() => setActiveTab("github")}
|
|
332
332
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
333
333
|
activeTab === "github"
|
|
334
|
-
? "bg-[
|
|
335
|
-
: "text-[
|
|
334
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
335
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
336
336
|
}`}
|
|
337
337
|
>
|
|
338
338
|
Browse GitHub
|
|
@@ -341,8 +341,8 @@ export function SkillsPage() {
|
|
|
341
341
|
onClick={() => setActiveTab("marketplace")}
|
|
342
342
|
className={`px-4 py-2 rounded text-sm font-medium transition ${
|
|
343
343
|
activeTab === "marketplace"
|
|
344
|
-
? "bg-[
|
|
345
|
-
: "text-[
|
|
344
|
+
? "bg-[var(--color-surface-raised)] text-white"
|
|
345
|
+
: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"
|
|
346
346
|
}`}
|
|
347
347
|
>
|
|
348
348
|
Marketplace
|
|
@@ -353,21 +353,21 @@ export function SkillsPage() {
|
|
|
353
353
|
{activeTab === "installed" && (
|
|
354
354
|
<>
|
|
355
355
|
{loading ? (
|
|
356
|
-
<div className="text-[
|
|
356
|
+
<div className="text-[var(--color-text-muted)]">Loading skills...</div>
|
|
357
357
|
) : skills.length === 0 ? (
|
|
358
|
-
<div className="text-center py-20 text-[
|
|
358
|
+
<div className="text-center py-20 text-[var(--color-text-muted)]">
|
|
359
359
|
<p className="text-lg">No skills installed</p>
|
|
360
360
|
<p className="text-sm mt-1">Create a skill or browse the marketplace</p>
|
|
361
361
|
<button
|
|
362
362
|
onClick={() => setActiveTab("marketplace")}
|
|
363
|
-
className="mt-4 bg-[
|
|
363
|
+
className="mt-4 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition"
|
|
364
364
|
>
|
|
365
365
|
Browse Marketplace
|
|
366
366
|
</button>
|
|
367
367
|
</div>
|
|
368
368
|
) : filteredSkills.length === 0 ? (
|
|
369
|
-
<div className="bg-[
|
|
370
|
-
<p className="text-[
|
|
369
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-6 text-center">
|
|
370
|
+
<p className="text-[var(--color-text-muted)]">No skills match this filter.</p>
|
|
371
371
|
</div>
|
|
372
372
|
) : (
|
|
373
373
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
|
@@ -407,12 +407,12 @@ export function SkillsPage() {
|
|
|
407
407
|
value={githubRepo}
|
|
408
408
|
onChange={(e) => setGithubRepo(e.target.value)}
|
|
409
409
|
placeholder="Enter GitHub repo (e.g., WordPress/agent-skills)"
|
|
410
|
-
className="flex-1 bg-[
|
|
410
|
+
className="flex-1 bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg px-4 py-3 focus:outline-none focus:border-[var(--color-accent)]"
|
|
411
411
|
/>
|
|
412
412
|
<button
|
|
413
413
|
type="submit"
|
|
414
414
|
disabled={githubLoading}
|
|
415
|
-
className="bg-[
|
|
415
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-6 py-3 rounded-lg font-medium transition"
|
|
416
416
|
>
|
|
417
417
|
{githubLoading ? "..." : "Browse"}
|
|
418
418
|
</button>
|
|
@@ -420,8 +420,8 @@ export function SkillsPage() {
|
|
|
420
420
|
|
|
421
421
|
{/* Project Scope Selector */}
|
|
422
422
|
{hasProjects && githubSkills.length > 0 && (
|
|
423
|
-
<div className="flex items-center gap-3 p-3 bg-[
|
|
424
|
-
<span className="text-sm text-[
|
|
423
|
+
<div className="flex items-center gap-3 p-3 bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg">
|
|
424
|
+
<span className="text-sm text-[var(--color-text-muted)]">Install to:</span>
|
|
425
425
|
<Select
|
|
426
426
|
value={githubProjectId || ""}
|
|
427
427
|
onChange={(value) => setGithubProjectId(value || null)}
|
|
@@ -449,11 +449,11 @@ export function SkillsPage() {
|
|
|
449
449
|
href={githubRepoInfo.url}
|
|
450
450
|
target="_blank"
|
|
451
451
|
rel="noopener noreferrer"
|
|
452
|
-
className="text-[
|
|
452
|
+
className="text-[var(--color-accent)] hover:underline font-medium"
|
|
453
453
|
>
|
|
454
454
|
{githubRepoInfo.owner}/{githubRepoInfo.repo}
|
|
455
455
|
</a>
|
|
456
|
-
<span className="text-sm text-[
|
|
456
|
+
<span className="text-sm text-[var(--color-text-muted)]">
|
|
457
457
|
{githubSkills.length} skill{githubSkills.length !== 1 ? "s" : ""} found
|
|
458
458
|
</span>
|
|
459
459
|
</div>
|
|
@@ -461,7 +461,7 @@ export function SkillsPage() {
|
|
|
461
461
|
<button
|
|
462
462
|
onClick={installAllFromGitHub}
|
|
463
463
|
disabled={!!installingGithub}
|
|
464
|
-
className="text-sm bg-[
|
|
464
|
+
className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-4 py-2 rounded transition disabled:opacity-50"
|
|
465
465
|
>
|
|
466
466
|
Install All
|
|
467
467
|
</button>
|
|
@@ -471,17 +471,17 @@ export function SkillsPage() {
|
|
|
471
471
|
|
|
472
472
|
{/* Loading */}
|
|
473
473
|
{githubLoading && (
|
|
474
|
-
<div className="text-center py-8 text-[
|
|
474
|
+
<div className="text-center py-8 text-[var(--color-text-muted)]">
|
|
475
475
|
Fetching skills from repository...
|
|
476
476
|
</div>
|
|
477
477
|
)}
|
|
478
478
|
|
|
479
479
|
{/* Empty State */}
|
|
480
480
|
{!githubLoading && !githubRepoInfo && !githubError && (
|
|
481
|
-
<div className="bg-[
|
|
481
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg p-8 text-center">
|
|
482
482
|
<div className="text-4xl mb-4">📦</div>
|
|
483
483
|
<h3 className="text-lg font-medium mb-2">Browse Skills from GitHub</h3>
|
|
484
|
-
<p className="text-[
|
|
484
|
+
<p className="text-[var(--color-text-muted)] mb-6 max-w-md mx-auto">
|
|
485
485
|
Enter a GitHub repository to browse and install skills. Skills are markdown files with instructions that teach agents how to perform specific tasks.
|
|
486
486
|
</p>
|
|
487
487
|
<div className="flex flex-wrap gap-2 justify-center">
|
|
@@ -494,7 +494,7 @@ export function SkillsPage() {
|
|
|
494
494
|
setGithubRepo(repo);
|
|
495
495
|
browseGitHubRepo(repo);
|
|
496
496
|
}}
|
|
497
|
-
className="text-sm bg-[
|
|
497
|
+
className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-3 py-1.5 rounded transition"
|
|
498
498
|
>
|
|
499
499
|
{label}
|
|
500
500
|
</button>
|
|
@@ -505,7 +505,7 @@ export function SkillsPage() {
|
|
|
505
505
|
|
|
506
506
|
{/* No Skills Found */}
|
|
507
507
|
{!githubLoading && githubRepoInfo && githubSkills.length === 0 && (
|
|
508
|
-
<div className="text-center py-8 text-[
|
|
508
|
+
<div className="text-center py-8 text-[var(--color-text-muted)]">
|
|
509
509
|
No skills found in this repository. Skills should be in subdirectories with a SKILL.md file.
|
|
510
510
|
</div>
|
|
511
511
|
)}
|
|
@@ -520,8 +520,8 @@ export function SkillsPage() {
|
|
|
520
520
|
return (
|
|
521
521
|
<div
|
|
522
522
|
key={skill.name}
|
|
523
|
-
className={`bg-[
|
|
524
|
-
installed ? "border-green-500/30" : "border-[
|
|
523
|
+
className={`bg-[var(--color-surface)] border rounded-lg p-4 transition ${
|
|
524
|
+
installed ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
|
|
525
525
|
}`}
|
|
526
526
|
>
|
|
527
527
|
<div className="flex items-start justify-between gap-3">
|
|
@@ -532,10 +532,10 @@ export function SkillsPage() {
|
|
|
532
532
|
<span className="text-xs text-green-400">✓ Installed</span>
|
|
533
533
|
)}
|
|
534
534
|
</div>
|
|
535
|
-
<p className="text-sm text-[
|
|
535
|
+
<p className="text-sm text-[var(--color-text-muted)] mt-1 line-clamp-2">
|
|
536
536
|
{skill.description || "No description"}
|
|
537
537
|
</p>
|
|
538
|
-
<div className="flex items-center gap-2 mt-2 text-xs text-[
|
|
538
|
+
<div className="flex items-center gap-2 mt-2 text-xs text-[var(--color-text-faint)]">
|
|
539
539
|
<span>{(skill.size / 1024).toFixed(1)}KB</span>
|
|
540
540
|
<span className="px-1.5 py-0.5 rounded bg-blue-500/10 text-blue-400">
|
|
541
541
|
GitHub
|
|
@@ -544,12 +544,12 @@ export function SkillsPage() {
|
|
|
544
544
|
</div>
|
|
545
545
|
<div className="flex-shrink-0">
|
|
546
546
|
{installed ? (
|
|
547
|
-
<span className="text-xs text-[
|
|
547
|
+
<span className="text-xs text-[var(--color-text-faint)] px-3 py-1.5">Added</span>
|
|
548
548
|
) : (
|
|
549
549
|
<button
|
|
550
550
|
onClick={() => installFromGitHub(skill)}
|
|
551
551
|
disabled={isInstalling}
|
|
552
|
-
className="text-sm bg-[
|
|
552
|
+
className="text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] px-3 py-1.5 rounded transition disabled:opacity-50"
|
|
553
553
|
>
|
|
554
554
|
{isInstalling ? "Installing..." : "Install"}
|
|
555
555
|
</button>
|
|
@@ -563,10 +563,10 @@ export function SkillsPage() {
|
|
|
563
563
|
)}
|
|
564
564
|
|
|
565
565
|
{/* Info */}
|
|
566
|
-
<div className="p-4 bg-[
|
|
566
|
+
<div className="p-4 bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg text-sm text-[var(--color-text-muted)]">
|
|
567
567
|
<p>
|
|
568
568
|
Skills are sourced from GitHub repositories. Each skill should be in its own directory with a{" "}
|
|
569
|
-
<code className="text-[
|
|
569
|
+
<code className="text-[var(--color-text-secondary)] bg-[var(--color-bg)] px-1 rounded">SKILL.md</code> file containing instructions.
|
|
570
570
|
</p>
|
|
571
571
|
</div>
|
|
572
572
|
</div>
|
|
@@ -584,12 +584,12 @@ export function SkillsPage() {
|
|
|
584
584
|
onChange={(e) => setSearchQuery(e.target.value)}
|
|
585
585
|
onKeyDown={(e) => e.key === "Enter" && searchMarketplace()}
|
|
586
586
|
placeholder="Search skills..."
|
|
587
|
-
className="flex-1 bg-[
|
|
587
|
+
className="flex-1 bg-[var(--color-surface)] border border-[var(--color-border)] rounded px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
588
588
|
/>
|
|
589
589
|
<button
|
|
590
590
|
onClick={() => searchMarketplace()}
|
|
591
591
|
disabled={marketplaceLoading}
|
|
592
|
-
className="bg-[
|
|
592
|
+
className="bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] text-white px-4 py-2 rounded font-medium transition border border-[var(--color-border-light)]"
|
|
593
593
|
>
|
|
594
594
|
{marketplaceLoading ? "..." : "Search"}
|
|
595
595
|
</button>
|
|
@@ -597,9 +597,9 @@ export function SkillsPage() {
|
|
|
597
597
|
</div>
|
|
598
598
|
|
|
599
599
|
{marketplaceLoading ? (
|
|
600
|
-
<div className="text-[
|
|
600
|
+
<div className="text-[var(--color-text-muted)]">Loading...</div>
|
|
601
601
|
) : marketplaceSkills.length === 0 ? (
|
|
602
|
-
<div className="text-center py-20 text-[
|
|
602
|
+
<div className="text-center py-20 text-[var(--color-text-muted)]">
|
|
603
603
|
<p className="text-lg">No skills found</p>
|
|
604
604
|
<p className="text-sm mt-1">Try a different search term</p>
|
|
605
605
|
</div>
|
|
@@ -697,7 +697,7 @@ function SkillCard({
|
|
|
697
697
|
}
|
|
698
698
|
if (skill.project_id === null) {
|
|
699
699
|
return (
|
|
700
|
-
<span className="text-xs text-[
|
|
700
|
+
<span className="text-xs text-[var(--color-text-muted)] bg-[var(--color-surface-raised)] px-1.5 py-0.5 rounded">
|
|
701
701
|
Global
|
|
702
702
|
</span>
|
|
703
703
|
);
|
|
@@ -707,9 +707,9 @@ function SkillCard({
|
|
|
707
707
|
|
|
708
708
|
return (
|
|
709
709
|
<div
|
|
710
|
-
className={`bg-[
|
|
711
|
-
skill.enabled ? "border-[
|
|
712
|
-
} hover:border-[
|
|
710
|
+
className={`bg-[var(--color-surface)] rounded-lg p-5 border transition cursor-pointer ${
|
|
711
|
+
skill.enabled ? "border-[var(--color-border)]" : "border-[var(--color-border)] opacity-60"
|
|
712
|
+
} hover:border-[var(--color-border-light)]`}
|
|
713
713
|
onClick={onView}
|
|
714
714
|
>
|
|
715
715
|
<div className="flex items-start justify-between mb-3">
|
|
@@ -718,11 +718,11 @@ function SkillCard({
|
|
|
718
718
|
<h3 className="font-semibold text-lg truncate">{skill.name}</h3>
|
|
719
719
|
{getScopeBadge()}
|
|
720
720
|
</div>
|
|
721
|
-
<p className="text-xs text-[
|
|
721
|
+
<p className="text-xs text-[var(--color-text-muted)] flex items-center gap-2 mt-0.5">
|
|
722
722
|
<span className={`px-1.5 py-0.5 rounded text-[10px] ${
|
|
723
723
|
skill.source === "skillsmp" ? "bg-purple-500/20 text-purple-400" :
|
|
724
724
|
skill.source === "github" ? "bg-blue-500/20 text-blue-400" :
|
|
725
|
-
"bg-[
|
|
725
|
+
"bg-[var(--color-surface-raised)] text-[var(--color-text-secondary)]"
|
|
726
726
|
}`}>
|
|
727
727
|
{sourceLabel}
|
|
728
728
|
</span>
|
|
@@ -735,7 +735,7 @@ function SkillCard({
|
|
|
735
735
|
onToggle();
|
|
736
736
|
}}
|
|
737
737
|
className={`w-10 h-5 rounded-full transition-colors relative ${
|
|
738
|
-
skill.enabled ? "bg-[
|
|
738
|
+
skill.enabled ? "bg-[var(--color-accent)]" : "bg-[var(--color-surface-raised)]"
|
|
739
739
|
}`}
|
|
740
740
|
>
|
|
741
741
|
<span
|
|
@@ -746,17 +746,17 @@ function SkillCard({
|
|
|
746
746
|
</button>
|
|
747
747
|
</div>
|
|
748
748
|
|
|
749
|
-
<p className="text-sm text-[
|
|
749
|
+
<p className="text-sm text-[var(--color-text-secondary)] line-clamp-2 mb-4">{skill.description}</p>
|
|
750
750
|
|
|
751
751
|
<div className="flex items-center justify-between">
|
|
752
752
|
<div className="flex gap-1 flex-wrap">
|
|
753
753
|
{skill.allowed_tools.slice(0, 2).map((tool) => (
|
|
754
|
-
<span key={tool} className="text-xs bg-[
|
|
754
|
+
<span key={tool} className="text-xs bg-[var(--color-surface-raised)] px-2 py-0.5 rounded text-[var(--color-text-muted)]">
|
|
755
755
|
{tool}
|
|
756
756
|
</span>
|
|
757
757
|
))}
|
|
758
758
|
{skill.allowed_tools.length > 2 && (
|
|
759
|
-
<span className="text-xs text-[
|
|
759
|
+
<span className="text-xs text-[var(--color-text-muted)]">+{skill.allowed_tools.length - 2}</span>
|
|
760
760
|
)}
|
|
761
761
|
</div>
|
|
762
762
|
<button
|
|
@@ -785,11 +785,11 @@ function MarketplaceSkillCard({
|
|
|
785
785
|
onInstall: () => void;
|
|
786
786
|
}) {
|
|
787
787
|
return (
|
|
788
|
-
<div className="bg-[
|
|
788
|
+
<div className="bg-[var(--color-surface)] rounded-lg p-5 border border-[var(--color-border)] hover:border-[var(--color-border-light)] transition">
|
|
789
789
|
<div className="flex items-start justify-between mb-3">
|
|
790
790
|
<div className="flex-1 min-w-0">
|
|
791
791
|
<h3 className="font-semibold text-lg truncate">{skill.name}</h3>
|
|
792
|
-
<p className="text-xs text-[
|
|
792
|
+
<p className="text-xs text-[var(--color-text-muted)] mt-0.5">
|
|
793
793
|
by {skill.author} · v{skill.version}
|
|
794
794
|
</p>
|
|
795
795
|
</div>
|
|
@@ -798,12 +798,12 @@ function MarketplaceSkillCard({
|
|
|
798
798
|
</div>
|
|
799
799
|
</div>
|
|
800
800
|
|
|
801
|
-
<p className="text-sm text-[
|
|
801
|
+
<p className="text-sm text-[var(--color-text-secondary)] line-clamp-2 mb-4">{skill.description}</p>
|
|
802
802
|
|
|
803
803
|
<div className="flex items-center justify-between">
|
|
804
804
|
<div className="flex gap-1 flex-wrap">
|
|
805
805
|
{skill.tags.slice(0, 3).map((tag) => (
|
|
806
|
-
<span key={tag} className="text-xs bg-[
|
|
806
|
+
<span key={tag} className="text-xs bg-[var(--color-surface-raised)] px-2 py-0.5 rounded text-[var(--color-text-muted)]">
|
|
807
807
|
{tag}
|
|
808
808
|
</span>
|
|
809
809
|
))}
|
|
@@ -814,14 +814,14 @@ function MarketplaceSkillCard({
|
|
|
814
814
|
<button
|
|
815
815
|
onClick={onInstall}
|
|
816
816
|
disabled={installing}
|
|
817
|
-
className="bg-[
|
|
817
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-3 py-1 rounded text-sm font-medium transition"
|
|
818
818
|
>
|
|
819
819
|
{installing ? "Installing..." : "Install"}
|
|
820
820
|
</button>
|
|
821
821
|
)}
|
|
822
822
|
</div>
|
|
823
823
|
|
|
824
|
-
<div className="mt-3 text-xs text-[
|
|
824
|
+
<div className="mt-3 text-xs text-[var(--color-text-faint)]">
|
|
825
825
|
{skill.downloads.toLocaleString()} downloads
|
|
826
826
|
</div>
|
|
827
827
|
</div>
|
|
@@ -895,10 +895,10 @@ function CreateSkillModal({
|
|
|
895
895
|
return (
|
|
896
896
|
<div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
|
|
897
897
|
<div
|
|
898
|
-
className="bg-[
|
|
898
|
+
className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
|
|
899
899
|
onClick={(e) => e.stopPropagation()}
|
|
900
900
|
>
|
|
901
|
-
<div className="p-6 border-b border-[
|
|
901
|
+
<div className="p-6 border-b border-[var(--color-border)]">
|
|
902
902
|
<h2 className="text-xl font-semibold">Create Skill</h2>
|
|
903
903
|
</div>
|
|
904
904
|
|
|
@@ -910,32 +910,32 @@ function CreateSkillModal({
|
|
|
910
910
|
)}
|
|
911
911
|
|
|
912
912
|
<div>
|
|
913
|
-
<label className="block text-sm text-[
|
|
913
|
+
<label className="block text-sm text-[var(--color-text-secondary)] mb-1">Name</label>
|
|
914
914
|
<input
|
|
915
915
|
type="text"
|
|
916
916
|
value={name}
|
|
917
917
|
onChange={(e) => setName(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, "-"))}
|
|
918
918
|
placeholder="my-skill-name"
|
|
919
|
-
className="w-full bg-[
|
|
919
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
920
920
|
/>
|
|
921
|
-
<p className="text-xs text-[
|
|
921
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">Lowercase letters, numbers, and hyphens only</p>
|
|
922
922
|
</div>
|
|
923
923
|
|
|
924
924
|
<div>
|
|
925
|
-
<label className="block text-sm text-[
|
|
925
|
+
<label className="block text-sm text-[var(--color-text-secondary)] mb-1">Description</label>
|
|
926
926
|
<input
|
|
927
927
|
type="text"
|
|
928
928
|
value={description}
|
|
929
929
|
onChange={(e) => setDescription(e.target.value)}
|
|
930
930
|
placeholder="What this skill does and when to use it..."
|
|
931
|
-
className="w-full bg-[
|
|
931
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
932
932
|
/>
|
|
933
933
|
</div>
|
|
934
934
|
|
|
935
935
|
{/* Project Scope - only show when projects exist */}
|
|
936
936
|
{hasProjects && (
|
|
937
937
|
<div>
|
|
938
|
-
<label className="block text-sm text-[
|
|
938
|
+
<label className="block text-sm text-[var(--color-text-secondary)] mb-1">Scope</label>
|
|
939
939
|
<Select
|
|
940
940
|
value={projectId || ""}
|
|
941
941
|
onChange={(value) => setProjectId(value || null)}
|
|
@@ -945,35 +945,35 @@ function CreateSkillModal({
|
|
|
945
945
|
]}
|
|
946
946
|
placeholder="Select scope..."
|
|
947
947
|
/>
|
|
948
|
-
<p className="text-xs text-[
|
|
948
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-1">
|
|
949
949
|
Global skills are available to all agents. Project-scoped skills are only available to agents in that project.
|
|
950
950
|
</p>
|
|
951
951
|
</div>
|
|
952
952
|
)}
|
|
953
953
|
|
|
954
954
|
<div>
|
|
955
|
-
<label className="block text-sm text-[
|
|
955
|
+
<label className="block text-sm text-[var(--color-text-secondary)] mb-1">Instructions (Markdown)</label>
|
|
956
956
|
<textarea
|
|
957
957
|
value={content}
|
|
958
958
|
onChange={(e) => setContent(e.target.value)}
|
|
959
959
|
placeholder="# Skill Instructions Write detailed instructions here..."
|
|
960
960
|
rows={12}
|
|
961
|
-
className="w-full bg-[
|
|
961
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)] font-mono text-sm"
|
|
962
962
|
/>
|
|
963
963
|
</div>
|
|
964
964
|
</div>
|
|
965
965
|
|
|
966
|
-
<div className="p-6 border-t border-[
|
|
966
|
+
<div className="p-6 border-t border-[var(--color-border)] flex justify-end gap-3">
|
|
967
967
|
<button
|
|
968
968
|
onClick={onClose}
|
|
969
|
-
className="px-4 py-2 text-[
|
|
969
|
+
className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
|
|
970
970
|
>
|
|
971
971
|
Cancel
|
|
972
972
|
</button>
|
|
973
973
|
<button
|
|
974
974
|
onClick={handleSave}
|
|
975
975
|
disabled={saving}
|
|
976
|
-
className="bg-[
|
|
976
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
|
|
977
977
|
>
|
|
978
978
|
{saving ? "Creating..." : "Create Skill"}
|
|
979
979
|
</button>
|
|
@@ -1029,12 +1029,12 @@ function ImportSkillModal({
|
|
|
1029
1029
|
return (
|
|
1030
1030
|
<div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
|
|
1031
1031
|
<div
|
|
1032
|
-
className="bg-[
|
|
1032
|
+
className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-2xl max-h-[90vh] overflow-auto"
|
|
1033
1033
|
onClick={(e) => e.stopPropagation()}
|
|
1034
1034
|
>
|
|
1035
|
-
<div className="p-6 border-b border-[
|
|
1035
|
+
<div className="p-6 border-b border-[var(--color-border)]">
|
|
1036
1036
|
<h2 className="text-xl font-semibold">Import Skill</h2>
|
|
1037
|
-
<p className="text-sm text-[
|
|
1037
|
+
<p className="text-sm text-[var(--color-text-muted)] mt-1">Paste the contents of a SKILL.md file</p>
|
|
1038
1038
|
</div>
|
|
1039
1039
|
|
|
1040
1040
|
<div className="p-6 space-y-4">
|
|
@@ -1056,21 +1056,21 @@ description: What this skill does...
|
|
|
1056
1056
|
|
|
1057
1057
|
Your skill instructions here...`}
|
|
1058
1058
|
rows={16}
|
|
1059
|
-
className="w-full bg-[
|
|
1059
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)] font-mono text-sm"
|
|
1060
1060
|
/>
|
|
1061
1061
|
</div>
|
|
1062
1062
|
|
|
1063
|
-
<div className="p-6 border-t border-[
|
|
1063
|
+
<div className="p-6 border-t border-[var(--color-border)] flex justify-end gap-3">
|
|
1064
1064
|
<button
|
|
1065
1065
|
onClick={onClose}
|
|
1066
|
-
className="px-4 py-2 text-[
|
|
1066
|
+
className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
|
|
1067
1067
|
>
|
|
1068
1068
|
Cancel
|
|
1069
1069
|
</button>
|
|
1070
1070
|
<button
|
|
1071
1071
|
onClick={handleImport}
|
|
1072
1072
|
disabled={importing}
|
|
1073
|
-
className="bg-[
|
|
1073
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
|
|
1074
1074
|
>
|
|
1075
1075
|
{importing ? "Importing..." : "Import Skill"}
|
|
1076
1076
|
</button>
|
|
@@ -1129,24 +1129,24 @@ function ViewSkillModal({
|
|
|
1129
1129
|
return (
|
|
1130
1130
|
<div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4" onClick={onClose}>
|
|
1131
1131
|
<div
|
|
1132
|
-
className="bg-[
|
|
1132
|
+
className="bg-[var(--color-surface)] border border-[var(--color-border)] rounded-lg w-full max-w-3xl max-h-[90vh] overflow-auto"
|
|
1133
1133
|
onClick={(e) => e.stopPropagation()}
|
|
1134
1134
|
>
|
|
1135
|
-
<div className="p-6 border-b border-[
|
|
1135
|
+
<div className="p-6 border-b border-[var(--color-border)] flex items-center justify-between">
|
|
1136
1136
|
<div>
|
|
1137
1137
|
<h2 className="text-xl font-semibold">{skill.name}</h2>
|
|
1138
|
-
<p className="text-sm text-[
|
|
1138
|
+
<p className="text-sm text-[var(--color-text-muted)] mt-0.5">{skill.description}</p>
|
|
1139
1139
|
</div>
|
|
1140
1140
|
<div className="flex gap-2">
|
|
1141
1141
|
<button
|
|
1142
1142
|
onClick={handleExport}
|
|
1143
|
-
className="text-sm text-[
|
|
1143
|
+
className="text-sm text-[var(--color-text-secondary)] hover:text-white transition px-3 py-1 rounded border border-[var(--color-border-light)]"
|
|
1144
1144
|
>
|
|
1145
1145
|
Export
|
|
1146
1146
|
</button>
|
|
1147
1147
|
<button
|
|
1148
1148
|
onClick={() => setEditing(!editing)}
|
|
1149
|
-
className="text-sm text-[
|
|
1149
|
+
className="text-sm text-[var(--color-text-secondary)] hover:text-white transition px-3 py-1 rounded border border-[var(--color-border-light)]"
|
|
1150
1150
|
>
|
|
1151
1151
|
{editing ? "View" : "Edit"}
|
|
1152
1152
|
</button>
|
|
@@ -1159,19 +1159,19 @@ function ViewSkillModal({
|
|
|
1159
1159
|
value={content}
|
|
1160
1160
|
onChange={(e) => setContent(e.target.value)}
|
|
1161
1161
|
rows={20}
|
|
1162
|
-
className="w-full bg-[
|
|
1162
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)] font-mono text-sm"
|
|
1163
1163
|
/>
|
|
1164
1164
|
) : (
|
|
1165
|
-
<pre className="bg-[
|
|
1165
|
+
<pre className="bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded p-4 font-mono text-sm overflow-auto max-h-[60vh] whitespace-pre-wrap">
|
|
1166
1166
|
{skill.content}
|
|
1167
1167
|
</pre>
|
|
1168
1168
|
)}
|
|
1169
1169
|
</div>
|
|
1170
1170
|
|
|
1171
|
-
<div className="p-6 border-t border-[
|
|
1172
|
-
<div className="text-xs text-[
|
|
1171
|
+
<div className="p-6 border-t border-[var(--color-border)] flex justify-between">
|
|
1172
|
+
<div className="text-xs text-[var(--color-text-faint)]">
|
|
1173
1173
|
{skill.source !== "local" && skill.source_url && (
|
|
1174
|
-
<a href={skill.source_url} target="_blank" rel="noopener noreferrer" className="text-[
|
|
1174
|
+
<a href={skill.source_url} target="_blank" rel="noopener noreferrer" className="text-[var(--color-accent)] hover:underline">
|
|
1175
1175
|
View source →
|
|
1176
1176
|
</a>
|
|
1177
1177
|
)}
|
|
@@ -1179,7 +1179,7 @@ function ViewSkillModal({
|
|
|
1179
1179
|
<div className="flex gap-3">
|
|
1180
1180
|
<button
|
|
1181
1181
|
onClick={onClose}
|
|
1182
|
-
className="px-4 py-2 text-[
|
|
1182
|
+
className="px-4 py-2 text-[var(--color-text-secondary)] hover:text-white transition"
|
|
1183
1183
|
>
|
|
1184
1184
|
Close
|
|
1185
1185
|
</button>
|
|
@@ -1187,7 +1187,7 @@ function ViewSkillModal({
|
|
|
1187
1187
|
<button
|
|
1188
1188
|
onClick={handleSave}
|
|
1189
1189
|
disabled={saving}
|
|
1190
|
-
className="bg-[
|
|
1190
|
+
className="bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition"
|
|
1191
1191
|
>
|
|
1192
1192
|
{saving ? "Saving..." : "Save Changes"}
|
|
1193
1193
|
</button>
|