@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.
Files changed (227) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +209 -0
  3. package/bin/mark.js +27 -0
  4. package/out/renderer/assets/icon-DHo2CYph.svg +1 -0
  5. package/out/renderer/assets/index-G2fADWO-.js +4768 -0
  6. package/out/renderer/assets/index-f3mVse3c.css +1 -0
  7. package/out/renderer/assets/music-cover-CG4vi3kZ.png +0 -0
  8. package/out/renderer/assets/poppins-devanagari-400-normal-CJDn6rn8.woff2 +0 -0
  9. package/out/renderer/assets/poppins-devanagari-400-normal-CqVvlrh5.woff +0 -0
  10. package/out/renderer/assets/poppins-devanagari-500-normal-BIdkeU1p.woff2 +0 -0
  11. package/out/renderer/assets/poppins-devanagari-500-normal-DMPDjHtT.woff +0 -0
  12. package/out/renderer/assets/poppins-devanagari-600-normal-ClASKHrr.woff +0 -0
  13. package/out/renderer/assets/poppins-devanagari-600-normal-STEjXBNN.woff2 +0 -0
  14. package/out/renderer/assets/poppins-devanagari-700-normal-O-jipLrW.woff2 +0 -0
  15. package/out/renderer/assets/poppins-devanagari-700-normal-fHs-vx92.woff +0 -0
  16. package/out/renderer/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
  17. package/out/renderer/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  18. package/out/renderer/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  19. package/out/renderer/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
  20. package/out/renderer/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
  21. package/out/renderer/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  22. package/out/renderer/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
  23. package/out/renderer/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  24. package/out/renderer/assets/poppins-latin-ext-400-normal-DaBSavcJ.woff +0 -0
  25. package/out/renderer/assets/poppins-latin-ext-400-normal-by3JarPu.woff2 +0 -0
  26. package/out/renderer/assets/poppins-latin-ext-500-normal-CK-6C4Hw.woff2 +0 -0
  27. package/out/renderer/assets/poppins-latin-ext-500-normal-CgAe2rWW.woff +0 -0
  28. package/out/renderer/assets/poppins-latin-ext-600-normal-CAhIAdZj.woff2 +0 -0
  29. package/out/renderer/assets/poppins-latin-ext-600-normal-Df5ffKXP.woff +0 -0
  30. package/out/renderer/assets/poppins-latin-ext-700-normal-DctTR6Tg.woff +0 -0
  31. package/out/renderer/assets/poppins-latin-ext-700-normal-cby-RkWa.woff2 +0 -0
  32. package/out/renderer/favicon.ico +0 -0
  33. package/out/renderer/icon-256.png +0 -0
  34. package/out/renderer/icon.svg +1 -0
  35. package/out/renderer/index.html +25 -0
  36. package/out/renderer/manifest.json +25 -0
  37. package/out/renderer/robot-simulator.html +1640 -0
  38. package/package.json +106 -0
  39. package/src/cli/index.js +332 -0
  40. package/src/cli/monitor.js +413 -0
  41. package/src/cli/theme.js +347 -0
  42. package/src/launcher/MarkTray.cs +227 -0
  43. package/src/main/browser-agent.js +1132 -0
  44. package/src/main/git-service.js +90 -0
  45. package/src/main/google/google-calendar.js +69 -0
  46. package/src/main/google/google-drive.js +263 -0
  47. package/src/main/google/google-gmail.js +131 -0
  48. package/src/main/google/google-service.js +241 -0
  49. package/src/main/node-tools.js +23 -0
  50. package/src/main/pc-agent-scripts/mouse-locker.ps1 +76 -0
  51. package/src/main/pc-agent-scripts/ocr-region.ps1 +185 -0
  52. package/src/main/pc-agent-scripts/pc-daemon.ps1 +726 -0
  53. package/src/main/pc-agent-scripts/pc-overlay.ps1 +253 -0
  54. package/src/main/pc-agent-scripts/pick-folder.ps1 +33 -0
  55. package/src/main/pc-agent-scripts/read-ui.ps1 +181 -0
  56. package/src/main/pc-agent-scripts/take-screenshot.ps1 +24 -0
  57. package/src/main/pc-agent-scripts/win-action.ps1 +380 -0
  58. package/src/main/plugins/plugin-loader.js +306 -0
  59. package/src/main/skills/skill-manager.js +265 -0
  60. package/src/main/syntax-validator.js +455 -0
  61. package/src/main/task-daemon.js +117 -0
  62. package/src/main/telegram/telegram-service.js +835 -0
  63. package/src/main/tools/browser-tools.js +516 -0
  64. package/src/main/tools/file-tools.js +1126 -0
  65. package/src/main/tools/git-tools.js +79 -0
  66. package/src/main/tools/google-tools.js +566 -0
  67. package/src/main/tools/index.js +36 -0
  68. package/src/main/tools/media-tools.js +42 -0
  69. package/src/main/tools/system-tools.js +295 -0
  70. package/src/main/tools/task-tools.js +73 -0
  71. package/src/main/tools/telegram-tools.js +101 -0
  72. package/src/renderer/index.html +24 -0
  73. package/src/renderer/public/favicon.ico +0 -0
  74. package/src/renderer/public/icon-256.png +0 -0
  75. package/src/renderer/public/icon.svg +1 -0
  76. package/src/renderer/public/manifest.json +25 -0
  77. package/src/renderer/public/robot-simulator.html +1640 -0
  78. package/src/renderer/src/App.jsx +304 -0
  79. package/src/renderer/src/api/ai/awareness.js +294 -0
  80. package/src/renderer/src/api/ai/chatSummarizer.js +79 -0
  81. package/src/renderer/src/api/ai/contextCompactor.js +129 -0
  82. package/src/renderer/src/api/ai/contextManager.js +1130 -0
  83. package/src/renderer/src/api/ai/core.js +167 -0
  84. package/src/renderer/src/api/ai/index.js +4 -0
  85. package/src/renderer/src/api/ai/memoryGroomer.js +101 -0
  86. package/src/renderer/src/api/ai/persona.js +115 -0
  87. package/src/renderer/src/api/ai/planning.js +317 -0
  88. package/src/renderer/src/api/ai/relationship.js +177 -0
  89. package/src/renderer/src/api/ai/skillSynthesizer.js +168 -0
  90. package/src/renderer/src/api/ai/tools.js +167 -0
  91. package/src/renderer/src/api/ai/utils.js +359 -0
  92. package/src/renderer/src/api/db.js +1013 -0
  93. package/src/renderer/src/api/oramaStore.js +592 -0
  94. package/src/renderer/src/api/ragPipeline.js +87 -0
  95. package/src/renderer/src/api/subagent/subagentExecutor.js +780 -0
  96. package/src/renderer/src/api/subagent/subagentPrompt.js +44 -0
  97. package/src/renderer/src/api/subagent/subagentStore.js +173 -0
  98. package/src/renderer/src/api/taskExecutor.js +18 -0
  99. package/src/renderer/src/api/taskStore.js +315 -0
  100. package/src/renderer/src/api/tools/core-tools.js +707 -0
  101. package/src/renderer/src/api/tools/index.js +151 -0
  102. package/src/renderer/src/api/turnPairMigrator.js +200 -0
  103. package/src/renderer/src/api/vectorMemory.js +136 -0
  104. package/src/renderer/src/api/wakeWord.js +101 -0
  105. package/src/renderer/src/api/web-bridge.js +885 -0
  106. package/src/renderer/src/api/webSpeech.js +178 -0
  107. package/src/renderer/src/api/workspaceRag.js +76 -0
  108. package/src/renderer/src/assets/electron.svg +10 -0
  109. package/src/renderer/src/assets/icon.svg +1 -0
  110. package/src/renderer/src/assets/main.css +589 -0
  111. package/src/renderer/src/assets/music-cover.png +0 -0
  112. package/src/renderer/src/assets/wavy-lines.svg +25 -0
  113. package/src/renderer/src/components/Chat/ApprovalBubble.jsx +127 -0
  114. package/src/renderer/src/components/Chat/CodeBlock.jsx +83 -0
  115. package/src/renderer/src/components/Chat/DurableTaskBubble.jsx +455 -0
  116. package/src/renderer/src/components/Chat/FileDiffModal.jsx +328 -0
  117. package/src/renderer/src/components/Chat/GeminiWidgets.jsx +82 -0
  118. package/src/renderer/src/components/Chat/MemoryFooterBubble.jsx +34 -0
  119. package/src/renderer/src/components/Chat/MessageBubble.jsx +459 -0
  120. package/src/renderer/src/components/Chat/PluginExecutionBubble.jsx +41 -0
  121. package/src/renderer/src/components/Chat/ThinkingBubble.jsx +316 -0
  122. package/src/renderer/src/components/Chat/YoutubeSearchBubble.jsx +43 -0
  123. package/src/renderer/src/components/Chat/YoutubeSummaryBubble.jsx +40 -0
  124. package/src/renderer/src/components/Chat/index.js +11 -0
  125. package/src/renderer/src/components/ChatList.jsx +434 -0
  126. package/src/renderer/src/components/GlobalCameraManager.jsx +67 -0
  127. package/src/renderer/src/components/Versions.jsx +15 -0
  128. package/src/renderer/src/components/YoutubeMusicPlayer.jsx +375 -0
  129. package/src/renderer/src/components/camera/CameraPreview.jsx +236 -0
  130. package/src/renderer/src/components/config/AiEngineSection.jsx +363 -0
  131. package/src/renderer/src/components/config/CameraSection.jsx +100 -0
  132. package/src/renderer/src/components/config/PermissionsSection.jsx +130 -0
  133. package/src/renderer/src/components/config/ShortcutSection.jsx +102 -0
  134. package/src/renderer/src/components/config/VoiceSection.jsx +110 -0
  135. package/src/renderer/src/components/config/index.js +5 -0
  136. package/src/renderer/src/components/core/Avatar.jsx +2197 -0
  137. package/src/renderer/src/components/core/ConfirmModal.jsx +80 -0
  138. package/src/renderer/src/components/core/DraggableHoloCard.jsx +125 -0
  139. package/src/renderer/src/components/core/FloatingMenu.jsx +272 -0
  140. package/src/renderer/src/components/core/HoloCard.jsx +64 -0
  141. package/src/renderer/src/components/core/InputBar.jsx +1346 -0
  142. package/src/renderer/src/components/core/ProcessPanel.jsx +216 -0
  143. package/src/renderer/src/components/core/ResponseArea.jsx +149 -0
  144. package/src/renderer/src/components/core/StatusIndicator.jsx +59 -0
  145. package/src/renderer/src/components/core/ThoughtNeuralFlow.jsx +168 -0
  146. package/src/renderer/src/components/core/ToolClustersDeck.jsx +210 -0
  147. package/src/renderer/src/components/core/native-skills.js +43 -0
  148. package/src/renderer/src/components/neural-core/EmotionalCortexLobe.jsx +359 -0
  149. package/src/renderer/src/components/neural-core/NodeDissectionModal.jsx +57 -0
  150. package/src/renderer/src/components/neural-core/ProceduralMatrixLobe.jsx +193 -0
  151. package/src/renderer/src/components/neural-core/ProceduralSkillModal.jsx +53 -0
  152. package/src/renderer/src/components/neural-core/ResetAiModal.jsx +198 -0
  153. package/src/renderer/src/components/neural-core/SynapticMemoryLobe.jsx +204 -0
  154. package/src/renderer/src/components/neural-core/traitMeta.js +102 -0
  155. package/src/renderer/src/components/subagent/AgentChatFeed.jsx +603 -0
  156. package/src/renderer/src/components/subagent/AgentInspector.jsx +224 -0
  157. package/src/renderer/src/components/subagent/AgentSidebar.jsx +216 -0
  158. package/src/renderer/src/components/subagent/SubagentIntercom.jsx +572 -0
  159. package/src/renderer/src/components/subagent/SubagentTopologyMap.jsx +423 -0
  160. package/src/renderer/src/contexts/ApprovalContext.jsx +425 -0
  161. package/src/renderer/src/contexts/ChatContext.jsx +61 -0
  162. package/src/renderer/src/contexts/YoutubeMusicContext.jsx +333 -0
  163. package/src/renderer/src/data/faqData.js +202 -0
  164. package/src/renderer/src/hooks/agent/executeAgentTool.js +895 -0
  165. package/src/renderer/src/hooks/agent/index.js +4 -0
  166. package/src/renderer/src/hooks/agent/useMarkMusic.js +75 -0
  167. package/src/renderer/src/hooks/agent/useMarkPlan.js +2739 -0
  168. package/src/renderer/src/hooks/agent/useMarkState.js +173 -0
  169. package/src/renderer/src/hooks/agent/useMarkYoutube.js +82 -0
  170. package/src/renderer/src/hooks/agent/useRelationalGrowth.js +201 -0
  171. package/src/renderer/src/hooks/telegram/useTelegramBot.js +63 -0
  172. package/src/renderer/src/hooks/useAwareness.js +289 -0
  173. package/src/renderer/src/hooks/useChatArchiver.js +52 -0
  174. package/src/renderer/src/hooks/useConfirm.jsx +68 -0
  175. package/src/renderer/src/hooks/useMarkAgent.js +454 -0
  176. package/src/renderer/src/hooks/useMemoryGroomer.js +152 -0
  177. package/src/renderer/src/hooks/useVAD.js +511 -0
  178. package/src/renderer/src/hooks/useWebSpeechWakeWord.js +122 -0
  179. package/src/renderer/src/main.jsx +12 -0
  180. package/src/renderer/src/pages/ChatStudio.jsx +922 -0
  181. package/src/renderer/src/pages/Configuration.jsx +360 -0
  182. package/src/renderer/src/pages/GoogleWorkspace.jsx +293 -0
  183. package/src/renderer/src/pages/Guidebook.jsx +917 -0
  184. package/src/renderer/src/pages/Knowledge.jsx +241 -0
  185. package/src/renderer/src/pages/MarkHome.jsx +491 -0
  186. package/src/renderer/src/pages/NeuralCore.jsx +786 -0
  187. package/src/renderer/src/pages/Plugins.jsx +630 -0
  188. package/src/renderer/src/pages/SkillEditor.jsx +380 -0
  189. package/src/renderer/src/pages/Skills.jsx +219 -0
  190. package/src/renderer/src/pages/Subagents.jsx +342 -0
  191. package/src/renderer/src/pages/TelegramBot.jsx +343 -0
  192. package/src/renderer/src/utils/chatContentParser.js +203 -0
  193. package/src/renderer/src/utils/toolClusters.js +201 -0
  194. package/src/server/bin/sha3_wasm_bg.wasm +0 -0
  195. package/src/server/config-manager.js +57 -0
  196. package/src/server/index.js +195 -0
  197. package/src/server/launcher.js +87 -0
  198. package/src/server/memory/db-store.js +758 -0
  199. package/src/server/memory/orama-store.js +177 -0
  200. package/src/server/memory/vector-engine.js +109 -0
  201. package/src/server/routes/ai.routes.js +280 -0
  202. package/src/server/routes/awareness.routes.js +62 -0
  203. package/src/server/routes/chat.routes.js +61 -0
  204. package/src/server/routes/config.routes.js +41 -0
  205. package/src/server/routes/index.js +35 -0
  206. package/src/server/routes/integrations.routes.js +116 -0
  207. package/src/server/routes/memory.routes.js +256 -0
  208. package/src/server/routes/plugins.routes.js +72 -0
  209. package/src/server/routes/skills.routes.js +139 -0
  210. package/src/server/routes/subagents.routes.js +70 -0
  211. package/src/server/routes/tasks.routes.js +175 -0
  212. package/src/server/routes/workspace.routes.js +127 -0
  213. package/src/server/services/ai/ai-utils.js +161 -0
  214. package/src/server/services/ai/openai-provider.js +757 -0
  215. package/src/server/services/ai/web-provider.js +729 -0
  216. package/src/server/services/ai-bridge.js +46 -0
  217. package/src/server/services/deepseek-web.js +956 -0
  218. package/src/server/services/gemini-web.js +170 -0
  219. package/src/server/services/notification-service.js +91 -0
  220. package/src/server/services/updater.js +125 -0
  221. package/src/server/tools/awareness-tracker.js +292 -0
  222. package/src/server/tools/group-tools.js +1164 -0
  223. package/src/server/tools/media-tools.js +244 -0
  224. package/src/server/tools/pc-agent.js +327 -0
  225. package/src/server/tools/screen-service.js +51 -0
  226. package/src/server/ws-hub.js +168 -0
  227. 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
+ }