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