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