@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,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 > 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
|