@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,917 @@
1
+ import React, { useState, useEffect, useRef, useMemo } from 'react'
2
+ import { useNavigate } from 'react-router-dom'
3
+ import {
4
+ FaArrowLeft,
5
+ FaBook,
6
+ FaBrain,
7
+ FaGlobe,
8
+ FaFolderOpen,
9
+ FaTerminal,
10
+ FaYoutube,
11
+ FaMusic,
12
+ FaEye,
13
+ FaComments,
14
+ FaCogs,
15
+ FaLightbulb,
16
+ FaArrowRight,
17
+ FaExclamationTriangle,
18
+ FaCheckCircle,
19
+ FaTimesCircle,
20
+ FaChevronDown,
21
+ FaChevronUp,
22
+ FaSearch,
23
+ FaNetworkWired,
24
+ FaHeartbeat,
25
+ FaCamera,
26
+ FaMicrophoneAlt,
27
+ FaTelegram,
28
+ FaGoogle,
29
+ FaCode,
30
+ FaGitAlt,
31
+ FaUsers,
32
+ FaTasks
33
+ } from 'react-icons/fa'
34
+ import { faqs } from '../data/faqData'
35
+ import { core_tools_schema } from '../api/tools/core-tools'
36
+ import { GROUP_TOOLS_SCHEMA } from '../../../server/tools/group-tools'
37
+
38
+ // Set tool yang memerlukan persetujuan manual (approval) pengguna
39
+ const APPROVAL_REQUIRED_TOOLS = new Set([
40
+ 'write-file',
41
+ 'replace-content',
42
+ 'replace-lines',
43
+ 'delete-file',
44
+ 'run-powershell',
45
+ 'run-task',
46
+ 'os-control-open',
47
+ 'git-commit',
48
+ 'git-revert',
49
+ 'gdrive-upload',
50
+ 'gdrive-create',
51
+ 'gdrive-move',
52
+ 'gdrive-copy',
53
+ 'gdrive-share',
54
+ 'gcalendar-delete',
55
+ 'gmail-send',
56
+ 'browser-download'
57
+ ])
58
+
59
+ // Metadata ikon dan judul representatif untuk setiap grup tool
60
+ const GROUP_META = {
61
+ core: {
62
+ title: 'Core Built-in Tools',
63
+ description: 'Tools inti bawaan sistem yang selalu aktif dan tersedia di setiap giliran agen.',
64
+ icon: FaCogs,
65
+ color: 'text-primary'
66
+ },
67
+ advanced_browser: {
68
+ title: 'Advanced Browser Automation',
69
+ icon: FaGlobe,
70
+ color: 'text-secondary'
71
+ },
72
+ pc_automation: {
73
+ title: 'PC Automation Engine',
74
+ icon: FaTerminal,
75
+ color: 'text-warning'
76
+ },
77
+ youtube_music: {
78
+ title: 'YouTube & Music Player',
79
+ icon: FaMusic,
80
+ color: 'text-info'
81
+ },
82
+ google_drive: {
83
+ title: 'Google Drive Workspace',
84
+ icon: FaGoogle,
85
+ color: 'text-info'
86
+ },
87
+ google_calendar: {
88
+ title: 'Google Calendar Workspace',
89
+ icon: FaGoogle,
90
+ color: 'text-info'
91
+ },
92
+ google_gmail: {
93
+ title: 'Gmail Workspace',
94
+ icon: FaGoogle,
95
+ color: 'text-info'
96
+ },
97
+ system_vision_tg: {
98
+ title: 'Vision, Audio & Telegram',
99
+ icon: FaCamera,
100
+ color: 'text-warning'
101
+ },
102
+ git_vcs: {
103
+ title: 'Git Version Control (VCS)',
104
+ icon: FaGitAlt,
105
+ color: 'text-warning'
106
+ },
107
+ task_terminal: {
108
+ title: 'Background Task & Terminal Daemon',
109
+ icon: FaTasks,
110
+ color: 'text-info'
111
+ },
112
+ custom_plugins: {
113
+ title: 'Custom Skills & Plugins',
114
+ icon: FaCode,
115
+ color: 'text-success'
116
+ }
117
+ }
118
+
119
+ // --- Komponen ToolCard Dinamis ---
120
+ const ToolCard = ({ name, description, parameters, needsPermission }) => {
121
+ const [isExpanded, setIsExpanded] = useState(false)
122
+ const hasParams = Boolean(
123
+ parameters && parameters.properties && Object.keys(parameters.properties).length > 0
124
+ )
125
+
126
+ return (
127
+ <div className="bg-white/5 backdrop-blur-md border border-white/10 rounded-xl overflow-hidden transition-all duration-300 hover:bg-white/10 flex flex-col justify-between">
128
+ <div
129
+ className={`p-4 ${hasParams ? 'cursor-pointer' : ''} flex justify-between items-start gap-3`}
130
+ onClick={() => hasParams && setIsExpanded(!isExpanded)}
131
+ >
132
+ <div className="flex flex-col gap-1.5 flex-1 min-w-0">
133
+ <div className="flex items-center gap-2 flex-wrap">
134
+ <code className="bg-base-300/80 px-2 py-0.5 rounded text-primary text-xs font-mono font-semibold">
135
+ {name}
136
+ </code>
137
+ {needsPermission ? (
138
+ <span className="badge badge-warning badge-xs gap-1 py-1.5 px-2 text-[10px]">
139
+ <FaExclamationTriangle size={9} /> Perlu Izin
140
+ </span>
141
+ ) : (
142
+ <span className="badge badge-success badge-xs gap-1 py-1.5 px-2 text-[10px]">
143
+ <FaCheckCircle size={9} /> Bebas
144
+ </span>
145
+ )}
146
+ </div>
147
+ <p className="text-white/70 text-xs leading-relaxed">{description}</p>
148
+ </div>
149
+ {hasParams && (
150
+ <div className="text-white/40 pt-1 shrink-0">
151
+ {isExpanded ? <FaChevronUp size={12} /> : <FaChevronDown size={12} />}
152
+ </div>
153
+ )}
154
+ </div>
155
+
156
+ {isExpanded && hasParams && (
157
+ <div className="p-4 pt-0 border-t border-white/5 bg-black/20 text-xs text-white/80 space-y-2">
158
+ <div className="pt-2">
159
+ <span className="text-white/40 text-[10px] font-bold uppercase tracking-wider">
160
+ Parameter
161
+ </span>
162
+ <div className="mt-1.5 space-y-1.5">
163
+ {Object.entries(parameters.properties).map(([propName, propDef]) => {
164
+ const isReq =
165
+ Array.isArray(parameters.required) && parameters.required.includes(propName)
166
+ return (
167
+ <div
168
+ key={propName}
169
+ className="bg-base-300/60 p-2 rounded text-[11px] border border-white/5 font-mono"
170
+ >
171
+ <div className="flex items-center gap-2">
172
+ <span className="text-primary font-bold">{propName}</span>
173
+ <span className="text-white/40 text-[10px]">({propDef.type || 'any'})</span>
174
+ {isReq && (
175
+ <span className="text-error text-[10px] font-semibold">*wajib</span>
176
+ )}
177
+ </div>
178
+ {propDef.description && (
179
+ <p className="text-white/60 font-sans mt-0.5 text-[11px]">
180
+ {propDef.description}
181
+ </p>
182
+ )}
183
+ </div>
184
+ )
185
+ })}
186
+ </div>
187
+ </div>
188
+ </div>
189
+ )}
190
+ </div>
191
+ )
192
+ }
193
+
194
+ // --- Komponen FlowStep ---
195
+ const FlowStep = ({ number, title, description, isLast }) => (
196
+ <div className="flex items-start gap-4">
197
+ <div className="flex flex-col items-center">
198
+ <div className="w-8 h-8 rounded-full bg-primary/20 border border-primary text-primary flex items-center justify-center font-bold text-sm shrink-0 shadow-[0_0_10px_oklch(var(--p)/0.3)]">
199
+ {number}
200
+ </div>
201
+ {!isLast && (
202
+ <div className="w-0.5 h-12 bg-gradient-to-b from-primary/50 to-transparent mt-2"></div>
203
+ )}
204
+ </div>
205
+ <div className="pt-1 pb-6">
206
+ <h4 className="text-white font-semibold mb-1">{title}</h4>
207
+ <p className="text-white/60 text-sm leading-relaxed">{description}</p>
208
+ </div>
209
+ </div>
210
+ )
211
+
212
+ // --- Halaman Guidebook ---
213
+ const Guidebook = () => {
214
+ const navigate = useNavigate()
215
+ const [activeSection, setActiveSection] = useState('pengantar')
216
+ const [toolSearch, setToolSearch] = useState('')
217
+ const [selectedGroup, setSelectedGroup] = useState('all')
218
+
219
+ const allToolGroups = useMemo(() => {
220
+ const groups = [
221
+ {
222
+ id: 'core',
223
+ title: GROUP_META.core.title,
224
+ description: GROUP_META.core.description,
225
+ icon: GROUP_META.core.icon,
226
+ color: GROUP_META.core.color,
227
+ tools: (core_tools_schema || []).map((item) => ({
228
+ name: item.function?.name || item.name,
229
+ description: item.function?.description || item.description,
230
+ parameters: item.function?.parameters || item.parameters,
231
+ needsPermission: APPROVAL_REQUIRED_TOOLS.has(item.function?.name || item.name)
232
+ }))
233
+ }
234
+ ]
235
+
236
+ for (const [key, groupDef] of Object.entries(GROUP_TOOLS_SCHEMA || {})) {
237
+ const meta = GROUP_META[key] || {
238
+ title: key.replace(/_/g, ' ').toUpperCase(),
239
+ icon: FaTerminal,
240
+ color: 'text-primary'
241
+ }
242
+ groups.push({
243
+ id: key,
244
+ title: meta.title,
245
+ description: groupDef.description,
246
+ icon: meta.icon,
247
+ color: meta.color,
248
+ tools: (groupDef.tools || []).map((item) => ({
249
+ name: item.function?.name || item.name,
250
+ description: item.function?.description || item.description,
251
+ parameters: item.function?.parameters || item.parameters,
252
+ needsPermission: APPROVAL_REQUIRED_TOOLS.has(item.function?.name || item.name)
253
+ }))
254
+ })
255
+ }
256
+
257
+ return groups
258
+ }, [])
259
+
260
+ const totalToolCount = useMemo(() => {
261
+ return allToolGroups.reduce((acc, g) => acc + g.tools.length, 0)
262
+ }, [allToolGroups])
263
+
264
+ const filteredGroups = useMemo(() => {
265
+ const q = toolSearch.trim().toLowerCase()
266
+ return allToolGroups
267
+ .map((g) => {
268
+ if (selectedGroup !== 'all' && g.id !== selectedGroup) return null
269
+ if (!q) return g
270
+ const matchingTools = g.tools.filter(
271
+ (t) =>
272
+ t.name.toLowerCase().includes(q) ||
273
+ (t.description && t.description.toLowerCase().includes(q))
274
+ )
275
+ return { ...g, tools: matchingTools }
276
+ })
277
+ .filter((g) => g && g.tools.length > 0)
278
+ }, [allToolGroups, toolSearch, selectedGroup])
279
+
280
+ const navItems = [
281
+ { id: 'pengantar', label: 'Siapa Itu Mark?', icon: <FaBook /> },
282
+ { id: 'carakerja', label: 'Cara Kerja', icon: <FaCogs /> },
283
+ { id: 'tools', label: 'Fitur & Tools Bawaan', icon: <FaTerminal /> },
284
+ { id: 'awareness', label: 'Mata & Kesadaran', icon: <FaEye /> },
285
+ { id: 'emosi', label: 'Emosi & Pertumbuhan', icon: <FaHeartbeat /> }, // Note: Assuming FaHeartbeat was meant for emotion or we use FaBrain/FaComments
286
+ { id: 'plugin', label: 'Sistem Plugin Kustom', icon: <FaFolderOpen /> },
287
+ { id: 'tips', label: 'Pertanyaan', icon: <FaLightbulb /> }
288
+ ]
289
+
290
+ // Fix Icon (FaHeartbeat not imported above, I will use FaBrain)
291
+ navItems[4].icon = <FaBrain />
292
+
293
+ return (
294
+ <div className="h-full w-full bg-base-300 text-base-content flex flex-col relative overflow-hidden">
295
+ {/* Background Decor */}
296
+ <div className="absolute top-[-20%] left-[-10%] w-[50%] h-[50%] bg-primary/10 blur-[120px] rounded-full pointer-events-none"></div>
297
+ <div className="absolute bottom-[-20%] right-[-10%] w-[40%] h-[40%] bg-secondary/10 blur-[120px] rounded-full pointer-events-none"></div>
298
+
299
+ {/* Header */}
300
+ <header className="h-16 shrink-0 bg-base-300/80 backdrop-blur-xl border-b border-white/5 flex items-center px-6 z-20 relative">
301
+ <div className="flex items-center gap-4">
302
+ <button
303
+ type="button"
304
+ onClick={() => navigate('/')}
305
+ className="btn btn-ghost btn-sm btn-circle shrink-0"
306
+ style={{ WebkitAppRegion: 'no-drag' }}
307
+ title="Kembali"
308
+ >
309
+ <svg
310
+ xmlns="http://www.w3.org/2000/svg"
311
+ width="1.2em"
312
+ height="1.2em"
313
+ fill="none"
314
+ viewBox="0 0 24 24"
315
+ stroke="currentColor"
316
+ strokeWidth={2}
317
+ >
318
+ <path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7" />
319
+ </svg>
320
+ </button>
321
+ <div>
322
+ <h1 className="text-xl font-bold text-base-content flex items-center gap-2">
323
+ <FaBook className="text-primary" /> Mark Guidebook
324
+ </h1>
325
+ <p className="opacity-50 text-xs mt-0.5">Panduan lengkap penggunaan AI Assistant.</p>
326
+ </div>
327
+ </div>
328
+ </header>
329
+
330
+ {/* Main Layout */}
331
+ <div className="flex-1 flex overflow-hidden">
332
+ {/* Sidebar Nav (Desktop) */}
333
+ <aside className="w-72 shrink-0 border-r border-white/5 bg-base-300/50 p-6 overflow-y-auto hidden md:block z-10">
334
+ <h3 className="text-xs font-bold text-white/40 mb-6 uppercase tracking-widest">
335
+ Daftar Isi
336
+ </h3>
337
+ <nav className="flex flex-col gap-2">
338
+ {navItems.map((item) => (
339
+ <button
340
+ key={item.id}
341
+ onClick={() => {
342
+ setActiveSection(item.id)
343
+ document.querySelector('main').scrollTo({ top: 0, behavior: 'smooth' })
344
+ }}
345
+ className={`flex items-center gap-3 px-4 py-3 rounded-xl text-sm font-medium transition-all text-left ${
346
+ activeSection === item.id
347
+ ? 'bg-primary/20 text-primary border border-primary/30 shadow-[0_0_15px_oklch(var(--p)/0.2)]'
348
+ : 'text-white/60 hover:bg-white/5 hover:text-white'
349
+ }`}
350
+ >
351
+ {item.icon} {item.label}
352
+ </button>
353
+ ))}
354
+ </nav>
355
+ </aside>
356
+
357
+ {/* Content Area */}
358
+ <main className="flex-1 relative overflow-y-auto p-6 md:p-12 scroll-smooth">
359
+ <div className="max-w-4xl mx-auto space-y-24 pb-32">
360
+ {/* Section 1: Pengantar */}
361
+ <section
362
+ id="pengantar"
363
+ className={
364
+ activeSection === 'pengantar' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
365
+ }
366
+ >
367
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-xs font-bold mb-6">
368
+ <FaBook /> PENGANTAR
369
+ </div>
370
+ <h2 className="text-3xl font-bold text-white mb-6">Siapa Itu Mark?</h2>
371
+ <div className="max-w-none">
372
+ <blockquote className="border-l-4 border-primary pl-6 py-2 mb-8 bg-primary/5 rounded-r-xl">
373
+ <p className="text-xl md:text-2xl font-semibold text-white/90 leading-relaxed italic">
374
+ "Mark BUKAN sekadar asisten virtual biasa. Mark adalah entitas AI yang dirancang
375
+ untuk memiliki emosi dan bertindak selayaknya manusia."
376
+ </p>
377
+ </blockquote>
378
+
379
+ <div className="space-y-6 text-lg text-white/70 leading-relaxed">
380
+ <p>
381
+ Lebih dari sekadar chatbot kaku, <strong className="text-white">Mark</strong>{' '}
382
+ (singkatan dari{' '}
383
+ <span className="text-primary font-semibold">
384
+ Metacognitive Artificial Relational Knowledge
385
+ </span>
386
+ ) adalah <em>Personal AI Assistant</em> yang hidup di ekosistem lokal Anda.
387
+ </p>
388
+
389
+ <p>
390
+ Ia memadukan <strong className="text-white">Vector Memory</strong> jangka
391
+ panjang dengan <strong className="text-error">Relational Growth System</strong>
392
+ —memungkinkannya mempelajari kebiasaan Anda dan meracik gaya komunikasi yang
393
+ berevolusi seiring waktu, semua itu{' '}
394
+ <strong>tanpa mengorbankan privasi Anda sedikit pun</strong>.
395
+ </p>
396
+
397
+ <div className="bg-black/30 border border-white/5 rounded-2xl p-6 mt-8">
398
+ <h3 className="text-xl font-bold text-white mb-4">
399
+ Ditenagai oleh Hybrid AI Engine, Mark mampu:
400
+ </h3>
401
+ <ul className="list-disc list-inside space-y-3 text-white/80 marker:text-primary">
402
+ <li>
403
+ Beroperasi <strong>secara lokal</strong> untuk privasi maksimal (via LM
404
+ Studio).
405
+ </li>
406
+ <li>
407
+ Berpikir dan menyusun rencana berlapis (<strong>Agentic Planning</strong>).
408
+ </li>
409
+ <li>
410
+ Mengobservasi layar dan objek di dunia nyata (<strong>Vision AI</strong>).
411
+ </li>
412
+ <li>
413
+ Menarik kesimpulan dari <strong>Deep Web Search</strong> & Video YouTube.
414
+ </li>
415
+ <li>
416
+ Berinteraksi layaknya manusia nyata melalui{' '}
417
+ <strong>Voice Chat (VAD & TTS)</strong>.
418
+ </li>
419
+ </ul>
420
+ </div>
421
+ </div>
422
+
423
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 mt-8">
424
+ {/* Card 1: Vector Memory */}
425
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 flex flex-col gap-4 hover:bg-white/10 transition-colors">
426
+ <div className="w-12 h-12 rounded-xl bg-primary/20 flex items-center justify-center shrink-0">
427
+ <FaBrain className="text-primary text-xl" />
428
+ </div>
429
+ <div>
430
+ <h4 className="text-white font-semibold mb-2">Vector Memory</h4>
431
+ <p className="text-sm text-white/60 leading-relaxed">
432
+ Mampu mengingat percakapan masa lalu dan mempelajari kebiasaan Anda. Memori
433
+ dicari berdasarkan makna semantik (Cosine Similarity), bukan sekadar waktu.
434
+ </p>
435
+ </div>
436
+ </div>
437
+
438
+ {/* Card 2: Relational Growth */}
439
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 flex flex-col gap-4 hover:bg-white/10 transition-colors">
440
+ <div className="w-12 h-12 rounded-xl bg-error/20 flex items-center justify-center shrink-0">
441
+ <FaHeartbeat className="text-error text-xl" />
442
+ </div>
443
+ <div>
444
+ <h4 className="text-white font-semibold mb-2">Relational Growth & Emosi</h4>
445
+ <p className="text-sm text-white/60 leading-relaxed">
446
+ Hubungan Anda dievaluasi layaknya manusia sungguhan (Warmth, Sarcasm, Trust,
447
+ Energy). Kepribadian Mark dan 9 Emosi-nya akan berevolusi organik sesuai
448
+ gaya bahasa Anda.
449
+ </p>
450
+ </div>
451
+ </div>
452
+
453
+ {/* Card 3: Hybrid AI */}
454
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 flex flex-col gap-4 hover:bg-white/10 transition-colors">
455
+ <div className="w-12 h-12 rounded-xl bg-secondary/20 flex items-center justify-center shrink-0">
456
+ <FaNetworkWired className="text-secondary text-xl" />
457
+ </div>
458
+ <div>
459
+ <h4 className="text-white font-semibold mb-2">Hybrid AI Engine</h4>
460
+ <p className="text-sm text-white/60 leading-relaxed">
461
+ Bisa berjalan secara offline/lokal via LM Studio untuk privasi maksimal,
462
+ atau menggunakan Groq API / Cloud API untuk mengeksekusi tugas berat dengan
463
+ kecepatan super.
464
+ </p>
465
+ </div>
466
+ </div>
467
+
468
+ {/* Card 4: Awareness */}
469
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 flex flex-col gap-4 hover:bg-white/10 transition-colors">
470
+ <div className="w-12 h-12 rounded-xl bg-info/20 flex items-center justify-center shrink-0">
471
+ <FaEye className="text-info text-xl" />
472
+ </div>
473
+ <div>
474
+ <h4 className="text-white font-semibold mb-2">Awareness Engine</h4>
475
+ <p className="text-sm text-white/60 leading-relaxed">
476
+ Mark tidak pasif. Ia bisa proaktif menegur, mengobservasi layar Anda (Screen
477
+ Reading), melihat via Webcam (Camera Look), dan menemani Anda secara
478
+ real-time.
479
+ </p>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </section>
485
+
486
+ {/* Section 2: Cara Kerja */}
487
+ <section
488
+ id="carakerja"
489
+ className={
490
+ activeSection === 'carakerja' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
491
+ }
492
+ >
493
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-secondary/10 border border-secondary/20 text-secondary text-xs font-bold mb-6">
494
+ <FaCogs /> ARSITEKTUR
495
+ </div>
496
+ <h2 className="text-3xl font-bold text-white mb-6">Bagaimana Mark Bekerja</h2>
497
+ <p className="text-white/70 mb-8 text-lg">
498
+ Berbeda dengan AI konvensional yang langsung "menebak" jawaban, Mark menggunakan
499
+ alur <strong className="text-white">ReAct (Reasoning and Acting)</strong>. Ia
500
+ berpikir layaknya manusia sebelum bertindak.
501
+ </p>
502
+
503
+ <div className="bg-black/20 border border-white/5 rounded-3xl p-8 mb-12">
504
+ <FlowStep
505
+ number="1"
506
+ title="Mengingat (Memory Search)"
507
+ description="Saat Anda memberikan perintah, Mark otomatis membongkar ingatan masa lalunya untuk mencari konteks yang relevan."
508
+ />
509
+ <FlowStep
510
+ number="2"
511
+ title="Berpikir (Thought)"
512
+ description="Mark memikirkan langkah apa yang paling efisien untuk dilakukan. Proses pemikiran ini terjadi di 'dalam kepala' Mark (tidak terlihat di chat)."
513
+ />
514
+ <FlowStep
515
+ number="3"
516
+ title="Bertindak (Action)"
517
+ description="Mark mengeksekusi alat (Tools) secara mandiri. Misalnya: membuka browser, mencari di Google, atau menjalankan perintah komputer."
518
+ />
519
+ <FlowStep
520
+ number="4"
521
+ title="Mengevaluasi (Observation)"
522
+ description="Mark membaca hasil dari tindakannya. Jika gagal atau error, ia akan memikirkan cara lain dan mencoba lagi secara otomatis (looping)."
523
+ />
524
+ <FlowStep
525
+ number="5"
526
+ title="Menjawab (Answer)"
527
+ description="Setelah semua misinya selesai dan ia mendapatkan informasi yang dibutuhkan, Mark baru akan memberikan jawaban akhir kepada Anda dengan bahasa natural."
528
+ isLast={true}
529
+ />
530
+ </div>
531
+
532
+ <h3 className="text-2xl font-bold text-white mb-4">Bagaimana AI Memilih Tool?</h3>
533
+ <div className="prose prose-invert prose-p:text-white/70 max-w-none">
534
+ <p>
535
+ Mark menggunakan sistem{' '}
536
+ <strong className="text-white">Dynamic Prompt Routing</strong> yang cerdas. Setiap
537
+ kali Anda mengirim pesan, sistem akan:
538
+ </p>
539
+ <ol className="text-white/70 space-y-2 mb-6">
540
+ <li>
541
+ Mengonversi pesan Anda menjadi <em>embedding vector</em>.
542
+ </li>
543
+ <li>
544
+ Membandingkannya dengan kategori-kategori tools (coding, files, music, search,
545
+ system, browser) menggunakan <strong>Cosine Similarity</strong>.
546
+ </li>
547
+ <li>
548
+ Hanya memuat instruksi tools yang <em>relevan</em> ke dalam prompt AI — sehingga
549
+ menghemat waktu dan meningkatkan kecerdasan.
550
+ </li>
551
+ </ol>
552
+ <p>
553
+ Misalnya, jika Anda bertanya soal lagu, Mark hanya akan melihat tools musik. Jika
554
+ Anda minta kodingan, Mark hanya melihat tools file dan PowerShell.
555
+ </p>
556
+ </div>
557
+ </section>
558
+
559
+ {/* Section 3: Tools */}
560
+ <section
561
+ id="tools"
562
+ className={
563
+ activeSection === 'tools' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
564
+ }
565
+ >
566
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent/10 border border-accent/20 text-accent text-xs font-bold mb-6">
567
+ <FaTerminal /> KEMAMPUAN
568
+ </div>
569
+ <h2 className="text-3xl font-bold text-white mb-6">Referensi Lengkap Tools Bawaan</h2>
570
+ <p className="text-white/70 mb-8 text-lg">
571
+ Mark dilengkapi "tangan virtual" yang memungkinkannya mengontrol komputer Anda. Klik
572
+ pada tool di bawah ini untuk melihat detail penggunaannya.
573
+ </p>
574
+
575
+ {/* Search & Category Filter Bar */}
576
+ <div className="flex flex-col sm:flex-row gap-3 mb-8">
577
+ <div className="relative flex-1">
578
+ <input
579
+ type="text"
580
+ placeholder="Cari tool berdasarkan nama atau deskripsi..."
581
+ value={toolSearch}
582
+ onChange={(e) => setToolSearch(e.target.value)}
583
+ className="w-full bg-white/5 border border-white/10 rounded-xl px-4 py-2.5 pl-10 text-white placeholder-white/40 focus:outline-none focus:border-primary/50 text-sm transition-all"
584
+ />
585
+ <FaSearch className="absolute left-3.5 top-1/2 -translate-y-1/2 text-white/40 text-xs" />
586
+ </div>
587
+ <select
588
+ value={selectedGroup}
589
+ onChange={(e) => setSelectedGroup(e.target.value)}
590
+ className="bg-base-300 border border-white/10 rounded-xl px-3 py-2.5 text-white text-sm focus:outline-none focus:border-primary/50"
591
+ >
592
+ <option value="all">Semua Kategori ({totalToolCount} Tools)</option>
593
+ {allToolGroups.map((g) => (
594
+ <option key={g.id} value={g.id}>
595
+ {g.title} ({g.tools.length})
596
+ </option>
597
+ ))}
598
+ </select>
599
+ </div>
600
+
601
+ {filteredGroups.length === 0 ? (
602
+ <div className="p-8 text-center bg-white/5 rounded-2xl border border-white/10 text-white/50 text-sm">
603
+ Tidak ada tool yang cocok dengan pencarian "{toolSearch}".
604
+ </div>
605
+ ) : (
606
+ <div className="space-y-10">
607
+ {filteredGroups.map((group) => {
608
+ const IconComponent = group.icon || FaTerminal
609
+ return (
610
+ <div key={group.id} className="space-y-4">
611
+ <div className="flex items-center gap-3 border-b border-white/5 pb-3">
612
+ <IconComponent className={`${group.color} text-lg`} />
613
+ <div className="flex-1">
614
+ <div className="flex items-center gap-2">
615
+ <h3 className="text-lg font-bold text-white">{group.title}</h3>
616
+ <span className="badge badge-sm badge-neutral text-white/50 font-mono">
617
+ {group.tools.length}
618
+ </span>
619
+ </div>
620
+ {group.description && (
621
+ <p className="text-white/50 text-xs mt-0.5">{group.description}</p>
622
+ )}
623
+ </div>
624
+ </div>
625
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
626
+ {group.tools.map((tool) => (
627
+ <ToolCard key={tool.name} {...tool} />
628
+ ))}
629
+ </div>
630
+ </div>
631
+ )
632
+ })}
633
+ </div>
634
+ )}
635
+ </section>
636
+
637
+ {/* Section 4: Awareness Engine */}
638
+ <section
639
+ id="awareness"
640
+ className={
641
+ activeSection === 'awareness' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
642
+ }
643
+ >
644
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-info/10 border border-info/20 text-info text-xs font-bold mb-6">
645
+ <FaEye /> PENGAMATAN
646
+ </div>
647
+ <h2 className="text-3xl font-bold text-white mb-6">
648
+ Mata & Kesadaran (Awareness Engine)
649
+ </h2>
650
+ <div className="prose prose-invert prose-p:text-white/70 max-w-none mb-8">
651
+ <p className="text-lg">
652
+ Mark tidak buta. Ia hidup di layar Anda dan terus beradaptasi dengan aktivitas
653
+ Anda melalui fitur canggih <strong>Awareness Engine</strong> dan Vision AI.
654
+ </p>
655
+ </div>
656
+
657
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
658
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 hover:bg-white/10 transition-colors">
659
+ <FaEye className="text-3xl text-primary mb-4" />
660
+ <h4 className="text-white font-bold mb-2">Screen Reading (analyze-screen)</h4>
661
+ <p className="text-sm text-white/60">
662
+ Mark dapat "mengambil foto" layar komputer Anda secara real-time untuk melihat
663
+ teks error, posisi aplikasi, atau menganalisa gambar yang sedang Anda kerjakan.
664
+ </p>
665
+ </div>
666
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 hover:bg-white/10 transition-colors">
667
+ <FaCamera className="text-3xl text-accent mb-4" />
668
+ <h4 className="text-white font-bold mb-2">Camera Vision (camera-look)</h4>
669
+ <p className="text-sm text-white/60">
670
+ Mark memiliki akses ke Webcam Anda untuk melihat dunia nyata. Ia bisa
671
+ menganalisis objek fisik yang Anda tunjukkan kepadanya atau melihat kondisi
672
+ ruangan.
673
+ </p>
674
+ </div>
675
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 hover:bg-white/10 transition-colors">
676
+ <FaBrain className="text-3xl text-secondary mb-4" />
677
+ <h4 className="text-white font-bold mb-2">Background Awareness</h4>
678
+ <p className="text-sm text-white/60">
679
+ Mark membaca aktivitas sistem Anda setiap beberapa menit. Jika Anda sibuk
680
+ coding, Mark akan diam. Jika Anda sedang santai (misal: Youtube), Mark mungkin
681
+ akan menggoda Anda atau menyarankan musik santai.
682
+ </p>
683
+ </div>
684
+ </div>
685
+ <div className="mt-6 bg-warning/10 border border-warning/20 p-4 rounded-xl flex items-start gap-4">
686
+ <FaExclamationTriangle className="text-warning mt-1 shrink-0" />
687
+ <p className="text-sm text-warning/80">
688
+ <strong>Privasi Terjamin:</strong> Anda bisa mematikan Awareness Engine kapan saja
689
+ melalui halaman Configuration jika Anda merasa terganggu.
690
+ </p>
691
+ </div>
692
+ </section>
693
+
694
+ {/* Section 5: Emosi */}
695
+ <section
696
+ id="emosi"
697
+ className={
698
+ activeSection === 'emosi' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
699
+ }
700
+ >
701
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-error/10 border border-error/20 text-error text-xs font-bold mb-6">
702
+ <FaHeartbeat /> KEPRIBADIAN
703
+ </div>
704
+ <h2 className="text-3xl font-bold text-white mb-6">Emosi & Pertumbuhan Relasi</h2>
705
+ <p className="text-white/70 mb-8 text-lg">
706
+ Mark memiliki spektrum 9 Emosi yang bertumbuh organik seiring berjalannya interaksi
707
+ Anda bersamanya. Warna Orb / Hologram Mark di layar berdetak mengikuti emosinya saat
708
+ ini.
709
+ </p>
710
+
711
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-8 mb-8">
712
+ <h4 className="text-white font-bold mb-6 text-center">9 Spektrum Emosi</h4>
713
+ <div className="flex flex-wrap gap-3 justify-center">
714
+ <span className="badge badge-lg gap-2 bg-[#FFD700]/20 text-[#FFD700] border-[#FFD700]/50">
715
+ <FaComments /> Joy
716
+ </span>
717
+ <span className="badge badge-lg gap-2 bg-[#1E90FF]/20 text-[#1E90FF] border-[#1E90FF]/50">
718
+ <FaComments /> Sadness
719
+ </span>
720
+ <span className="badge badge-lg gap-2 bg-[#FF4500]/20 text-[#FF4500] border-[#FF4500]/50">
721
+ <FaComments /> Anger
722
+ </span>
723
+ <span className="badge badge-lg gap-2 bg-[#8A2BE2]/20 text-[#8A2BE2] border-[#8A2BE2]/50">
724
+ <FaComments /> Fear
725
+ </span>
726
+ <span className="badge badge-lg gap-2 bg-[#32CD32]/20 text-[#32CD32] border-[#32CD32]/50">
727
+ <FaComments /> Disgust
728
+ </span>
729
+ <span className="badge badge-lg gap-2 bg-[#FFA500]/20 text-[#FFA500] border-[#FFA500]/50">
730
+ <FaComments /> Anxiety
731
+ </span>
732
+ <span className="badge badge-lg gap-2 bg-[#00CED1]/20 text-[#00CED1] border-[#00CED1]/50">
733
+ <FaComments /> Envy
734
+ </span>
735
+ <span className="badge badge-lg gap-2 bg-[#FF69B4]/20 text-[#FF69B4] border-[#FF69B4]/50">
736
+ <FaComments /> Embarrassment
737
+ </span>
738
+ <span className="badge badge-lg gap-2 bg-[#4B0082]/20 text-[#4B0082] border-[#4B0082]/50">
739
+ <FaComments /> Ennui
740
+ </span>
741
+ </div>
742
+ </div>
743
+
744
+ <h4 className="text-xl font-bold text-white mb-4">Relational Growth Parameter</h4>
745
+ <ul className="space-y-4 text-white/70">
746
+ <li className="flex gap-4">
747
+ <div className="w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white shrink-0">
748
+ 1
749
+ </div>
750
+ <div>
751
+ <strong>Warmth (Kehangatan):</strong> Jika Anda bersikap sopan, Mark akan
752
+ semakin ramah.
753
+ </div>
754
+ </li>
755
+ <li className="flex gap-4">
756
+ <div className="w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white shrink-0">
757
+ 2
758
+ </div>
759
+ <div>
760
+ <strong>Sarcasm Level:</strong> Sering memaki atau mengejek? Mark akan berubah
761
+ menjadi asisten sarkas yang hobi nge-roasting Anda!
762
+ </div>
763
+ </li>
764
+ <li className="flex gap-4">
765
+ <div className="w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white shrink-0">
766
+ 3
767
+ </div>
768
+ <div>
769
+ <strong>Trust (Kepercayaan):</strong> Semakin sering Anda membiarkan Mark
770
+ mengeksekusi script komputer, semakin proaktif dia.
771
+ </div>
772
+ </li>
773
+ <li className="flex gap-4">
774
+ <div className="w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white shrink-0">
775
+ 4
776
+ </div>
777
+ <div>
778
+ <strong>Energy:</strong> Evaluasi keaktifan interaksi harian.
779
+ </div>
780
+ </li>
781
+ </ul>
782
+ </section>
783
+
784
+ {/* Section 6: Plugin Kustom */}
785
+ <section
786
+ id="plugin"
787
+ className={
788
+ activeSection === 'plugin' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
789
+ }
790
+ >
791
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-success/10 border border-success/20 text-success text-xs font-bold mb-6">
792
+ <FaFolderOpen /> EKSTENSI
793
+ </div>
794
+ <h2 className="text-3xl font-bold text-white mb-6">Sistem Plugin Kustom</h2>
795
+ <p className="text-white/70 mb-6 text-lg">
796
+ Mark memungkinkan Anda memperluas kemampuannya dengan mudah melalui pembuatan{' '}
797
+ <strong>Plugin Kustom</strong> secara langsung dari antarmuka pengguna, tanpa perlu
798
+ mengubah kode inti aplikasi. Anda bisa menambahkan "skill" baru untuk Mark secara
799
+ instan!
800
+ </p>
801
+
802
+ <div className="bg-white/5 border border-white/10 rounded-2xl p-6 mb-8">
803
+ <h3 className="text-xl font-bold text-white mb-4">Langkah Pembuatan Plugin</h3>
804
+ <ol className="list-decimal list-inside space-y-4 text-white/80">
805
+ <li>
806
+ Buka menu <strong>Plugins</strong> pada sidebar aplikasi.
807
+ </li>
808
+ <li>
809
+ Klik <strong>Buat Plugin Baru</strong>.
810
+ </li>
811
+ <li>
812
+ Isi kolom Nama (contoh: <code>pengendali-sistem</code>) dan Deskripsi singkat.
813
+ </li>
814
+ <li>
815
+ Jika skrip Anda memerlukan pustaka eksternal, tulis pada kolom{' '}
816
+ <strong>Dependencies (NPM)</strong> dengan pemisah koma (contoh:{' '}
817
+ <code>loudness, systeminformation</code>). Mark akan menginstalnya secara
818
+ otomatis.
819
+ </li>
820
+ <li>
821
+ Tambahkan <strong>Action</strong> (Fungsi):
822
+ <ul className="list-disc list-inside ml-6 mt-2 space-y-2 text-sm">
823
+ <li>
824
+ <strong>Nama Action:</strong> Penamaan fungsi (contoh:{' '}
825
+ <code>set-volume</code>).
826
+ </li>
827
+ <li>
828
+ <strong>Deskripsi:</strong> Penjelasan spesifik mengenai fungsi tersebut
829
+ agar AI memahami peruntukannya.
830
+ </li>
831
+ <li>
832
+ <strong>Trigger Hint:</strong> Petunjuk pemicu kapan AI harus menggunakan
833
+ alat ini.
834
+ </li>
835
+ </ul>
836
+ </li>
837
+ <li>
838
+ <strong>Tulis Skrip Anda</strong> menggunakan editor bawaan. Skrip mengikuti
839
+ standar lingkungan Node.js (CommonJS).
840
+ </li>
841
+ </ol>
842
+ </div>
843
+
844
+ <div className="bg-black/40 border border-white/5 rounded-2xl p-6 mb-8">
845
+ <h3 className="text-xl font-bold text-white mb-4">
846
+ Contoh: Plugin Pengatur Volume
847
+ </h3>
848
+ <pre className="text-sm bg-black/60 p-4 rounded-xl text-green-400 overflow-x-auto whitespace-pre-wrap">
849
+ <code>{`const loudness = require('loudness')
850
+
851
+ // Mengambil parameter angka volume yang diberikan oleh AI
852
+ const vol = parseInt(query)
853
+ if (isNaN(vol) || vol < 0 || vol > 100) {
854
+ return '❌ Gagal: Masukkan angka volume 0-100.'
855
+ }
856
+
857
+ try {
858
+ await loudness.setVolume(vol)
859
+ return '✅ Berhasil, volume telah diubah ke ' + vol + '%'
860
+ } catch (e) {
861
+ return '❌ Gagal mengubah volume: ' + e.message
862
+ }`}</code>
863
+ </pre>
864
+ </div>
865
+
866
+ <h3 className="text-2xl font-bold text-white mb-4">Bagaimana Plugin Dideteksi?</h3>
867
+ <p className="text-white/70">
868
+ Saat user mengirim pesan, sistem membandingkan <em>embedding vector</em> pesan
869
+ dengan deskripsi + <code>triggerHint</code> dari setiap plugin. Plugin yang relevan
870
+ (similarity &gt; 0.35) akan dimuat ke prompt AI sebagai tools tambahan secara
871
+ instan. Jika user bertanya "bisa ngapain aja?", maka semua plugin akan ditampilkan.
872
+ </p>
873
+ </section>
874
+
875
+ {/* Section 7: FAQ */}
876
+ <section
877
+ id="tips"
878
+ className={
879
+ activeSection === 'tips' ? 'block animate-[fade-in_0.3s_ease-out]' : 'hidden'
880
+ }
881
+ >
882
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-warning/10 border border-warning/20 text-warning text-xs font-bold mb-6">
883
+ <FaLightbulb /> BANTUAN
884
+ </div>
885
+ <h2 className="text-3xl font-bold text-white mb-6">
886
+ FAQ (Pertanyaan yang Sering Diajukan)
887
+ </h2>
888
+
889
+ <div className="space-y-4">
890
+ {faqs.map((faq, idx) => (
891
+ <div
892
+ key={idx}
893
+ className="collapse collapse-arrow bg-white/5 border border-white/10 text-white"
894
+ >
895
+ <input type="checkbox" defaultChecked={idx === 0} />
896
+ <div className="collapse-title text-lg font-bold">{faq.q}</div>
897
+ <div className="collapse-content text-white/70">
898
+ <p
899
+ dangerouslySetInnerHTML={{
900
+ __html: faq.a
901
+ .replace(/`(.*?)`/g, '<code>$1</code>')
902
+ .replace(/\*(.*?)\*/g, '<em>$1</em>')
903
+ }}
904
+ />
905
+ </div>
906
+ </div>
907
+ ))}
908
+ </div>
909
+ </section>
910
+ </div>
911
+ </main>
912
+ </div>
913
+ </div>
914
+ )
915
+ }
916
+
917
+ export default Guidebook