@ravi-hq/ravi 0.1.0 → 0.2.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 +56 -6
- package/dist/auth.d.ts +39 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +97 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin/ravi-secrets.d.ts +23 -0
- package/dist/bin/ravi-secrets.d.ts.map +1 -0
- package/dist/bin/ravi-secrets.js +113 -0
- package/dist/bin/ravi-secrets.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +142 -188
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +4 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +26 -17
- package/dist/client.js.map +1 -1
- package/dist/crypto.d.ts +13 -0
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +45 -5
- package/dist/crypto.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -46
- package/dist/index.js.map +1 -1
- package/dist/service.d.ts +7 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +11 -0
- package/dist/service.js.map +1 -1
- package/dist/sse.d.ts +9 -0
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +20 -2
- package/dist/sse.js.map +1 -1
- package/dist/tools/email-send.js +1 -1
- package/dist/tools/email-send.js.map +1 -1
- package/dist/tools/feedback.d.ts +2 -3
- package/dist/tools/feedback.d.ts.map +1 -1
- package/dist/tools/feedback.js +26 -18
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/inbox.d.ts.map +1 -1
- package/dist/tools/inbox.js +15 -56
- package/dist/tools/inbox.js.map +1 -1
- package/dist/tools/passwords.d.ts.map +1 -1
- package/dist/tools/passwords.js +21 -51
- package/dist/tools/passwords.js.map +1 -1
- package/dist/tools/vault.d.ts.map +1 -1
- package/dist/tools/vault.js +4 -8
- package/dist/tools/vault.js.map +1 -1
- package/dist/types.d.ts +10 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +6 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -1
- package/openclaw.plugin.json +3 -23
- package/package.json +5 -3
- package/skills/CLAUDE.md +0 -36
- package/skills/ravi/SKILL.md +0 -46
- package/skills/ravi-email-send/SKILL.md +0 -44
- package/skills/ravi-feedback/SKILL.md +0 -37
- package/skills/ravi-identity/SKILL.md +0 -50
- package/skills/ravi-inbox/SKILL.md +0 -58
- package/skills/ravi-login/SKILL.md +0 -42
- package/skills/ravi-passwords/SKILL.md +0 -48
- package/skills/ravi-vault/SKILL.md +0 -54
package/dist/tools/feedback.js
CHANGED
|
@@ -1,42 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feedback tool for the Ravi OpenClaw plugin.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* acknowledges the feedback; a future version could POST to a feedback endpoint.
|
|
4
|
+
* Sends feedback to the Ravi team by composing an email to feedback@ravi.app
|
|
5
|
+
* from the agent's identity inbox. Matches the Go CLI's `ravi feedback` command.
|
|
7
6
|
*
|
|
8
7
|
* @module tools/feedback
|
|
9
8
|
*/
|
|
9
|
+
import { wrapInHtml } from "../utils.js";
|
|
10
|
+
const FEEDBACK_EMAIL = "feedback@ravi.app";
|
|
10
11
|
/** Tools for submitting feedback about Ravi. */
|
|
11
12
|
export const feedbackTools = [
|
|
12
13
|
{
|
|
13
14
|
name: "ravi_feedback",
|
|
14
|
-
description: "
|
|
15
|
+
description: "Send feedback to the Ravi team about any experience with Ravi tools — good or bad. " +
|
|
16
|
+
"Use this whenever you encounter bugs, have feature requests, notice UX friction, " +
|
|
17
|
+
"or have a positive experience worth sharing. Proactive feedback helps improve Ravi for all agents.",
|
|
15
18
|
parameters: {
|
|
16
19
|
type: "object",
|
|
17
20
|
properties: {
|
|
18
|
-
message: { type: "string", description: "The feedback message" },
|
|
21
|
+
message: { type: "string", description: "The feedback message describing your experience" },
|
|
19
22
|
category: {
|
|
20
23
|
type: "string",
|
|
21
|
-
enum: ["bug", "feature", "
|
|
22
|
-
description: "Category
|
|
24
|
+
enum: ["bug", "feature", "positive", "friction", "other"],
|
|
25
|
+
description: "Category: bug report, feature request, positive experience, UX friction, or other",
|
|
23
26
|
},
|
|
24
27
|
},
|
|
25
28
|
required: ["message"],
|
|
26
29
|
},
|
|
27
|
-
handler: async (params,
|
|
30
|
+
handler: async (params, context) => {
|
|
28
31
|
const category = params.category ?? "other";
|
|
29
32
|
const message = params.message;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
message
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
const subject = `[${category}] Agent Feedback`;
|
|
34
|
+
try {
|
|
35
|
+
await context.client.composeEmail(FEEDBACK_EMAIL, subject, wrapInHtml(message));
|
|
36
|
+
return {
|
|
37
|
+
status: "sent",
|
|
38
|
+
message: `Feedback sent to ${FEEDBACK_EMAIL}.`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
43
|
+
return {
|
|
44
|
+
status: "error",
|
|
45
|
+
message: `Failed to send feedback: ${detail}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
40
48
|
},
|
|
41
49
|
},
|
|
42
50
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAE3C,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,qFAAqF;YACrF,mFAAmF;YACnF,oGAAoG;QACtG,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;gBAC3F,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC;oBACzD,WAAW,EAAE,mFAAmF;iBACjG;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAoB,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAI,MAAM,CAAC,QAAmB,IAAI,OAAO,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAiB,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,QAAQ,kBAAkB,CAAC;YAE/C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,CAC/B,cAAc,EACd,OAAO,EACP,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,oBAAoB,cAAc,GAAG;iBAC/C,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,OAAO;oBACL,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,4BAA4B,MAAM,EAAE;iBAC9C,CAAC;YACJ,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,eAAe,CAAC;AAGjE;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,cAAc,EAsGtC,CAAC"}
|
package/dist/tools/inbox.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module tools/inbox
|
|
10
10
|
*/
|
|
11
|
+
import { tryDecrypt } from "../utils.js";
|
|
11
12
|
/**
|
|
12
13
|
* Tools for reading email and SMS inboxes.
|
|
13
14
|
*
|
|
@@ -35,22 +36,10 @@ export const inboxTools = [
|
|
|
35
36
|
const threads = await client.listEmailThreads(params.unread);
|
|
36
37
|
if (crypto) {
|
|
37
38
|
for (const thread of threads) {
|
|
38
|
-
if (thread.subject)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
catch {
|
|
43
|
-
thread.subject = "[decryption failed]";
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (thread.preview) {
|
|
47
|
-
try {
|
|
48
|
-
thread.preview = await crypto.decrypt(thread.preview);
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
thread.preview = "[decryption failed]";
|
|
52
|
-
}
|
|
53
|
-
}
|
|
39
|
+
if (thread.subject)
|
|
40
|
+
thread.subject = await tryDecrypt(crypto, thread.subject, "email.subject");
|
|
41
|
+
if (thread.preview)
|
|
42
|
+
thread.preview = await tryDecrypt(crypto, thread.preview, "email.preview");
|
|
54
43
|
}
|
|
55
44
|
}
|
|
56
45
|
return threads;
|
|
@@ -73,14 +62,8 @@ export const inboxTools = [
|
|
|
73
62
|
const conversations = await client.listSmsConversations(params.unread);
|
|
74
63
|
if (crypto) {
|
|
75
64
|
for (const conv of conversations) {
|
|
76
|
-
if (conv.preview)
|
|
77
|
-
|
|
78
|
-
conv.preview = await crypto.decrypt(conv.preview);
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
conv.preview = "[decryption failed]";
|
|
82
|
-
}
|
|
83
|
-
}
|
|
65
|
+
if (conv.preview)
|
|
66
|
+
conv.preview = await tryDecrypt(crypto, conv.preview, "sms.preview");
|
|
84
67
|
}
|
|
85
68
|
}
|
|
86
69
|
return conversations;
|
|
@@ -103,30 +86,12 @@ export const inboxTools = [
|
|
|
103
86
|
const messages = await client.getEmailThread(params.thread_id);
|
|
104
87
|
if (crypto) {
|
|
105
88
|
for (const msg of messages) {
|
|
106
|
-
if (msg.subject)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (msg.text_content) {
|
|
115
|
-
try {
|
|
116
|
-
msg.text_content = await crypto.decrypt(msg.text_content);
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
msg.text_content = "[decryption failed]";
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (msg.html_content) {
|
|
123
|
-
try {
|
|
124
|
-
msg.html_content = await crypto.decrypt(msg.html_content);
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
msg.html_content = "[decryption failed]";
|
|
128
|
-
}
|
|
129
|
-
}
|
|
89
|
+
if (msg.subject)
|
|
90
|
+
msg.subject = await tryDecrypt(crypto, msg.subject, "email.subject");
|
|
91
|
+
if (msg.text_content)
|
|
92
|
+
msg.text_content = await tryDecrypt(crypto, msg.text_content, "email.text_content");
|
|
93
|
+
if (msg.html_content)
|
|
94
|
+
msg.html_content = await tryDecrypt(crypto, msg.html_content, "email.html_content");
|
|
130
95
|
}
|
|
131
96
|
}
|
|
132
97
|
return messages;
|
|
@@ -149,14 +114,8 @@ export const inboxTools = [
|
|
|
149
114
|
const messages = await client.listSmsMessages(params.conversation_id);
|
|
150
115
|
if (crypto) {
|
|
151
116
|
for (const msg of messages) {
|
|
152
|
-
if (msg.body)
|
|
153
|
-
|
|
154
|
-
msg.body = await crypto.decrypt(msg.body);
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
msg.body = "[decryption failed]";
|
|
158
|
-
}
|
|
159
|
-
}
|
|
117
|
+
if (msg.body)
|
|
118
|
+
msg.body = await tryDecrypt(crypto, msg.body, "sms.body");
|
|
160
119
|
}
|
|
161
120
|
}
|
|
162
121
|
return messages;
|
package/dist/tools/inbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passwords.d.ts","sourceRoot":"","sources":["../../src/tools/passwords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"passwords.d.ts","sourceRoot":"","sources":["../../src/tools/passwords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAI5C,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,cAAc,EAkHzC,CAAC"}
|
package/dist/tools/passwords.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module tools/passwords
|
|
14
14
|
*/
|
|
15
|
+
import { tryDecrypt } from "../utils.js";
|
|
15
16
|
// ─── Password Tools ─────────────────────────────────────────────────────────
|
|
16
17
|
/** Tools for managing website credentials (list, get, create, delete). */
|
|
17
18
|
export const passwordTools = [
|
|
@@ -25,31 +26,18 @@ export const passwordTools = [
|
|
|
25
26
|
},
|
|
26
27
|
handler: async (_params, { client, crypto }) => {
|
|
27
28
|
const entries = await client.listPasswords();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
if (entry.notes) {
|
|
39
|
-
try {
|
|
40
|
-
entry.notes = await crypto.decrypt(entry.notes);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
entry.notes = "[decryption failed]";
|
|
44
|
-
}
|
|
45
|
-
}
|
|
29
|
+
// Never expose passwords in list view — only in detail view.
|
|
30
|
+
// Build new objects to avoid mutating the API response.
|
|
31
|
+
return Promise.all(entries.map(async (entry) => {
|
|
32
|
+
const result = { ...entry, password: "[hidden]" };
|
|
33
|
+
if (crypto) {
|
|
34
|
+
if (entry.username)
|
|
35
|
+
result.username = await tryDecrypt(crypto, entry.username, "password.username");
|
|
36
|
+
if (entry.notes)
|
|
37
|
+
result.notes = await tryDecrypt(crypto, entry.notes, "password.notes");
|
|
46
38
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
for (const entry of entries) {
|
|
50
|
-
entry.password = "[hidden]";
|
|
51
|
-
}
|
|
52
|
-
return entries;
|
|
39
|
+
return result;
|
|
40
|
+
}));
|
|
53
41
|
},
|
|
54
42
|
},
|
|
55
43
|
{
|
|
@@ -68,30 +56,12 @@ export const passwordTools = [
|
|
|
68
56
|
handler: async (params, { client, crypto }) => {
|
|
69
57
|
const entry = await client.getPassword(params.uuid);
|
|
70
58
|
if (crypto) {
|
|
71
|
-
if (entry.username)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (entry.password) {
|
|
80
|
-
try {
|
|
81
|
-
entry.password = await crypto.decrypt(entry.password);
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
entry.password = "[decryption failed]";
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (entry.notes) {
|
|
88
|
-
try {
|
|
89
|
-
entry.notes = await crypto.decrypt(entry.notes);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
entry.notes = "[decryption failed]";
|
|
93
|
-
}
|
|
94
|
-
}
|
|
59
|
+
if (entry.username)
|
|
60
|
+
entry.username = await tryDecrypt(crypto, entry.username, "password.username");
|
|
61
|
+
if (entry.password)
|
|
62
|
+
entry.password = await tryDecrypt(crypto, entry.password, "password.password");
|
|
63
|
+
if (entry.notes)
|
|
64
|
+
entry.notes = await tryDecrypt(crypto, entry.notes, "password.notes");
|
|
95
65
|
}
|
|
96
66
|
return entry;
|
|
97
67
|
},
|
|
@@ -131,13 +101,13 @@ export const passwordTools = [
|
|
|
131
101
|
const data = {
|
|
132
102
|
domain: params.domain,
|
|
133
103
|
};
|
|
134
|
-
if (params.username) {
|
|
104
|
+
if (params.username !== undefined) {
|
|
135
105
|
data.username = await crypto.encrypt(params.username);
|
|
136
106
|
}
|
|
137
|
-
if (params.password) {
|
|
107
|
+
if (params.password !== undefined) {
|
|
138
108
|
data.password = await crypto.encrypt(params.password);
|
|
139
109
|
}
|
|
140
|
-
if (params.notes) {
|
|
110
|
+
if (params.notes !== undefined) {
|
|
141
111
|
data.notes = await crypto.encrypt(params.notes);
|
|
142
112
|
}
|
|
143
113
|
return client.createPassword(data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passwords.js","sourceRoot":"","sources":["../../src/tools/passwords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"passwords.js","sourceRoot":"","sources":["../../src/tools/passwords.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/tools/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/tools/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAI5C,qEAAqE;AACrE,eAAO,MAAM,UAAU,EAAE,cAAc,EAgFtC,CAAC"}
|
package/dist/tools/vault.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module tools/vault
|
|
10
10
|
*/
|
|
11
|
+
import { tryDecrypt } from "../utils.js";
|
|
11
12
|
// ─── Vault Tools ────────────────────────────────────────────────────────────
|
|
12
13
|
/** Tools for managing secrets in the Ravi vault (list, get, set). */
|
|
13
14
|
export const vaultTools = [
|
|
@@ -26,7 +27,7 @@ export const vaultTools = [
|
|
|
26
27
|
},
|
|
27
28
|
{
|
|
28
29
|
name: "ravi_vault_get",
|
|
29
|
-
description: "Get a secret from the Ravi vault by key.
|
|
30
|
+
description: "Get a secret from the Ravi vault by key. Response includes the secret's UUID, needed for deletion.",
|
|
30
31
|
parameters: {
|
|
31
32
|
type: "object",
|
|
32
33
|
properties: {
|
|
@@ -40,12 +41,7 @@ export const vaultTools = [
|
|
|
40
41
|
handler: async (params, { client, crypto }) => {
|
|
41
42
|
const secret = await client.getSecret(params.key);
|
|
42
43
|
if (crypto && secret.value) {
|
|
43
|
-
|
|
44
|
-
secret.value = await crypto.decrypt(secret.value);
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
secret.value = "[decryption failed]";
|
|
48
|
-
}
|
|
44
|
+
secret.value = await tryDecrypt(crypto, secret.value, "vault.value");
|
|
49
45
|
}
|
|
50
46
|
return secret;
|
|
51
47
|
},
|
|
@@ -80,7 +76,7 @@ export const vaultTools = [
|
|
|
80
76
|
},
|
|
81
77
|
{
|
|
82
78
|
name: "ravi_vault_delete",
|
|
83
|
-
description: "Delete a secret from the Ravi vault by UUID.",
|
|
79
|
+
description: "Delete a secret from the Ravi vault by UUID. Use ravi_vault_get or ravi_vault_list to find the UUID.",
|
|
84
80
|
parameters: {
|
|
85
81
|
type: "object",
|
|
86
82
|
properties: {
|
package/dist/tools/vault.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/tools/vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/tools/vault.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -123,15 +123,16 @@ export interface SmsEvent {
|
|
|
123
123
|
sender_type: SenderType;
|
|
124
124
|
created_dt: string;
|
|
125
125
|
}
|
|
126
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Configuration shape for the Ravi OpenClaw plugin.
|
|
128
|
+
*
|
|
129
|
+
* Auth credentials (tokens, keypair) are stored in ~/.ravi/auth.json
|
|
130
|
+
* (managed by `openclaw ravi login`). The OpenClaw config only needs
|
|
131
|
+
* the identity UUID to scope this agent to a specific Ravi identity.
|
|
132
|
+
*/
|
|
127
133
|
export interface RaviPluginConfig {
|
|
128
|
-
/**
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
refreshToken?: string;
|
|
132
|
-
/** Identity UUID for scoped operations (from 'openclaw ravi setup') */
|
|
133
|
-
identityUuid?: string;
|
|
134
|
-
/** User PIN for E2E encryption key derivation */
|
|
135
|
-
pin: string;
|
|
134
|
+
/** Identity UUID — maps this OpenClaw agent to a Ravi identity.
|
|
135
|
+
* Set in the OpenClaw agent config (each agent binds to one identity). */
|
|
136
|
+
identityUuid: string;
|
|
136
137
|
}
|
|
137
138
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -3,9 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module utils
|
|
5
5
|
*/
|
|
6
|
+
import type { CryptoManager } from "./crypto.js";
|
|
6
7
|
/**
|
|
7
8
|
* Wraps plain text in HTML for email sending.
|
|
8
9
|
* Escapes &, <, > and converts newlines to <br> tags.
|
|
9
10
|
*/
|
|
10
11
|
export declare function wrapInHtml(text: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Try to decrypt a value, returning a fallback on failure.
|
|
14
|
+
* Logs the first decryption failure to help diagnose wrong-PIN issues.
|
|
15
|
+
*/
|
|
16
|
+
export declare function tryDecrypt(crypto: CryptoManager, value: string, context: string): Promise<string>;
|
|
11
17
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAID;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|
package/dist/utils.js
CHANGED
|
@@ -15,4 +15,22 @@ export function wrapInHtml(text) {
|
|
|
15
15
|
.replace(/\n/g, "<br>");
|
|
16
16
|
return `<div>${escaped}</div>`;
|
|
17
17
|
}
|
|
18
|
+
let decryptionWarningLogged = false;
|
|
19
|
+
/**
|
|
20
|
+
* Try to decrypt a value, returning a fallback on failure.
|
|
21
|
+
* Logs the first decryption failure to help diagnose wrong-PIN issues.
|
|
22
|
+
*/
|
|
23
|
+
export async function tryDecrypt(crypto, value, context) {
|
|
24
|
+
try {
|
|
25
|
+
return await crypto.decrypt(value);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (!decryptionWarningLogged) {
|
|
29
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
30
|
+
console.error(`[ravi] Decryption failed (${context}): ${detail}. Wrong PIN?`);
|
|
31
|
+
decryptionWarningLogged = true;
|
|
32
|
+
}
|
|
33
|
+
return "[decryption failed]";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
18
36
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1B,OAAO,QAAQ,OAAO,QAAQ,CAAC;AACjC,CAAC;AAED,IAAI,uBAAuB,GAAG,KAAK,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAqB,EACrB,KAAa,EACb,OAAe;IAEf,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,MAAM,MAAM,cAAc,CAAC,CAAC;YAC9E,uBAAuB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -5,29 +5,9 @@
|
|
|
5
5
|
"configSchema": {
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
|
-
"
|
|
9
|
-
"type": "string",
|
|
10
|
-
"description": "Access token from 'openclaw ravi login'"
|
|
11
|
-
},
|
|
12
|
-
"refreshToken": {
|
|
13
|
-
"type": "string",
|
|
14
|
-
"description": "Refresh token for automatic access token renewal"
|
|
15
|
-
},
|
|
16
|
-
"identityUuid": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "Identity UUID for scoped operations (from 'openclaw ravi setup')"
|
|
19
|
-
},
|
|
20
|
-
"pin": {
|
|
21
|
-
"type": "string",
|
|
22
|
-
"pattern": "^[0-9]{6}$",
|
|
23
|
-
"description": "6-digit E2E encryption PIN"
|
|
24
|
-
}
|
|
8
|
+
"identityUuid": { "type": "string" }
|
|
25
9
|
},
|
|
26
|
-
"required": ["
|
|
10
|
+
"required": ["identityUuid"]
|
|
27
11
|
},
|
|
28
|
-
"uiHints": {
|
|
29
|
-
"token": { "label": "Access Token", "sensitive": true },
|
|
30
|
-
"refreshToken": { "label": "Refresh Token", "sensitive": true },
|
|
31
|
-
"pin": { "label": "E2E PIN", "sensitive": true }
|
|
32
|
-
}
|
|
12
|
+
"uiHints": {}
|
|
33
13
|
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ravi-hq/ravi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "OpenClaw plugin for Ravi — identity provider for AI agents. Email & SMS channels + full agent toolbox.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ravi-secrets": "dist/bin/ravi-secrets.js"
|
|
10
|
+
},
|
|
8
11
|
"scripts": {
|
|
9
12
|
"build": "bash scripts/build.sh",
|
|
10
13
|
"build:prod": "RAVI_API_URL=https://ravi.app bash scripts/build.sh",
|
|
@@ -50,8 +53,7 @@
|
|
|
50
53
|
},
|
|
51
54
|
"files": [
|
|
52
55
|
"dist",
|
|
53
|
-
"openclaw.plugin.json"
|
|
54
|
-
"skills"
|
|
56
|
+
"openclaw.plugin.json"
|
|
55
57
|
],
|
|
56
58
|
"license": "MIT",
|
|
57
59
|
"repository": {
|
package/skills/CLAUDE.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# skills/
|
|
2
|
-
|
|
3
|
-
Agent-facing skill documentation bundled with the plugin. 8 skills total.
|
|
4
|
-
|
|
5
|
-
## Skills vs Tools
|
|
6
|
-
|
|
7
|
-
**Skills** are documentation files (SKILL.md) that teach agents _when_ and _how_ to use tools. **Tools** are executable functions registered with the runtime. Skills reference tools but do not contain executable code.
|
|
8
|
-
|
|
9
|
-
## SKILL.md Format
|
|
10
|
-
|
|
11
|
-
Each skill is a directory containing a single `SKILL.md` file with:
|
|
12
|
-
|
|
13
|
-
1. **YAML frontmatter**: `name` and `description` (used for skill discovery and routing)
|
|
14
|
-
2. **Markdown body**: Usage examples, parameter docs, workflow patterns, important notes
|
|
15
|
-
|
|
16
|
-
The `description` frontmatter includes negative guidance ("Do NOT use for...") to help agents route to the correct skill.
|
|
17
|
-
|
|
18
|
-
## Skill Inventory
|
|
19
|
-
|
|
20
|
-
| Directory | Name | Purpose |
|
|
21
|
-
|-----------|------|---------|
|
|
22
|
-
| `ravi/` | `ravi` | Overview of all tools and when to use each one |
|
|
23
|
-
| `ravi-identity/` | `ravi-identity` | Manage identities (list, create, get info) |
|
|
24
|
-
| `ravi-inbox/` | `ravi-inbox` | Read incoming email and SMS (OTPs, verification codes) |
|
|
25
|
-
| `ravi-email-send/` | `ravi-email-send` | Compose and reply to emails |
|
|
26
|
-
| `ravi-passwords/` | `ravi-passwords` | Store and retrieve website credentials |
|
|
27
|
-
| `ravi-vault/` | `ravi-vault` | Store and retrieve key-value secrets (API keys) |
|
|
28
|
-
| `ravi-login/` | `ravi-login` | Sign up/login workflows, 2FA, OTP handling |
|
|
29
|
-
| `ravi-feedback/` | `ravi-feedback` | Submit feedback, bugs, feature requests |
|
|
30
|
-
|
|
31
|
-
## Distribution
|
|
32
|
-
|
|
33
|
-
Skills are distributed through multiple channels from this single repo:
|
|
34
|
-
- **skills.sh**: `npx skills add ravi-hq/ravi-skills` reads `skills/*/SKILL.md`
|
|
35
|
-
- **Claude Code plugin**: reads `.claude-plugin/plugin.json`
|
|
36
|
-
- **ClawdHub**: published individually via CI
|