visionclaw 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/README.md +116 -0
- package/dist/agent/context.d.ts +56 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +142 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/loop.d.ts +18 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +323 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session.d.ts +49 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +200 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +10 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +167 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/calendar/google-calendar.d.ts +46 -0
- package/dist/calendar/google-calendar.d.ts.map +1 -0
- package/dist/calendar/google-calendar.js +132 -0
- package/dist/calendar/google-calendar.js.map +1 -0
- package/dist/calendar/scheduler.d.ts +7 -0
- package/dist/calendar/scheduler.d.ts.map +1 -0
- package/dist/calendar/scheduler.js +33 -0
- package/dist/calendar/scheduler.js.map +1 -0
- package/dist/channels/discord.d.ts +19 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +169 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/gmail.d.ts +31 -0
- package/dist/channels/gmail.d.ts.map +1 -0
- package/dist/channels/gmail.js +300 -0
- package/dist/channels/gmail.js.map +1 -0
- package/dist/channels/interface.d.ts +45 -0
- package/dist/channels/interface.d.ts.map +1 -0
- package/dist/channels/interface.js +2 -0
- package/dist/channels/interface.js.map +1 -0
- package/dist/channels/manager.d.ts +36 -0
- package/dist/channels/manager.d.ts.map +1 -0
- package/dist/channels/manager.js +108 -0
- package/dist/channels/manager.js.map +1 -0
- package/dist/channels/queue.d.ts +17 -0
- package/dist/channels/queue.d.ts.map +1 -0
- package/dist/channels/queue.js +85 -0
- package/dist/channels/queue.js.map +1 -0
- package/dist/channels/slack.d.ts +17 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +142 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/sms.d.ts +19 -0
- package/dist/channels/sms.d.ts.map +1 -0
- package/dist/channels/sms.js +111 -0
- package/dist/channels/sms.js.map +1 -0
- package/dist/channels/telegram.d.ts +28 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +246 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +28 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +292 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config/index.d.ts +24 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +104 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +227 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +45 -0
- package/dist/config/types.js.map +1 -0
- package/dist/files.d.ts +20 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +82 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +384 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/store.d.ts +24 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +71 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/obs/server.d.ts +10 -0
- package/dist/obs/server.d.ts.map +1 -0
- package/dist/obs/server.js +406 -0
- package/dist/obs/server.js.map +1 -0
- package/dist/onboarding/google-auth.d.ts +11 -0
- package/dist/onboarding/google-auth.d.ts.map +1 -0
- package/dist/onboarding/google-auth.js +113 -0
- package/dist/onboarding/google-auth.js.map +1 -0
- package/dist/onboarding/index.d.ts +2 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +213 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/macos-permissions.d.ts +37 -0
- package/dist/onboarding/macos-permissions.d.ts.map +1 -0
- package/dist/onboarding/macos-permissions.js +207 -0
- package/dist/onboarding/macos-permissions.js.map +1 -0
- package/dist/skills/install.d.ts +7 -0
- package/dist/skills/install.d.ts.map +1 -0
- package/dist/skills/install.js +63 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/tools/browser.d.ts +7 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +202 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +12 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +210 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/computer-use.d.ts +28 -0
- package/dist/tools/computer-use.d.ts.map +1 -0
- package/dist/tools/computer-use.js +311 -0
- package/dist/tools/computer-use.js.map +1 -0
- package/dist/tools/coordinate-resolver.d.ts +26 -0
- package/dist/tools/coordinate-resolver.d.ts.map +1 -0
- package/dist/tools/coordinate-resolver.js +157 -0
- package/dist/tools/coordinate-resolver.js.map +1 -0
- package/dist/tools/desktop-executor.d.ts +52 -0
- package/dist/tools/desktop-executor.d.ts.map +1 -0
- package/dist/tools/desktop-executor.js +202 -0
- package/dist/tools/desktop-executor.js.map +1 -0
- package/dist/tools/finish.d.ts +5 -0
- package/dist/tools/finish.d.ts.map +1 -0
- package/dist/tools/finish.js +18 -0
- package/dist/tools/finish.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +37 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory.d.ts +14 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +269 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notify.d.ts +12 -0
- package/dist/tools/notify.d.ts.map +1 -0
- package/dist/tools/notify.js +108 -0
- package/dist/tools/notify.js.map +1 -0
- package/dist/tools/screenshot.d.ts +7 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +189 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/skill.d.ts +8 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +133 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/upgrade.d.ts +5 -0
- package/dist/tools/upgrade.d.ts.map +1 -0
- package/dist/tools/upgrade.js +89 -0
- package/dist/tools/upgrade.js.map +1 -0
- package/dist/tools/wait.d.ts +5 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/wait.js +21 -0
- package/dist/tools/wait.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import prompts from "prompts";
|
|
2
|
+
import { saveConfig, ensureConfigDir } from "../config/index.js";
|
|
3
|
+
import { runGoogleOAuth } from "./google-auth.js";
|
|
4
|
+
import { checkMacOSPermissions } from "./macos-permissions.js";
|
|
5
|
+
import { installBuiltinSkills } from "../skills/install.js";
|
|
6
|
+
export async function runOnboarding() {
|
|
7
|
+
ensureConfigDir();
|
|
8
|
+
console.log("=== VisionClaw Onboarding ===\n");
|
|
9
|
+
// --- macOS permission check (screen recording + accessibility) ---
|
|
10
|
+
const permissionsOk = await checkMacOSPermissions();
|
|
11
|
+
if (!permissionsOk) {
|
|
12
|
+
const continueResult = (await prompts({
|
|
13
|
+
type: "confirm",
|
|
14
|
+
name: "continueSetup",
|
|
15
|
+
message: "Continue setup without full permissions?",
|
|
16
|
+
initial: true,
|
|
17
|
+
}));
|
|
18
|
+
if (!continueResult.continueSetup) {
|
|
19
|
+
console.log("\nPlease grant the required permissions and run onboarding again.");
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
console.log("VisionClaw needs a dedicated Gmail account to serve as its identity.");
|
|
24
|
+
console.log("The agent will use this account for email and Google Calendar.\n");
|
|
25
|
+
// --- Required: Owner identity ---
|
|
26
|
+
const ownerNameResult = (await prompts({
|
|
27
|
+
type: "text",
|
|
28
|
+
name: "ownerName",
|
|
29
|
+
message: "Your name (the agent's owner):",
|
|
30
|
+
validate: (v) => v.trim().length > 0 ? true : "Name is required",
|
|
31
|
+
}));
|
|
32
|
+
const ownerName = ownerNameResult.ownerName;
|
|
33
|
+
if (!ownerName) {
|
|
34
|
+
throw new Error("Onboarding cancelled");
|
|
35
|
+
}
|
|
36
|
+
const ownerEmailResult = (await prompts({
|
|
37
|
+
type: "text",
|
|
38
|
+
name: "ownerEmail",
|
|
39
|
+
message: "Your personal email (so the agent can identify you):",
|
|
40
|
+
}));
|
|
41
|
+
const ownerEmail = ownerEmailResult.ownerEmail;
|
|
42
|
+
// --- Required: Anthropic API Key ---
|
|
43
|
+
const anthropicResult = (await prompts({
|
|
44
|
+
type: "password",
|
|
45
|
+
name: "anthropicApiKey",
|
|
46
|
+
message: "Anthropic API key:",
|
|
47
|
+
validate: (v) => v.trim().length > 0 ? true : "API key is required",
|
|
48
|
+
}));
|
|
49
|
+
const anthropicApiKey = anthropicResult.anthropicApiKey;
|
|
50
|
+
if (!anthropicApiKey) {
|
|
51
|
+
throw new Error("Onboarding cancelled");
|
|
52
|
+
}
|
|
53
|
+
// --- Required: Gmail address ---
|
|
54
|
+
const gmailResult = (await prompts({
|
|
55
|
+
type: "text",
|
|
56
|
+
name: "gmail",
|
|
57
|
+
message: "Gmail address for the agent (dedicated account):",
|
|
58
|
+
validate: (v) => v.includes("@gmail.com") ? true : "Must be a @gmail.com address",
|
|
59
|
+
}));
|
|
60
|
+
const gmail = gmailResult.gmail;
|
|
61
|
+
if (!gmail) {
|
|
62
|
+
throw new Error("Onboarding cancelled");
|
|
63
|
+
}
|
|
64
|
+
// --- Required: Agent name ---
|
|
65
|
+
const agentNameResult = (await prompts({
|
|
66
|
+
type: "text",
|
|
67
|
+
name: "agentName",
|
|
68
|
+
message: "Agent name:",
|
|
69
|
+
initial: "VisionClaw",
|
|
70
|
+
}));
|
|
71
|
+
const agentName = agentNameResult.agentName;
|
|
72
|
+
// --- Required: Google OAuth2 credentials ---
|
|
73
|
+
console.log("\n--- Google Cloud OAuth2 Credentials ---");
|
|
74
|
+
console.log("Create OAuth2 credentials at https://console.cloud.google.com/apis/credentials");
|
|
75
|
+
console.log('Set the application type to "Desktop app" and add http://127.0.0.1 as an authorized redirect URI if needed.\n');
|
|
76
|
+
const googleClientIdResult = (await prompts({
|
|
77
|
+
type: "text",
|
|
78
|
+
name: "googleClientId",
|
|
79
|
+
message: "Google OAuth2 Client ID:",
|
|
80
|
+
validate: (v) => v.trim().length > 0 ? true : "Client ID is required",
|
|
81
|
+
}));
|
|
82
|
+
const googleClientId = googleClientIdResult.googleClientId;
|
|
83
|
+
if (!googleClientId) {
|
|
84
|
+
throw new Error("Onboarding cancelled");
|
|
85
|
+
}
|
|
86
|
+
const googleClientSecretResult = (await prompts({
|
|
87
|
+
type: "password",
|
|
88
|
+
name: "googleClientSecret",
|
|
89
|
+
message: "Google OAuth2 Client Secret:",
|
|
90
|
+
validate: (v) => v.trim().length > 0 ? true : "Client Secret is required",
|
|
91
|
+
}));
|
|
92
|
+
const googleClientSecret = googleClientSecretResult.googleClientSecret;
|
|
93
|
+
if (!googleClientSecret) {
|
|
94
|
+
throw new Error("Onboarding cancelled");
|
|
95
|
+
}
|
|
96
|
+
// Run Google OAuth flow
|
|
97
|
+
console.log("\nStarting Google OAuth2 authorization...");
|
|
98
|
+
await runGoogleOAuth(googleClientId, googleClientSecret);
|
|
99
|
+
console.log("Google authorization successful!");
|
|
100
|
+
// --- Required: At least one command channel ---
|
|
101
|
+
console.log("\n--- Command Channels ---");
|
|
102
|
+
console.log("You need at least one channel to communicate with the agent.");
|
|
103
|
+
console.log(`Gmail (${gmail.trim()}) is always available as a channel.\n`);
|
|
104
|
+
const channelChoiceResult = (await prompts({
|
|
105
|
+
type: "multiselect",
|
|
106
|
+
name: "channels",
|
|
107
|
+
message: "Which channels do you want to enable?",
|
|
108
|
+
choices: [
|
|
109
|
+
{ title: `Gmail (${gmail.trim()})`, value: "gmail", selected: true },
|
|
110
|
+
{ title: "Telegram", value: "telegram" },
|
|
111
|
+
{ title: "Discord", value: "discord" },
|
|
112
|
+
],
|
|
113
|
+
min: 1,
|
|
114
|
+
hint: "- Space to toggle, Enter to confirm. At least one required.",
|
|
115
|
+
}));
|
|
116
|
+
const selectedChannels = channelChoiceResult.channels ?? ["gmail"];
|
|
117
|
+
if (selectedChannels.length === 0) {
|
|
118
|
+
throw new Error("At least one channel is required. Onboarding cancelled.");
|
|
119
|
+
}
|
|
120
|
+
// --- Telegram setup ---
|
|
121
|
+
let telegramBotToken;
|
|
122
|
+
let telegramChatIds = [];
|
|
123
|
+
if (selectedChannels.includes("telegram")) {
|
|
124
|
+
const telegramResult = (await prompts({
|
|
125
|
+
type: "text",
|
|
126
|
+
name: "botToken",
|
|
127
|
+
message: "Telegram Bot Token (from @BotFather):",
|
|
128
|
+
validate: (v) => v.trim().length > 0 ? true : "Bot token is required",
|
|
129
|
+
}));
|
|
130
|
+
telegramBotToken = telegramResult.botToken;
|
|
131
|
+
if (!telegramBotToken) {
|
|
132
|
+
throw new Error("Telegram bot token is required. Onboarding cancelled.");
|
|
133
|
+
}
|
|
134
|
+
console.log("\nTo find your Telegram Chat ID, message @userinfobot on Telegram -- it will reply with your ID.");
|
|
135
|
+
const chatIdResult = (await prompts({
|
|
136
|
+
type: "text",
|
|
137
|
+
name: "chatId",
|
|
138
|
+
message: "Your Telegram Chat ID (numeric, e.g. 5788338436):",
|
|
139
|
+
validate: (v) => /^\d+$/.test(v.trim()) ? true : "Must be a numeric Chat ID",
|
|
140
|
+
}));
|
|
141
|
+
if (chatIdResult.chatId) {
|
|
142
|
+
telegramChatIds = [Number(chatIdResult.chatId)];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// --- Discord setup ---
|
|
146
|
+
let discordBotToken;
|
|
147
|
+
let discordChannelIds = [];
|
|
148
|
+
if (selectedChannels.includes("discord")) {
|
|
149
|
+
console.log("\nCreate a bot at https://discord.com/developers/applications");
|
|
150
|
+
console.log("Enable MESSAGE CONTENT intent under Bot settings.\n");
|
|
151
|
+
const discordResult = (await prompts({
|
|
152
|
+
type: "text",
|
|
153
|
+
name: "botToken",
|
|
154
|
+
message: "Discord Bot Token:",
|
|
155
|
+
validate: (v) => v.trim().length > 0 ? true : "Bot token is required",
|
|
156
|
+
}));
|
|
157
|
+
discordBotToken = discordResult.botToken;
|
|
158
|
+
if (!discordBotToken) {
|
|
159
|
+
throw new Error("Discord bot token is required. Onboarding cancelled.");
|
|
160
|
+
}
|
|
161
|
+
const channelIdResult = (await prompts({
|
|
162
|
+
type: "text",
|
|
163
|
+
name: "channelId",
|
|
164
|
+
message: "Discord channel ID to listen on (right-click channel > Copy Channel ID, or leave blank for DMs only):",
|
|
165
|
+
}));
|
|
166
|
+
if (channelIdResult.channelId?.trim()) {
|
|
167
|
+
discordChannelIds = [channelIdResult.channelId.trim()];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// --- Optional: Phone number ---
|
|
171
|
+
const phoneNumberResult = (await prompts({
|
|
172
|
+
type: "text",
|
|
173
|
+
name: "phoneNumber",
|
|
174
|
+
message: "Phone number (optional, for reference):",
|
|
175
|
+
}));
|
|
176
|
+
const phoneNumber = phoneNumberResult.phoneNumber;
|
|
177
|
+
// --- Build and save config ---
|
|
178
|
+
const enabledList = selectedChannels.join(", ");
|
|
179
|
+
console.log(`\nEnabled channels: ${enabledList}`);
|
|
180
|
+
const config = {
|
|
181
|
+
agentName: agentName ?? "VisionClaw",
|
|
182
|
+
ownerName: ownerName.trim(),
|
|
183
|
+
ownerEmail: typeof ownerEmail === "string" ? ownerEmail.trim() || undefined : undefined,
|
|
184
|
+
gmail: gmail.trim(),
|
|
185
|
+
googleClientId: googleClientId.trim(),
|
|
186
|
+
googleClientSecret: googleClientSecret.trim(),
|
|
187
|
+
phoneNumber: typeof phoneNumber === "string" ? phoneNumber.trim() || undefined : undefined,
|
|
188
|
+
anthropicApiKey: anthropicApiKey.trim(),
|
|
189
|
+
channels: {
|
|
190
|
+
telegram: telegramBotToken
|
|
191
|
+
? { enabled: true, botToken: telegramBotToken, allowedChatIds: telegramChatIds }
|
|
192
|
+
: { enabled: false, allowedChatIds: [] },
|
|
193
|
+
discord: discordBotToken
|
|
194
|
+
? { enabled: true, botToken: discordBotToken, allowedChannelIds: discordChannelIds }
|
|
195
|
+
: { enabled: false, allowedChannelIds: [] },
|
|
196
|
+
},
|
|
197
|
+
// Advanced configuration (not prompted during onboarding)
|
|
198
|
+
// Defaults are applied by the schema, but include explicit values to keep
|
|
199
|
+
// the generated config file self-describing.
|
|
200
|
+
obs: {
|
|
201
|
+
enabled: true,
|
|
202
|
+
host: "127.0.0.1",
|
|
203
|
+
port: 3101,
|
|
204
|
+
bufferSize: 1000,
|
|
205
|
+
},
|
|
206
|
+
heartbeatIntervalMs: 5 * 60 * 1000,
|
|
207
|
+
};
|
|
208
|
+
saveConfig(config);
|
|
209
|
+
// Install built-in skills (e.g. transcribe-audio)
|
|
210
|
+
installBuiltinSkills();
|
|
211
|
+
console.log("Configuration saved successfully!");
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if Screen Recording permission is granted on macOS.
|
|
3
|
+
*
|
|
4
|
+
* We do this by attempting a silent screenshot. If it succeeds and
|
|
5
|
+
* produces a non-trivial file, we have permission. If the file is
|
|
6
|
+
* tiny or missing, the permission was denied.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkScreenRecordingPermission(): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if cliclick is installed (required for computer_use tools).
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkCliclickInstalled(): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Check if ffmpeg is installed (required for screenshot compression and audio transcription).
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkFfmpegInstalled(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if Google Chrome or Chromium is installed (required for Playwright browser tools).
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkChromeInstalled(): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if Accessibility permission is granted on macOS.
|
|
23
|
+
*
|
|
24
|
+
* Uses AppleScript to test if we can check accessibility status.
|
|
25
|
+
* Also tries the `tccutil` approach as a fallback.
|
|
26
|
+
*/
|
|
27
|
+
export declare function checkAccessibilityPermission(): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Print instructions for granting a macOS permission.
|
|
30
|
+
*/
|
|
31
|
+
export declare function printPermissionInstructions(permission: "screen-recording" | "accessibility"): void;
|
|
32
|
+
/**
|
|
33
|
+
* Run all macOS permission checks and report results.
|
|
34
|
+
* Returns true if all required permissions are granted.
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkMacOSPermissions(): Promise<boolean>;
|
|
37
|
+
//# sourceMappingURL=macos-permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-permissions.d.ts","sourceRoot":"","sources":["../../src/onboarding/macos-permissions.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAiB7D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAsB7D;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAcrE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,kBAAkB,GAAG,eAAe,GAC/C,IAAI,CAYN;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CA+E9D"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
/**
|
|
5
|
+
* Check if Screen Recording permission is granted on macOS.
|
|
6
|
+
*
|
|
7
|
+
* We do this by attempting a silent screenshot. If it succeeds and
|
|
8
|
+
* produces a non-trivial file, we have permission. If the file is
|
|
9
|
+
* tiny or missing, the permission was denied.
|
|
10
|
+
*/
|
|
11
|
+
export async function checkScreenRecordingPermission() {
|
|
12
|
+
if (process.platform !== "darwin")
|
|
13
|
+
return true;
|
|
14
|
+
try {
|
|
15
|
+
const tmpFile = `/tmp/visionclaw-permission-check-${Date.now()}.png`;
|
|
16
|
+
await execAsync(`screencapture -x -C "${tmpFile}"`);
|
|
17
|
+
// Check if the file exists and has meaningful content
|
|
18
|
+
const { stdout } = await execAsync(`stat -f%z "${tmpFile}" 2>/dev/null || echo 0`);
|
|
19
|
+
const size = parseInt(stdout.trim(), 10);
|
|
20
|
+
// Clean up
|
|
21
|
+
await execAsync(`rm -f "${tmpFile}"`).catch(() => { });
|
|
22
|
+
// A real screenshot is at least a few KB; a blank/denied one is tiny or zero
|
|
23
|
+
return size > 1000;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if cliclick is installed (required for computer_use tools).
|
|
31
|
+
*/
|
|
32
|
+
export async function checkCliclickInstalled() {
|
|
33
|
+
if (process.platform !== "darwin")
|
|
34
|
+
return true;
|
|
35
|
+
try {
|
|
36
|
+
const { stdout } = await execAsync("which cliclick 2>/dev/null");
|
|
37
|
+
return stdout.trim().length > 0;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if ffmpeg is installed (required for screenshot compression and audio transcription).
|
|
45
|
+
*/
|
|
46
|
+
export async function checkFfmpegInstalled() {
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await execAsync("which ffmpeg 2>/dev/null");
|
|
49
|
+
if (stdout.trim().length > 0)
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch { /* fall through */ }
|
|
53
|
+
const candidates = [
|
|
54
|
+
"/opt/homebrew/bin/ffmpeg",
|
|
55
|
+
"/usr/local/bin/ffmpeg",
|
|
56
|
+
"/usr/bin/ffmpeg",
|
|
57
|
+
];
|
|
58
|
+
for (const c of candidates) {
|
|
59
|
+
try {
|
|
60
|
+
await execAsync(`test -x "${c}"`);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch { /* try next */ }
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if Google Chrome or Chromium is installed (required for Playwright browser tools).
|
|
69
|
+
*/
|
|
70
|
+
export async function checkChromeInstalled() {
|
|
71
|
+
// Check common macOS app locations
|
|
72
|
+
const appPaths = [
|
|
73
|
+
"/Applications/Google Chrome.app",
|
|
74
|
+
"/Applications/Chromium.app",
|
|
75
|
+
`${process.env.HOME}/Applications/Google Chrome.app`,
|
|
76
|
+
`${process.env.HOME}/Applications/Chromium.app`,
|
|
77
|
+
];
|
|
78
|
+
for (const p of appPaths) {
|
|
79
|
+
try {
|
|
80
|
+
await execAsync(`test -d "${p}"`);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch { /* try next */ }
|
|
84
|
+
}
|
|
85
|
+
// Check PATH-based executables
|
|
86
|
+
try {
|
|
87
|
+
const { stdout } = await execAsync("which google-chrome chromium chromium-browser 2>/dev/null | head -1");
|
|
88
|
+
if (stdout.trim().length > 0)
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch { /* fall through */ }
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if Accessibility permission is granted on macOS.
|
|
96
|
+
*
|
|
97
|
+
* Uses AppleScript to test if we can check accessibility status.
|
|
98
|
+
* Also tries the `tccutil` approach as a fallback.
|
|
99
|
+
*/
|
|
100
|
+
export async function checkAccessibilityPermission() {
|
|
101
|
+
if (process.platform !== "darwin")
|
|
102
|
+
return true;
|
|
103
|
+
try {
|
|
104
|
+
// Use the system's accessibility check via osascript
|
|
105
|
+
const { stdout } = await execAsync(`osascript -e 'tell application "System Events" to return name of first process'`);
|
|
106
|
+
// If this returns a process name, we have accessibility access
|
|
107
|
+
return stdout.trim().length > 0;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// "System Events got an error: osascript is not allowed assistive access"
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Print instructions for granting a macOS permission.
|
|
116
|
+
*/
|
|
117
|
+
export function printPermissionInstructions(permission) {
|
|
118
|
+
if (permission === "screen-recording") {
|
|
119
|
+
console.log("\n To grant Screen Recording permission:");
|
|
120
|
+
console.log(" 1. Open System Settings > Privacy & Security > Screen Recording");
|
|
121
|
+
console.log(" 2. Click '+' and add your terminal app (Terminal, iTerm2, etc.)");
|
|
122
|
+
console.log(" 3. Restart your terminal after granting permission");
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log("\n To grant Accessibility permission:");
|
|
126
|
+
console.log(" 1. Open System Settings > Privacy & Security > Accessibility");
|
|
127
|
+
console.log(" 2. Click '+' and add your terminal app (Terminal, iTerm2, etc.)");
|
|
128
|
+
console.log(" 3. Restart your terminal after granting permission");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Run all macOS permission checks and report results.
|
|
133
|
+
* Returns true if all required permissions are granted.
|
|
134
|
+
*/
|
|
135
|
+
export async function checkMacOSPermissions() {
|
|
136
|
+
if (process.platform !== "darwin") {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
console.log("--- macOS Permissions Check ---\n");
|
|
140
|
+
let allGranted = true;
|
|
141
|
+
// Screen Recording
|
|
142
|
+
process.stdout.write(" Screen Recording: ");
|
|
143
|
+
const screenOk = await checkScreenRecordingPermission();
|
|
144
|
+
if (screenOk) {
|
|
145
|
+
console.log("Granted");
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log("NOT GRANTED");
|
|
149
|
+
printPermissionInstructions("screen-recording");
|
|
150
|
+
allGranted = false;
|
|
151
|
+
}
|
|
152
|
+
// Accessibility
|
|
153
|
+
process.stdout.write(" Accessibility: ");
|
|
154
|
+
const accessOk = await checkAccessibilityPermission();
|
|
155
|
+
if (accessOk) {
|
|
156
|
+
console.log("Granted");
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.log("NOT GRANTED");
|
|
160
|
+
printPermissionInstructions("accessibility");
|
|
161
|
+
allGranted = false;
|
|
162
|
+
}
|
|
163
|
+
// cliclick (for computer_use tools)
|
|
164
|
+
process.stdout.write(" cliclick: ");
|
|
165
|
+
const cliclickOk = await checkCliclickInstalled();
|
|
166
|
+
if (cliclickOk) {
|
|
167
|
+
console.log("Installed");
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
console.log("NOT INSTALLED");
|
|
171
|
+
console.log("\n To install cliclick: brew install cliclick");
|
|
172
|
+
allGranted = false;
|
|
173
|
+
}
|
|
174
|
+
// ffmpeg (for screenshot compression and audio transcription)
|
|
175
|
+
process.stdout.write(" ffmpeg: ");
|
|
176
|
+
const ffmpegOk = await checkFfmpegInstalled();
|
|
177
|
+
if (ffmpegOk) {
|
|
178
|
+
console.log("Installed");
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log("NOT INSTALLED");
|
|
182
|
+
console.log("\n To install ffmpeg: brew install ffmpeg");
|
|
183
|
+
allGranted = false;
|
|
184
|
+
}
|
|
185
|
+
// Chrome / Chromium (for Playwright browser tools)
|
|
186
|
+
process.stdout.write(" Chrome: ");
|
|
187
|
+
const chromeOk = await checkChromeInstalled();
|
|
188
|
+
if (chromeOk) {
|
|
189
|
+
console.log("Found");
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.log("NOT FOUND");
|
|
193
|
+
console.log("\n Install Google Chrome from https://www.google.com/chrome/");
|
|
194
|
+
allGranted = false;
|
|
195
|
+
}
|
|
196
|
+
console.log("");
|
|
197
|
+
if (!allGranted) {
|
|
198
|
+
console.log(" Some permissions are missing. VisionClaw needs these to control the desktop.");
|
|
199
|
+
console.log(" You can continue setup now and grant them later, but the agent will");
|
|
200
|
+
console.log(" not be fully functional until all permissions are granted.\n");
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(" All permissions granted!\n");
|
|
204
|
+
}
|
|
205
|
+
return allGranted;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=macos-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-permissions.js","sourceRoot":"","sources":["../../src/onboarding/macos-permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install built-in skills to the active profile's skills directory.
|
|
3
|
+
* Copies from src/skills/ to {profileDir}/.claude/skills/.
|
|
4
|
+
* Only copies skills that don't already exist (won't overwrite user edits).
|
|
5
|
+
*/
|
|
6
|
+
export declare function installBuiltinSkills(): void;
|
|
7
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/skills/install.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CA8D3C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { getSkillsDir } from "../config/index.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
/**
|
|
8
|
+
* Install built-in skills to the active profile's skills directory.
|
|
9
|
+
* Copies from src/skills/ to {profileDir}/.claude/skills/.
|
|
10
|
+
* Only copies skills that don't already exist (won't overwrite user edits).
|
|
11
|
+
*/
|
|
12
|
+
export function installBuiltinSkills() {
|
|
13
|
+
const builtinDir = path.join(__dirname, "..", "skills");
|
|
14
|
+
const targetDir = getSkillsDir();
|
|
15
|
+
// In dev mode (tsx), __dirname points to src/skills.
|
|
16
|
+
// In built mode, it points to dist/skills.
|
|
17
|
+
// The skill files are in src/skills/ which may not exist in dist.
|
|
18
|
+
// Try both locations.
|
|
19
|
+
const sourceDirs = [
|
|
20
|
+
builtinDir,
|
|
21
|
+
path.join(__dirname, "..", "..", "src", "skills"),
|
|
22
|
+
];
|
|
23
|
+
let sourceDir = null;
|
|
24
|
+
for (const dir of sourceDirs) {
|
|
25
|
+
if (fs.existsSync(dir)) {
|
|
26
|
+
sourceDir = dir;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!sourceDir) {
|
|
31
|
+
logger.debug("No built-in skills directory found");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!fs.existsSync(targetDir)) {
|
|
35
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
// Skip non-directories and the install.ts file itself
|
|
40
|
+
if (!entry.isDirectory())
|
|
41
|
+
continue;
|
|
42
|
+
const skillSource = path.join(sourceDir, entry.name);
|
|
43
|
+
const skillTarget = path.join(targetDir, entry.name);
|
|
44
|
+
const skillFile = path.join(skillSource, "SKILL.md");
|
|
45
|
+
// Only copy if source has SKILL.md and target doesn't exist yet
|
|
46
|
+
if (!fs.existsSync(skillFile))
|
|
47
|
+
continue;
|
|
48
|
+
if (fs.existsSync(path.join(skillTarget, "SKILL.md"))) {
|
|
49
|
+
logger.debug(`Skill "${entry.name}" already installed, skipping`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// Copy the skill directory
|
|
53
|
+
if (!fs.existsSync(skillTarget)) {
|
|
54
|
+
fs.mkdirSync(skillTarget, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
const files = fs.readdirSync(skillSource);
|
|
57
|
+
for (const file of files) {
|
|
58
|
+
fs.copyFileSync(path.join(skillSource, file), path.join(skillTarget, file));
|
|
59
|
+
}
|
|
60
|
+
logger.system(`Installed built-in skill: ${entry.name}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/skills/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const browserTool: import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{
|
|
3
|
+
action: z.ZodEnum<["navigate", "screenshot", "get_text", "get_page_elements", "back", "forward", "new_tab", "close", "close_browser"]>;
|
|
4
|
+
url: z.ZodOptional<z.ZodString>;
|
|
5
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,eAAO,MAAM,WAAW;;;;EAmMvB,CAAC"}
|