@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,253 @@
1
+ Add-Type -AssemblyName System.Windows.Forms
2
+ Add-Type -AssemblyName System.Drawing
3
+
4
+ $cSharpCode = @"
5
+ using System;
6
+ using System.Drawing;
7
+ using System.Drawing.Drawing2D;
8
+ using System.Drawing.Text;
9
+ using System.Runtime.InteropServices;
10
+ using System.Diagnostics;
11
+ using System.Windows.Forms;
12
+
13
+ public class MarkPcOverlayForm : Form {
14
+ private const int WH_MOUSE_LL = 14;
15
+ private const int WH_KEYBOARD_LL = 13;
16
+ private const uint LLMHF_INJECTED = 0x01;
17
+ private const uint LLMHF_LOWER_IL_INJECTED = 0x02;
18
+ private const int WM_KEYDOWN = 0x0100;
19
+ private const int WM_SYSKEYDOWN = 0x0104;
20
+
21
+ private const int VK_S = 0x53;
22
+ private const int VK_CONTROL = 0x11;
23
+ private const int VK_SHIFT = 0x10;
24
+ private const int VK_LCONTROL = 0xA2;
25
+ private const int VK_RCONTROL = 0xA3;
26
+ private const int VK_LSHIFT = 0xA0;
27
+ private const int VK_RSHIFT = 0xA1;
28
+
29
+ [StructLayout(LayoutKind.Sequential)]
30
+ private struct MSLLHOOKSTRUCT {
31
+ public int x;
32
+ public int y;
33
+ public uint mouseData;
34
+ public uint flags;
35
+ public uint time;
36
+ public IntPtr dwExtraInfo;
37
+ }
38
+
39
+ [StructLayout(LayoutKind.Sequential)]
40
+ private struct KBDLLHOOKSTRUCT {
41
+ public uint vkCode;
42
+ public uint scanCode;
43
+ public uint flags;
44
+ public uint time;
45
+ public IntPtr dwExtraInfo;
46
+ }
47
+
48
+ private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
49
+
50
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
51
+ private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
52
+
53
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
54
+ [return: MarshalAs(UnmanagedType.Bool)]
55
+ private static extern bool UnhookWindowsHookEx(IntPtr hhk);
56
+
57
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
58
+ private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
59
+
60
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
61
+ private static extern IntPtr GetModuleHandle(string lpModuleName);
62
+
63
+ [DllImport("user32.dll")]
64
+ private static extern short GetAsyncKeyState(int vKey);
65
+
66
+ private static IntPtr _mouseHook = IntPtr.Zero;
67
+ private static IntPtr _kbdHook = IntPtr.Zero;
68
+ private static HookProc _mouseProc = MouseHookCallback;
69
+ private static HookProc _kbdProc = KbdHookCallback;
70
+
71
+ public static MarkPcOverlayForm Instance = null;
72
+ public static bool IsAborted = false;
73
+
74
+ private Timer pulseTimer;
75
+ private int pulseAlpha = 255;
76
+ private bool pulseDec = true;
77
+
78
+ public MarkPcOverlayForm() {
79
+ this.FormBorderStyle = FormBorderStyle.None;
80
+ this.StartPosition = FormStartPosition.Manual;
81
+ this.TopMost = true;
82
+ this.ShowInTaskbar = false;
83
+ this.Size = new Size(510, 36);
84
+ this.BackColor = Color.FromArgb(15, 23, 21); // #0f1715 Mark Theme Base
85
+ this.Opacity = 0.98;
86
+
87
+ this.SetStyle(ControlStyles.AllPaintingInWmPaint |
88
+ ControlStyles.UserPaint |
89
+ ControlStyles.OptimizedDoubleBuffer |
90
+ ControlStyles.ResizeRedraw, true);
91
+
92
+ Rectangle primary = Screen.PrimaryScreen.Bounds;
93
+ int x = (primary.Width - this.Width) / 2;
94
+ int y = 16;
95
+ this.Location = new Point(x, y);
96
+
97
+ pulseTimer = new Timer();
98
+ pulseTimer.Interval = 40;
99
+ pulseTimer.Tick += (s, e) => {
100
+ if (pulseDec) {
101
+ pulseAlpha -= 14;
102
+ if (pulseAlpha <= 100) pulseDec = false;
103
+ } else {
104
+ pulseAlpha += 14;
105
+ if (pulseAlpha >= 255) pulseDec = true;
106
+ }
107
+ this.Invalidate();
108
+ };
109
+ pulseTimer.Start();
110
+
111
+ Instance = this;
112
+ InitHooks();
113
+ }
114
+
115
+ public static void InitHooks() {
116
+ using (Process curProcess = Process.GetCurrentProcess())
117
+ using (ProcessModule curModule = curProcess.MainModule) {
118
+ IntPtr hModule = GetModuleHandle(curModule.ModuleName);
119
+ _mouseHook = SetWindowsHookEx(WH_MOUSE_LL, _mouseProc, hModule, 0);
120
+ _kbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _kbdProc, hModule, 0);
121
+ }
122
+
123
+ AppDomain.CurrentDomain.ProcessExit += (s, e) => {
124
+ CleanupHooks();
125
+ };
126
+ }
127
+
128
+ public static void CleanupHooks() {
129
+ if (_mouseHook != IntPtr.Zero) {
130
+ UnhookWindowsHookEx(_mouseHook);
131
+ _mouseHook = IntPtr.Zero;
132
+ }
133
+ if (_kbdHook != IntPtr.Zero) {
134
+ UnhookWindowsHookEx(_kbdHook);
135
+ _kbdHook = IntPtr.Zero;
136
+ }
137
+ }
138
+
139
+ public static void TriggerAbort() {
140
+ if (IsAborted) return;
141
+ IsAborted = true;
142
+ Console.WriteLine("{\"event\":\"abort\"}");
143
+ CleanupHooks();
144
+ if (Instance != null && !Instance.IsDisposed) {
145
+ try {
146
+ Instance.BeginInvoke(new Action(() => {
147
+ Instance.Close();
148
+ }));
149
+ } catch {}
150
+ }
151
+ }
152
+
153
+ private static IntPtr MouseHookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
154
+ if (nCode >= 0) {
155
+ MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
156
+
157
+ // Allow injected events (AI automation) to pass, block physical user movements
158
+ bool isInjected = (hookStruct.flags & LLMHF_INJECTED) != 0 ||
159
+ (hookStruct.flags & LLMHF_LOWER_IL_INJECTED) != 0;
160
+
161
+ if (!isInjected) {
162
+ return (IntPtr)1; // Block physical mouse movement 100%
163
+ }
164
+ }
165
+ return CallNextHookEx(_mouseHook, nCode, wParam, lParam);
166
+ }
167
+
168
+ private static IntPtr KbdHookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
169
+ if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)) {
170
+ KBDLLHOOKSTRUCT kb = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
171
+ if (kb.vkCode == VK_S) {
172
+ bool isCtrl = (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0 ||
173
+ (GetAsyncKeyState(VK_LCONTROL) & 0x8000) != 0 ||
174
+ (GetAsyncKeyState(VK_RCONTROL) & 0x8000) != 0;
175
+ bool isShift = (GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0 ||
176
+ (GetAsyncKeyState(VK_LSHIFT) & 0x8000) != 0 ||
177
+ (GetAsyncKeyState(VK_RSHIFT) & 0x8000) != 0;
178
+
179
+ if (isCtrl && isShift) {
180
+ TriggerAbort();
181
+ return (IntPtr)1; // Block key
182
+ }
183
+ }
184
+ }
185
+ return CallNextHookEx(_kbdHook, nCode, wParam, lParam);
186
+ }
187
+
188
+ protected override void OnPaint(PaintEventArgs e) {
189
+ base.OnPaint(e);
190
+ Graphics g = e.Graphics;
191
+ g.SmoothingMode = SmoothingMode.AntiAlias;
192
+ g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
193
+
194
+ // Background Dark Ground (#0f1715)
195
+ using (SolidBrush bgBrush = new SolidBrush(Color.FromArgb(15, 23, 21))) {
196
+ g.FillRectangle(bgBrush, 0, 0, this.Width, this.Height);
197
+ }
198
+
199
+ // Animated Pulsing Red Dot (Recording / Locked state indicator)
200
+ using (SolidBrush dotBrush = new SolidBrush(Color.FromArgb(pulseAlpha, 239, 68, 68))) {
201
+ g.FillEllipse(dotBrush, 14, (this.Height - 8) / 2, 8, 8);
202
+ }
203
+
204
+ // Fonts & Typography
205
+ using (Font fontBold = new Font("Segoe UI", 9.0f, FontStyle.Bold))
206
+ using (Font fontRegular = new Font("Segoe UI", 9.0f, FontStyle.Regular))
207
+ using (SolidBrush textGreen = new SolidBrush(Color.FromArgb(31, 184, 84))) // #1fb854 Mark Green
208
+ using (SolidBrush textWhite = new SolidBrush(Color.FromArgb(240, 240, 240)))
209
+ using (SolidBrush textMuted = new SolidBrush(Color.FromArgb(150, 165, 158)))
210
+ using (Pen divPen = new Pen(Color.FromArgb(35, 75, 60), 1.0f))
211
+ {
212
+ float curX = 30;
213
+ float textY = (this.Height - fontRegular.Height) / 2.0f;
214
+
215
+ // [MARK PC AUTOMATION]
216
+ string tag = "MARK PC AUTOMATION";
217
+ g.DrawString(tag, fontBold, textGreen, curX, textY);
218
+ curX += g.MeasureString(tag, fontBold).Width + 10;
219
+
220
+ // Divider Line 1
221
+ g.DrawLine(divPen, curX, 8, curX, this.Height - 8);
222
+ curX += 10;
223
+
224
+ // Hotkey Instruction Text
225
+ string cancelPrefix = "Buka Kunci Mouse: ";
226
+ g.DrawString(cancelPrefix, fontRegular, textMuted, curX, textY);
227
+ curX += g.MeasureString(cancelPrefix, fontRegular).Width;
228
+
229
+ string hotkey = "Ctrl + Shift + S";
230
+ g.DrawString(hotkey, fontBold, textGreen, curX, textY);
231
+ }
232
+ }
233
+
234
+ protected override void Dispose(bool disposing) {
235
+ if (disposing) {
236
+ CleanupHooks();
237
+ if (pulseTimer != null) {
238
+ pulseTimer.Stop();
239
+ pulseTimer.Dispose();
240
+ }
241
+ }
242
+ base.Dispose(disposing);
243
+ }
244
+ }
245
+ "@
246
+
247
+ Add-Type -TypeDefinition $cSharpCode -ReferencedAssemblies "System.Windows.Forms", "System.Drawing"
248
+
249
+ [System.Windows.Forms.Application]::EnableVisualStyles()
250
+
251
+ $overlay = New-Object MarkPcOverlayForm
252
+ [System.Console]::WriteLine("READY")
253
+ [System.Windows.Forms.Application]::Run($overlay)
@@ -0,0 +1,33 @@
1
+ [CmdletBinding()]
2
+ param(
3
+ [string]$Title = "Pilih Folder Workspace Proyek"
4
+ )
5
+
6
+ $ErrorActionPreference = 'SilentlyContinue'
7
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
8
+
9
+ Add-Type -AssemblyName System.Windows.Forms
10
+
11
+ # Gunakan Form TopMost sebagai Owner agar dialog pasti muncul di paling depan
12
+ $owner = New-Object System.Windows.Forms.Form
13
+ $owner.TopMost = $true
14
+ $owner.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
15
+ $owner.Width = 0
16
+ $owner.Height = 0
17
+ $owner.ShowInTaskbar = $false
18
+ $owner.Opacity = 0
19
+ $owner.Show()
20
+ $owner.Activate()
21
+
22
+ $dialog = New-Object System.Windows.Forms.FolderBrowserDialog
23
+ $dialog.Description = $Title
24
+ $dialog.ShowNewFolderButton = $true
25
+
26
+ $res = $dialog.ShowDialog($owner)
27
+
28
+ if ($res -eq [System.Windows.Forms.DialogResult]::OK -and -not [string]::IsNullOrWhiteSpace($dialog.SelectedPath)) {
29
+ [Console]::Out.Write($dialog.SelectedPath)
30
+ }
31
+
32
+ $owner.Close()
33
+ $owner.Dispose()
@@ -0,0 +1,181 @@
1
+ # read-ui.ps1
2
+ # Windows UIAutomation Accessibility Tree reader for MARK PC Automation
3
+ # Zero Vision Cost: Extracts interactive GUI elements as JSON text (~200-400 tokens)
4
+
5
+ $ErrorActionPreference = "SilentlyContinue"
6
+
7
+ Add-Type -AssemblyName UIAutomationClient
8
+ Add-Type -AssemblyName UIAutomationTypes
9
+ Add-Type -AssemblyName System.Windows.Forms
10
+
11
+ # Get foreground window handle
12
+ $code = @"
13
+ using System;
14
+ using System.Runtime.InteropServices;
15
+ using System.Text;
16
+
17
+ public class Win32 {
18
+ [DllImport("user32.dll")]
19
+ public static extern IntPtr GetForegroundWindow();
20
+
21
+ [DllImport("user32.dll", CharSet = CharSet.Unicode)]
22
+ public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
23
+
24
+ [DllImport("user32.dll")]
25
+ public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
26
+
27
+ [DllImport("user32.dll")]
28
+ public static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
29
+
30
+ [DllImport("user32.dll")]
31
+ public static extern bool IsWindowVisible(IntPtr hWnd);
32
+
33
+ [DllImport("user32.dll")]
34
+ public static extern bool IsIconic(IntPtr hWnd);
35
+
36
+ [DllImport("user32.dll")]
37
+ public static extern int GetWindowTextLength(IntPtr hWnd);
38
+
39
+ [DllImport("user32.dll")]
40
+ public static extern bool SetForegroundWindow(IntPtr hWnd);
41
+
42
+ public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
43
+
44
+ public static bool IsMarkWindow(string title) {
45
+ if (string.IsNullOrWhiteSpace(title)) return true;
46
+ string t = title.Trim();
47
+ if (t == "Program Manager" || t == "Default IME" || t.StartsWith("MSCTFIME")) return true;
48
+ string lower = t.ToLower();
49
+ if (lower == "mark" || lower.StartsWith("mark -") || lower.StartsWith("mark_pc_stop") || lower.StartsWith("mark_unblock") || lower.Contains("mark agent") || lower.Contains("mark pc automation")) {
50
+ return true;
51
+ }
52
+ return false;
53
+ }
54
+
55
+ public static IntPtr GetTargetWindow() {
56
+ IntPtr fg = GetForegroundWindow();
57
+ string fgTitle = "";
58
+ int fgLen = GetWindowTextLength(fg);
59
+ if (fgLen > 0) {
60
+ StringBuilder fgSb = new StringBuilder(fgLen + 1);
61
+ GetWindowText(fg, fgSb, fgSb.Capacity);
62
+ fgTitle = fgSb.ToString();
63
+ }
64
+
65
+ if (!IsMarkWindow(fgTitle)) {
66
+ return fg;
67
+ }
68
+
69
+ IntPtr target = IntPtr.Zero;
70
+ EnumWindows(delegate(IntPtr hWnd, IntPtr lParam) {
71
+ if (!IsWindowVisible(hWnd) || IsIconic(hWnd)) return true;
72
+ int len = GetWindowTextLength(hWnd);
73
+ if (len <= 0) return true;
74
+ StringBuilder sb = new StringBuilder(len + 1);
75
+ GetWindowText(hWnd, sb, sb.Capacity);
76
+ string title = sb.ToString();
77
+
78
+ if (!IsMarkWindow(title)) {
79
+ target = hWnd;
80
+ return false;
81
+ }
82
+ return true;
83
+ }, IntPtr.Zero);
84
+
85
+ if (target != IntPtr.Zero) {
86
+ SetForegroundWindow(target);
87
+ return target;
88
+ }
89
+ return fg;
90
+ }
91
+ }
92
+ "@
93
+ Add-Type -TypeDefinition $code -Language CSharp
94
+
95
+ $hwnd = [Win32]::GetTargetWindow()
96
+ $titleBuilder = New-Object System.Text.StringBuilder 512
97
+ [Win32]::GetWindowText($hwnd, $titleBuilder, $titleBuilder.Capacity) | Out-Null
98
+ $windowTitle = $titleBuilder.ToString()
99
+
100
+ $processId = 0
101
+ [Win32]::GetWindowThreadProcessId($hwnd, [ref]$processId) | Out-Null
102
+ $processName = "unknown"
103
+ if ($processId -gt 0) {
104
+ try {
105
+ $proc = Get-Process -Id $processId
106
+ $processName = $proc.ProcessName + ".exe"
107
+ } catch {}
108
+ }
109
+
110
+ # Traverse Accessibility Tree of Foreground Window
111
+ $elements = @()
112
+ $idCounter = 1
113
+
114
+ try {
115
+ $windowElement = [System.Windows.Automation.AutomationElement]::FromHandle($hwnd)
116
+ if ($windowElement) {
117
+ $condition = [System.Windows.Automation.Condition]::TrueCondition
118
+ $treeWalker = [System.Windows.Automation.TreeWalker]::ControlViewWalker
119
+
120
+ # We search descendants using FindAll with TrueCondition, limited to top 60 interactive elements
121
+ $allControls = $windowElement.FindAll([System.Windows.Automation.TreeScope]::Descendants, $condition)
122
+
123
+ foreach ($el in $allControls) {
124
+ if ($idCounter -gt 60) { break }
125
+
126
+ # Check if element is enabled and offscreen=false
127
+ $enabled = $el.Current.IsEnabled
128
+ $offscreen = $el.Current.IsOffscreen
129
+ if (-not $enabled -or $offscreen) { continue }
130
+
131
+ $role = $el.Current.ControlType.ProgrammaticName.Replace("ControlType.", "")
132
+ $interactiveRoles = @("Button", "Edit", "MenuItem", "TabItem", "ComboBox", "CheckBox", "RadioButton", "Hyperlink", "ListItem", "TreeItem", "DataItem", "Text")
133
+ if ($interactiveRoles -notcontains $role) { continue }
134
+
135
+ $name = $el.Current.Name
136
+ $autoId = $el.Current.AutomationId
137
+ $rect = $el.Current.BoundingRectangle
138
+
139
+ # Skip elements with empty name & empty autoId unless it's an Edit control
140
+ if ([string]::IsNullOrWhiteSpace($name) -and [string]::IsNullOrWhiteSpace($autoId) -and $role -ne "Edit") {
141
+ continue
142
+ }
143
+
144
+ # Extract Value if Edit
145
+ $val = ""
146
+ if ($role -eq "Edit") {
147
+ try {
148
+ $valuePattern = $el.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)
149
+ if ($valuePattern) { $val = $valuePattern.Current.Value }
150
+ } catch {}
151
+ }
152
+
153
+ $elementObj = @{
154
+ id = $idCounter
155
+ name = if ($name) { $name } else { $autoId }
156
+ role = $role
157
+ rect = @([int]$rect.X, [int]$rect.Y, [int]$rect.Width, [int]$rect.Height)
158
+ }
159
+ if ($val) {
160
+ $elementObj["value"] = $val
161
+ }
162
+
163
+ $elements += $elementObj
164
+ $idCounter++
165
+ }
166
+ }
167
+ } catch {
168
+ # If error reading Accessibility Tree, return empty elements array so caller can fallback to OCR
169
+ }
170
+
171
+ $output = @{
172
+ window = $windowTitle
173
+ process = $processName
174
+ elements = $elements
175
+ element_count = $elements.Count
176
+ method = "uiautomation"
177
+ }
178
+
179
+ $json = $output | ConvertTo-Json -Depth 5 -Compress
180
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
181
+ Write-Output $json
@@ -0,0 +1,24 @@
1
+ Add-Type -AssemblyName System.Windows.Forms
2
+ Add-Type -AssemblyName System.Drawing
3
+
4
+ $screens = [System.Windows.Forms.Screen]::AllScreens
5
+ $results = @()
6
+
7
+ foreach ($screen in $screens) {
8
+ $bounds = $screen.Bounds
9
+ $bitmap = New-Object System.Drawing.Bitmap $bounds.Width, $bounds.Height
10
+ $graphics = [System.Drawing.Graphics]::FromImage($bitmap)
11
+ $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size)
12
+
13
+ $memoryStream = New-Object System.IO.MemoryStream
14
+ $bitmap.Save($memoryStream, [System.Drawing.Imaging.ImageFormat]::Jpeg)
15
+ $base64 = [Convert]::ToBase64String($memoryStream.ToArray())
16
+
17
+ $graphics.Dispose()
18
+ $bitmap.Dispose()
19
+ $memoryStream.Dispose()
20
+
21
+ $results += $base64
22
+ }
23
+
24
+ Write-Output ($results -join '|||')