@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
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "@mazees/mark",
3
+ "version": "5.0.0",
4
+ "description": "Mark: Metacognitive Artificial Relational Knowledge AI",
5
+ "main": "./src/server/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "mark": "./bin/mark.js"
9
+ },
10
+ "author": "Mazees",
11
+ "license": "SEE LICENSE IN LICENSE",
12
+ "homepage": "https://github.com/Mazees/mark-agent/",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/Mazees/mark-agent.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/Mazees/mark-agent/issues"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "format": "prettier --write .",
25
+ "lint": "eslint --cache .",
26
+ "start": "node bin/mark.js",
27
+ "dev": "node bin/mark.js --dev",
28
+ "dev:server": "node src/server/index.js --dev",
29
+ "dev:ui": "vite",
30
+ "build": "vite build",
31
+ "build:ui": "vite build",
32
+ "prepublishOnly": "npm run build:ui",
33
+ "cli": "node bin/mark.js"
34
+ },
35
+ "files": [
36
+ "bin",
37
+ "src",
38
+ "out",
39
+ "public",
40
+ "index.html",
41
+ "LICENSE",
42
+ "README.md",
43
+ "package.json"
44
+ ],
45
+ "dependencies": {
46
+ "@electron-toolkit/preload": "^3.0.2",
47
+ "@electron-toolkit/utils": "^4.0.0",
48
+ "@fontsource/poppins": "^5.2.7",
49
+ "@huggingface/transformers": "^4.2.0",
50
+ "@modelcontextprotocol/sdk": "^1.25.3",
51
+ "@monaco-editor/react": "^4.7.0",
52
+ "@orama/orama": "^3.1.18",
53
+ "active-win": "^8.2.1",
54
+ "adm-zip": "^0.6.0",
55
+ "axios": "^1.13.4",
56
+ "better-sqlite3": "^13.0.3",
57
+ "cors": "^2.8.5",
58
+ "driver.js": "^1.4.0",
59
+ "duck-duck-scrape": "^2.2.7",
60
+ "electron-updater": "^6.3.9",
61
+ "express": "^4.21.2",
62
+ "ffmpeg-static": "^5.3.0",
63
+ "googleapis": "^174.0.1",
64
+ "gpt-tokenizer": "^4.0.0",
65
+ "gray-matter": "^4.0.3",
66
+ "jsonrepair": "^3.14.0",
67
+ "lucide-react": "^1.25.0",
68
+ "mammoth": "^1.12.0",
69
+ "msedge-tts": "^2.0.4",
70
+ "open": "^11.0.0",
71
+ "openai": "^6.17.0",
72
+ "pdf-parse": "^2.4.5",
73
+ "react-force-graph-2d": "^1.29.1",
74
+ "react-icons": "^5.6.0",
75
+ "react-markdown": "^10.1.0",
76
+ "react-router-dom": "^7.13.0",
77
+ "react-syntax-highlighter": "^16.1.0",
78
+ "rehype-external-links": "^3.0.0",
79
+ "remark-gfm": "^4.0.1",
80
+ "telegraf": "^4.16.3",
81
+ "ws": "^8.18.0",
82
+ "youtube-dl-exec": "^3.1.7",
83
+ "youtube-transcript-plus": "^1.1.2",
84
+ "yt-search": "^2.13.1"
85
+ },
86
+ "devDependencies": {
87
+ "@electron-toolkit/eslint-config": "^2.1.0",
88
+ "@electron-toolkit/eslint-config-prettier": "^3.0.0",
89
+ "@tailwindcss/vite": "^4.1.18",
90
+ "@vitejs/plugin-react": "^5.1.1",
91
+ "app-builder-lib": "^26.8.1",
92
+ "daisyui": "^5.5.14",
93
+ "electron": "^39.2.6",
94
+ "electron-builder": "^26.8.1",
95
+ "electron-vite": "^5.0.0",
96
+ "eslint": "^9.39.1",
97
+ "eslint-plugin-react": "^7.37.5",
98
+ "eslint-plugin-react-hooks": "^7.0.1",
99
+ "eslint-plugin-react-refresh": "^0.4.24",
100
+ "prettier": "^3.7.4",
101
+ "react": "^19.2.1",
102
+ "react-dom": "^19.2.1",
103
+ "tailwindcss": "^4.1.18",
104
+ "vite": "^7.2.6"
105
+ }
106
+ }
@@ -0,0 +1,332 @@
1
+ import readline from 'readline'
2
+ import http from 'http'
3
+ import { WebSocket } from 'ws'
4
+ import {
5
+ colors as c,
6
+ printHeader,
7
+ printThought,
8
+ printToolCall,
9
+ printToolResult,
10
+ printAssistantAnswer,
11
+ drawBox,
12
+ promptSelect
13
+ } from './theme.js'
14
+
15
+ const SERVER_URL = process.env.MARK_SERVER_URL || 'http://localhost:3000'
16
+ const WS_URL = process.env.MARK_WS_URL || 'ws://localhost:3000/stream'
17
+
18
+ async function checkServerHealth() {
19
+ return new Promise((resolve) => {
20
+ http
21
+ .get(`${SERVER_URL}/api/health`, (res) => {
22
+ resolve(res.statusCode === 200)
23
+ })
24
+ .on('error', () => {
25
+ resolve(false)
26
+ })
27
+ })
28
+ }
29
+
30
+ async function fetchConfig() {
31
+ try {
32
+ const res = await fetch(`${SERVER_URL}/api/config`)
33
+ const json = await res.json()
34
+ return json.data || {}
35
+ } catch (_) {
36
+ return {}
37
+ }
38
+ }
39
+
40
+ async function updateConfig(updates) {
41
+ try {
42
+ const res = await fetch(`${SERVER_URL}/api/config`, {
43
+ method: 'POST',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify(updates)
46
+ })
47
+ const json = await res.json()
48
+ return json.data
49
+ } catch (err) {
50
+ console.error(` ${c.red}[Error]${c.reset} Gagal update konfigurasi: ${err.message}`)
51
+ return null
52
+ }
53
+ }
54
+
55
+ async function triggerLauncher(mode = 'app') {
56
+ try {
57
+ const res = await fetch(`${SERVER_URL}/api/launcher/open`, {
58
+ method: 'POST',
59
+ headers: { 'Content-Type': 'application/json' },
60
+ body: JSON.stringify({ mode })
61
+ })
62
+ const data = await res.json()
63
+ console.log(` ${c.green}●${c.reset} ${c.white}${data.message || 'WebUI berhasil dibuka.'}${c.reset}\n`)
64
+ } catch (err) {
65
+ console.error(` ${c.red}[Launcher Error]${c.reset} ${err.message}\n`)
66
+ }
67
+ }
68
+
69
+ async function showMemoryList() {
70
+ try {
71
+ const res = await fetch(`${SERVER_URL}/api/memories`)
72
+ const json = await res.json()
73
+ const memories = json.data || []
74
+
75
+ if (memories.length === 0) {
76
+ console.log(` ${c.darkGray}Belum ada memori pengguna tersimpan di MMS.${c.reset}\n`)
77
+ return
78
+ }
79
+
80
+ const lines = memories.slice(0, 10).map((m, idx) => {
81
+ const type = `[${(m.type || 'info').toUpperCase()}]`
82
+ return ` ${c.cyan}${String(idx + 1).padStart(2, ' ')}.${c.reset} ${c.teal}${type}${c.reset} ${c.white}${m.summary || m.memory || m.content}${c.reset}`
83
+ })
84
+
85
+ drawBox('MMS Stored Memories', lines, 74, c.darkGray)
86
+ console.log()
87
+ } catch (err) {
88
+ console.error(` ${c.red}[Memory Error]${c.reset} ${err.message}\n`)
89
+ }
90
+ }
91
+
92
+ async function showStatus() {
93
+ try {
94
+ const res = await fetch(`${SERVER_URL}/api/health`)
95
+ const health = await res.json()
96
+ const conf = await fetchConfig()
97
+ const memUsage = process.memoryUsage()
98
+
99
+ const lines = [
100
+ ` ${c.darkGray}Core Status :${c.reset} ${c.green}ONLINE${c.reset} ${c.darkGray}|${c.reset} ${c.darkGray}Version :${c.reset} ${c.white}${health.version || '5.0.0'}${c.reset}`,
101
+ ` ${c.darkGray}Uptime :${c.reset} ${c.white}${Math.floor(health.uptime || 0)}s${c.reset} ${c.darkGray}|${c.reset} ${c.darkGray}Process :${c.reset} ${c.white}Node.js ${process.version}${c.reset}`,
102
+ ` ${c.darkGray}Heap Usage :${c.reset} ${c.white}${Math.round(memUsage.heapUsed / 1024 / 1024)} MB${c.reset} / ${Math.round(memUsage.heapTotal / 1024 / 1024)} MB`,
103
+ ` ${c.darkGray}AI Engine :${c.reset} ${c.cyan}${conf.aiProvider || 'lm-studio'}${c.reset} ${c.darkGray}(${conf.model || 'default'})${c.reset}`,
104
+ ` ${c.darkGray}Speech API :${c.reset} ${c.green}Microsoft Edge Web Speech (Native 0 MB)${c.reset}`
105
+ ]
106
+
107
+ drawBox('System Diagnostics', lines, 74, c.darkGray)
108
+ console.log()
109
+ } catch (err) {
110
+ console.error(` ${c.red}[Status Error]${c.reset} ${err.message}\n`)
111
+ }
112
+ }
113
+
114
+ function showHelp() {
115
+ const lines = [
116
+ ` ${c.green}/ui${c.reset} › Buka antarmuka WebUI dalam Edge App Mode (Jendela Desktop)`,
117
+ ` ${c.green}/web${c.reset} › Buka antarmuka WebUI di Browser Standar`,
118
+ ` ${c.green}/provider <nama>${c.reset} › Ubah provider AI (lm-studio, custom, gemini-web)`,
119
+ ` ${c.green}/model <nama>${c.reset} › Ubah model AI yang aktif (mis. /model google/gemma-3-4b)`,
120
+ ` ${c.green}/memory${c.reset} › Lihat memori pengguna dan preferensi yang tersimpan di MMS`,
121
+ ` ${c.green}/status${c.reset} › Cek kesehatan server, RAM usage, dan konektivitas`,
122
+ ` ${c.green}/clear${c.reset} › Bersihkan layar terminal dan gambar ulang header`,
123
+ ` ${c.green}/exit${c.reset} › Matikan MARK Core Engine dan tutup CLI`
124
+ ]
125
+ drawBox('Available Commands', lines, 74, c.darkGray)
126
+ console.log()
127
+ }
128
+
129
+ export async function runCLI() {
130
+ const isAlive = await checkServerHealth()
131
+ if (!isAlive) {
132
+ await import('../server/index.js')
133
+ await new Promise((resolve) => setTimeout(resolve, 800))
134
+ }
135
+
136
+ let config = await fetchConfig()
137
+ printHeader(config)
138
+
139
+ // Connect WebSocket for live streaming
140
+ let ws = null
141
+ try {
142
+ ws = new WebSocket(WS_URL)
143
+ ws.on('message', (data) => {
144
+ try {
145
+ const { event, payload } = JSON.parse(data.toString())
146
+ if (event === 'agent:thought') {
147
+ printThought(payload.thought, payload.turn)
148
+ } else if (event === 'tool:call') {
149
+ printToolCall(payload.tool, payload.query)
150
+ } else if (event === 'tool:result') {
151
+ printToolResult(payload.tool, payload.observation)
152
+ }
153
+ } catch (_) {}
154
+ })
155
+ } catch (_) {}
156
+
157
+ const rl = readline.createInterface({
158
+ input: process.stdin,
159
+ output: process.stdout,
160
+ prompt: `${c.bold}${c.green}› ${c.reset}`
161
+ })
162
+
163
+ let activeMenu = null
164
+
165
+ rl.prompt()
166
+
167
+ rl.on('line', async (line) => {
168
+ const input = line.trim()
169
+
170
+ // Tangani input saat menu interaktif aktif
171
+ if (activeMenu === 'provider') {
172
+ activeMenu = null
173
+ const val = input.toLowerCase()
174
+ let selected = null
175
+ if (val === '1' || val === 'lm-studio' || val === 'lmstudio' || val === 'local') selected = 'lm-studio'
176
+ else if (val === '2' || val === 'custom') selected = 'custom'
177
+ else if (val === '3' || val === 'gemini-web' || val === 'gemini') selected = 'gemini-web'
178
+
179
+ if (selected) {
180
+ await updateConfig({ aiProvider: selected })
181
+ console.log(`\n ${c.green}✓${c.reset} Provider berhasil diubah ke: ${c.bold}${c.cyan}${selected}${c.reset}\n`)
182
+ } else if (input) {
183
+ console.log(`\n ${c.yellow}i${c.reset} Pilihan dibatalkan atau tidak valid.\n`)
184
+ } else {
185
+ console.log()
186
+ }
187
+ rl.prompt()
188
+ return
189
+ }
190
+
191
+ if (!input) {
192
+ rl.prompt()
193
+ return
194
+ }
195
+
196
+ if (input === '/exit') {
197
+ console.log(`\n ${c.yellow}●${c.reset} ${c.gray}Menutup sesi CLI. Sampai jumpa!${c.reset}\n`)
198
+ process.exit(0)
199
+ }
200
+
201
+ if (input === '/clear') {
202
+ config = await fetchConfig()
203
+ printHeader(config)
204
+ rl.prompt()
205
+ return
206
+ }
207
+
208
+ if (input === '/help') {
209
+ showHelp()
210
+ rl.prompt()
211
+ return
212
+ }
213
+
214
+ if (input === '/ui') {
215
+ await triggerLauncher('app')
216
+ rl.prompt()
217
+ return
218
+ }
219
+
220
+ if (input === '/web') {
221
+ await triggerLauncher('browser')
222
+ rl.prompt()
223
+ return
224
+ }
225
+
226
+ if (input === '/provider') {
227
+ rl.pause()
228
+ const conf = await fetchConfig()
229
+ const curProv = conf.aiProvider || 'lm-studio'
230
+
231
+ const selected = await promptSelect({
232
+ title: 'Select AI Provider',
233
+ activeId: curProv,
234
+ options: [
235
+ { id: 'lm-studio', title: 'LM Studio', description: '(Local LLM - localhost:1234)' },
236
+ { id: 'custom', title: 'Custom API', description: '(OpenAI-Compatible Endpoint)' },
237
+ { id: 'gemini-web', title: 'Gemini Web', description: '(Native Gemini Web RPC Engine)' }
238
+ ]
239
+ })
240
+
241
+ if (selected && selected !== curProv) {
242
+ await updateConfig({ aiProvider: selected })
243
+ console.log(`\n ${c.green}✓${c.reset} Provider berhasil diubah ke: ${c.bold}${c.cyan}${selected}${c.reset}\n`)
244
+ } else if (selected) {
245
+ console.log(`\n ${c.gray}Provider tetap: ${selected}${c.reset}\n`)
246
+ } else {
247
+ console.log(`\n ${c.yellow}i${c.reset} ${c.gray}Pemilihan dibatalkan.${c.reset}\n`)
248
+ }
249
+
250
+ rl.resume()
251
+ rl.prompt()
252
+ return
253
+ }
254
+
255
+ if (input.startsWith('/provider ')) {
256
+ const raw = input.slice(10).trim().toLowerCase()
257
+ let selected = null
258
+ if (raw === '1' || raw === 'lm-studio' || raw === 'lmstudio' || raw === 'local') selected = 'lm-studio'
259
+ else if (raw === '2' || raw === 'custom') selected = 'custom'
260
+ else if (raw === '3' || raw === 'gemini-web' || raw === 'gemini') selected = 'gemini-web'
261
+
262
+ if (selected) {
263
+ await updateConfig({ aiProvider: selected })
264
+ console.log(` ${c.green}✓${c.reset} Provider berhasil diubah ke: ${c.bold}${c.cyan}${selected}${c.reset}\n`)
265
+ } else {
266
+ console.log(` ${c.yellow}i${c.reset} Penggunaan: ${c.white}/provider <lm-studio | custom | gemini-web>${c.reset}\n`)
267
+ }
268
+ rl.prompt()
269
+ return
270
+ }
271
+
272
+ if (input.startsWith('/model')) {
273
+ const parts = input.split(' ')
274
+ if (parts.length > 1 && parts[1].trim()) {
275
+ const newModel = parts[1].trim()
276
+ await updateConfig({ model: newModel, customModel: newModel })
277
+ console.log(` ${c.green}✓${c.reset} Model berhasil diubah ke: ${c.cyan}${newModel}${c.reset}\n`)
278
+ } else {
279
+ console.log(` ${c.yellow}i${c.reset} Penggunaan: ${c.white}/model <nama-model>${c.reset}\n`)
280
+ }
281
+ rl.prompt()
282
+ return
283
+ }
284
+
285
+ if (input === '/memory') {
286
+ await showMemoryList()
287
+ rl.prompt()
288
+ return
289
+ }
290
+
291
+ if (input === '/status') {
292
+ await showStatus()
293
+ rl.prompt()
294
+ return
295
+ }
296
+
297
+ // Chat Turn Execution
298
+ process.stdout.write(` ${c.darkGray}● Berpikir...${c.reset}\r`)
299
+ try {
300
+ const response = await fetch(`${SERVER_URL}/api/chat`, {
301
+ method: 'POST',
302
+ headers: { 'Content-Type': 'application/json' },
303
+ body: JSON.stringify({ message: input, sessionId: 'cli' })
304
+ })
305
+ process.stdout.write('\r\x1b[K')
306
+ const data = await response.json()
307
+ if (data.answer) {
308
+ printAssistantAnswer(data.answer)
309
+ } else if (data.error || !response.ok) {
310
+ const errorMsg = data.error?.message || data.error || `HTTP error ${response.status}`
311
+ console.log(`\n ${c.red}● Error:${c.reset} ${c.white}${errorMsg}${c.reset}`)
312
+ if (errorMsg.includes('Cookie') || errorMsg.includes('Google menolak') || errorMsg.includes('Session')) {
313
+ console.log(` ${c.darkGray}Tip: Provider saat ini adalah 'gemini-web'. Ketik ${c.green}/provider lm-studio${c.darkGray} untuk beralih ke Local LLM.${c.reset}\n`)
314
+ } else {
315
+ console.log()
316
+ }
317
+ } else {
318
+ console.log(` ${c.gray}(Tidak ada respons)${c.reset}\n`)
319
+ }
320
+ } catch (err) {
321
+ process.stdout.write('\r\x1b[K')
322
+ console.log(`\n ${c.red}● Error:${c.reset} ${c.white}${err.message}${c.reset}\n`)
323
+ }
324
+
325
+ rl.prompt()
326
+ })
327
+ }
328
+
329
+ // Jalankan jika dipanggil secara mandiri
330
+ if (process.argv[1]?.endsWith('cli/index.js')) {
331
+ runCLI().catch((err) => console.error('[CLI Fatal Error]:', err))
332
+ }