@usejarvis/brain 0.1.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 (266) hide show
  1. package/LICENSE +153 -0
  2. package/README.md +278 -0
  3. package/bin/jarvis.ts +413 -0
  4. package/package.json +74 -0
  5. package/scripts/ensure-bun.cjs +8 -0
  6. package/src/actions/README.md +421 -0
  7. package/src/actions/app-control/desktop-controller.test.ts +26 -0
  8. package/src/actions/app-control/desktop-controller.ts +438 -0
  9. package/src/actions/app-control/interface.ts +64 -0
  10. package/src/actions/app-control/linux.ts +273 -0
  11. package/src/actions/app-control/macos.ts +54 -0
  12. package/src/actions/app-control/sidecar-launcher.test.ts +23 -0
  13. package/src/actions/app-control/sidecar-launcher.ts +286 -0
  14. package/src/actions/app-control/windows.ts +44 -0
  15. package/src/actions/browser/cdp.ts +138 -0
  16. package/src/actions/browser/chrome-launcher.ts +252 -0
  17. package/src/actions/browser/session.ts +437 -0
  18. package/src/actions/browser/stealth.ts +49 -0
  19. package/src/actions/index.ts +20 -0
  20. package/src/actions/terminal/executor.ts +157 -0
  21. package/src/actions/terminal/wsl-bridge.ts +126 -0
  22. package/src/actions/test.ts +93 -0
  23. package/src/actions/tools/agents.ts +321 -0
  24. package/src/actions/tools/builtin.ts +846 -0
  25. package/src/actions/tools/commitments.ts +192 -0
  26. package/src/actions/tools/content.ts +217 -0
  27. package/src/actions/tools/delegate.ts +147 -0
  28. package/src/actions/tools/desktop.test.ts +55 -0
  29. package/src/actions/tools/desktop.ts +305 -0
  30. package/src/actions/tools/goals.ts +376 -0
  31. package/src/actions/tools/local-tools-guard.ts +20 -0
  32. package/src/actions/tools/registry.ts +171 -0
  33. package/src/actions/tools/research.ts +111 -0
  34. package/src/actions/tools/sidecar-list.ts +57 -0
  35. package/src/actions/tools/sidecar-route.ts +105 -0
  36. package/src/actions/tools/workflows.ts +216 -0
  37. package/src/agents/agent.ts +132 -0
  38. package/src/agents/delegation.ts +107 -0
  39. package/src/agents/hierarchy.ts +113 -0
  40. package/src/agents/index.ts +19 -0
  41. package/src/agents/messaging.ts +125 -0
  42. package/src/agents/orchestrator.ts +576 -0
  43. package/src/agents/role-discovery.ts +61 -0
  44. package/src/agents/sub-agent-runner.ts +307 -0
  45. package/src/agents/task-manager.ts +151 -0
  46. package/src/authority/approval-delivery.ts +59 -0
  47. package/src/authority/approval.ts +196 -0
  48. package/src/authority/audit.ts +158 -0
  49. package/src/authority/authority.test.ts +519 -0
  50. package/src/authority/deferred-executor.ts +103 -0
  51. package/src/authority/emergency.ts +66 -0
  52. package/src/authority/engine.ts +297 -0
  53. package/src/authority/index.ts +12 -0
  54. package/src/authority/learning.ts +111 -0
  55. package/src/authority/tool-action-map.ts +74 -0
  56. package/src/awareness/analytics.ts +466 -0
  57. package/src/awareness/awareness.test.ts +332 -0
  58. package/src/awareness/capture-engine.ts +305 -0
  59. package/src/awareness/context-graph.ts +130 -0
  60. package/src/awareness/context-tracker.ts +349 -0
  61. package/src/awareness/index.ts +25 -0
  62. package/src/awareness/intelligence.ts +321 -0
  63. package/src/awareness/ocr-engine.ts +88 -0
  64. package/src/awareness/service.ts +528 -0
  65. package/src/awareness/struggle-detector.ts +342 -0
  66. package/src/awareness/suggestion-engine.ts +476 -0
  67. package/src/awareness/types.ts +201 -0
  68. package/src/cli/autostart.ts +241 -0
  69. package/src/cli/deps.ts +449 -0
  70. package/src/cli/doctor.ts +230 -0
  71. package/src/cli/helpers.ts +401 -0
  72. package/src/cli/onboard.ts +580 -0
  73. package/src/comms/README.md +329 -0
  74. package/src/comms/auth-error.html +48 -0
  75. package/src/comms/channels/discord.ts +228 -0
  76. package/src/comms/channels/signal.ts +56 -0
  77. package/src/comms/channels/telegram.ts +316 -0
  78. package/src/comms/channels/whatsapp.ts +60 -0
  79. package/src/comms/channels.test.ts +173 -0
  80. package/src/comms/desktop-notify.ts +114 -0
  81. package/src/comms/example.ts +129 -0
  82. package/src/comms/index.ts +129 -0
  83. package/src/comms/streaming.ts +142 -0
  84. package/src/comms/voice.test.ts +152 -0
  85. package/src/comms/voice.ts +291 -0
  86. package/src/comms/websocket.test.ts +409 -0
  87. package/src/comms/websocket.ts +473 -0
  88. package/src/config/README.md +387 -0
  89. package/src/config/index.ts +6 -0
  90. package/src/config/loader.test.ts +137 -0
  91. package/src/config/loader.ts +142 -0
  92. package/src/config/types.ts +260 -0
  93. package/src/daemon/README.md +232 -0
  94. package/src/daemon/agent-service-interface.ts +9 -0
  95. package/src/daemon/agent-service.ts +600 -0
  96. package/src/daemon/api-routes.ts +2119 -0
  97. package/src/daemon/background-agent-service.ts +396 -0
  98. package/src/daemon/background-agent.test.ts +78 -0
  99. package/src/daemon/channel-service.ts +201 -0
  100. package/src/daemon/commitment-executor.ts +297 -0
  101. package/src/daemon/event-classifier.ts +239 -0
  102. package/src/daemon/event-coalescer.ts +123 -0
  103. package/src/daemon/event-reactor.ts +214 -0
  104. package/src/daemon/health.ts +220 -0
  105. package/src/daemon/index.ts +1004 -0
  106. package/src/daemon/llm-settings.ts +316 -0
  107. package/src/daemon/observer-service.ts +150 -0
  108. package/src/daemon/pid.ts +98 -0
  109. package/src/daemon/research-queue.ts +155 -0
  110. package/src/daemon/services.ts +175 -0
  111. package/src/daemon/ws-service.ts +788 -0
  112. package/src/goals/accountability.ts +240 -0
  113. package/src/goals/awareness-bridge.ts +185 -0
  114. package/src/goals/estimator.ts +185 -0
  115. package/src/goals/events.ts +28 -0
  116. package/src/goals/goals.test.ts +400 -0
  117. package/src/goals/integration.test.ts +329 -0
  118. package/src/goals/nl-builder.test.ts +220 -0
  119. package/src/goals/nl-builder.ts +256 -0
  120. package/src/goals/rhythm.test.ts +177 -0
  121. package/src/goals/rhythm.ts +275 -0
  122. package/src/goals/service.test.ts +135 -0
  123. package/src/goals/service.ts +348 -0
  124. package/src/goals/types.ts +106 -0
  125. package/src/goals/workflow-bridge.ts +96 -0
  126. package/src/integrations/google-api.ts +134 -0
  127. package/src/integrations/google-auth.ts +175 -0
  128. package/src/llm/README.md +291 -0
  129. package/src/llm/anthropic.ts +386 -0
  130. package/src/llm/gemini.ts +371 -0
  131. package/src/llm/index.ts +19 -0
  132. package/src/llm/manager.ts +153 -0
  133. package/src/llm/ollama.ts +307 -0
  134. package/src/llm/openai.ts +350 -0
  135. package/src/llm/provider.test.ts +231 -0
  136. package/src/llm/provider.ts +60 -0
  137. package/src/llm/test.ts +87 -0
  138. package/src/observers/README.md +278 -0
  139. package/src/observers/calendar.ts +113 -0
  140. package/src/observers/clipboard.ts +136 -0
  141. package/src/observers/email.ts +109 -0
  142. package/src/observers/example.ts +58 -0
  143. package/src/observers/file-watcher.ts +124 -0
  144. package/src/observers/index.ts +159 -0
  145. package/src/observers/notifications.ts +197 -0
  146. package/src/observers/observers.test.ts +203 -0
  147. package/src/observers/processes.ts +225 -0
  148. package/src/personality/README.md +61 -0
  149. package/src/personality/adapter.ts +196 -0
  150. package/src/personality/index.ts +20 -0
  151. package/src/personality/learner.ts +209 -0
  152. package/src/personality/model.ts +132 -0
  153. package/src/personality/personality.test.ts +236 -0
  154. package/src/roles/README.md +252 -0
  155. package/src/roles/authority.ts +119 -0
  156. package/src/roles/example-usage.ts +198 -0
  157. package/src/roles/index.ts +42 -0
  158. package/src/roles/loader.ts +143 -0
  159. package/src/roles/prompt-builder.ts +194 -0
  160. package/src/roles/test-multi.ts +102 -0
  161. package/src/roles/test-role.yaml +77 -0
  162. package/src/roles/test-utils.ts +93 -0
  163. package/src/roles/test.ts +106 -0
  164. package/src/roles/tool-guide.ts +190 -0
  165. package/src/roles/types.ts +36 -0
  166. package/src/roles/utils.ts +200 -0
  167. package/src/scripts/google-setup.ts +168 -0
  168. package/src/sidecar/connection.ts +179 -0
  169. package/src/sidecar/index.ts +6 -0
  170. package/src/sidecar/manager.ts +542 -0
  171. package/src/sidecar/protocol.ts +85 -0
  172. package/src/sidecar/rpc.ts +161 -0
  173. package/src/sidecar/scheduler.ts +136 -0
  174. package/src/sidecar/types.ts +112 -0
  175. package/src/sidecar/validator.ts +144 -0
  176. package/src/vault/README.md +110 -0
  177. package/src/vault/awareness.ts +341 -0
  178. package/src/vault/commitments.ts +299 -0
  179. package/src/vault/content-pipeline.ts +260 -0
  180. package/src/vault/conversations.ts +173 -0
  181. package/src/vault/entities.ts +180 -0
  182. package/src/vault/extractor.test.ts +356 -0
  183. package/src/vault/extractor.ts +345 -0
  184. package/src/vault/facts.ts +190 -0
  185. package/src/vault/goals.ts +477 -0
  186. package/src/vault/index.ts +87 -0
  187. package/src/vault/keychain.ts +99 -0
  188. package/src/vault/observations.ts +115 -0
  189. package/src/vault/relationships.ts +178 -0
  190. package/src/vault/retrieval.test.ts +126 -0
  191. package/src/vault/retrieval.ts +227 -0
  192. package/src/vault/schema.ts +658 -0
  193. package/src/vault/settings.ts +38 -0
  194. package/src/vault/vectors.ts +92 -0
  195. package/src/vault/workflows.ts +403 -0
  196. package/src/workflows/auto-suggest.ts +290 -0
  197. package/src/workflows/engine.ts +366 -0
  198. package/src/workflows/events.ts +24 -0
  199. package/src/workflows/executor.ts +207 -0
  200. package/src/workflows/nl-builder.ts +198 -0
  201. package/src/workflows/nodes/actions/agent-task.ts +73 -0
  202. package/src/workflows/nodes/actions/calendar-action.ts +85 -0
  203. package/src/workflows/nodes/actions/code-execution.ts +73 -0
  204. package/src/workflows/nodes/actions/discord.ts +77 -0
  205. package/src/workflows/nodes/actions/file-write.ts +73 -0
  206. package/src/workflows/nodes/actions/gmail.ts +69 -0
  207. package/src/workflows/nodes/actions/http-request.ts +117 -0
  208. package/src/workflows/nodes/actions/notification.ts +85 -0
  209. package/src/workflows/nodes/actions/run-tool.ts +55 -0
  210. package/src/workflows/nodes/actions/send-message.ts +82 -0
  211. package/src/workflows/nodes/actions/shell-command.ts +76 -0
  212. package/src/workflows/nodes/actions/telegram.ts +60 -0
  213. package/src/workflows/nodes/builtin.ts +119 -0
  214. package/src/workflows/nodes/error/error-handler.ts +37 -0
  215. package/src/workflows/nodes/error/fallback.ts +47 -0
  216. package/src/workflows/nodes/error/retry.ts +82 -0
  217. package/src/workflows/nodes/logic/delay.ts +42 -0
  218. package/src/workflows/nodes/logic/if-else.ts +41 -0
  219. package/src/workflows/nodes/logic/loop.ts +90 -0
  220. package/src/workflows/nodes/logic/merge.ts +38 -0
  221. package/src/workflows/nodes/logic/race.ts +40 -0
  222. package/src/workflows/nodes/logic/switch.ts +59 -0
  223. package/src/workflows/nodes/logic/template-render.ts +53 -0
  224. package/src/workflows/nodes/logic/variable-get.ts +37 -0
  225. package/src/workflows/nodes/logic/variable-set.ts +59 -0
  226. package/src/workflows/nodes/registry.ts +99 -0
  227. package/src/workflows/nodes/transform/aggregate.ts +99 -0
  228. package/src/workflows/nodes/transform/csv-parse.ts +70 -0
  229. package/src/workflows/nodes/transform/json-parse.ts +63 -0
  230. package/src/workflows/nodes/transform/map-filter.ts +84 -0
  231. package/src/workflows/nodes/transform/regex-match.ts +89 -0
  232. package/src/workflows/nodes/triggers/calendar.ts +33 -0
  233. package/src/workflows/nodes/triggers/clipboard.ts +32 -0
  234. package/src/workflows/nodes/triggers/cron.ts +40 -0
  235. package/src/workflows/nodes/triggers/email.ts +40 -0
  236. package/src/workflows/nodes/triggers/file-change.ts +45 -0
  237. package/src/workflows/nodes/triggers/git.ts +46 -0
  238. package/src/workflows/nodes/triggers/manual.ts +23 -0
  239. package/src/workflows/nodes/triggers/poll.ts +81 -0
  240. package/src/workflows/nodes/triggers/process.ts +44 -0
  241. package/src/workflows/nodes/triggers/screen-event.ts +37 -0
  242. package/src/workflows/nodes/triggers/webhook.ts +39 -0
  243. package/src/workflows/safe-eval.ts +139 -0
  244. package/src/workflows/template.ts +118 -0
  245. package/src/workflows/triggers/cron.ts +311 -0
  246. package/src/workflows/triggers/manager.ts +285 -0
  247. package/src/workflows/triggers/observer-bridge.ts +172 -0
  248. package/src/workflows/triggers/poller.ts +201 -0
  249. package/src/workflows/triggers/screen-condition.ts +218 -0
  250. package/src/workflows/triggers/triggers.test.ts +740 -0
  251. package/src/workflows/triggers/webhook.ts +191 -0
  252. package/src/workflows/types.ts +133 -0
  253. package/src/workflows/variables.ts +72 -0
  254. package/src/workflows/workflows.test.ts +383 -0
  255. package/src/workflows/yaml.ts +104 -0
  256. package/ui/dist/index-j75njzc1.css +1199 -0
  257. package/ui/dist/index-p2zh407q.js +80603 -0
  258. package/ui/dist/index.html +13 -0
  259. package/ui/public/openwakeword/models/embedding_model.onnx +0 -0
  260. package/ui/public/openwakeword/models/hey_jarvis_v0.1.onnx +0 -0
  261. package/ui/public/openwakeword/models/melspectrogram.onnx +0 -0
  262. package/ui/public/openwakeword/models/silero_vad.onnx +0 -0
  263. package/ui/public/ort/ort-wasm-simd-threaded.jsep.mjs +106 -0
  264. package/ui/public/ort/ort-wasm-simd-threaded.jsep.wasm +0 -0
  265. package/ui/public/ort/ort-wasm-simd-threaded.mjs +59 -0
  266. package/ui/public/ort/ort-wasm-simd-threaded.wasm +0 -0
@@ -0,0 +1,421 @@
1
+ # J.A.R.V.I.S. Action Layer
2
+
3
+ The Action Layer provides cross-platform interfaces for controlling applications, browsers, terminals, and managing tool execution.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ src/actions/
9
+ ├── app-control/ # Cross-platform application control
10
+ │ ├── interface.ts # Common interface & platform factory
11
+ │ ├── linux.ts # Linux/X11 implementation
12
+ │ ├── windows.ts # Windows stub (UI Automation)
13
+ │ └── macos.ts # macOS stub (AXUIElement)
14
+ ├── browser/ # Chrome DevTools Protocol
15
+ │ ├── cdp.ts # CDP client implementation
16
+ │ └── session.ts # Browser session management
17
+ ├── terminal/ # Command execution
18
+ │ ├── executor.ts # Shell command executor
19
+ │ └── wsl-bridge.ts # WSL integration
20
+ ├── tools/ # Tool registry & execution
21
+ │ └── registry.ts # Dynamic tool management
22
+ └── index.ts # Public API exports
23
+ ```
24
+
25
+ ## Components
26
+
27
+ ### App Control
28
+
29
+ Cross-platform application and window management with UI automation.
30
+
31
+ **Interface:**
32
+ ```typescript
33
+ import { getAppController } from '@/actions';
34
+
35
+ const controller = getAppController(); // Returns platform-specific implementation
36
+
37
+ // Get active window
38
+ const activeWindow = await controller.getActiveWindow();
39
+ console.log(activeWindow.title, activeWindow.bounds);
40
+
41
+ // List all windows
42
+ const windows = await controller.listWindows();
43
+
44
+ // UI automation
45
+ await controller.typeText("Hello World");
46
+ await controller.pressKeys(['ctrl', 'a']);
47
+ await controller.focusWindow(pid);
48
+
49
+ // Screenshots
50
+ const screenBuffer = await controller.captureScreen();
51
+ const windowBuffer = await controller.captureWindow(pid);
52
+ ```
53
+
54
+ **Linux Implementation:**
55
+
56
+ Uses X11 tools (xdotool, xprop, wmctrl, ImageMagick):
57
+ - Window management and focus control
58
+ - Keyboard/mouse input simulation
59
+ - Screenshot capture
60
+ - Geometry and property inspection
61
+
62
+ **Status:**
63
+ - ✅ Linux: Fully implemented
64
+ - ⏳ Windows: Stub (needs UI Automation API)
65
+ - ⏳ macOS: Stub (needs AXUIElement API)
66
+
67
+ ### Browser Control
68
+
69
+ Chrome DevTools Protocol client for browser automation.
70
+
71
+ **Usage:**
72
+ ```typescript
73
+ import { BrowserSession, CDPBrowser } from '@/actions';
74
+
75
+ const session = new BrowserSession(9222); // Default CDP port
76
+
77
+ // Check availability
78
+ if (await session.isAvailable()) {
79
+ await session.ensureConnected();
80
+
81
+ const browser = session.getBrowser();
82
+
83
+ // List tabs
84
+ const tabs = await browser.listTabs();
85
+
86
+ // Navigate
87
+ await browser.navigate(tabs[0].id, 'https://example.com');
88
+
89
+ // Execute JavaScript
90
+ const result = await browser.evaluate(tabs[0].id, 'document.title');
91
+
92
+ // Screenshot
93
+ const screenshot = await browser.screenshot(tabs[0].id);
94
+
95
+ await session.disconnect();
96
+ }
97
+ ```
98
+
99
+ **Requirements:**
100
+
101
+ Launch Chrome with remote debugging:
102
+ ```bash
103
+ google-chrome --remote-debugging-port=9222
104
+ ```
105
+
106
+ Or Chrome/Chromium headless:
107
+ ```bash
108
+ chromium --headless --remote-debugging-port=9222
109
+ ```
110
+
111
+ ### Terminal Executor
112
+
113
+ Cross-platform shell command execution with streaming support.
114
+
115
+ **Usage:**
116
+ ```typescript
117
+ import { TerminalExecutor } from '@/actions';
118
+
119
+ const executor = new TerminalExecutor({
120
+ shell: '/bin/bash', // Auto-detected if not specified
121
+ timeout: 30000, // Default timeout in ms
122
+ });
123
+
124
+ // Execute command
125
+ const result = await executor.execute('ls -la', {
126
+ cwd: '/home/user',
127
+ env: { DEBUG: 'true' },
128
+ timeout: 10000,
129
+ });
130
+
131
+ console.log(result.stdout);
132
+ console.log(result.stderr);
133
+ console.log(result.exitCode);
134
+ console.log(result.duration);
135
+
136
+ // Stream output
137
+ for await (const chunk of executor.stream('npm install')) {
138
+ process.stdout.write(chunk);
139
+ }
140
+ ```
141
+
142
+ **Shell Detection:**
143
+ - Linux/macOS: `$SHELL` or `/bin/bash`
144
+ - Windows: `%COMSPEC%` or `powershell.exe`
145
+
146
+ ### WSL Bridge
147
+
148
+ Windows Subsystem for Linux integration.
149
+
150
+ **Usage:**
151
+ ```typescript
152
+ import { WSLBridge } from '@/actions';
153
+
154
+ // Detect WSL environment
155
+ if (WSLBridge.isWSL()) {
156
+ const bridge = new WSLBridge();
157
+
158
+ // Run Windows commands from WSL
159
+ const result = await bridge.runWindowsCommand('dir C:\\Users');
160
+
161
+ // Run PowerShell scripts
162
+ const psResult = await bridge.runPowerShell('Get-Process | Select -First 5');
163
+
164
+ // Path conversion
165
+ const winPath = await bridge.convertToWindowsPath('/home/user/file.txt');
166
+ const wslPath = await bridge.convertToWSLPath('C:\\Users\\user\\file.txt');
167
+
168
+ // Get Windows home directory
169
+ const winHome = bridge.getWindowsHome();
170
+ }
171
+ ```
172
+
173
+ **Detection:**
174
+ - Checks `/proc/version` for "microsoft" or "WSL"
175
+ - Checks `$WSL_DISTRO_NAME` or `$WSL_INTEROP` environment variables
176
+
177
+ ### Tool Registry
178
+
179
+ Dynamic tool registration and execution with parameter validation.
180
+
181
+ **Usage:**
182
+ ```typescript
183
+ import { ToolRegistry, type ToolDefinition } from '@/actions';
184
+
185
+ const registry = new ToolRegistry();
186
+
187
+ // Define a tool
188
+ const searchTool: ToolDefinition = {
189
+ name: 'search_files',
190
+ description: 'Search for files by pattern',
191
+ category: 'filesystem',
192
+ parameters: {
193
+ pattern: {
194
+ type: 'string',
195
+ description: 'Search pattern (glob)',
196
+ required: true,
197
+ },
198
+ directory: {
199
+ type: 'string',
200
+ description: 'Directory to search',
201
+ required: false,
202
+ },
203
+ },
204
+ execute: async (params) => {
205
+ const pattern = params.pattern as string;
206
+ const dir = (params.directory as string) || '.';
207
+
208
+ // Implementation here
209
+ return { found: [] };
210
+ },
211
+ };
212
+
213
+ // Register tool
214
+ registry.register(searchTool);
215
+
216
+ // Execute tool
217
+ const result = await registry.execute('search_files', {
218
+ pattern: '*.ts',
219
+ directory: '/src',
220
+ });
221
+
222
+ // Query registry
223
+ console.log(registry.list('filesystem'));
224
+ console.log(registry.getCategories());
225
+ console.log(registry.count());
226
+ ```
227
+
228
+ **Features:**
229
+ - Parameter type validation
230
+ - Required parameter enforcement
231
+ - Category organization
232
+ - Graceful error handling
233
+
234
+ ## Installation
235
+
236
+ The Action Layer uses native Bun APIs and requires no additional npm packages.
237
+
238
+ ### Linux Dependencies
239
+
240
+ For full app-control functionality:
241
+
242
+ ```bash
243
+ # Ubuntu/Debian
244
+ sudo apt install xdotool x11-utils wmctrl imagemagick scrot
245
+
246
+ # Fedora
247
+ sudo dnf install xdotool xorg-x11-utils wmctrl ImageMagick scrot
248
+
249
+ # Arch
250
+ sudo pacman -S xdotool xorg-xprop wmctrl imagemagick scrot
251
+ ```
252
+
253
+ ### Browser Dependencies
254
+
255
+ Chrome/Chromium with remote debugging enabled:
256
+
257
+ ```bash
258
+ google-chrome --remote-debugging-port=9222 &
259
+ ```
260
+
261
+ ## Examples
262
+
263
+ ### Complete Example: Screenshot Active Window
264
+
265
+ ```typescript
266
+ import { getAppController } from '@/actions';
267
+
268
+ async function screenshotActiveWindow() {
269
+ const controller = getAppController();
270
+
271
+ const activeWindow = await controller.getActiveWindow();
272
+ console.log(`Capturing: ${activeWindow.title}`);
273
+
274
+ const screenshot = await controller.captureWindow(activeWindow.pid);
275
+ await Bun.write('screenshot.png', screenshot);
276
+
277
+ console.log('Saved screenshot.png');
278
+ }
279
+
280
+ screenshotActiveWindow();
281
+ ```
282
+
283
+ ### Complete Example: Automate Browser
284
+
285
+ ```typescript
286
+ import { BrowserSession } from '@/actions';
287
+
288
+ async function automateSearch() {
289
+ const session = new BrowserSession();
290
+ await session.ensureConnected();
291
+
292
+ const browser = session.getBrowser();
293
+ const tabs = await browser.listTabs();
294
+ const tabId = tabs[0]?.id;
295
+
296
+ if (!tabId) {
297
+ throw new Error('No tabs found');
298
+ }
299
+
300
+ await browser.navigate(tabId, 'https://google.com');
301
+
302
+ const title = await browser.evaluate(tabId, 'document.title');
303
+ console.log('Page title:', title);
304
+
305
+ await session.disconnect();
306
+ }
307
+
308
+ automateSearch();
309
+ ```
310
+
311
+ ### Complete Example: WSL File Transfer
312
+
313
+ ```typescript
314
+ import { WSLBridge, TerminalExecutor } from '@/actions';
315
+
316
+ async function copyToWindows() {
317
+ if (!WSLBridge.isWSL()) {
318
+ throw new Error('Not running in WSL');
319
+ }
320
+
321
+ const bridge = new WSLBridge();
322
+ const executor = new TerminalExecutor();
323
+
324
+ // Copy file from WSL to Windows
325
+ const wslFile = '/home/user/data.json';
326
+ const winPath = await bridge.convertToWindowsPath(wslFile);
327
+
328
+ await bridge.runPowerShell(
329
+ `Copy-Item "${winPath}" "C:\\Users\\Public\\data.json"`
330
+ );
331
+
332
+ console.log('File copied to Windows');
333
+ }
334
+
335
+ copyToWindows();
336
+ ```
337
+
338
+ ## Error Handling
339
+
340
+ All methods throw descriptive errors with installation instructions when dependencies are missing:
341
+
342
+ ```typescript
343
+ try {
344
+ await controller.captureScreen();
345
+ } catch (error) {
346
+ // Error includes installation instructions:
347
+ // "No screenshot tool found. Please install one:
348
+ // ImageMagick: sudo apt install imagemagick
349
+ // Scrot: sudo apt install scrot"
350
+ }
351
+ ```
352
+
353
+ ## Testing
354
+
355
+ Run the test suite:
356
+
357
+ ```bash
358
+ bun run src/actions/test.ts
359
+ ```
360
+
361
+ Expected output:
362
+ ```
363
+ Testing J.A.R.V.I.S. Action Layer
364
+
365
+ 1. App Controller
366
+ Platform: linux
367
+ ✓ App controller initialized for linux
368
+
369
+ 2. Terminal Executor
370
+ Detected shell: /bin/bash
371
+ ✓ Command executed: Hello from JARVIS
372
+ Duration: 35ms
373
+
374
+ 3. WSL Bridge
375
+ Running in WSL: true
376
+ Windows home: Not detected
377
+
378
+ 4. Browser Session
379
+ Chrome DevTools available: false
380
+
381
+ 5. Tool Registry
382
+ Registered tools: 1
383
+ Categories: utility
384
+ ✓ Tool execution: Echo: Hello JARVIS!
385
+
386
+ ✓ Action Layer test complete!
387
+ ```
388
+
389
+ ## Platform Support Matrix
390
+
391
+ | Feature | Linux | Windows | macOS |
392
+ |---------|-------|---------|-------|
393
+ | Window Management | ✅ | ⏳ | ⏳ |
394
+ | UI Automation | ✅ | ⏳ | ⏳ |
395
+ | Keyboard Input | ✅ | ⏳ | ⏳ |
396
+ | Screenshots | ✅ | ⏳ | ⏳ |
397
+ | Browser CDP | ✅ | ✅ | ✅ |
398
+ | Terminal Execution | ✅ | ✅ | ✅ |
399
+ | WSL Bridge | ✅ | N/A | N/A |
400
+ | Tool Registry | ✅ | ✅ | ✅ |
401
+
402
+ ## Future Enhancements
403
+
404
+ ### Windows Implementation
405
+ - Use UI Automation COM API via N-API bindings
406
+ - PowerShell UIAutomation module fallback
407
+ - Consider AutoHotkey IPC bridge for complex automation
408
+
409
+ ### macOS Implementation
410
+ - AXUIElement API via Swift/Objective-C bridge
411
+ - AppleScript integration for legacy apps
412
+ - Consider node-mac-automation package
413
+
414
+ ### Linux Enhancements
415
+ - AT-SPI2 integration for accessibility tree
416
+ - Wayland support (currently X11 only)
417
+ - Direct D-Bus bindings for better performance
418
+
419
+ ## License
420
+
421
+ Part of Project J.A.R.V.I.S. - See root LICENSE file.
@@ -0,0 +1,26 @@
1
+ import { test, expect, describe } from 'bun:test';
2
+ import { DesktopController } from './desktop-controller.ts';
3
+
4
+ describe('DesktopController', () => {
5
+ test('constructor accepts custom port', () => {
6
+ const ctrl = new DesktopController(9224);
7
+ expect(ctrl).toBeDefined();
8
+ expect(ctrl.connected).toBe(false);
9
+ });
10
+
11
+ test('constructor uses default port', () => {
12
+ const ctrl = new DesktopController();
13
+ expect(ctrl).toBeDefined();
14
+ expect(ctrl.connected).toBe(false);
15
+ });
16
+
17
+ test('constructor accepts different port', () => {
18
+ const ctrl = new DesktopController(9999);
19
+ expect(ctrl).toBeDefined();
20
+ });
21
+
22
+ test('starts disconnected', () => {
23
+ const ctrl = new DesktopController();
24
+ expect(ctrl.connected).toBe(false);
25
+ });
26
+ });