@mazees/mark 5.0.0
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/LICENSE +29 -0
- package/README.md +209 -0
- package/bin/mark.js +27 -0
- package/out/renderer/assets/icon-DHo2CYph.svg +1 -0
- package/out/renderer/assets/index-G2fADWO-.js +4768 -0
- package/out/renderer/assets/index-f3mVse3c.css +1 -0
- package/out/renderer/assets/music-cover-CG4vi3kZ.png +0 -0
- package/out/renderer/assets/poppins-devanagari-400-normal-CJDn6rn8.woff2 +0 -0
- package/out/renderer/assets/poppins-devanagari-400-normal-CqVvlrh5.woff +0 -0
- package/out/renderer/assets/poppins-devanagari-500-normal-BIdkeU1p.woff2 +0 -0
- package/out/renderer/assets/poppins-devanagari-500-normal-DMPDjHtT.woff +0 -0
- package/out/renderer/assets/poppins-devanagari-600-normal-ClASKHrr.woff +0 -0
- package/out/renderer/assets/poppins-devanagari-600-normal-STEjXBNN.woff2 +0 -0
- package/out/renderer/assets/poppins-devanagari-700-normal-O-jipLrW.woff2 +0 -0
- package/out/renderer/assets/poppins-devanagari-700-normal-fHs-vx92.woff +0 -0
- package/out/renderer/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
- package/out/renderer/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
- package/out/renderer/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
- package/out/renderer/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
- package/out/renderer/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-ext-400-normal-DaBSavcJ.woff +0 -0
- package/out/renderer/assets/poppins-latin-ext-400-normal-by3JarPu.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-ext-500-normal-CK-6C4Hw.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-ext-500-normal-CgAe2rWW.woff +0 -0
- package/out/renderer/assets/poppins-latin-ext-600-normal-CAhIAdZj.woff2 +0 -0
- package/out/renderer/assets/poppins-latin-ext-600-normal-Df5ffKXP.woff +0 -0
- package/out/renderer/assets/poppins-latin-ext-700-normal-DctTR6Tg.woff +0 -0
- package/out/renderer/assets/poppins-latin-ext-700-normal-cby-RkWa.woff2 +0 -0
- package/out/renderer/favicon.ico +0 -0
- package/out/renderer/icon-256.png +0 -0
- package/out/renderer/icon.svg +1 -0
- package/out/renderer/index.html +25 -0
- package/out/renderer/manifest.json +25 -0
- package/out/renderer/robot-simulator.html +1640 -0
- package/package.json +106 -0
- package/src/cli/index.js +332 -0
- package/src/cli/monitor.js +413 -0
- package/src/cli/theme.js +347 -0
- package/src/launcher/MarkTray.cs +227 -0
- package/src/main/browser-agent.js +1132 -0
- package/src/main/git-service.js +90 -0
- package/src/main/google/google-calendar.js +69 -0
- package/src/main/google/google-drive.js +263 -0
- package/src/main/google/google-gmail.js +131 -0
- package/src/main/google/google-service.js +241 -0
- package/src/main/node-tools.js +23 -0
- package/src/main/pc-agent-scripts/mouse-locker.ps1 +76 -0
- package/src/main/pc-agent-scripts/ocr-region.ps1 +185 -0
- package/src/main/pc-agent-scripts/pc-daemon.ps1 +726 -0
- package/src/main/pc-agent-scripts/pc-overlay.ps1 +253 -0
- package/src/main/pc-agent-scripts/pick-folder.ps1 +33 -0
- package/src/main/pc-agent-scripts/read-ui.ps1 +181 -0
- package/src/main/pc-agent-scripts/take-screenshot.ps1 +24 -0
- package/src/main/pc-agent-scripts/win-action.ps1 +380 -0
- package/src/main/plugins/plugin-loader.js +306 -0
- package/src/main/skills/skill-manager.js +265 -0
- package/src/main/syntax-validator.js +455 -0
- package/src/main/task-daemon.js +117 -0
- package/src/main/telegram/telegram-service.js +835 -0
- package/src/main/tools/browser-tools.js +516 -0
- package/src/main/tools/file-tools.js +1126 -0
- package/src/main/tools/git-tools.js +79 -0
- package/src/main/tools/google-tools.js +566 -0
- package/src/main/tools/index.js +36 -0
- package/src/main/tools/media-tools.js +42 -0
- package/src/main/tools/system-tools.js +295 -0
- package/src/main/tools/task-tools.js +73 -0
- package/src/main/tools/telegram-tools.js +101 -0
- package/src/renderer/index.html +24 -0
- package/src/renderer/public/favicon.ico +0 -0
- package/src/renderer/public/icon-256.png +0 -0
- package/src/renderer/public/icon.svg +1 -0
- package/src/renderer/public/manifest.json +25 -0
- package/src/renderer/public/robot-simulator.html +1640 -0
- package/src/renderer/src/App.jsx +304 -0
- package/src/renderer/src/api/ai/awareness.js +294 -0
- package/src/renderer/src/api/ai/chatSummarizer.js +79 -0
- package/src/renderer/src/api/ai/contextCompactor.js +129 -0
- package/src/renderer/src/api/ai/contextManager.js +1130 -0
- package/src/renderer/src/api/ai/core.js +167 -0
- package/src/renderer/src/api/ai/index.js +4 -0
- package/src/renderer/src/api/ai/memoryGroomer.js +101 -0
- package/src/renderer/src/api/ai/persona.js +115 -0
- package/src/renderer/src/api/ai/planning.js +317 -0
- package/src/renderer/src/api/ai/relationship.js +177 -0
- package/src/renderer/src/api/ai/skillSynthesizer.js +168 -0
- package/src/renderer/src/api/ai/tools.js +167 -0
- package/src/renderer/src/api/ai/utils.js +359 -0
- package/src/renderer/src/api/db.js +1013 -0
- package/src/renderer/src/api/oramaStore.js +592 -0
- package/src/renderer/src/api/ragPipeline.js +87 -0
- package/src/renderer/src/api/subagent/subagentExecutor.js +780 -0
- package/src/renderer/src/api/subagent/subagentPrompt.js +44 -0
- package/src/renderer/src/api/subagent/subagentStore.js +173 -0
- package/src/renderer/src/api/taskExecutor.js +18 -0
- package/src/renderer/src/api/taskStore.js +315 -0
- package/src/renderer/src/api/tools/core-tools.js +707 -0
- package/src/renderer/src/api/tools/index.js +151 -0
- package/src/renderer/src/api/turnPairMigrator.js +200 -0
- package/src/renderer/src/api/vectorMemory.js +136 -0
- package/src/renderer/src/api/wakeWord.js +101 -0
- package/src/renderer/src/api/web-bridge.js +885 -0
- package/src/renderer/src/api/webSpeech.js +178 -0
- package/src/renderer/src/api/workspaceRag.js +76 -0
- package/src/renderer/src/assets/electron.svg +10 -0
- package/src/renderer/src/assets/icon.svg +1 -0
- package/src/renderer/src/assets/main.css +589 -0
- package/src/renderer/src/assets/music-cover.png +0 -0
- package/src/renderer/src/assets/wavy-lines.svg +25 -0
- package/src/renderer/src/components/Chat/ApprovalBubble.jsx +127 -0
- package/src/renderer/src/components/Chat/CodeBlock.jsx +83 -0
- package/src/renderer/src/components/Chat/DurableTaskBubble.jsx +455 -0
- package/src/renderer/src/components/Chat/FileDiffModal.jsx +328 -0
- package/src/renderer/src/components/Chat/GeminiWidgets.jsx +82 -0
- package/src/renderer/src/components/Chat/MemoryFooterBubble.jsx +34 -0
- package/src/renderer/src/components/Chat/MessageBubble.jsx +459 -0
- package/src/renderer/src/components/Chat/PluginExecutionBubble.jsx +41 -0
- package/src/renderer/src/components/Chat/ThinkingBubble.jsx +316 -0
- package/src/renderer/src/components/Chat/YoutubeSearchBubble.jsx +43 -0
- package/src/renderer/src/components/Chat/YoutubeSummaryBubble.jsx +40 -0
- package/src/renderer/src/components/Chat/index.js +11 -0
- package/src/renderer/src/components/ChatList.jsx +434 -0
- package/src/renderer/src/components/GlobalCameraManager.jsx +67 -0
- package/src/renderer/src/components/Versions.jsx +15 -0
- package/src/renderer/src/components/YoutubeMusicPlayer.jsx +375 -0
- package/src/renderer/src/components/camera/CameraPreview.jsx +236 -0
- package/src/renderer/src/components/config/AiEngineSection.jsx +363 -0
- package/src/renderer/src/components/config/CameraSection.jsx +100 -0
- package/src/renderer/src/components/config/PermissionsSection.jsx +130 -0
- package/src/renderer/src/components/config/ShortcutSection.jsx +102 -0
- package/src/renderer/src/components/config/VoiceSection.jsx +110 -0
- package/src/renderer/src/components/config/index.js +5 -0
- package/src/renderer/src/components/core/Avatar.jsx +2197 -0
- package/src/renderer/src/components/core/ConfirmModal.jsx +80 -0
- package/src/renderer/src/components/core/DraggableHoloCard.jsx +125 -0
- package/src/renderer/src/components/core/FloatingMenu.jsx +272 -0
- package/src/renderer/src/components/core/HoloCard.jsx +64 -0
- package/src/renderer/src/components/core/InputBar.jsx +1346 -0
- package/src/renderer/src/components/core/ProcessPanel.jsx +216 -0
- package/src/renderer/src/components/core/ResponseArea.jsx +149 -0
- package/src/renderer/src/components/core/StatusIndicator.jsx +59 -0
- package/src/renderer/src/components/core/ThoughtNeuralFlow.jsx +168 -0
- package/src/renderer/src/components/core/ToolClustersDeck.jsx +210 -0
- package/src/renderer/src/components/core/native-skills.js +43 -0
- package/src/renderer/src/components/neural-core/EmotionalCortexLobe.jsx +359 -0
- package/src/renderer/src/components/neural-core/NodeDissectionModal.jsx +57 -0
- package/src/renderer/src/components/neural-core/ProceduralMatrixLobe.jsx +193 -0
- package/src/renderer/src/components/neural-core/ProceduralSkillModal.jsx +53 -0
- package/src/renderer/src/components/neural-core/ResetAiModal.jsx +198 -0
- package/src/renderer/src/components/neural-core/SynapticMemoryLobe.jsx +204 -0
- package/src/renderer/src/components/neural-core/traitMeta.js +102 -0
- package/src/renderer/src/components/subagent/AgentChatFeed.jsx +603 -0
- package/src/renderer/src/components/subagent/AgentInspector.jsx +224 -0
- package/src/renderer/src/components/subagent/AgentSidebar.jsx +216 -0
- package/src/renderer/src/components/subagent/SubagentIntercom.jsx +572 -0
- package/src/renderer/src/components/subagent/SubagentTopologyMap.jsx +423 -0
- package/src/renderer/src/contexts/ApprovalContext.jsx +425 -0
- package/src/renderer/src/contexts/ChatContext.jsx +61 -0
- package/src/renderer/src/contexts/YoutubeMusicContext.jsx +333 -0
- package/src/renderer/src/data/faqData.js +202 -0
- package/src/renderer/src/hooks/agent/executeAgentTool.js +895 -0
- package/src/renderer/src/hooks/agent/index.js +4 -0
- package/src/renderer/src/hooks/agent/useMarkMusic.js +75 -0
- package/src/renderer/src/hooks/agent/useMarkPlan.js +2739 -0
- package/src/renderer/src/hooks/agent/useMarkState.js +173 -0
- package/src/renderer/src/hooks/agent/useMarkYoutube.js +82 -0
- package/src/renderer/src/hooks/agent/useRelationalGrowth.js +201 -0
- package/src/renderer/src/hooks/telegram/useTelegramBot.js +63 -0
- package/src/renderer/src/hooks/useAwareness.js +289 -0
- package/src/renderer/src/hooks/useChatArchiver.js +52 -0
- package/src/renderer/src/hooks/useConfirm.jsx +68 -0
- package/src/renderer/src/hooks/useMarkAgent.js +454 -0
- package/src/renderer/src/hooks/useMemoryGroomer.js +152 -0
- package/src/renderer/src/hooks/useVAD.js +511 -0
- package/src/renderer/src/hooks/useWebSpeechWakeWord.js +122 -0
- package/src/renderer/src/main.jsx +12 -0
- package/src/renderer/src/pages/ChatStudio.jsx +922 -0
- package/src/renderer/src/pages/Configuration.jsx +360 -0
- package/src/renderer/src/pages/GoogleWorkspace.jsx +293 -0
- package/src/renderer/src/pages/Guidebook.jsx +917 -0
- package/src/renderer/src/pages/Knowledge.jsx +241 -0
- package/src/renderer/src/pages/MarkHome.jsx +491 -0
- package/src/renderer/src/pages/NeuralCore.jsx +786 -0
- package/src/renderer/src/pages/Plugins.jsx +630 -0
- package/src/renderer/src/pages/SkillEditor.jsx +380 -0
- package/src/renderer/src/pages/Skills.jsx +219 -0
- package/src/renderer/src/pages/Subagents.jsx +342 -0
- package/src/renderer/src/pages/TelegramBot.jsx +343 -0
- package/src/renderer/src/utils/chatContentParser.js +203 -0
- package/src/renderer/src/utils/toolClusters.js +201 -0
- package/src/server/bin/sha3_wasm_bg.wasm +0 -0
- package/src/server/config-manager.js +57 -0
- package/src/server/index.js +195 -0
- package/src/server/launcher.js +87 -0
- package/src/server/memory/db-store.js +758 -0
- package/src/server/memory/orama-store.js +177 -0
- package/src/server/memory/vector-engine.js +109 -0
- package/src/server/routes/ai.routes.js +280 -0
- package/src/server/routes/awareness.routes.js +62 -0
- package/src/server/routes/chat.routes.js +61 -0
- package/src/server/routes/config.routes.js +41 -0
- package/src/server/routes/index.js +35 -0
- package/src/server/routes/integrations.routes.js +116 -0
- package/src/server/routes/memory.routes.js +256 -0
- package/src/server/routes/plugins.routes.js +72 -0
- package/src/server/routes/skills.routes.js +139 -0
- package/src/server/routes/subagents.routes.js +70 -0
- package/src/server/routes/tasks.routes.js +175 -0
- package/src/server/routes/workspace.routes.js +127 -0
- package/src/server/services/ai/ai-utils.js +161 -0
- package/src/server/services/ai/openai-provider.js +757 -0
- package/src/server/services/ai/web-provider.js +729 -0
- package/src/server/services/ai-bridge.js +46 -0
- package/src/server/services/deepseek-web.js +956 -0
- package/src/server/services/gemini-web.js +170 -0
- package/src/server/services/notification-service.js +91 -0
- package/src/server/services/updater.js +125 -0
- package/src/server/tools/awareness-tracker.js +292 -0
- package/src/server/tools/group-tools.js +1164 -0
- package/src/server/tools/media-tools.js +244 -0
- package/src/server/tools/pc-agent.js +327 -0
- package/src/server/tools/screen-service.js +51 -0
- package/src/server/ws-hub.js +168 -0
- package/src/shared/parsers/mark-tag-parser.js +275 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
X,
|
|
4
|
+
Cpu,
|
|
5
|
+
Shield,
|
|
6
|
+
Terminal,
|
|
7
|
+
CheckCircle2,
|
|
8
|
+
Trash2
|
|
9
|
+
} from 'lucide-react'
|
|
10
|
+
|
|
11
|
+
export default function AgentInspector({ subagent, onClose, onDeleteAgent }) {
|
|
12
|
+
const [activeTab, setActiveTab] = useState('details') // 'details' | 'tools'
|
|
13
|
+
|
|
14
|
+
if (!subagent) return null
|
|
15
|
+
|
|
16
|
+
const isRunning = subagent.status === 'running'
|
|
17
|
+
const isCompleted = subagent.status === 'completed'
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<aside className="w-80 flex flex-col bg-base-200/60 border-l border-base-content/10 flex-none h-full overflow-hidden select-none">
|
|
21
|
+
{/* Inspector Header */}
|
|
22
|
+
<div className="p-3.5 border-b border-base-content/10 flex items-center justify-between">
|
|
23
|
+
<div className="flex items-center gap-2">
|
|
24
|
+
<div className="p-1.5 rounded-xl bg-accent/10 border border-accent/20 text-accent">
|
|
25
|
+
<Cpu className="w-4 h-4" />
|
|
26
|
+
</div>
|
|
27
|
+
<div>
|
|
28
|
+
<h2 className="text-xs font-bold tracking-wide uppercase text-base-content/90 font-mono">
|
|
29
|
+
Agent Inspector
|
|
30
|
+
</h2>
|
|
31
|
+
<span className="text-[10px] text-base-content/50 font-mono">
|
|
32
|
+
ID: {subagent.id}
|
|
33
|
+
</span>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div className="flex items-center gap-1">
|
|
38
|
+
{onDeleteAgent && (
|
|
39
|
+
<button
|
|
40
|
+
type="button"
|
|
41
|
+
onClick={() => onDeleteAgent(subagent.id)}
|
|
42
|
+
className="btn btn-ghost btn-xs btn-circle text-base-content/40 hover:text-error transition-colors"
|
|
43
|
+
title="Hapus Agen"
|
|
44
|
+
>
|
|
45
|
+
<Trash2 className="w-3.5 h-3.5" />
|
|
46
|
+
</button>
|
|
47
|
+
)}
|
|
48
|
+
{onClose && (
|
|
49
|
+
<button
|
|
50
|
+
type="button"
|
|
51
|
+
onClick={onClose}
|
|
52
|
+
className="btn btn-ghost btn-xs btn-circle text-base-content/50 hover:text-base-content"
|
|
53
|
+
title="Tutup Panel Inspector"
|
|
54
|
+
>
|
|
55
|
+
<X className="w-4 h-4" />
|
|
56
|
+
</button>
|
|
57
|
+
)}
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
{/* Tabs */}
|
|
62
|
+
<div className="px-3 pt-2">
|
|
63
|
+
<div className="flex gap-1 p-0.5 bg-base-300/60 rounded-xl w-full border border-base-content/5 font-mono text-[10px]">
|
|
64
|
+
<button
|
|
65
|
+
type="button"
|
|
66
|
+
onClick={() => setActiveTab('details')}
|
|
67
|
+
className={`flex-1 py-1 font-medium rounded-lg transition-all ${
|
|
68
|
+
activeTab === 'details'
|
|
69
|
+
? 'bg-base-100 text-base-content shadow-sm font-semibold'
|
|
70
|
+
: 'text-base-content/50 hover:text-base-content'
|
|
71
|
+
}`}
|
|
72
|
+
>
|
|
73
|
+
Overview
|
|
74
|
+
</button>
|
|
75
|
+
<button
|
|
76
|
+
type="button"
|
|
77
|
+
onClick={() => setActiveTab('tools')}
|
|
78
|
+
className={`flex-1 py-1 font-medium rounded-lg transition-all ${
|
|
79
|
+
activeTab === 'tools'
|
|
80
|
+
? 'bg-base-100 text-base-content shadow-sm font-semibold'
|
|
81
|
+
: 'text-base-content/50 hover:text-base-content'
|
|
82
|
+
}`}
|
|
83
|
+
>
|
|
84
|
+
Tools & Sandbox
|
|
85
|
+
</button>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
{/* Tab Content */}
|
|
90
|
+
<div className="flex-1 overflow-y-auto p-3.5 space-y-4 text-xs custom-scrollbar font-mono">
|
|
91
|
+
{activeTab === 'details' && (
|
|
92
|
+
<>
|
|
93
|
+
{/* Identity Card */}
|
|
94
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-2.5">
|
|
95
|
+
<div className="flex items-center justify-between">
|
|
96
|
+
<span className="text-[10px] text-base-content/40 uppercase">Status</span>
|
|
97
|
+
<span
|
|
98
|
+
className={`badge badge-xs font-mono text-[9px] py-2 gap-1 ${
|
|
99
|
+
isRunning
|
|
100
|
+
? 'badge-primary'
|
|
101
|
+
: isCompleted
|
|
102
|
+
? 'badge-success'
|
|
103
|
+
: 'badge-ghost text-base-content/60'
|
|
104
|
+
}`}
|
|
105
|
+
>
|
|
106
|
+
{isRunning && <span className="w-1.5 h-1.5 rounded-full bg-base-100 animate-ping" />}
|
|
107
|
+
{subagent.status}
|
|
108
|
+
</span>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div>
|
|
112
|
+
<span className="text-[10px] text-base-content/40 uppercase block mb-0.5">Role</span>
|
|
113
|
+
<p className="font-semibold text-base-content/90 text-xs">
|
|
114
|
+
{subagent.role || 'Technical Specialist'}
|
|
115
|
+
</p>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div>
|
|
119
|
+
<span className="text-[10px] text-base-content/40 uppercase block mb-0.5">Goal</span>
|
|
120
|
+
<p className="text-base-content/80 text-[11px] leading-relaxed whitespace-pre-wrap bg-base-200/50 p-2 rounded-lg border border-base-content/5">
|
|
121
|
+
{subagent.goal || '-'}
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
{/* Metrics */}
|
|
127
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-2">
|
|
128
|
+
<span className="text-[10px] text-base-content/40 uppercase block">Telemetry</span>
|
|
129
|
+
<div className="grid grid-cols-2 gap-2 text-[11px]">
|
|
130
|
+
<div className="p-2 bg-base-200/50 rounded-lg border border-base-content/5">
|
|
131
|
+
<span className="text-[10px] text-base-content/50 block">Turns</span>
|
|
132
|
+
<span className="font-bold text-primary text-sm">{subagent.turnCount || 0}</span>
|
|
133
|
+
</div>
|
|
134
|
+
<div className="p-2 bg-base-200/50 rounded-lg border border-base-content/5">
|
|
135
|
+
<span className="text-[10px] text-base-content/50 block">Sandbox</span>
|
|
136
|
+
<span className="font-bold text-accent text-sm">Puppeteer</span>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<div className="text-[10px] text-base-content/40 space-y-1 pt-1">
|
|
141
|
+
<div className="flex justify-between">
|
|
142
|
+
<span>Dibuat:</span>
|
|
143
|
+
<span>{new Date(subagent.createdAt).toLocaleTimeString()}</span>
|
|
144
|
+
</div>
|
|
145
|
+
<div className="flex justify-between">
|
|
146
|
+
<span>Terakhir aktif:</span>
|
|
147
|
+
<span>{new Date(subagent.updatedAt).toLocaleTimeString()}</span>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
{/* Final Answer / Artifact if available */}
|
|
153
|
+
{subagent.finalAnswer && (
|
|
154
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-1.5">
|
|
155
|
+
<span className="text-[10px] text-success uppercase font-semibold flex items-center gap-1">
|
|
156
|
+
<CheckCircle2 className="w-3 h-3" /> Laporan Akhir
|
|
157
|
+
</span>
|
|
158
|
+
<p className="text-[11px] text-base-content/85 whitespace-pre-wrap leading-relaxed bg-base-200/60 p-2 rounded-lg max-h-48 overflow-y-auto">
|
|
159
|
+
{subagent.finalAnswer}
|
|
160
|
+
</p>
|
|
161
|
+
</div>
|
|
162
|
+
)}
|
|
163
|
+
</>
|
|
164
|
+
)}
|
|
165
|
+
|
|
166
|
+
{activeTab === 'tools' && (
|
|
167
|
+
<div className="space-y-3">
|
|
168
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-2">
|
|
169
|
+
<div className="flex items-center gap-1.5 text-primary text-[11px] font-semibold">
|
|
170
|
+
<Shield className="w-3.5 h-3.5" />
|
|
171
|
+
<span>Sandbox Security</span>
|
|
172
|
+
</div>
|
|
173
|
+
<p className="text-[10px] text-base-content/60 leading-relaxed">
|
|
174
|
+
Sub-agent berjalan dengan isolasi session Puppeteer dan registry tool native.
|
|
175
|
+
</p>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-2">
|
|
179
|
+
<span className="text-[10px] text-base-content/40 uppercase block">Allowed Tools</span>
|
|
180
|
+
<div className="flex flex-wrap gap-1">
|
|
181
|
+
{Array.isArray(subagent.allowedTools) && subagent.allowedTools.includes('*') ? (
|
|
182
|
+
<span className="badge badge-primary badge-sm text-[10px] font-mono">
|
|
183
|
+
All Tools Allowed (*)
|
|
184
|
+
</span>
|
|
185
|
+
) : Array.isArray(subagent.allowedTools) && subagent.allowedTools.length > 0 ? (
|
|
186
|
+
subagent.allowedTools.map((t, idx) => (
|
|
187
|
+
<span
|
|
188
|
+
key={idx}
|
|
189
|
+
className="badge badge-ghost badge-sm text-[10px] font-mono text-base-content/80 border-base-content/10"
|
|
190
|
+
>
|
|
191
|
+
{t}
|
|
192
|
+
</span>
|
|
193
|
+
))
|
|
194
|
+
) : (
|
|
195
|
+
<span className="text-[10px] text-base-content/40">Default Core Tools</span>
|
|
196
|
+
)}
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div className="p-3 bg-base-100/50 rounded-xl border border-base-content/10 space-y-1.5">
|
|
201
|
+
<span className="text-[10px] text-base-content/40 uppercase block">Inter-Agent Routing</span>
|
|
202
|
+
<div className="space-y-1 text-[10px] text-base-content/70">
|
|
203
|
+
<div className="flex items-center gap-1 text-accent">
|
|
204
|
+
<Terminal className="w-3 h-3" />
|
|
205
|
+
<span>message_agent</span>
|
|
206
|
+
</div>
|
|
207
|
+
<p className="text-[10px] text-base-content/50 pl-4">
|
|
208
|
+
Dapat memanggil sub-agent spesialis lain secara mandiri.
|
|
209
|
+
</p>
|
|
210
|
+
<div className="flex items-center gap-1 text-primary pt-1">
|
|
211
|
+
<Terminal className="w-3 h-3" />
|
|
212
|
+
<span>report_to_lead</span>
|
|
213
|
+
</div>
|
|
214
|
+
<p className="text-[10px] text-base-content/50 pl-4">
|
|
215
|
+
Mengirim push notification hasil pekerjaan ke Lead Agent Mark.
|
|
216
|
+
</p>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
)}
|
|
221
|
+
</div>
|
|
222
|
+
</aside>
|
|
223
|
+
)
|
|
224
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
Bot,
|
|
4
|
+
Plus,
|
|
5
|
+
Trash2,
|
|
6
|
+
Cpu,
|
|
7
|
+
Layers,
|
|
8
|
+
Search,
|
|
9
|
+
CheckCircle2,
|
|
10
|
+
Clock,
|
|
11
|
+
AlertCircle,
|
|
12
|
+
Play,
|
|
13
|
+
Terminal
|
|
14
|
+
} from 'lucide-react'
|
|
15
|
+
|
|
16
|
+
export default function AgentSidebar({
|
|
17
|
+
subagents = [],
|
|
18
|
+
selectedId = null,
|
|
19
|
+
onSelectAgent = () => {},
|
|
20
|
+
onOpenNewAgentModal = () => {},
|
|
21
|
+
onDeleteAgent = () => {}
|
|
22
|
+
}) {
|
|
23
|
+
const [searchQuery, setSearchQuery] = useState('')
|
|
24
|
+
const [filterTab, setFilterTab] = useState('all') // 'all' | 'running' | 'idle' | 'completed'
|
|
25
|
+
|
|
26
|
+
const filteredAgents = subagents.filter((agent) => {
|
|
27
|
+
const matchesSearch =
|
|
28
|
+
agent.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
29
|
+
(agent.role && agent.role.toLowerCase().includes(searchQuery.toLowerCase())) ||
|
|
30
|
+
(agent.goal && agent.goal.toLowerCase().includes(searchQuery.toLowerCase()))
|
|
31
|
+
|
|
32
|
+
if (!matchesSearch) return false
|
|
33
|
+
|
|
34
|
+
if (filterTab === 'running') return agent.status === 'running'
|
|
35
|
+
if (filterTab === 'idle') return agent.status === 'idle'
|
|
36
|
+
if (filterTab === 'completed') return agent.status === 'completed'
|
|
37
|
+
return true
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const getStatusBadge = (status) => {
|
|
41
|
+
switch (status) {
|
|
42
|
+
case 'running':
|
|
43
|
+
return (
|
|
44
|
+
<span className="flex items-center gap-1 text-[10px] text-primary font-mono font-medium">
|
|
45
|
+
<span className="w-1.5 h-1.5 rounded-full bg-primary animate-ping" />
|
|
46
|
+
Running
|
|
47
|
+
</span>
|
|
48
|
+
)
|
|
49
|
+
case 'completed':
|
|
50
|
+
return (
|
|
51
|
+
<span className="flex items-center gap-1 text-[10px] text-success font-mono font-medium">
|
|
52
|
+
<CheckCircle2 className="w-2.5 h-2.5" />
|
|
53
|
+
Done
|
|
54
|
+
</span>
|
|
55
|
+
)
|
|
56
|
+
case 'failed':
|
|
57
|
+
case 'killed':
|
|
58
|
+
return (
|
|
59
|
+
<span className="flex items-center gap-1 text-[10px] text-error font-mono font-medium">
|
|
60
|
+
<AlertCircle className="w-2.5 h-2.5" />
|
|
61
|
+
Stopped
|
|
62
|
+
</span>
|
|
63
|
+
)
|
|
64
|
+
default:
|
|
65
|
+
return (
|
|
66
|
+
<span className="flex items-center gap-1 text-[10px] text-base-content/50 font-mono">
|
|
67
|
+
<Clock className="w-2.5 h-2.5" />
|
|
68
|
+
Idle
|
|
69
|
+
</span>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<aside className="w-72 md:w-80 flex flex-col bg-base-200/60 border-r border-base-content/10 flex-none select-none h-full overflow-hidden">
|
|
76
|
+
{/* Header with New Agent Action */}
|
|
77
|
+
<div className="p-3.5 border-b border-base-content/10 flex items-center justify-between gap-2">
|
|
78
|
+
<div className="flex items-center gap-2">
|
|
79
|
+
<div className="p-1.5 rounded-xl bg-primary/10 border border-primary/20 text-primary">
|
|
80
|
+
<Bot className="w-4 h-4" />
|
|
81
|
+
</div>
|
|
82
|
+
<div>
|
|
83
|
+
<h2 className="text-xs font-bold tracking-wide uppercase text-base-content/90 font-mono">
|
|
84
|
+
Bots & Agents
|
|
85
|
+
</h2>
|
|
86
|
+
<span className="text-[10px] text-base-content/50 font-mono">
|
|
87
|
+
{subagents.length} terdaftar
|
|
88
|
+
</span>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<button
|
|
93
|
+
type="button"
|
|
94
|
+
onClick={onOpenNewAgentModal}
|
|
95
|
+
className="btn btn-primary btn-xs rounded-xl gap-1 px-2.5 font-medium shadow-sm shadow-primary/20"
|
|
96
|
+
title="Tambah Sub-Agent Baru"
|
|
97
|
+
>
|
|
98
|
+
<Plus className="w-3.5 h-3.5" />
|
|
99
|
+
<span className="text-[11px]">New Agent</span>
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
{/* Search Input */}
|
|
104
|
+
<div className="p-2.5 pb-1">
|
|
105
|
+
<div className="relative">
|
|
106
|
+
<Search className="w-3.5 h-3.5 absolute left-3 top-1/2 -translate-y-1/2 text-base-content/40" />
|
|
107
|
+
<input
|
|
108
|
+
type="text"
|
|
109
|
+
placeholder="Cari agen atau peran..."
|
|
110
|
+
value={searchQuery}
|
|
111
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
112
|
+
className="input input-xs w-full pl-8 pr-3 py-3 rounded-xl bg-base-100/60 border-base-content/10 text-[11px] focus:outline-none focus:border-primary/50"
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
{/* Filter Tabs */}
|
|
118
|
+
<div className="px-2.5 py-1.5">
|
|
119
|
+
<div className="flex gap-1 p-0.5 bg-base-300/60 rounded-xl w-full border border-base-content/5">
|
|
120
|
+
{['all', 'running', 'idle', 'completed'].map((tab) => (
|
|
121
|
+
<button
|
|
122
|
+
key={tab}
|
|
123
|
+
type="button"
|
|
124
|
+
onClick={() => setFilterTab(tab)}
|
|
125
|
+
className={`flex-1 py-1 text-[10px] font-medium rounded-lg transition-all capitalize font-mono ${
|
|
126
|
+
filterTab === tab
|
|
127
|
+
? 'bg-base-100 text-base-content shadow-sm font-semibold'
|
|
128
|
+
: 'text-base-content/50 hover:text-base-content'
|
|
129
|
+
}`}
|
|
130
|
+
>
|
|
131
|
+
{tab === 'all' ? 'Semua' : tab}
|
|
132
|
+
</button>
|
|
133
|
+
))}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
{/* Agent List */}
|
|
138
|
+
<div className="flex-1 overflow-y-auto p-2.5 space-y-1.5 custom-scrollbar">
|
|
139
|
+
{filteredAgents.length === 0 ? (
|
|
140
|
+
<div className="h-full flex flex-col items-center justify-center text-center p-6 text-base-content/30 gap-2">
|
|
141
|
+
<Layers className="w-7 h-7 stroke-[1.5]" />
|
|
142
|
+
<p className="text-[11px] font-mono">Tidak ada agen ditemukan.</p>
|
|
143
|
+
</div>
|
|
144
|
+
) : (
|
|
145
|
+
filteredAgents.map((agent) => {
|
|
146
|
+
const isSelected = agent.id === selectedId
|
|
147
|
+
const isRunning = agent.status === 'running'
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<div
|
|
151
|
+
key={agent.id}
|
|
152
|
+
onClick={() => onSelectAgent(agent.id)}
|
|
153
|
+
className={`p-3 rounded-xl border transition-all cursor-pointer relative group ${
|
|
154
|
+
isSelected
|
|
155
|
+
? 'bg-primary/10 border-primary/40 shadow-sm'
|
|
156
|
+
: 'bg-base-100/40 border-base-content/5 hover:border-base-content/15 hover:bg-base-100/70'
|
|
157
|
+
}`}
|
|
158
|
+
>
|
|
159
|
+
<div className="flex items-start justify-between gap-2 mb-1">
|
|
160
|
+
<div className="flex items-center gap-2 min-w-0">
|
|
161
|
+
<div
|
|
162
|
+
className={`w-7 h-7 rounded-xl flex items-center justify-center font-bold text-[10px] shrink-0 font-mono ${
|
|
163
|
+
isRunning
|
|
164
|
+
? 'bg-primary/20 text-primary border border-primary/40 shadow-sm'
|
|
165
|
+
: isSelected
|
|
166
|
+
? 'bg-primary/10 text-primary border border-primary/20'
|
|
167
|
+
: 'bg-base-300 text-base-content/70 border border-base-content/10'
|
|
168
|
+
}`}
|
|
169
|
+
>
|
|
170
|
+
{agent.name.slice(0, 2).toUpperCase()}
|
|
171
|
+
</div>
|
|
172
|
+
<div className="min-w-0 flex-1">
|
|
173
|
+
<div className="flex items-center gap-1.5">
|
|
174
|
+
<span className="font-semibold text-xs text-base-content/95 truncate">
|
|
175
|
+
{agent.name}
|
|
176
|
+
</span>
|
|
177
|
+
{(agent.role?.toLowerCase().includes('curiosity') ||
|
|
178
|
+
agent.name.toLowerCase().includes('sideproject')) && (
|
|
179
|
+
<span className="text-[8px] font-mono px-1.5 py-0.5 rounded bg-primary/20 text-primary border border-primary/30 uppercase tracking-tight shrink-0">
|
|
180
|
+
Curiosity
|
|
181
|
+
</span>
|
|
182
|
+
)}
|
|
183
|
+
</div>
|
|
184
|
+
<p className="text-[10px] text-base-content/50 truncate font-mono">
|
|
185
|
+
{agent.role || 'Technical Specialist'}
|
|
186
|
+
</p>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
|
|
190
|
+
<div className="flex items-center gap-1">
|
|
191
|
+
<button
|
|
192
|
+
type="button"
|
|
193
|
+
onClick={(e) => {
|
|
194
|
+
e.stopPropagation()
|
|
195
|
+
onDeleteAgent(agent.id)
|
|
196
|
+
}}
|
|
197
|
+
className="opacity-0 group-hover:opacity-100 text-base-content/40 hover:text-error transition-all p-1 rounded-md hover:bg-base-content/5"
|
|
198
|
+
title="Hapus Agen"
|
|
199
|
+
>
|
|
200
|
+
<Trash2 className="w-3 h-3" />
|
|
201
|
+
</button>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
<div className="flex items-center justify-between text-[10px] text-base-content/45 font-mono pt-1 border-t border-base-content/5 mt-1.5">
|
|
206
|
+
<div className="flex items-center gap-1">{getStatusBadge(agent.status)}</div>
|
|
207
|
+
<span>Langkah: {agent.turnCount || 0}</span>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
)
|
|
211
|
+
})
|
|
212
|
+
)}
|
|
213
|
+
</div>
|
|
214
|
+
</aside>
|
|
215
|
+
)
|
|
216
|
+
}
|