apteva 0.4.41 → 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.7fb3e7mp.js → App.qzbx5wtj.js} +1 -1
- 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 +8 -8
- package/src/db.ts +19 -9
- package/src/integrations/agentdojo.ts +1 -0
- package/src/mcp-platform.ts +418 -63
- package/src/openapi.ts +96 -0
- package/src/providers.ts +50 -24
- package/src/routes/api/agent-utils.ts +0 -1
- package/src/routes/api/agents.ts +19 -1
- package/src/routes/api/meta-agent.ts +2 -0
- package/src/routes/api/system.ts +90 -1
- package/src/routes/api/telemetry.ts +19 -1
- package/src/routes/share.ts +85 -0
- package/src/server.ts +12 -0
- package/src/web/App.tsx +89 -11
- package/src/web/components/activity/ActivityPage.tsx +14 -14
- package/src/web/components/agents/AgentCard.tsx +14 -14
- 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/LoadingSpinner.tsx +2 -2
- package/src/web/components/common/Modal.tsx +8 -8
- package/src/web/components/common/Select.tsx +9 -9
- 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 +32 -32
- package/src/web/components/layout/Header.tsx +50 -34
- package/src/web/components/layout/Sidebar.tsx +34 -15
- package/src/web/components/mcp/IntegrationsPanel.tsx +40 -40
- package/src/web/components/mcp/McpPage.tsx +208 -208
- package/src/web/components/meta-agent/MetaAgent.tsx +12 -10
- package/src/web/components/onboarding/OnboardingWizard.tsx +25 -25
- package/src/web/components/settings/SettingsPage.tsx +258 -175
- package/src/web/components/skills/SkillsPage.tsx +88 -88
- package/src/web/components/tasks/TasksPage.tsx +339 -54
- package/src/web/components/telemetry/TelemetryPage.tsx +135 -64
- package/src/web/components/tests/TestsPage.tsx +50 -50
- package/src/web/components/threads/ThreadsPage.tsx +23 -21
- package/src/web/context/ProjectContext.tsx +6 -1
- package/src/web/context/ThemeContext.tsx +69 -0
- package/src/web/context/index.ts +2 -0
- package/src/web/styles.css +5 -3
- package/src/web/themes.ts +99 -0
- package/src/web/types.ts +0 -4
- package/dist/ActivityPage.7907h64p.js +0 -3
- package/dist/ApiDocsPage.k3jjenpq.js +0 -4
- package/dist/App.01nq20st.js +0 -4
- package/dist/App.1maqvamf.js +0 -4
- package/dist/App.2yjrh32f.js +0 -4
- package/dist/App.3qw8nben.js +0 -20
- package/dist/App.7sy3wq8c.js +0 -4
- package/dist/App.apjrmctz.js +0 -57
- package/dist/App.av6t2yhe.js +0 -4
- package/dist/App.jqj5a094.js +0 -46
- package/dist/App.mc7xf85h.js +0 -4
- package/dist/App.myxqcj9x.js +0 -4
- package/dist/App.nm91r1mp.js +0 -13
- package/dist/App.p02f4ret.js +0 -1
- package/dist/App.qcknavjz.js +0 -221
- package/dist/App.vc7vfhg4.js +0 -4
- package/dist/App.z4s9zkw5.js +0 -4
- package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
- package/dist/McpPage.8vc97z0b.js +0 -3
- package/dist/SettingsPage.p61bz8kd.js +0 -3
- package/dist/SkillsPage.r9x43g3g.js +0 -3
- package/dist/TasksPage.1e0zkye4.js +0 -3
- package/dist/TelemetryPage.p9vbe4gf.js +0 -3
- package/dist/TestsPage.d4xy504e.js +0 -3
- package/dist/ThreadsPage.m016am3x.js +0 -3
|
@@ -385,7 +385,7 @@ export function IntegrationsPanel({
|
|
|
385
385
|
const availableApps = filteredApps.filter((app) => !isConnected(app));
|
|
386
386
|
|
|
387
387
|
if (loading) {
|
|
388
|
-
return <div className="text-center py-8 text-[
|
|
388
|
+
return <div className="text-center py-8 text-[var(--color-text-muted)]">Loading apps...</div>;
|
|
389
389
|
}
|
|
390
390
|
|
|
391
391
|
return (
|
|
@@ -393,7 +393,7 @@ export function IntegrationsPanel({
|
|
|
393
393
|
{/* Auth Method Choice Modal */}
|
|
394
394
|
{authMethodModal && (
|
|
395
395
|
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
|
|
396
|
-
<div className="bg-[
|
|
396
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
|
|
397
397
|
<div className="flex items-center gap-3 mb-4">
|
|
398
398
|
{authMethodModal.app.logo && (
|
|
399
399
|
<img
|
|
@@ -404,7 +404,7 @@ export function IntegrationsPanel({
|
|
|
404
404
|
)}
|
|
405
405
|
<div>
|
|
406
406
|
<h3 className="font-medium">Connect {authMethodModal.app.name}</h3>
|
|
407
|
-
<p className="text-xs text-[
|
|
407
|
+
<p className="text-xs text-[var(--color-text-muted)]">Choose how to authenticate</p>
|
|
408
408
|
</div>
|
|
409
409
|
</div>
|
|
410
410
|
<div className="space-y-3">
|
|
@@ -415,10 +415,10 @@ export function IntegrationsPanel({
|
|
|
415
415
|
setApiKeyInput("");
|
|
416
416
|
setCredentialInputs({});
|
|
417
417
|
}}
|
|
418
|
-
className="w-full text-left p-3 bg-[
|
|
418
|
+
className="w-full text-left p-3 bg-[var(--color-bg)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] rounded-lg transition"
|
|
419
419
|
>
|
|
420
420
|
<div className="font-medium text-sm">API Key</div>
|
|
421
|
-
<div className="text-xs text-[
|
|
421
|
+
<div className="text-xs text-[var(--color-text-muted)] mt-0.5">
|
|
422
422
|
Enter your {authMethodModal.app.name} API key directly
|
|
423
423
|
</div>
|
|
424
424
|
</button>
|
|
@@ -427,17 +427,17 @@ export function IntegrationsPanel({
|
|
|
427
427
|
setAuthMethodModal(null);
|
|
428
428
|
connectApp(authMethodModal.app, undefined, true);
|
|
429
429
|
}}
|
|
430
|
-
className="w-full text-left p-3 bg-[
|
|
430
|
+
className="w-full text-left p-3 bg-[var(--color-bg)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] hover:border-[var(--color-accent)] rounded-lg transition"
|
|
431
431
|
>
|
|
432
432
|
<div className="font-medium text-sm">OAuth</div>
|
|
433
|
-
<div className="text-xs text-[
|
|
433
|
+
<div className="text-xs text-[var(--color-text-muted)] mt-0.5">
|
|
434
434
|
Sign in with your {authMethodModal.app.name} account
|
|
435
435
|
</div>
|
|
436
436
|
</button>
|
|
437
437
|
</div>
|
|
438
438
|
<button
|
|
439
439
|
onClick={() => setAuthMethodModal(null)}
|
|
440
|
-
className="w-full text-sm text-[
|
|
440
|
+
className="w-full text-sm text-[var(--color-text-muted)] hover:text-white mt-4 py-2 transition"
|
|
441
441
|
>
|
|
442
442
|
Cancel
|
|
443
443
|
</button>
|
|
@@ -448,7 +448,7 @@ export function IntegrationsPanel({
|
|
|
448
448
|
{/* API Key / Credentials Modal */}
|
|
449
449
|
{apiKeyModal && (
|
|
450
450
|
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
|
|
451
|
-
<div className="bg-[
|
|
451
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
|
|
452
452
|
<div className="flex items-center gap-3 mb-4">
|
|
453
453
|
{apiKeyModal.app.logo && (
|
|
454
454
|
<img
|
|
@@ -459,7 +459,7 @@ export function IntegrationsPanel({
|
|
|
459
459
|
)}
|
|
460
460
|
<div>
|
|
461
461
|
<h3 className="font-medium">Connect {apiKeyModal.app.name}</h3>
|
|
462
|
-
<p className="text-xs text-[
|
|
462
|
+
<p className="text-xs text-[var(--color-text-muted)]">
|
|
463
463
|
{apiKeyModal.app.credentialFields?.length
|
|
464
464
|
? "Enter your credentials to connect"
|
|
465
465
|
: "Enter your API key to connect"}
|
|
@@ -471,19 +471,19 @@ export function IntegrationsPanel({
|
|
|
471
471
|
<div className="space-y-3 mb-4">
|
|
472
472
|
{apiKeyModal.app.credentialFields.map((field, idx) => (
|
|
473
473
|
<div key={field.name}>
|
|
474
|
-
<label className="block text-xs text-[
|
|
474
|
+
<label className="block text-xs text-[var(--color-text-secondary)] mb-1">
|
|
475
475
|
{field.name.replace(/([A-Z])/g, " $1").replace(/[-_]/g, " ").replace(/\b\w/g, c => c.toUpperCase()).trim()}
|
|
476
476
|
{field.required !== false && <span className="text-red-400 ml-0.5">*</span>}
|
|
477
477
|
</label>
|
|
478
478
|
{field.description && (
|
|
479
|
-
<p className="text-[10px] text-[
|
|
479
|
+
<p className="text-[10px] text-[var(--color-text-faint)] mb-1">{field.description}</p>
|
|
480
480
|
)}
|
|
481
481
|
<input
|
|
482
482
|
type="password"
|
|
483
483
|
value={credentialInputs[field.name] || ""}
|
|
484
484
|
onChange={(e) => setCredentialInputs(prev => ({ ...prev, [field.name]: e.target.value }))}
|
|
485
485
|
placeholder={`Enter ${field.name}...`}
|
|
486
|
-
className="w-full bg-[
|
|
486
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
487
487
|
autoFocus={idx === 0}
|
|
488
488
|
/>
|
|
489
489
|
</div>
|
|
@@ -495,7 +495,7 @@ export function IntegrationsPanel({
|
|
|
495
495
|
value={apiKeyInput}
|
|
496
496
|
onChange={(e) => setApiKeyInput(e.target.value)}
|
|
497
497
|
placeholder="Enter API Key..."
|
|
498
|
-
className="w-full bg-[
|
|
498
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[var(--color-accent)]"
|
|
499
499
|
autoFocus
|
|
500
500
|
/>
|
|
501
501
|
)}
|
|
@@ -503,7 +503,7 @@ export function IntegrationsPanel({
|
|
|
503
503
|
<button
|
|
504
504
|
type="button"
|
|
505
505
|
onClick={() => setApiKeyModal(null)}
|
|
506
|
-
className="flex-1 text-sm bg-[
|
|
506
|
+
className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 rounded transition"
|
|
507
507
|
>
|
|
508
508
|
Cancel
|
|
509
509
|
</button>
|
|
@@ -515,7 +515,7 @@ export function IntegrationsPanel({
|
|
|
515
515
|
? !apiKeyModal.app.credentialFields.filter(f => f.required !== false).every(f => credentialInputs[f.name]?.trim())
|
|
516
516
|
: !apiKeyInput.trim())
|
|
517
517
|
}
|
|
518
|
-
className="flex-1 text-sm bg-[
|
|
518
|
+
className="flex-1 text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition disabled:opacity-50"
|
|
519
519
|
>
|
|
520
520
|
{connecting === apiKeyModal.app.slug ? "Connecting..." : "Connect"}
|
|
521
521
|
</button>
|
|
@@ -528,7 +528,7 @@ export function IntegrationsPanel({
|
|
|
528
528
|
{/* MCP Config Creation Modal */}
|
|
529
529
|
{mcpConfigModal && (
|
|
530
530
|
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
|
|
531
|
-
<div className="bg-[
|
|
531
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-md mx-4">
|
|
532
532
|
{mcpConfigSuccess ? (
|
|
533
533
|
<>
|
|
534
534
|
<div className="text-center mb-4">
|
|
@@ -536,7 +536,7 @@ export function IntegrationsPanel({
|
|
|
536
536
|
<span className="text-green-400 text-2xl">✓</span>
|
|
537
537
|
</div>
|
|
538
538
|
<h3 className="font-medium text-lg">MCP Config Created!</h3>
|
|
539
|
-
<p className="text-sm text-[
|
|
539
|
+
<p className="text-sm text-[var(--color-text-secondary)] mt-2">
|
|
540
540
|
"{mcpConfigSuccess}" has been created and added to your servers.
|
|
541
541
|
</p>
|
|
542
542
|
</div>
|
|
@@ -545,7 +545,7 @@ export function IntegrationsPanel({
|
|
|
545
545
|
setMcpConfigModal(null);
|
|
546
546
|
setMcpConfigSuccess(null);
|
|
547
547
|
}}
|
|
548
|
-
className="w-full text-sm bg-[
|
|
548
|
+
className="w-full text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition"
|
|
549
549
|
>
|
|
550
550
|
Done
|
|
551
551
|
</button>
|
|
@@ -562,19 +562,19 @@ export function IntegrationsPanel({
|
|
|
562
562
|
)}
|
|
563
563
|
<div>
|
|
564
564
|
<h3 className="font-medium">Create MCP Config</h3>
|
|
565
|
-
<p className="text-xs text-[
|
|
565
|
+
<p className="text-xs text-[var(--color-text-muted)]">
|
|
566
566
|
Create an MCP config for {mcpConfigModal.app.name}
|
|
567
567
|
</p>
|
|
568
568
|
</div>
|
|
569
569
|
</div>
|
|
570
570
|
<form onSubmit={(e) => { e.preventDefault(); createMcpConfig(); }}>
|
|
571
|
-
<label className="block text-xs text-[
|
|
571
|
+
<label className="block text-xs text-[var(--color-text-secondary)] mb-1">Config Name</label>
|
|
572
572
|
<input
|
|
573
573
|
type="text"
|
|
574
574
|
value={mcpConfigName}
|
|
575
575
|
onChange={(e) => setMcpConfigName(e.target.value)}
|
|
576
576
|
placeholder="Enter config name..."
|
|
577
|
-
className="w-full bg-[
|
|
577
|
+
className="w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 mb-4 focus:outline-none focus:border-[var(--color-accent)]"
|
|
578
578
|
autoFocus
|
|
579
579
|
maxLength={30}
|
|
580
580
|
/>
|
|
@@ -582,14 +582,14 @@ export function IntegrationsPanel({
|
|
|
582
582
|
<button
|
|
583
583
|
type="button"
|
|
584
584
|
onClick={() => setMcpConfigModal(null)}
|
|
585
|
-
className="flex-1 text-sm bg-[
|
|
585
|
+
className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 rounded transition"
|
|
586
586
|
>
|
|
587
587
|
Cancel
|
|
588
588
|
</button>
|
|
589
589
|
<button
|
|
590
590
|
type="submit"
|
|
591
591
|
disabled={!mcpConfigName.trim() || mcpConfigCreating}
|
|
592
|
-
className="flex-1 text-sm bg-[
|
|
592
|
+
className="flex-1 text-sm bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-white px-4 py-2 rounded transition disabled:opacity-50"
|
|
593
593
|
>
|
|
594
594
|
{mcpConfigCreating ? "Creating..." : "Create Config"}
|
|
595
595
|
</button>
|
|
@@ -604,12 +604,12 @@ export function IntegrationsPanel({
|
|
|
604
604
|
{/* Confirmation Modal */}
|
|
605
605
|
{confirmModal && (
|
|
606
606
|
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
|
|
607
|
-
<div className="bg-[
|
|
607
|
+
<div className="bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg p-6 w-full max-w-sm mx-4">
|
|
608
608
|
<p className="text-center mb-4">{confirmModal.message}</p>
|
|
609
609
|
<div className="flex gap-2">
|
|
610
610
|
<button
|
|
611
611
|
onClick={() => setConfirmModal(null)}
|
|
612
|
-
className="flex-1 text-sm bg-[
|
|
612
|
+
className="flex-1 text-sm bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] border border-[var(--color-border-light)] px-4 py-2 rounded transition"
|
|
613
613
|
>
|
|
614
614
|
Cancel
|
|
615
615
|
</button>
|
|
@@ -649,14 +649,14 @@ export function IntegrationsPanel({
|
|
|
649
649
|
value={search}
|
|
650
650
|
onChange={(e) => setSearch(e.target.value)}
|
|
651
651
|
placeholder="Search apps..."
|
|
652
|
-
className="w-full bg-[
|
|
652
|
+
className="w-full bg-[var(--color-surface)] border border-[var(--color-border-light)] rounded-lg px-4 py-2 focus:outline-none focus:border-[var(--color-accent)]"
|
|
653
653
|
/>
|
|
654
654
|
</div>
|
|
655
655
|
|
|
656
656
|
{/* Connected Apps */}
|
|
657
657
|
{connectedApps.length > 0 && (
|
|
658
658
|
<div>
|
|
659
|
-
<h3 className="text-sm font-medium text-[
|
|
659
|
+
<h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">
|
|
660
660
|
Connected ({connectedApps.length})
|
|
661
661
|
</h3>
|
|
662
662
|
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
|
|
@@ -686,11 +686,11 @@ export function IntegrationsPanel({
|
|
|
686
686
|
|
|
687
687
|
{/* Available Apps */}
|
|
688
688
|
<div>
|
|
689
|
-
<h3 className="text-sm font-medium text-[
|
|
689
|
+
<h3 className="text-sm font-medium text-[var(--color-text-secondary)] mb-3">
|
|
690
690
|
Available Apps ({availableApps.length})
|
|
691
691
|
</h3>
|
|
692
692
|
{availableApps.length === 0 ? (
|
|
693
|
-
<p className="text-[
|
|
693
|
+
<p className="text-[var(--color-text-muted)] text-sm">
|
|
694
694
|
{search ? "No apps match your search" : "No apps available"}
|
|
695
695
|
</p>
|
|
696
696
|
) : (
|
|
@@ -706,7 +706,7 @@ export function IntegrationsPanel({
|
|
|
706
706
|
</div>
|
|
707
707
|
)}
|
|
708
708
|
{availableApps.length > 50 && (
|
|
709
|
-
<p className="text-xs text-[
|
|
709
|
+
<p className="text-xs text-[var(--color-text-faint)] mt-3 text-center">
|
|
710
710
|
Showing first 50 of {availableApps.length} apps. Use search to find more.
|
|
711
711
|
</p>
|
|
712
712
|
)}
|
|
@@ -742,13 +742,13 @@ function AppCard({
|
|
|
742
742
|
|
|
743
743
|
return (
|
|
744
744
|
<div
|
|
745
|
-
className={`bg-[
|
|
746
|
-
isConnected ? "border-green-500/30" : "border-[
|
|
745
|
+
className={`bg-[var(--color-surface)] border rounded-lg p-3 transition ${
|
|
746
|
+
isConnected ? "border-green-500/30" : "border-[var(--color-border)] hover:border-[var(--color-border-light)]"
|
|
747
747
|
}`}
|
|
748
748
|
>
|
|
749
749
|
<div className="flex items-start gap-3">
|
|
750
750
|
{/* Logo */}
|
|
751
|
-
<div className="w-10 h-10 rounded bg-[
|
|
751
|
+
<div className="w-10 h-10 rounded bg-[var(--color-surface-raised)] flex items-center justify-center flex-shrink-0 overflow-hidden">
|
|
752
752
|
{app.logo ? (
|
|
753
753
|
<img
|
|
754
754
|
src={app.logo}
|
|
@@ -771,7 +771,7 @@ function AppCard({
|
|
|
771
771
|
<span className="text-xs text-green-400">✓</span>
|
|
772
772
|
)}
|
|
773
773
|
{!isConnected && hasApiKey && !hasOAuth && (
|
|
774
|
-
<span className="text-[10px] bg-[
|
|
774
|
+
<span className="text-[10px] bg-[var(--color-surface-raised)] text-[var(--color-text-secondary)] px-1.5 py-0.5 rounded" title="Requires API Key">
|
|
775
775
|
API Key
|
|
776
776
|
</span>
|
|
777
777
|
)}
|
|
@@ -782,7 +782,7 @@ function AppCard({
|
|
|
782
782
|
)}
|
|
783
783
|
</div>
|
|
784
784
|
{app.description && (
|
|
785
|
-
<p className="text-xs text-[
|
|
785
|
+
<p className="text-xs text-[var(--color-text-muted)] line-clamp-2 mt-0.5">
|
|
786
786
|
{app.description}
|
|
787
787
|
</p>
|
|
788
788
|
)}
|
|
@@ -791,7 +791,7 @@ function AppCard({
|
|
|
791
791
|
{app.categories.slice(0, 2).map((cat) => (
|
|
792
792
|
<span
|
|
793
793
|
key={cat}
|
|
794
|
-
className="text-[10px] bg-[
|
|
794
|
+
className="text-[10px] bg-[var(--color-surface-raised)] text-[var(--color-text-faint)] px-1.5 py-0.5 rounded"
|
|
795
795
|
>
|
|
796
796
|
{cat}
|
|
797
797
|
</span>
|
|
@@ -824,7 +824,7 @@ function AppCard({
|
|
|
824
824
|
{onUpdateKey && (
|
|
825
825
|
<button
|
|
826
826
|
onClick={onUpdateKey}
|
|
827
|
-
className="text-xs text-[
|
|
827
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-[var(--color-accent)] transition px-2"
|
|
828
828
|
title="Update API Key"
|
|
829
829
|
>
|
|
830
830
|
Key
|
|
@@ -833,7 +833,7 @@ function AppCard({
|
|
|
833
833
|
{onDisconnect && (
|
|
834
834
|
<button
|
|
835
835
|
onClick={onDisconnect}
|
|
836
|
-
className="text-xs text-[
|
|
836
|
+
className="text-xs text-[var(--color-text-muted)] hover:text-red-400 transition px-2"
|
|
837
837
|
title="Disconnect"
|
|
838
838
|
>
|
|
839
839
|
×
|
|
@@ -844,7 +844,7 @@ function AppCard({
|
|
|
844
844
|
<button
|
|
845
845
|
onClick={onConnect}
|
|
846
846
|
disabled={connecting}
|
|
847
|
-
className="w-full text-xs bg-[
|
|
847
|
+
className="w-full text-xs 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"
|
|
848
848
|
>
|
|
849
849
|
{connecting ? "Connecting..." : (hasApiKey && !hasOAuth) ? "Enter API Key" : "Connect"}
|
|
850
850
|
</button>
|