visionclaw 0.1.32 → 0.1.34
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/CHANGELOG.md +20 -0
- package/assets/avatars/abstract.jpg +0 -0
- package/assets/avatars/cat.jpg +0 -0
- package/assets/avatars/fox.jpg +0 -0
- package/assets/avatars/orb.jpg +0 -0
- package/assets/avatars/owl.jpg +0 -0
- package/assets/avatars/robot.jpg +0 -0
- package/assets/avatars/visionclaw.jpg +0 -0
- package/dist/agent/context.d.ts +2 -1
- package/dist/agent/context.d.ts.map +1 -1
- package/dist/agent/context.js +2 -2
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/loop.d.ts +2 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +111 -8
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/session.d.ts +3 -1
- package/dist/agent/session.d.ts.map +1 -1
- package/dist/agent/session.js +7 -4
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +2 -2
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +14 -10
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/channels/discord.d.ts +7 -0
- package/dist/channels/discord.d.ts.map +1 -1
- package/dist/channels/discord.js +10 -2
- package/dist/channels/discord.js.map +1 -1
- package/dist/channels/gmail.js +1 -1
- package/dist/channels/gmail.js.map +1 -1
- package/dist/channels/interface.d.ts +8 -0
- package/dist/channels/interface.d.ts.map +1 -1
- package/dist/channels/manager.d.ts +10 -0
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +23 -0
- package/dist/channels/manager.js.map +1 -1
- package/dist/channels/telegram.d.ts +7 -0
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +18 -4
- package/dist/channels/telegram.js.map +1 -1
- package/dist/config/index.d.ts +10 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +56 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +23 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +22 -7
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +31 -16
- package/dist/index.js.map +1 -1
- package/dist/obs/notify.d.ts.map +1 -1
- package/dist/obs/notify.js +6 -5
- package/dist/obs/notify.js.map +1 -1
- package/dist/onboarding/index.d.ts +6 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +25 -83
- package/dist/onboarding/index.js.map +1 -1
- package/dist/onboarding/onboarding-session.d.ts +33 -0
- package/dist/onboarding/onboarding-session.d.ts.map +1 -0
- package/dist/onboarding/onboarding-session.js +207 -0
- package/dist/onboarding/onboarding-session.js.map +1 -0
- package/dist/onboarding/onboarding-tools.d.ts +43 -0
- package/dist/onboarding/onboarding-tools.d.ts.map +1 -0
- package/dist/onboarding/onboarding-tools.js +178 -0
- package/dist/onboarding/onboarding-tools.js.map +1 -0
- package/dist/onboarding/send-invite.d.ts +7 -0
- package/dist/onboarding/send-invite.d.ts.map +1 -0
- package/dist/onboarding/send-invite.js +61 -0
- package/dist/onboarding/send-invite.js.map +1 -0
- package/dist/onboarding/set-owner.d.ts +8 -0
- package/dist/onboarding/set-owner.d.ts.map +1 -0
- package/dist/onboarding/set-owner.js +53 -0
- package/dist/onboarding/set-owner.js.map +1 -0
- package/dist/onboarding/telegram-onboarding.d.ts +47 -0
- package/dist/onboarding/telegram-onboarding.d.ts.map +1 -0
- package/dist/onboarding/telegram-onboarding.js +208 -0
- package/dist/onboarding/telegram-onboarding.js.map +1 -0
- package/dist/reconfigure.d.ts.map +1 -1
- package/dist/reconfigure.js +49 -47
- package/dist/reconfigure.js.map +1 -1
- package/dist/tools/notify.d.ts +1 -0
- package/dist/tools/notify.d.ts.map +1 -1
- package/dist/tools/notify.js +27 -0
- package/dist/tools/notify.js.map +1 -1
- package/dist/tools/sleep-interval.js +5 -5
- package/dist/tools/sleep-interval.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { OwnerConfig, VisionClawConfig } from "../config/types.js";
|
|
2
|
+
import type { CommandMessage } from "../channels/interface.js";
|
|
3
|
+
import type { ChannelManager } from "../channels/manager.js";
|
|
4
|
+
type SendReplyFn = (chatId: number, text: string) => Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Agent-based Telegram onboarding handler.
|
|
7
|
+
*
|
|
8
|
+
* Phase 1 (programmatic): Validates the /start verification code.
|
|
9
|
+
* Phase 2 (LLM agent): Hands off to an Agent SDK session that
|
|
10
|
+
* conversationally collects owner name, agent name, wakeup interval,
|
|
11
|
+
* and profile photo through natural dialogue.
|
|
12
|
+
*
|
|
13
|
+
* Session state is persisted by the SDK, so a process restart
|
|
14
|
+
* mid-onboarding resumes the conversation from where it left off.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TelegramOnboardingHandler {
|
|
17
|
+
private ownerConfig;
|
|
18
|
+
private config;
|
|
19
|
+
private botToken;
|
|
20
|
+
private channelManager;
|
|
21
|
+
private capturedChatId;
|
|
22
|
+
private session;
|
|
23
|
+
private onboardingResult;
|
|
24
|
+
private _isComplete;
|
|
25
|
+
constructor(ownerConfig: OwnerConfig, config: VisionClawConfig, botToken: string, channelManager: ChannelManager);
|
|
26
|
+
get isComplete(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Process a Telegram message during onboarding.
|
|
29
|
+
* Returns true when onboarding is complete.
|
|
30
|
+
*/
|
|
31
|
+
handleMessage(msg: CommandMessage, sendReply: SendReplyFn): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Phase 1: Programmatic verification code check.
|
|
34
|
+
*/
|
|
35
|
+
private handleCodeVerification;
|
|
36
|
+
/**
|
|
37
|
+
* Phase 2: Forward messages to the LLM onboarding agent.
|
|
38
|
+
*/
|
|
39
|
+
private handleAgentConversation;
|
|
40
|
+
private getSession;
|
|
41
|
+
private initSession;
|
|
42
|
+
private finalizeOnboarding;
|
|
43
|
+
private sendTypingIndicator;
|
|
44
|
+
private updateBotName;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=telegram-onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-onboarding.d.ts","sourceRoot":"","sources":["../../src/onboarding/telegram-onboarding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,KAAK,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,WAAW,CAAS;gBAG1B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc;IAahC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACG,aAAa,CACjB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,WAAW,GACrB,OAAO,CAAC,OAAO,CAAC;IAmBnB;;OAEG;YACW,sBAAsB;IAyDpC;;OAEG;YACW,uBAAuB;IAkDrC,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,WAAW;YAiCL,kBAAkB;YA6BlB,mBAAmB;YAiBnB,aAAa;CA2B5B"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { saveOwnerConfig, deleteOnboardingSession, } from "../config/index.js";
|
|
2
|
+
import { logger } from "../logger.js";
|
|
3
|
+
import { createOnboardingToolServer, } from "./onboarding-tools.js";
|
|
4
|
+
import { OnboardingSession } from "./onboarding-session.js";
|
|
5
|
+
/**
|
|
6
|
+
* Agent-based Telegram onboarding handler.
|
|
7
|
+
*
|
|
8
|
+
* Phase 1 (programmatic): Validates the /start verification code.
|
|
9
|
+
* Phase 2 (LLM agent): Hands off to an Agent SDK session that
|
|
10
|
+
* conversationally collects owner name, agent name, wakeup interval,
|
|
11
|
+
* and profile photo through natural dialogue.
|
|
12
|
+
*
|
|
13
|
+
* Session state is persisted by the SDK, so a process restart
|
|
14
|
+
* mid-onboarding resumes the conversation from where it left off.
|
|
15
|
+
*/
|
|
16
|
+
export class TelegramOnboardingHandler {
|
|
17
|
+
ownerConfig;
|
|
18
|
+
config;
|
|
19
|
+
botToken;
|
|
20
|
+
channelManager;
|
|
21
|
+
capturedChatId = null;
|
|
22
|
+
session = null;
|
|
23
|
+
onboardingResult = null;
|
|
24
|
+
_isComplete = false;
|
|
25
|
+
constructor(ownerConfig, config, botToken, channelManager) {
|
|
26
|
+
this.ownerConfig = ownerConfig;
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.botToken = botToken;
|
|
29
|
+
this.channelManager = channelManager;
|
|
30
|
+
if (ownerConfig.onboardingCodeVerified && ownerConfig.telegramChatId) {
|
|
31
|
+
this.capturedChatId = ownerConfig.telegramChatId;
|
|
32
|
+
this.initSession();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
get isComplete() {
|
|
36
|
+
return this._isComplete;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Process a Telegram message during onboarding.
|
|
40
|
+
* Returns true when onboarding is complete.
|
|
41
|
+
*/
|
|
42
|
+
async handleMessage(msg, sendReply) {
|
|
43
|
+
if (this._isComplete)
|
|
44
|
+
return true;
|
|
45
|
+
const chatId = typeof msg.meta?.chatId === "number" ? msg.meta.chatId : null;
|
|
46
|
+
if (chatId === null) {
|
|
47
|
+
logger.warn("Onboarding: received message without chatId metadata");
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const text = msg.text.trim();
|
|
51
|
+
if (!this.ownerConfig.onboardingCodeVerified) {
|
|
52
|
+
return this.handleCodeVerification(text, chatId, sendReply);
|
|
53
|
+
}
|
|
54
|
+
return this.handleAgentConversation(msg, chatId, sendReply);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Phase 1: Programmatic verification code check.
|
|
58
|
+
*/
|
|
59
|
+
async handleCodeVerification(text, chatId, sendReply) {
|
|
60
|
+
const match = /^\/start\s+(\S+)$/i.exec(text);
|
|
61
|
+
const code = match?.[1];
|
|
62
|
+
if (!code) {
|
|
63
|
+
await sendReply(chatId, "Welcome! To get started, please send your verification code:\n\n" +
|
|
64
|
+
"/start YOUR_CODE\n\nYou can find the code in the setup email.");
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (code !== this.ownerConfig.onboardingCode) {
|
|
68
|
+
await sendReply(chatId, "That verification code doesn't match. Please check the email and try again.\n\n" +
|
|
69
|
+
"/start YOUR_CODE");
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
this.capturedChatId = chatId;
|
|
73
|
+
this.ownerConfig.onboardingCodeVerified = true;
|
|
74
|
+
this.ownerConfig.telegramChatId = chatId;
|
|
75
|
+
saveOwnerConfig(this.ownerConfig);
|
|
76
|
+
logger.system(`Onboarding: code verified for chat ${chatId}`);
|
|
77
|
+
this.initSession();
|
|
78
|
+
await this.sendTypingIndicator(chatId);
|
|
79
|
+
const reply = await this.getSession().sendAndGetReply("The user has just verified their code successfully. " +
|
|
80
|
+
"Greet them warmly and start the onboarding conversation by asking for their name.", async () => {
|
|
81
|
+
await sendReply(chatId, "Hold on, let me try that again...");
|
|
82
|
+
await this.sendTypingIndicator(chatId);
|
|
83
|
+
});
|
|
84
|
+
if (reply.text) {
|
|
85
|
+
await sendReply(chatId, reply.text);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
await sendReply(chatId, "Sorry, I'm having trouble responding right now. Please send another message to try again.");
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Phase 2: Forward messages to the LLM onboarding agent.
|
|
94
|
+
*/
|
|
95
|
+
async handleAgentConversation(msg, chatId, sendReply) {
|
|
96
|
+
if (!this.session) {
|
|
97
|
+
this.initSession();
|
|
98
|
+
}
|
|
99
|
+
await this.sendTypingIndicator(chatId);
|
|
100
|
+
let userMessage = msg.text.trim();
|
|
101
|
+
if (msg.attachments.length > 0) {
|
|
102
|
+
const imageAtt = msg.attachments.find((a) => a.type === "image");
|
|
103
|
+
if (imageAtt?.url) {
|
|
104
|
+
userMessage +=
|
|
105
|
+
`\n\n[The user sent a photo. Telegram file URL: ${imageAtt.url}]`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!userMessage) {
|
|
109
|
+
userMessage = "(empty message)";
|
|
110
|
+
}
|
|
111
|
+
const reply = await this.getSession().sendAndGetReply(userMessage, async () => {
|
|
112
|
+
await sendReply(chatId, "Hold on, let me try that again...");
|
|
113
|
+
await this.sendTypingIndicator(chatId);
|
|
114
|
+
});
|
|
115
|
+
if (reply.text) {
|
|
116
|
+
await sendReply(chatId, reply.text);
|
|
117
|
+
}
|
|
118
|
+
else if (!reply.completed) {
|
|
119
|
+
await sendReply(chatId, "Sorry, I'm having trouble responding right now. Please send another message to try again.");
|
|
120
|
+
}
|
|
121
|
+
if (reply.completed && this.onboardingResult) {
|
|
122
|
+
await this.finalizeOnboarding();
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
getSession() {
|
|
128
|
+
if (!this.session) {
|
|
129
|
+
throw new Error("Onboarding session not initialized");
|
|
130
|
+
}
|
|
131
|
+
return this.session;
|
|
132
|
+
}
|
|
133
|
+
initSession() {
|
|
134
|
+
if (this.session)
|
|
135
|
+
return;
|
|
136
|
+
if (!this.capturedChatId) {
|
|
137
|
+
throw new Error("Cannot init onboarding session without chatId");
|
|
138
|
+
}
|
|
139
|
+
const chatId = this.capturedChatId;
|
|
140
|
+
const channelManager = this.channelManager;
|
|
141
|
+
const toolServer = createOnboardingToolServer({
|
|
142
|
+
botToken: this.botToken,
|
|
143
|
+
chatId,
|
|
144
|
+
sendPhoto: async (targetChatId, photoPath, caption) => {
|
|
145
|
+
await channelManager.sendMessage("telegram", String(targetChatId), caption, [
|
|
146
|
+
{ type: "image", localPath: photoPath, mimeType: "image/jpeg" },
|
|
147
|
+
]);
|
|
148
|
+
},
|
|
149
|
+
onComplete: (result) => {
|
|
150
|
+
this.onboardingResult = result;
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
this.session = new OnboardingSession(this.config, this.ownerConfig.ownerEmail, { onboarding: toolServer });
|
|
154
|
+
}
|
|
155
|
+
async finalizeOnboarding() {
|
|
156
|
+
const result = this.onboardingResult;
|
|
157
|
+
if (!result) {
|
|
158
|
+
throw new Error("finalizeOnboarding called without onboardingResult");
|
|
159
|
+
}
|
|
160
|
+
this.ownerConfig.ownerName = result.ownerName;
|
|
161
|
+
this.ownerConfig.agentName = result.agentName;
|
|
162
|
+
this.ownerConfig.allowedTelegramChatIds = this.capturedChatId
|
|
163
|
+
? [this.capturedChatId]
|
|
164
|
+
: [];
|
|
165
|
+
this.ownerConfig.heartbeatIntervalMs = result.wakeupIntervalMinutes * 60_000;
|
|
166
|
+
this.ownerConfig.onboardingComplete = true;
|
|
167
|
+
this.ownerConfig.onboardedAt = new Date().toISOString();
|
|
168
|
+
this.ownerConfig.onboardingCode = undefined;
|
|
169
|
+
saveOwnerConfig(this.ownerConfig);
|
|
170
|
+
deleteOnboardingSession();
|
|
171
|
+
await this.updateBotName(result.agentName);
|
|
172
|
+
this._isComplete = true;
|
|
173
|
+
logger.system(`Onboarding complete! Agent "${result.agentName}" for owner "${result.ownerName}" ` +
|
|
174
|
+
`(wakeup: ${result.wakeupIntervalMinutes}min)`);
|
|
175
|
+
}
|
|
176
|
+
async sendTypingIndicator(chatId) {
|
|
177
|
+
try {
|
|
178
|
+
await fetch(`https://api.telegram.org/bot${this.botToken}/sendChatAction`, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
headers: { "Content-Type": "application/json" },
|
|
181
|
+
body: JSON.stringify({ chat_id: chatId, action: "typing" }),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
logger.debug(`Failed to send typing indicator: ${err instanceof Error ? err.message : String(err)}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async updateBotName(name) {
|
|
189
|
+
try {
|
|
190
|
+
const res = await fetch(`https://api.telegram.org/bot${this.botToken}/setMyName`, {
|
|
191
|
+
method: "POST",
|
|
192
|
+
headers: { "Content-Type": "application/json" },
|
|
193
|
+
body: JSON.stringify({ name }),
|
|
194
|
+
});
|
|
195
|
+
const data = (await res.json());
|
|
196
|
+
if (data.ok) {
|
|
197
|
+
logger.system(`Telegram bot name updated to "${name}"`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
logger.warn(`Failed to update Telegram bot name: ${data.description ?? "unknown error"}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
logger.warn(`Failed to update Telegram bot name: ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=telegram-onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-onboarding.js","sourceRoot":"","sources":["../../src/onboarding/telegram-onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconfigure.d.ts","sourceRoot":"","sources":["../src/reconfigure.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconfigure.d.ts","sourceRoot":"","sources":["../src/reconfigure.ts"],"names":[],"mappings":"AAkBA,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4N7F"}
|
package/dist/reconfigure.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import prompts from "prompts";
|
|
2
|
-
import { setProfile, getProfile, loadConfig, saveConfig, configExists, } from "./config/index.js";
|
|
2
|
+
import { setProfile, getProfile, loadConfig, saveConfig, configExists, ownerConfigExists, loadOwnerConfig, saveOwnerConfig, } from "./config/index.js";
|
|
3
3
|
import { runGoogleOAuth } from "./onboarding/google-auth.js";
|
|
4
4
|
function parseProfileFromArgs(args) {
|
|
5
5
|
const idx = args.indexOf("--profile");
|
|
@@ -9,58 +9,49 @@ export async function runReconfigureCli(args = process.argv.slice(2)) {
|
|
|
9
9
|
const profile = parseProfileFromArgs(args);
|
|
10
10
|
setProfile(profile);
|
|
11
11
|
if (!configExists()) {
|
|
12
|
-
// Keep message consistent with existing script UX
|
|
13
|
-
// (pnpm dev supports passing args through to tsx)
|
|
14
12
|
console.error(`Profile "${profile}" does not exist. Run 'pnpm dev -- --profile ${profile}' to create it.`);
|
|
15
13
|
process.exit(1);
|
|
16
14
|
}
|
|
17
15
|
const config = loadConfig();
|
|
16
|
+
const hasOwner = ownerConfigExists();
|
|
17
|
+
const ownerConfig = hasOwner ? loadOwnerConfig() : undefined;
|
|
18
18
|
console.log(`\n=== Reconfigure Profile: ${getProfile()} ===`);
|
|
19
|
-
console.log(`Agent: ${
|
|
19
|
+
console.log(`Agent: ${ownerConfig?.agentName ?? "VisionClaw"} <${config.gmail}>\n`);
|
|
20
|
+
const choices = [
|
|
21
|
+
{ title: "Update Telegram bot token", value: "telegram" },
|
|
22
|
+
{ title: "Add/update Discord", value: "discord" },
|
|
23
|
+
{ title: "Update Anthropic API key", value: "apikey" },
|
|
24
|
+
{ title: "Re-authorize Google OAuth", value: "google" },
|
|
25
|
+
{ title: "Disable a channel", value: "disable" },
|
|
26
|
+
];
|
|
27
|
+
if (hasOwner && ownerConfig) {
|
|
28
|
+
choices.splice(2, 0, { title: "Update agent name", value: "name" }, { title: "Update owner info", value: "owner" }, { title: "Update heartbeat interval", value: "heartbeat" });
|
|
29
|
+
}
|
|
20
30
|
const { section } = (await prompts({
|
|
21
31
|
type: "select",
|
|
22
32
|
name: "section",
|
|
23
33
|
message: "What do you want to update?",
|
|
24
|
-
choices
|
|
25
|
-
{ title: "Add/update Telegram", value: "telegram" },
|
|
26
|
-
{ title: "Add/update Discord", value: "discord" },
|
|
27
|
-
{ title: "Update agent name", value: "name" },
|
|
28
|
-
{ title: "Update owner info", value: "owner" },
|
|
29
|
-
{ title: "Update Anthropic API key", value: "apikey" },
|
|
30
|
-
{ title: "Re-authorize Google OAuth", value: "google" },
|
|
31
|
-
{ title: "Update heartbeat interval", value: "heartbeat" },
|
|
32
|
-
{ title: "Disable a channel", value: "disable" },
|
|
33
|
-
],
|
|
34
|
+
choices,
|
|
34
35
|
}));
|
|
35
36
|
if (!section) {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
39
|
switch (section) {
|
|
39
40
|
case "telegram": {
|
|
40
|
-
const result = (await prompts(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
type: "text",
|
|
50
|
-
name: "chatId",
|
|
51
|
-
message: "Your Telegram Chat ID (message @userinfobot to find it):",
|
|
52
|
-
initial: config.channels.telegram?.allowedChatIds[0]?.toString() ?? "",
|
|
53
|
-
validate: (v) => (/^\d+$/.test(v.trim()) ? true : "Must be numeric"),
|
|
54
|
-
},
|
|
55
|
-
]));
|
|
56
|
-
if (result.botToken && result.chatId) {
|
|
41
|
+
const result = (await prompts({
|
|
42
|
+
type: "text",
|
|
43
|
+
name: "botToken",
|
|
44
|
+
message: "Telegram Bot Token:",
|
|
45
|
+
initial: config.channels.telegram?.botToken ?? "",
|
|
46
|
+
validate: (v) => (v.trim().length > 0 ? true : "Required"),
|
|
47
|
+
}));
|
|
48
|
+
if (result.botToken) {
|
|
57
49
|
config.channels.telegram = {
|
|
58
50
|
enabled: true,
|
|
59
51
|
botToken: result.botToken,
|
|
60
|
-
allowedChatIds: [Number(result.chatId)],
|
|
61
52
|
};
|
|
62
53
|
saveConfig(config);
|
|
63
|
-
console.log("\nTelegram
|
|
54
|
+
console.log("\nTelegram bot token updated.");
|
|
64
55
|
}
|
|
65
56
|
break;
|
|
66
57
|
}
|
|
@@ -79,53 +70,62 @@ export async function runReconfigureCli(args = process.argv.slice(2)) {
|
|
|
79
70
|
type: "text",
|
|
80
71
|
name: "channelId",
|
|
81
72
|
message: "Discord channel ID (leave blank for DMs only):",
|
|
82
|
-
initial:
|
|
73
|
+
initial: ownerConfig?.allowedDiscordChannelIds[0] ?? "",
|
|
83
74
|
},
|
|
84
75
|
]));
|
|
85
76
|
if (result.botToken) {
|
|
86
77
|
config.channels.discord = {
|
|
87
78
|
enabled: true,
|
|
88
79
|
botToken: result.botToken,
|
|
89
|
-
allowedChannelIds: result.channelId?.trim() ? [result.channelId.trim()] : [],
|
|
90
80
|
};
|
|
91
81
|
saveConfig(config);
|
|
82
|
+
if (ownerConfig) {
|
|
83
|
+
ownerConfig.allowedDiscordChannelIds = result.channelId?.trim() ? [result.channelId.trim()] : [];
|
|
84
|
+
saveOwnerConfig(ownerConfig);
|
|
85
|
+
}
|
|
92
86
|
console.log("\nDiscord configured and enabled.");
|
|
93
87
|
}
|
|
94
88
|
break;
|
|
95
89
|
}
|
|
96
90
|
case "name": {
|
|
91
|
+
if (!ownerConfig)
|
|
92
|
+
break;
|
|
97
93
|
const result = (await prompts({
|
|
98
94
|
type: "text",
|
|
99
95
|
name: "agentName",
|
|
100
96
|
message: "Agent name:",
|
|
101
|
-
initial:
|
|
97
|
+
initial: ownerConfig.agentName,
|
|
102
98
|
}));
|
|
103
99
|
if (result.agentName) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
console.log(`\nAgent name updated to "${
|
|
100
|
+
ownerConfig.agentName = result.agentName;
|
|
101
|
+
saveOwnerConfig(ownerConfig);
|
|
102
|
+
console.log(`\nAgent name updated to "${ownerConfig.agentName}".`);
|
|
107
103
|
}
|
|
108
104
|
break;
|
|
109
105
|
}
|
|
110
106
|
case "owner": {
|
|
107
|
+
if (!ownerConfig)
|
|
108
|
+
break;
|
|
111
109
|
const result = (await prompts([
|
|
112
110
|
{
|
|
113
111
|
type: "text",
|
|
114
112
|
name: "ownerName",
|
|
115
113
|
message: "Owner name:",
|
|
116
|
-
initial:
|
|
114
|
+
initial: ownerConfig.ownerName,
|
|
117
115
|
},
|
|
118
116
|
{
|
|
119
117
|
type: "text",
|
|
120
118
|
name: "ownerEmail",
|
|
121
119
|
message: "Owner email:",
|
|
122
|
-
initial:
|
|
120
|
+
initial: ownerConfig.ownerEmail,
|
|
123
121
|
},
|
|
124
122
|
]));
|
|
125
123
|
if (result.ownerName !== undefined) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
ownerConfig.ownerName = result.ownerName;
|
|
125
|
+
if (result.ownerEmail) {
|
|
126
|
+
ownerConfig.ownerEmail = result.ownerEmail;
|
|
127
|
+
}
|
|
128
|
+
saveOwnerConfig(ownerConfig);
|
|
129
129
|
console.log("\nOwner info updated.");
|
|
130
130
|
}
|
|
131
131
|
break;
|
|
@@ -150,16 +150,18 @@ export async function runReconfigureCli(args = process.argv.slice(2)) {
|
|
|
150
150
|
break;
|
|
151
151
|
}
|
|
152
152
|
case "heartbeat": {
|
|
153
|
+
if (!ownerConfig)
|
|
154
|
+
break;
|
|
153
155
|
const result = (await prompts({
|
|
154
156
|
type: "number",
|
|
155
157
|
name: "seconds",
|
|
156
158
|
message: "Heartbeat interval (seconds):",
|
|
157
|
-
initial:
|
|
159
|
+
initial: ownerConfig.heartbeatIntervalMs / 1000,
|
|
158
160
|
min: 30,
|
|
159
161
|
}));
|
|
160
162
|
if (result.seconds) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
+
ownerConfig.heartbeatIntervalMs = result.seconds * 1000;
|
|
164
|
+
saveOwnerConfig(ownerConfig);
|
|
163
165
|
console.log(`\nHeartbeat interval updated to ${result.seconds}s.`);
|
|
164
166
|
}
|
|
165
167
|
break;
|
package/dist/reconfigure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconfigure.js","sourceRoot":"","sources":["../src/reconfigure.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"reconfigure.js","sourceRoot":"","sources":["../src/reconfigure.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/notify.d.ts
CHANGED
|
@@ -8,5 +8,6 @@ export declare const notifyUserTool: import("@anthropic-ai/claude-agent-sdk").Sd
|
|
|
8
8
|
file_url: z.ZodOptional<z.ZodString>;
|
|
9
9
|
file_path: z.ZodOptional<z.ZodString>;
|
|
10
10
|
file_name: z.ZodOptional<z.ZodString>;
|
|
11
|
+
attach_screenshot: z.ZodBoolean;
|
|
11
12
|
}>;
|
|
12
13
|
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,cAAc;;;;;;;;;;EAmJ1B,CAAC"}
|
package/dist/tools/notify.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
1
4
|
import { z } from "zod";
|
|
2
5
|
import { tool } from "@anthropic-ai/claude-agent-sdk";
|
|
3
6
|
import { getAgentState } from "../agent/loop.js";
|
|
7
|
+
import { takeScreenshot } from "./screenshot.js";
|
|
4
8
|
export const notifyUserTool = tool("notify_user", "Send a message to the user through a messaging channel. Supports text and optional image/file attachments. Use this to communicate results, answer questions, request help, or send files.", {
|
|
5
9
|
message: z
|
|
6
10
|
.string()
|
|
@@ -33,6 +37,9 @@ export const notifyUserTool = tool("notify_user", "Send a message to the user th
|
|
|
33
37
|
.string()
|
|
34
38
|
.optional()
|
|
35
39
|
.describe("Display filename for the attached file"),
|
|
40
|
+
attach_screenshot: z
|
|
41
|
+
.boolean()
|
|
42
|
+
.describe("Should ALWAYS be true if you are sending task results."),
|
|
36
43
|
}, async (args) => {
|
|
37
44
|
const state = getAgentState();
|
|
38
45
|
const channel = args.channel ?? state.lastMessageChannel ?? "gmail";
|
|
@@ -50,6 +57,18 @@ export const notifyUserTool = tool("notify_user", "Send a message to the user th
|
|
|
50
57
|
}
|
|
51
58
|
// Build attachments array from optional params
|
|
52
59
|
const attachments = [];
|
|
60
|
+
let screenshotTmpPath;
|
|
61
|
+
if (args.attach_screenshot) {
|
|
62
|
+
const base64 = await takeScreenshot();
|
|
63
|
+
screenshotTmpPath = path.join(os.tmpdir(), `visionclaw-notify-screenshot-${Date.now()}.png`);
|
|
64
|
+
fs.writeFileSync(screenshotTmpPath, Buffer.from(base64, "base64"));
|
|
65
|
+
attachments.push({
|
|
66
|
+
type: "image",
|
|
67
|
+
localPath: screenshotTmpPath,
|
|
68
|
+
mimeType: "image/png",
|
|
69
|
+
filename: "screenshot.png",
|
|
70
|
+
});
|
|
71
|
+
}
|
|
53
72
|
if (args.image_url) {
|
|
54
73
|
attachments.push({
|
|
55
74
|
type: "image",
|
|
@@ -104,5 +123,13 @@ export const notifyUserTool = tool("notify_user", "Send a message to the user th
|
|
|
104
123
|
isError: true,
|
|
105
124
|
};
|
|
106
125
|
}
|
|
126
|
+
finally {
|
|
127
|
+
if (screenshotTmpPath) {
|
|
128
|
+
try {
|
|
129
|
+
fs.unlinkSync(screenshotTmpPath);
|
|
130
|
+
}
|
|
131
|
+
catch { /* noop */ }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
107
134
|
});
|
|
108
135
|
//# sourceMappingURL=notify.js.map
|
package/dist/tools/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { tool } from "@anthropic-ai/claude-agent-sdk";
|
|
3
3
|
import { getAgentState } from "../agent/loop.js";
|
|
4
|
-
import {
|
|
4
|
+
import { saveOwnerConfig } from "../config/index.js";
|
|
5
5
|
export const setSleepIntervalTool = tool("set_sleep_interval", "Change how long the agent sleeps between heartbeat wake-ups. Use this when the user asks you to sleep longer or shorter, or to change the check-in frequency.", {
|
|
6
6
|
minutes: z
|
|
7
7
|
.number()
|
|
@@ -10,14 +10,14 @@ export const setSleepIntervalTool = tool("set_sleep_interval", "Change how long
|
|
|
10
10
|
.describe("Sleep interval in minutes (1-1440, i.e. up to 24 hours)"),
|
|
11
11
|
}, async (args) => {
|
|
12
12
|
const state = await Promise.resolve(getAgentState());
|
|
13
|
-
const oldMs = state.
|
|
14
|
-
state.
|
|
15
|
-
|
|
13
|
+
const oldMs = state.ownerConfig.heartbeatIntervalMs;
|
|
14
|
+
state.ownerConfig.heartbeatIntervalMs = args.minutes * 60 * 1000;
|
|
15
|
+
saveOwnerConfig(state.ownerConfig);
|
|
16
16
|
return {
|
|
17
17
|
content: [
|
|
18
18
|
{
|
|
19
19
|
type: "text",
|
|
20
|
-
text: `Sleep interval changed from ${oldMs / 60000}m to ${args.minutes}m (saved to config).`,
|
|
20
|
+
text: `Sleep interval changed from ${oldMs / 60000}m to ${args.minutes}m (saved to owner config).`,
|
|
21
21
|
},
|
|
22
22
|
],
|
|
23
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sleep-interval.js","sourceRoot":"","sources":["../../src/tools/sleep-interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sleep-interval.js","sourceRoot":"","sources":["../../src/tools/sleep-interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CACtC,oBAAoB,EACpB,+JAA+J,EAC/J;IACE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,CAAC,yDAAyD,CAAC;CACvE,EACD,KAAK,EAAE,IAAI,EAA2B,EAAE;IACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,mBAAmB,CAAC;IACpD,KAAK,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC;IACjE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,+BAA+B,KAAK,GAAG,KAAK,QAAQ,IAAI,CAAC,OAAO,4BAA4B;aACnG;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|