@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,80 @@
1
+ import React, { useEffect } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+
4
+ const ConfirmModal = ({
5
+ isOpen,
6
+ title,
7
+ message,
8
+ onConfirm,
9
+ onCancel,
10
+ confirmText = "Ya",
11
+ cancelText = "Batal",
12
+ isError = false,
13
+ hideCancel = false
14
+ }) => {
15
+ useEffect(() => {
16
+ const handleKeyDown = (e) => {
17
+ if (e.key === 'Escape' && isOpen) {
18
+ onCancel?.();
19
+ }
20
+ };
21
+ if (isOpen) {
22
+ window.addEventListener('keydown', handleKeyDown);
23
+ }
24
+ return () => window.removeEventListener('keydown', handleKeyDown);
25
+ }, [isOpen, onCancel]);
26
+
27
+ if (!isOpen) return null;
28
+
29
+ const modalContent = (
30
+ <div className="modal modal-open z-[99999] fixed inset-0 flex items-center justify-center bg-black/70 backdrop-blur-md animate-[response-fade-in_0.15s_ease-out_forwards]">
31
+ <div className="modal-box relative bg-base-300 border border-white/10 shadow-2xl z-10 max-w-md">
32
+ <h3 className={`font-bold text-lg ${isError ? 'text-error' : 'text-primary'}`}>{title}</h3>
33
+ <p className="py-4 text-sm opacity-80 whitespace-pre-wrap">
34
+ {message}
35
+ </p>
36
+ <div className="modal-action">
37
+ {!hideCancel && (
38
+ <button
39
+ type="button"
40
+ className="btn btn-ghost btn-sm"
41
+ onClick={(e) => {
42
+ e.preventDefault();
43
+ e.stopPropagation();
44
+ onCancel?.();
45
+ }}
46
+ >
47
+ {cancelText}
48
+ </button>
49
+ )}
50
+ <button
51
+ type="button"
52
+ className={`btn ${isError ? 'btn-error' : 'btn-primary'} btn-sm shadow-md`}
53
+ onClick={(e) => {
54
+ e.preventDefault();
55
+ e.stopPropagation();
56
+ onConfirm?.();
57
+ }}
58
+ >
59
+ {confirmText}
60
+ </button>
61
+ </div>
62
+ </div>
63
+ <div
64
+ className="modal-backdrop fixed inset-0 cursor-pointer bg-transparent"
65
+ onClick={(e) => {
66
+ e.preventDefault();
67
+ e.stopPropagation();
68
+ onCancel?.();
69
+ }}
70
+ />
71
+ </div>
72
+ );
73
+
74
+ if (typeof document !== 'undefined') {
75
+ return createPortal(modalContent, document.body);
76
+ }
77
+ return modalContent;
78
+ };
79
+
80
+ export default ConfirmModal;
@@ -0,0 +1,125 @@
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+
3
+ const DraggableHoloCard = ({
4
+ children,
5
+ title,
6
+ id,
7
+ defaultPosition = { x: window.innerWidth - 400, y: 80 },
8
+ onClose,
9
+ isVisible = true
10
+ }) => {
11
+ const [pos, setPos] = useState(defaultPosition);
12
+ const [isDragging, setIsDragging] = useState(false);
13
+ const [animState, setAnimState] = useState(isVisible ? 'entering' : 'hidden');
14
+ const dragRef = useRef({ offsetX: 0, offsetY: 0 });
15
+
16
+ useEffect(() => {
17
+ if (isVisible) {
18
+ setAnimState('entering');
19
+ const timer = setTimeout(() => setAnimState('visible'), 300);
20
+ return () => clearTimeout(timer);
21
+ } else {
22
+ setAnimState('exiting');
23
+ const timer = setTimeout(() => setAnimState('hidden'), 300);
24
+ return () => clearTimeout(timer);
25
+ }
26
+ }, [isVisible]);
27
+
28
+ useEffect(() => {
29
+ const handleMouseMove = (e) => {
30
+ if (!isDragging) return;
31
+
32
+ let newX = e.clientX - dragRef.current.offsetX;
33
+ let newY = e.clientY - dragRef.current.offsetY;
34
+
35
+ // Simple boundary clamping
36
+ const maxX = window.innerWidth - 100; // at least 100px visible
37
+ const maxY = window.innerHeight - 50;
38
+
39
+ newX = Math.max(0, Math.min(newX, maxX));
40
+ newY = Math.max(0, Math.min(newY, maxY));
41
+
42
+ setPos({ x: newX, y: newY });
43
+ };
44
+
45
+ const handleMouseUp = () => {
46
+ setIsDragging(false);
47
+ };
48
+
49
+ if (isDragging) {
50
+ document.addEventListener('mousemove', handleMouseMove);
51
+ document.addEventListener('mouseup', handleMouseUp);
52
+ }
53
+
54
+ return () => {
55
+ document.removeEventListener('mousemove', handleMouseMove);
56
+ document.removeEventListener('mouseup', handleMouseUp);
57
+ };
58
+ }, [isDragging]);
59
+
60
+ const handleMouseDown = (e) => {
61
+ setIsDragging(true);
62
+ dragRef.current = {
63
+ offsetX: e.clientX - pos.x,
64
+ offsetY: e.clientY - pos.y
65
+ };
66
+ };
67
+
68
+ if (animState === 'hidden') return null;
69
+
70
+ const animationClass = animState === 'entering'
71
+ ? 'animate-[holo-project-in_0.3s_ease-out_forwards]'
72
+ : animState === 'exiting'
73
+ ? 'animate-[holo-dismiss_0.3s_ease-in_forwards]'
74
+ : '';
75
+
76
+ const dragClass = isDragging ? 'scale-[1.02] rotate-1 shadow-2xl z-50' : 'shadow-lg z-40';
77
+
78
+ return (
79
+ <div
80
+ className={`fixed ${animationClass} ${dragClass} transition-transform duration-75`}
81
+ style={{ left: pos.x, top: pos.y, width: 'fit-content' }}
82
+ >
83
+ <div className="relative overflow-hidden rounded-sm bg-[var(--glass-bg)] backdrop-blur-md border border-[var(--glass-border)] shadow-[0_4px_30px_oklch(var(--p)/0.1)]">
84
+
85
+ {/* Animated Border Flow (Top & Bottom) */}
86
+ <div className="absolute top-0 left-0 right-0 h-[1px] bg-[var(--color-holo-border)] bg-[length:200%_auto] animate-[holo-border-flow_3s_linear_infinite]" />
87
+ <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-[var(--color-holo-border)] bg-[length:200%_auto] animate-[holo-border-flow_3s_linear_infinite] rotate-180" />
88
+
89
+ {/* HUD Brackets */}
90
+ <div className="absolute top-0 left-0 w-4 h-4 border-t-2 border-l-2 border-white/30 pointer-events-none" />
91
+ <div className="absolute top-0 right-0 w-4 h-4 border-t-2 border-r-2 border-white/30 pointer-events-none" />
92
+ <div className="absolute bottom-0 left-0 w-4 h-4 border-b-2 border-l-2 border-white/30 pointer-events-none" />
93
+ <div className="absolute bottom-0 right-0 w-4 h-4 border-b-2 border-r-2 border-white/30 pointer-events-none" />
94
+
95
+ {/* Header / Drag Handle */}
96
+ <div
97
+ className="flex items-center justify-between px-4 py-2 bg-base-300/50 cursor-grab active:cursor-grabbing border-b border-white/5 select-none"
98
+ onMouseDown={handleMouseDown}
99
+ >
100
+ <div className="flex items-center gap-2">
101
+ <span className="w-1.5 h-1.5 bg-success rounded-full animate-pulse shadow-[0_0_8px_oklch(var(--su))]" />
102
+ <span className="text-xs font-semibold uppercase tracking-wider text-success opacity-90">{title}</span>
103
+ </div>
104
+
105
+ <button
106
+ onClick={onClose}
107
+ className="text-white/50 hover:text-error transition-colors p-1 -mr-2 rounded-md hover:bg-white/10"
108
+ >
109
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
110
+ <line x1="18" y1="6" x2="6" y2="18"></line>
111
+ <line x1="6" y1="6" x2="18" y2="18"></line>
112
+ </svg>
113
+ </button>
114
+ </div>
115
+
116
+ {/* Content */}
117
+ <div className="p-4 overflow-y-auto max-h-[60vh] custom-scrollbar">
118
+ {children}
119
+ </div>
120
+ </div>
121
+ </div>
122
+ );
123
+ };
124
+
125
+ export default DraggableHoloCard;
@@ -0,0 +1,272 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import { useNavigate } from 'react-router-dom'
3
+ import markLogo from '../../assets/icon.svg'
4
+ import {
5
+ FaBars,
6
+ FaTimes,
7
+ FaCog,
8
+ FaPuzzlePiece,
9
+ FaTelegram,
10
+ FaDatabase,
11
+ FaBook,
12
+ FaGoogle,
13
+ FaBrain,
14
+ FaRobot,
15
+ FaCommentAlt,
16
+ FaChevronRight
17
+ } from 'react-icons/fa'
18
+
19
+ const FloatingMenu = () => {
20
+ const [isOpen, setIsOpen] = useState(false)
21
+ const navigate = useNavigate()
22
+
23
+ // Handle ESC key to close drawer
24
+ useEffect(() => {
25
+ const handleKeyDown = (e) => {
26
+ if (e.key === 'Escape' && isOpen) {
27
+ setIsOpen(false)
28
+ }
29
+ }
30
+ window.addEventListener('keydown', handleKeyDown)
31
+ return () => window.removeEventListener('keydown', handleKeyDown)
32
+ }, [isOpen])
33
+
34
+ const handleNav = (path) => {
35
+ navigate(path)
36
+ setIsOpen(false)
37
+ }
38
+
39
+ const handleOpenStudio = () => {
40
+ navigate('/chat')
41
+ setIsOpen(false)
42
+ }
43
+
44
+ return (
45
+ <>
46
+ {/* Trigger Button */}
47
+ <button
48
+ type="button"
49
+ onClick={() => setIsOpen(true)}
50
+ className={`h-9 w-9 btn btn-ghost p-0 bg-white/5 hover:bg-white/10 rounded-xl flex items-center justify-center transition-all cursor-pointer ${
51
+ isOpen ? 'text-white bg-white/20 ring-1 ring-white/20' : 'text-white/70 hover:text-white'
52
+ }`}
53
+ title="Buka Menu Navigasi"
54
+ >
55
+ <FaBars size={15} />
56
+ </button>
57
+
58
+ {/* Backdrop Overlay */}
59
+ {isOpen && (
60
+ <div
61
+ className="fixed inset-0 bg-black/75 backdrop-blur-md z-[100] transition-opacity duration-300 animate-[response-fade-in_0.2s_ease-out_forwards]"
62
+ onClick={() => setIsOpen(false)}
63
+ />
64
+ )}
65
+
66
+ {/* Slide-over Left Navigation Drawer */}
67
+ <aside
68
+ className={`fixed top-0 left-0 bottom-0 w-80 max-w-[85vw] bg-base-300/98 border-r border-white/10 shadow-[0_20px_50px_rgba(0,0,0,0.9)] z-[110] flex flex-col transition-transform duration-300 ease-out transform ${
69
+ isOpen ? 'translate-x-0' : '-translate-x-full'
70
+ }`}
71
+ >
72
+ {/* Drawer Header */}
73
+ <div className="flex items-center justify-between px-5 py-4 border-b border-white/5 bg-base-200/40">
74
+ <div className="flex items-center gap-3">
75
+ <img src={markLogo} alt="Mark Logo" className="size-20 object-contain" />
76
+ <div>
77
+ <h2 className="text-sm font-bold font-mono text-white tracking-wider">MARK AGENT</h2>
78
+ <p className="text-[10px] font-mono text-primary uppercase tracking-widest font-semibold">
79
+ v{typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '5.0.0'}
80
+ </p>
81
+ </div>
82
+ </div>
83
+ <button
84
+ type="button"
85
+ onClick={() => setIsOpen(false)}
86
+ className="w-8 h-8 flex items-center justify-center rounded-xl bg-white/5 hover:bg-error hover:text-white text-base-content/60 transition-colors cursor-pointer"
87
+ title="Tutup Menu"
88
+ >
89
+ <FaTimes size={13} />
90
+ </button>
91
+ </div>
92
+
93
+ {/* Scrollable Navigation Items */}
94
+ <div className="flex-1 overflow-y-auto custom-scrollbar p-3.5 space-y-4">
95
+ {/* Section: Main Studio & Live */}
96
+ <div>
97
+ <span className="text-[10px] font-mono font-bold text-base-content/40 uppercase tracking-widest px-2.5 mb-1.5 block">
98
+ Workspace & Live
99
+ </span>
100
+ <div className="space-y-1">
101
+ <button
102
+ type="button"
103
+ onClick={handleOpenStudio}
104
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
105
+ >
106
+ <div className="flex items-center gap-3">
107
+ <FaCommentAlt className="text-primary text-sm" />
108
+ <span>Chat Studio</span>
109
+ </div>
110
+ <FaChevronRight
111
+ size={10}
112
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
113
+ />
114
+ </button>
115
+ </div>
116
+ </div>
117
+
118
+ {/* Section: Brain & Cognitive Systems */}
119
+ <div>
120
+ <span className="text-[10px] font-mono font-bold text-base-content/40 uppercase tracking-widest px-2.5 mb-1.5 block">
121
+ Cognitive & Brain
122
+ </span>
123
+ <div className="space-y-1">
124
+ <button
125
+ type="button"
126
+ onClick={() => handleNav('/neural-core')}
127
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
128
+ >
129
+ <div className="flex items-center gap-3">
130
+ <FaBrain className="text-primary text-sm" />
131
+ <span>Neural Core</span>
132
+ </div>
133
+ <span className="text-[9px] px-1.5 py-0.5 rounded-md bg-primary/20 text-primary border border-primary/30 font-bold">
134
+ OTAK
135
+ </span>
136
+ </button>
137
+
138
+ <button
139
+ type="button"
140
+ onClick={() => handleNav('/subagents')}
141
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
142
+ >
143
+ <div className="flex items-center gap-3">
144
+ <FaRobot className="text-primary text-sm" />
145
+ <span>Sub-Agents</span>
146
+ </div>
147
+ <FaChevronRight
148
+ size={10}
149
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
150
+ />
151
+ </button>
152
+
153
+ <button
154
+ type="button"
155
+ onClick={() => handleNav('/skills')}
156
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
157
+ >
158
+ <div className="flex items-center gap-3">
159
+ <FaPuzzlePiece className="text-primary text-sm" />
160
+ <span>User Skills</span>
161
+ </div>
162
+ <FaChevronRight
163
+ size={10}
164
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
165
+ />
166
+ </button>
167
+
168
+ <button
169
+ type="button"
170
+ onClick={() => handleNav('/knowledge')}
171
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
172
+ >
173
+ <div className="flex items-center gap-3">
174
+ <FaDatabase className="text-primary text-sm" />
175
+ <span>Knowledge (RAG)</span>
176
+ </div>
177
+ <FaChevronRight
178
+ size={10}
179
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
180
+ />
181
+ </button>
182
+ </div>
183
+ </div>
184
+
185
+ {/* Section: Ecosystem & Integrations */}
186
+ <div>
187
+ <span className="text-[10px] font-mono font-bold text-base-content/40 uppercase tracking-widest px-2.5 mb-1.5 block">
188
+ Integrations & System
189
+ </span>
190
+ <div className="space-y-1">
191
+ <button
192
+ type="button"
193
+ onClick={() => handleNav('/plugins')}
194
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
195
+ >
196
+ <div className="flex items-center gap-3">
197
+ <FaPuzzlePiece className="text-primary text-sm" />
198
+ <span>Plugins Hub</span>
199
+ </div>
200
+ <FaChevronRight
201
+ size={10}
202
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
203
+ />
204
+ </button>
205
+
206
+ <button
207
+ type="button"
208
+ onClick={() => handleNav('/google-workspace')}
209
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
210
+ >
211
+ <div className="flex items-center gap-3">
212
+ <FaGoogle className="text-primary text-sm" />
213
+ <span>Google Workspace</span>
214
+ </div>
215
+ <FaChevronRight
216
+ size={10}
217
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
218
+ />
219
+ </button>
220
+ <button
221
+ type="button"
222
+ onClick={() => handleNav('/telegram-bot')}
223
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
224
+ >
225
+ <div className="flex items-center gap-3">
226
+ <FaTelegram className="text-primary text-sm" />
227
+ <span>Telegram Bot</span>
228
+ </div>
229
+ <FaChevronRight
230
+ size={10}
231
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
232
+ />
233
+ </button>
234
+
235
+ <button
236
+ type="button"
237
+ onClick={() => handleNav('/guidebook')}
238
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
239
+ >
240
+ <div className="flex items-center gap-3">
241
+ <FaBook className="text-primary text-sm" />
242
+ <span>Guidebook</span>
243
+ </div>
244
+ <FaChevronRight
245
+ size={10}
246
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
247
+ />
248
+ </button>
249
+
250
+ <button
251
+ type="button"
252
+ onClick={() => handleNav('/config')}
253
+ className="w-full flex items-center justify-between p-2.5 rounded-xl hover:bg-white/5 text-base-content/80 hover:text-white text-xs font-medium font-mono transition-colors cursor-pointer group"
254
+ >
255
+ <div className="flex items-center gap-3">
256
+ <FaCog className="text-primary text-sm" />
257
+ <span>Configuration</span>
258
+ </div>
259
+ <FaChevronRight
260
+ size={10}
261
+ className="text-base-content/30 group-hover:text-white/60 group-hover:translate-x-0.5 transition-all"
262
+ />
263
+ </button>
264
+ </div>
265
+ </div>
266
+ </div>
267
+ </aside>
268
+ </>
269
+ )
270
+ }
271
+
272
+ export default FloatingMenu
@@ -0,0 +1,64 @@
1
+ import React, { useState, useRef, useEffect } from 'react';
2
+
3
+ const HoloCard = ({ children, title, defaultExpanded = false }) => {
4
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
5
+ const [isOverflowing, setIsOverflowing] = useState(false);
6
+ const contentRef = useRef(null);
7
+
8
+ useEffect(() => {
9
+ if (contentRef.current) {
10
+ if (contentRef.current.scrollHeight > 200) {
11
+ setIsOverflowing(true);
12
+ }
13
+ }
14
+ }, [children]);
15
+
16
+ return (
17
+ <div className="relative w-full overflow-hidden rounded-sm bg-[var(--glass-bg)] backdrop-blur-md border border-[var(--glass-border)] animate-[holo-enter_0.4s_ease-out_forwards] shadow-xl">
18
+
19
+ {/* Animated Border Flow (Top) */}
20
+ <div className="absolute top-0 left-0 right-0 h-[1px] bg-[var(--color-holo-border)] bg-[length:200%_auto] animate-[holo-border-flow_3s_linear_infinite]" />
21
+ <div className="absolute bottom-0 left-0 right-0 h-[1px] bg-[var(--color-holo-border)] bg-[length:200%_auto] animate-[holo-border-flow_3s_linear_infinite] rotate-180" />
22
+
23
+ {/* HUD Brackets */}
24
+ <div className="absolute top-0 left-0 w-4 h-4 border-t-2 border-l-2 border-white/30" />
25
+ <div className="absolute top-0 right-0 w-4 h-4 border-t-2 border-r-2 border-white/30" />
26
+ <div className="absolute bottom-0 left-0 w-4 h-4 border-b-2 border-l-2 border-white/30" />
27
+ <div className="absolute bottom-0 right-0 w-4 h-4 border-b-2 border-r-2 border-white/30" />
28
+
29
+ {/* Scan lines effect */}
30
+ <div className="absolute inset-0 pointer-events-none opacity-[0.03] bg-[repeating-linear-gradient(transparent,transparent_2px,oklch(var(--p))_3px,transparent_4px)] mix-blend-screen" />
31
+
32
+ <div className="relative z-10 flex flex-col p-5">
33
+ {title && (
34
+ <h3 className="text-success font-semibold text-xs mb-3 uppercase tracking-[0.2em] flex items-center gap-2">
35
+ <span className="w-1.5 h-1.5 bg-success rounded-full animate-pulse shadow-[0_0_8px_oklch(var(--su))]" />
36
+ {title}
37
+ </h3>
38
+ )}
39
+
40
+ <div
41
+ ref={contentRef}
42
+ className={`transition-all duration-500 ease-in-out relative custom-markdown text-sm text-[#e2e8f0] ${isExpanded ? 'max-h-[60vh] overflow-y-auto pr-2 custom-scrollbar' : 'max-h-[200px] overflow-hidden'}`}
43
+ >
44
+ {children}
45
+ </div>
46
+
47
+ {isOverflowing && (
48
+ <button
49
+ onClick={() => setIsExpanded(!isExpanded)}
50
+ className="mt-4 flex items-center justify-center gap-2 text-xs font-medium text-success opacity-70 hover:opacity-100 hover:bg-white/10 transition-all bg-white/5 py-2 rounded-lg border border-white/5"
51
+ >
52
+ {isExpanded ? (
53
+ <>▲ Ringkas Detail</>
54
+ ) : (
55
+ <>▼ Baca Detail Sepenuhnya</>
56
+ )}
57
+ </button>
58
+ )}
59
+ </div>
60
+ </div>
61
+ );
62
+ };
63
+
64
+ export default HoloCard;