@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.
- package/LICENSE +153 -0
- package/README.md +278 -0
- package/bin/jarvis.ts +413 -0
- package/package.json +74 -0
- package/scripts/ensure-bun.cjs +8 -0
- package/src/actions/README.md +421 -0
- package/src/actions/app-control/desktop-controller.test.ts +26 -0
- package/src/actions/app-control/desktop-controller.ts +438 -0
- package/src/actions/app-control/interface.ts +64 -0
- package/src/actions/app-control/linux.ts +273 -0
- package/src/actions/app-control/macos.ts +54 -0
- package/src/actions/app-control/sidecar-launcher.test.ts +23 -0
- package/src/actions/app-control/sidecar-launcher.ts +286 -0
- package/src/actions/app-control/windows.ts +44 -0
- package/src/actions/browser/cdp.ts +138 -0
- package/src/actions/browser/chrome-launcher.ts +252 -0
- package/src/actions/browser/session.ts +437 -0
- package/src/actions/browser/stealth.ts +49 -0
- package/src/actions/index.ts +20 -0
- package/src/actions/terminal/executor.ts +157 -0
- package/src/actions/terminal/wsl-bridge.ts +126 -0
- package/src/actions/test.ts +93 -0
- package/src/actions/tools/agents.ts +321 -0
- package/src/actions/tools/builtin.ts +846 -0
- package/src/actions/tools/commitments.ts +192 -0
- package/src/actions/tools/content.ts +217 -0
- package/src/actions/tools/delegate.ts +147 -0
- package/src/actions/tools/desktop.test.ts +55 -0
- package/src/actions/tools/desktop.ts +305 -0
- package/src/actions/tools/goals.ts +376 -0
- package/src/actions/tools/local-tools-guard.ts +20 -0
- package/src/actions/tools/registry.ts +171 -0
- package/src/actions/tools/research.ts +111 -0
- package/src/actions/tools/sidecar-list.ts +57 -0
- package/src/actions/tools/sidecar-route.ts +105 -0
- package/src/actions/tools/workflows.ts +216 -0
- package/src/agents/agent.ts +132 -0
- package/src/agents/delegation.ts +107 -0
- package/src/agents/hierarchy.ts +113 -0
- package/src/agents/index.ts +19 -0
- package/src/agents/messaging.ts +125 -0
- package/src/agents/orchestrator.ts +576 -0
- package/src/agents/role-discovery.ts +61 -0
- package/src/agents/sub-agent-runner.ts +307 -0
- package/src/agents/task-manager.ts +151 -0
- package/src/authority/approval-delivery.ts +59 -0
- package/src/authority/approval.ts +196 -0
- package/src/authority/audit.ts +158 -0
- package/src/authority/authority.test.ts +519 -0
- package/src/authority/deferred-executor.ts +103 -0
- package/src/authority/emergency.ts +66 -0
- package/src/authority/engine.ts +297 -0
- package/src/authority/index.ts +12 -0
- package/src/authority/learning.ts +111 -0
- package/src/authority/tool-action-map.ts +74 -0
- package/src/awareness/analytics.ts +466 -0
- package/src/awareness/awareness.test.ts +332 -0
- package/src/awareness/capture-engine.ts +305 -0
- package/src/awareness/context-graph.ts +130 -0
- package/src/awareness/context-tracker.ts +349 -0
- package/src/awareness/index.ts +25 -0
- package/src/awareness/intelligence.ts +321 -0
- package/src/awareness/ocr-engine.ts +88 -0
- package/src/awareness/service.ts +528 -0
- package/src/awareness/struggle-detector.ts +342 -0
- package/src/awareness/suggestion-engine.ts +476 -0
- package/src/awareness/types.ts +201 -0
- package/src/cli/autostart.ts +241 -0
- package/src/cli/deps.ts +449 -0
- package/src/cli/doctor.ts +230 -0
- package/src/cli/helpers.ts +401 -0
- package/src/cli/onboard.ts +580 -0
- package/src/comms/README.md +329 -0
- package/src/comms/auth-error.html +48 -0
- package/src/comms/channels/discord.ts +228 -0
- package/src/comms/channels/signal.ts +56 -0
- package/src/comms/channels/telegram.ts +316 -0
- package/src/comms/channels/whatsapp.ts +60 -0
- package/src/comms/channels.test.ts +173 -0
- package/src/comms/desktop-notify.ts +114 -0
- package/src/comms/example.ts +129 -0
- package/src/comms/index.ts +129 -0
- package/src/comms/streaming.ts +142 -0
- package/src/comms/voice.test.ts +152 -0
- package/src/comms/voice.ts +291 -0
- package/src/comms/websocket.test.ts +409 -0
- package/src/comms/websocket.ts +473 -0
- package/src/config/README.md +387 -0
- package/src/config/index.ts +6 -0
- package/src/config/loader.test.ts +137 -0
- package/src/config/loader.ts +142 -0
- package/src/config/types.ts +260 -0
- package/src/daemon/README.md +232 -0
- package/src/daemon/agent-service-interface.ts +9 -0
- package/src/daemon/agent-service.ts +600 -0
- package/src/daemon/api-routes.ts +2119 -0
- package/src/daemon/background-agent-service.ts +396 -0
- package/src/daemon/background-agent.test.ts +78 -0
- package/src/daemon/channel-service.ts +201 -0
- package/src/daemon/commitment-executor.ts +297 -0
- package/src/daemon/event-classifier.ts +239 -0
- package/src/daemon/event-coalescer.ts +123 -0
- package/src/daemon/event-reactor.ts +214 -0
- package/src/daemon/health.ts +220 -0
- package/src/daemon/index.ts +1004 -0
- package/src/daemon/llm-settings.ts +316 -0
- package/src/daemon/observer-service.ts +150 -0
- package/src/daemon/pid.ts +98 -0
- package/src/daemon/research-queue.ts +155 -0
- package/src/daemon/services.ts +175 -0
- package/src/daemon/ws-service.ts +788 -0
- package/src/goals/accountability.ts +240 -0
- package/src/goals/awareness-bridge.ts +185 -0
- package/src/goals/estimator.ts +185 -0
- package/src/goals/events.ts +28 -0
- package/src/goals/goals.test.ts +400 -0
- package/src/goals/integration.test.ts +329 -0
- package/src/goals/nl-builder.test.ts +220 -0
- package/src/goals/nl-builder.ts +256 -0
- package/src/goals/rhythm.test.ts +177 -0
- package/src/goals/rhythm.ts +275 -0
- package/src/goals/service.test.ts +135 -0
- package/src/goals/service.ts +348 -0
- package/src/goals/types.ts +106 -0
- package/src/goals/workflow-bridge.ts +96 -0
- package/src/integrations/google-api.ts +134 -0
- package/src/integrations/google-auth.ts +175 -0
- package/src/llm/README.md +291 -0
- package/src/llm/anthropic.ts +386 -0
- package/src/llm/gemini.ts +371 -0
- package/src/llm/index.ts +19 -0
- package/src/llm/manager.ts +153 -0
- package/src/llm/ollama.ts +307 -0
- package/src/llm/openai.ts +350 -0
- package/src/llm/provider.test.ts +231 -0
- package/src/llm/provider.ts +60 -0
- package/src/llm/test.ts +87 -0
- package/src/observers/README.md +278 -0
- package/src/observers/calendar.ts +113 -0
- package/src/observers/clipboard.ts +136 -0
- package/src/observers/email.ts +109 -0
- package/src/observers/example.ts +58 -0
- package/src/observers/file-watcher.ts +124 -0
- package/src/observers/index.ts +159 -0
- package/src/observers/notifications.ts +197 -0
- package/src/observers/observers.test.ts +203 -0
- package/src/observers/processes.ts +225 -0
- package/src/personality/README.md +61 -0
- package/src/personality/adapter.ts +196 -0
- package/src/personality/index.ts +20 -0
- package/src/personality/learner.ts +209 -0
- package/src/personality/model.ts +132 -0
- package/src/personality/personality.test.ts +236 -0
- package/src/roles/README.md +252 -0
- package/src/roles/authority.ts +119 -0
- package/src/roles/example-usage.ts +198 -0
- package/src/roles/index.ts +42 -0
- package/src/roles/loader.ts +143 -0
- package/src/roles/prompt-builder.ts +194 -0
- package/src/roles/test-multi.ts +102 -0
- package/src/roles/test-role.yaml +77 -0
- package/src/roles/test-utils.ts +93 -0
- package/src/roles/test.ts +106 -0
- package/src/roles/tool-guide.ts +190 -0
- package/src/roles/types.ts +36 -0
- package/src/roles/utils.ts +200 -0
- package/src/scripts/google-setup.ts +168 -0
- package/src/sidecar/connection.ts +179 -0
- package/src/sidecar/index.ts +6 -0
- package/src/sidecar/manager.ts +542 -0
- package/src/sidecar/protocol.ts +85 -0
- package/src/sidecar/rpc.ts +161 -0
- package/src/sidecar/scheduler.ts +136 -0
- package/src/sidecar/types.ts +112 -0
- package/src/sidecar/validator.ts +144 -0
- package/src/vault/README.md +110 -0
- package/src/vault/awareness.ts +341 -0
- package/src/vault/commitments.ts +299 -0
- package/src/vault/content-pipeline.ts +260 -0
- package/src/vault/conversations.ts +173 -0
- package/src/vault/entities.ts +180 -0
- package/src/vault/extractor.test.ts +356 -0
- package/src/vault/extractor.ts +345 -0
- package/src/vault/facts.ts +190 -0
- package/src/vault/goals.ts +477 -0
- package/src/vault/index.ts +87 -0
- package/src/vault/keychain.ts +99 -0
- package/src/vault/observations.ts +115 -0
- package/src/vault/relationships.ts +178 -0
- package/src/vault/retrieval.test.ts +126 -0
- package/src/vault/retrieval.ts +227 -0
- package/src/vault/schema.ts +658 -0
- package/src/vault/settings.ts +38 -0
- package/src/vault/vectors.ts +92 -0
- package/src/vault/workflows.ts +403 -0
- package/src/workflows/auto-suggest.ts +290 -0
- package/src/workflows/engine.ts +366 -0
- package/src/workflows/events.ts +24 -0
- package/src/workflows/executor.ts +207 -0
- package/src/workflows/nl-builder.ts +198 -0
- package/src/workflows/nodes/actions/agent-task.ts +73 -0
- package/src/workflows/nodes/actions/calendar-action.ts +85 -0
- package/src/workflows/nodes/actions/code-execution.ts +73 -0
- package/src/workflows/nodes/actions/discord.ts +77 -0
- package/src/workflows/nodes/actions/file-write.ts +73 -0
- package/src/workflows/nodes/actions/gmail.ts +69 -0
- package/src/workflows/nodes/actions/http-request.ts +117 -0
- package/src/workflows/nodes/actions/notification.ts +85 -0
- package/src/workflows/nodes/actions/run-tool.ts +55 -0
- package/src/workflows/nodes/actions/send-message.ts +82 -0
- package/src/workflows/nodes/actions/shell-command.ts +76 -0
- package/src/workflows/nodes/actions/telegram.ts +60 -0
- package/src/workflows/nodes/builtin.ts +119 -0
- package/src/workflows/nodes/error/error-handler.ts +37 -0
- package/src/workflows/nodes/error/fallback.ts +47 -0
- package/src/workflows/nodes/error/retry.ts +82 -0
- package/src/workflows/nodes/logic/delay.ts +42 -0
- package/src/workflows/nodes/logic/if-else.ts +41 -0
- package/src/workflows/nodes/logic/loop.ts +90 -0
- package/src/workflows/nodes/logic/merge.ts +38 -0
- package/src/workflows/nodes/logic/race.ts +40 -0
- package/src/workflows/nodes/logic/switch.ts +59 -0
- package/src/workflows/nodes/logic/template-render.ts +53 -0
- package/src/workflows/nodes/logic/variable-get.ts +37 -0
- package/src/workflows/nodes/logic/variable-set.ts +59 -0
- package/src/workflows/nodes/registry.ts +99 -0
- package/src/workflows/nodes/transform/aggregate.ts +99 -0
- package/src/workflows/nodes/transform/csv-parse.ts +70 -0
- package/src/workflows/nodes/transform/json-parse.ts +63 -0
- package/src/workflows/nodes/transform/map-filter.ts +84 -0
- package/src/workflows/nodes/transform/regex-match.ts +89 -0
- package/src/workflows/nodes/triggers/calendar.ts +33 -0
- package/src/workflows/nodes/triggers/clipboard.ts +32 -0
- package/src/workflows/nodes/triggers/cron.ts +40 -0
- package/src/workflows/nodes/triggers/email.ts +40 -0
- package/src/workflows/nodes/triggers/file-change.ts +45 -0
- package/src/workflows/nodes/triggers/git.ts +46 -0
- package/src/workflows/nodes/triggers/manual.ts +23 -0
- package/src/workflows/nodes/triggers/poll.ts +81 -0
- package/src/workflows/nodes/triggers/process.ts +44 -0
- package/src/workflows/nodes/triggers/screen-event.ts +37 -0
- package/src/workflows/nodes/triggers/webhook.ts +39 -0
- package/src/workflows/safe-eval.ts +139 -0
- package/src/workflows/template.ts +118 -0
- package/src/workflows/triggers/cron.ts +311 -0
- package/src/workflows/triggers/manager.ts +285 -0
- package/src/workflows/triggers/observer-bridge.ts +172 -0
- package/src/workflows/triggers/poller.ts +201 -0
- package/src/workflows/triggers/screen-condition.ts +218 -0
- package/src/workflows/triggers/triggers.test.ts +740 -0
- package/src/workflows/triggers/webhook.ts +191 -0
- package/src/workflows/types.ts +133 -0
- package/src/workflows/variables.ts +72 -0
- package/src/workflows/workflows.test.ts +383 -0
- package/src/workflows/yaml.ts +104 -0
- package/ui/dist/index-j75njzc1.css +1199 -0
- package/ui/dist/index-p2zh407q.js +80603 -0
- package/ui/dist/index.html +13 -0
- package/ui/public/openwakeword/models/embedding_model.onnx +0 -0
- package/ui/public/openwakeword/models/hey_jarvis_v0.1.onnx +0 -0
- package/ui/public/openwakeword/models/melspectrogram.onnx +0 -0
- package/ui/public/openwakeword/models/silero_vad.onnx +0 -0
- package/ui/public/ort/ort-wasm-simd-threaded.jsep.mjs +106 -0
- package/ui/public/ort/ort-wasm-simd-threaded.jsep.wasm +0 -0
- package/ui/public/ort/ort-wasm-simd-threaded.mjs +59 -0
- 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
|
+
});
|