@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,241 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react'
|
|
2
|
+
import { useNavigate } from 'react-router-dom'
|
|
3
|
+
import { ingestDocument } from '../api/ragPipeline'
|
|
4
|
+
import { getAllDocuments, deleteDocumentByName } from '../api/db'
|
|
5
|
+
import { deleteDocumentFromOrama } from '../api/oramaStore'
|
|
6
|
+
import { useConfirm } from '../hooks/useConfirm'
|
|
7
|
+
|
|
8
|
+
const Knowledge = () => {
|
|
9
|
+
const navigate = useNavigate()
|
|
10
|
+
const [documents, setDocuments] = useState([])
|
|
11
|
+
const [isUploading, setIsUploading] = useState(false)
|
|
12
|
+
const [uploadProgress, setUploadProgress] = useState(0)
|
|
13
|
+
const { confirm, ModalComponent } = useConfirm()
|
|
14
|
+
|
|
15
|
+
const [toastMessage, setToastMessage] = useState(null)
|
|
16
|
+
|
|
17
|
+
const showToast = (message) => {
|
|
18
|
+
setToastMessage(message)
|
|
19
|
+
setTimeout(() => setToastMessage(null), 3000)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const loadData = useCallback(async () => {
|
|
23
|
+
try {
|
|
24
|
+
const allDocs = await getAllDocuments()
|
|
25
|
+
const uniqueDocs = Array.from(new Set(allDocs.map((d) => d.docName))).map((name) => {
|
|
26
|
+
const chunks = allDocs.filter((d) => d.docName === name)
|
|
27
|
+
return {
|
|
28
|
+
name,
|
|
29
|
+
chunks: chunks.length,
|
|
30
|
+
timestamp: chunks[0]?.timestamp || 0
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
setDocuments(uniqueDocs.sort((a, b) => b.timestamp - a.timestamp))
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.error(e)
|
|
36
|
+
}
|
|
37
|
+
}, [])
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
loadData()
|
|
41
|
+
}, [loadData])
|
|
42
|
+
|
|
43
|
+
const handleFileUpload = async (e) => {
|
|
44
|
+
const file = e.target.files?.[0]
|
|
45
|
+
if (!file) return
|
|
46
|
+
|
|
47
|
+
setIsUploading(true)
|
|
48
|
+
setUploadProgress(0)
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
await ingestDocument(file, (progress) => {
|
|
52
|
+
setUploadProgress(progress)
|
|
53
|
+
})
|
|
54
|
+
await loadData()
|
|
55
|
+
showToast('Dokumen berhasil di-ingest!')
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error(error)
|
|
58
|
+
await confirm({
|
|
59
|
+
title: 'Gagal Ingest',
|
|
60
|
+
message: error.message,
|
|
61
|
+
isError: true,
|
|
62
|
+
hideCancel: true,
|
|
63
|
+
confirmText: 'Tutup'
|
|
64
|
+
})
|
|
65
|
+
} finally {
|
|
66
|
+
setIsUploading(false)
|
|
67
|
+
setUploadProgress(0)
|
|
68
|
+
if (e.target) e.target.value = ''
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const handleDeleteDocument = async (docName) => {
|
|
73
|
+
const result = await confirm({
|
|
74
|
+
title: 'Hapus Dokumen?',
|
|
75
|
+
message: `Yakin ingin menghapus dokumen "${docName}"? Mark tidak akan bisa mengingat informasi dari dokumen ini lagi.`,
|
|
76
|
+
isError: true,
|
|
77
|
+
confirmText: 'Ya, Hapus',
|
|
78
|
+
cancelText: 'Batal'
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
if (!result.isConfirmed) return
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const allDocs = await getAllDocuments()
|
|
85
|
+
const chunks = allDocs.filter((d) => d.docName === docName)
|
|
86
|
+
|
|
87
|
+
for (const chunk of chunks) {
|
|
88
|
+
await deleteDocumentByName(docName)
|
|
89
|
+
if (chunk.oramaId) {
|
|
90
|
+
await deleteDocumentFromOrama(chunk.oramaId)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
await loadData()
|
|
95
|
+
showToast('Dokumen berhasil dihapus')
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.error(error)
|
|
98
|
+
await confirm({
|
|
99
|
+
title: 'Oops...',
|
|
100
|
+
message: 'Gagal menghapus dokumen',
|
|
101
|
+
isError: true,
|
|
102
|
+
hideCancel: true,
|
|
103
|
+
confirmText: 'Tutup'
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<div className="h-screen bg-base-300 text-base-content overflow-hidden relative font-['Poppins',sans-serif]">
|
|
110
|
+
{/* Background Ambience */}
|
|
111
|
+
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,oklch(var(--n))_0%,transparent_70%)] opacity-20 pointer-events-none" />
|
|
112
|
+
<div className="absolute inset-0 bg-[url('https://www.transparenttextures.com/patterns/stardust.png')] opacity-10 pointer-events-none" />
|
|
113
|
+
|
|
114
|
+
{/* Main Content Area */}
|
|
115
|
+
<div className="relative z-10 w-full h-full overflow-y-auto custom-scrollbar">
|
|
116
|
+
<div className="max-w-2xl mx-auto px-4 py-8 pb-32 space-y-8">
|
|
117
|
+
{/* Page Header */}
|
|
118
|
+
<div className="flex items-center gap-4">
|
|
119
|
+
<button
|
|
120
|
+
type="button"
|
|
121
|
+
onClick={() => navigate('/')}
|
|
122
|
+
className="btn btn-ghost btn-sm btn-circle shrink-0"
|
|
123
|
+
style={{ WebkitAppRegion: 'no-drag' }}
|
|
124
|
+
title="Kembali"
|
|
125
|
+
>
|
|
126
|
+
<svg
|
|
127
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
128
|
+
width="1.2em"
|
|
129
|
+
height="1.2em"
|
|
130
|
+
fill="none"
|
|
131
|
+
viewBox="0 0 24 24"
|
|
132
|
+
stroke="currentColor"
|
|
133
|
+
strokeWidth={2}
|
|
134
|
+
>
|
|
135
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7" />
|
|
136
|
+
</svg>
|
|
137
|
+
</button>
|
|
138
|
+
<div>
|
|
139
|
+
<h1 className="text-2xl font-bold">Document Knowledge</h1>
|
|
140
|
+
<p className="opacity-50 text-sm mt-1">
|
|
141
|
+
Inject dokumen lokal untuk dipelajari oleh Mark AI.
|
|
142
|
+
</p>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<section className="space-y-5">
|
|
147
|
+
<div className="card bg-base-100/50 backdrop-blur-xl border border-base-content/10 shadow-xl">
|
|
148
|
+
<div className="card-body">
|
|
149
|
+
<h2 className="card-title text-base font-bold uppercase tracking-wider opacity-70">
|
|
150
|
+
Upload Dokumen Baru
|
|
151
|
+
</h2>
|
|
152
|
+
<p className="text-sm opacity-50 mb-2">
|
|
153
|
+
Pilih file PDF, TXT, MD, atau DOCX. Mark akan membaca dan memprosesnya menjadi
|
|
154
|
+
bagian dari ingatannya (RAG).
|
|
155
|
+
</p>
|
|
156
|
+
|
|
157
|
+
<div className="form-control">
|
|
158
|
+
<input
|
|
159
|
+
type="file"
|
|
160
|
+
className="file-input file-input-bordered file-input-primary w-full"
|
|
161
|
+
accept=".pdf,.txt,.md,.docx"
|
|
162
|
+
onChange={handleFileUpload}
|
|
163
|
+
disabled={isUploading}
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{isUploading && (
|
|
168
|
+
<div className="w-full mt-4">
|
|
169
|
+
<progress
|
|
170
|
+
className="progress progress-primary w-full"
|
|
171
|
+
value={uploadProgress}
|
|
172
|
+
max="100"
|
|
173
|
+
></progress>
|
|
174
|
+
<p className="text-xs text-center mt-2 opacity-50">
|
|
175
|
+
Memproses: {uploadProgress}%
|
|
176
|
+
</p>
|
|
177
|
+
</div>
|
|
178
|
+
)}
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
</section>
|
|
182
|
+
|
|
183
|
+
<section className="space-y-5">
|
|
184
|
+
<div className="flex items-center justify-between">
|
|
185
|
+
<h2 className="text-base font-bold uppercase tracking-wider opacity-70">
|
|
186
|
+
Dokumen Tersimpan
|
|
187
|
+
</h2>
|
|
188
|
+
<span className="badge badge-sm badge-outline badge-primary">
|
|
189
|
+
{documents.length} dokumen
|
|
190
|
+
</span>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<div className="space-y-2 max-h-[50vh] overflow-y-auto custom-scrollbar pr-2">
|
|
194
|
+
{documents.length === 0 ? (
|
|
195
|
+
<div className="text-center py-10 opacity-30 bg-base-200/30 rounded-xl border border-base-content/5">
|
|
196
|
+
<p className="text-sm">Belum ada dokumen yang di-inject.</p>
|
|
197
|
+
</div>
|
|
198
|
+
) : (
|
|
199
|
+
documents.map((doc, i) => (
|
|
200
|
+
<div
|
|
201
|
+
key={i}
|
|
202
|
+
className="flex flex-col sm:flex-row sm:items-center justify-between bg-base-200/50 backdrop-blur-sm p-4 rounded-xl hover:bg-base-300 transition-colors border border-base-content/5 gap-3"
|
|
203
|
+
>
|
|
204
|
+
<div className="truncate pr-2">
|
|
205
|
+
<p className="font-semibold truncate text-sm" title={doc.name}>
|
|
206
|
+
{doc.name}
|
|
207
|
+
</p>
|
|
208
|
+
<div className="flex gap-2 mt-1 items-center">
|
|
209
|
+
<span className="badge badge-xs badge-secondary">{doc.chunks} chunks</span>
|
|
210
|
+
<span className="text-xs opacity-40">
|
|
211
|
+
Diunggah {new Date(doc.timestamp).toLocaleDateString()}
|
|
212
|
+
</span>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
<button
|
|
216
|
+
className="btn btn-outline btn-error btn-sm shrink-0"
|
|
217
|
+
onClick={() => handleDeleteDocument(doc.name)}
|
|
218
|
+
>
|
|
219
|
+
Hapus
|
|
220
|
+
</button>
|
|
221
|
+
</div>
|
|
222
|
+
))
|
|
223
|
+
)}
|
|
224
|
+
</div>
|
|
225
|
+
</section>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
<ModalComponent />
|
|
229
|
+
|
|
230
|
+
{toastMessage && (
|
|
231
|
+
<div className="toast toast-top toast-end z-[9999]">
|
|
232
|
+
<div className="alert alert-success shadow-lg rounded-xl flex items-center gap-2">
|
|
233
|
+
<span className="text-sm font-medium">{toastMessage}</span>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
)}
|
|
237
|
+
</div>
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export default Knowledge
|