@sofer_agent/cli 0.5.3 → 0.6.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/dist/bin.js +5 -0
- package/dist/bin.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +30 -2
- package/dist/init.js.map +1 -1
- package/dist/telegram-start.d.ts +2 -0
- package/dist/telegram-start.d.ts.map +1 -0
- package/dist/telegram-start.js +46 -0
- package/dist/telegram-start.js.map +1 -0
- package/package.json +3 -2
- package/src/bin.ts +5 -0
- package/src/init.ts +31 -2
- package/src/telegram-start.ts +51 -0
package/dist/bin.js
CHANGED
|
@@ -3,6 +3,7 @@ import { agentPaths } from "@sofer_agent/core";
|
|
|
3
3
|
import { chatCommand } from "./chat.js";
|
|
4
4
|
import { infoCommand } from "./info.js";
|
|
5
5
|
import { initCommand } from "./init.js";
|
|
6
|
+
import { telegramCommand } from "./telegram-start.js";
|
|
6
7
|
function printHelp() {
|
|
7
8
|
console.log(`sofer — sovereign AI agent on Sui (memory on Walrus)
|
|
8
9
|
|
|
@@ -10,6 +11,7 @@ function printHelp() {
|
|
|
10
11
|
sofer --resume <id> resume a previous session
|
|
11
12
|
sofer init interactive setup — mint agent + provision memory
|
|
12
13
|
sofer info print on-chain agent state
|
|
14
|
+
sofer telegram start the Telegram bot
|
|
13
15
|
sofer help show this help
|
|
14
16
|
|
|
15
17
|
Chat commands: /sessions /reset /exit /quit
|
|
@@ -32,6 +34,9 @@ async function main() {
|
|
|
32
34
|
case "info":
|
|
33
35
|
await infoCommand();
|
|
34
36
|
break;
|
|
37
|
+
case "telegram":
|
|
38
|
+
await telegramCommand();
|
|
39
|
+
break;
|
|
35
40
|
case "help":
|
|
36
41
|
case "-h":
|
|
37
42
|
case "--help":
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CACT;;;;;;;;;;6BAUyB,UAAU,CAAC,IAAI;gDACI,CAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAE9B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,MAAM;QACR,KAAK,UAAU;YACb,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ;YACX,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;YAC3C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,IACE,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAChC,CAAC;QACD,OAAO,CAAC,KAAK,CACX,qEAAqE,UAAU,CAAC,IAAI,KAAK,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyPjD"}
|
package/dist/init.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cancel, intro, isCancel, note, outro, password, select, spinner } from "@clack/prompts";
|
|
1
|
+
import { cancel, confirm, intro, isCancel, note, outro, password, select, spinner, text } from "@clack/prompts";
|
|
2
2
|
import { AgentClient, agentPaths, encryptWithKey, generateKeypair, keypairFromSecret, loadConfig, makeSuiClient, provisionMemwal, readSecret, requestFaucet, shortAgentId, suiBalance, waitForBalance, writePersistedConfig, writeSecret, } from "@sofer_agent/core";
|
|
3
3
|
/**
|
|
4
4
|
* Interactive init wizard — mint the agent + provision Walrus memory.
|
|
@@ -182,7 +182,31 @@ export async function initCommand() {
|
|
|
182
182
|
catch (e) {
|
|
183
183
|
sLink.stop(`link failed (may already be linked): ${String(e).slice(0, 80)}`);
|
|
184
184
|
}
|
|
185
|
-
// ── 8.
|
|
185
|
+
// ── 8. Telegram bot setup ──────────────────────────────────────────────
|
|
186
|
+
let tgToken = "";
|
|
187
|
+
let tgAllowedUsers = [];
|
|
188
|
+
const tgChoice = await confirm({
|
|
189
|
+
message: "Configure a Telegram bot for this agent?",
|
|
190
|
+
initialValue: true,
|
|
191
|
+
});
|
|
192
|
+
if (!isCancel(tgChoice) && tgChoice) {
|
|
193
|
+
const token = (await password({
|
|
194
|
+
message: "Telegram bot token (from @BotFather)",
|
|
195
|
+
mask: "*",
|
|
196
|
+
}));
|
|
197
|
+
if (!isCancel(token) && token)
|
|
198
|
+
tgToken = token;
|
|
199
|
+
if (tgToken) {
|
|
200
|
+
const users = (await text({
|
|
201
|
+
message: "Allowed Telegram user IDs (comma-separated, empty = all)",
|
|
202
|
+
placeholder: "123456789,987654321",
|
|
203
|
+
}));
|
|
204
|
+
if (!isCancel(users) && typeof users === "string") {
|
|
205
|
+
tgAllowedUsers = users.split(",").map((s) => Number(s.trim())).filter((n) => !Number.isNaN(n));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// ── 9. Persist config + secrets to ~/.sofer/ ───────────────────────────
|
|
186
210
|
if (!delegateKey) {
|
|
187
211
|
cancel("Memory delegate key missing. Re-run `sofer init`.");
|
|
188
212
|
return;
|
|
@@ -191,6 +215,10 @@ export async function initCommand() {
|
|
|
191
215
|
sSave.start("Saving to ~/.sofer/");
|
|
192
216
|
writeSecret(agentPaths.suiKey, secret);
|
|
193
217
|
writeSecret(`${agentPaths.brainKey}.enc`, encryptWithKey(secret, apiKey));
|
|
218
|
+
if (tgToken) {
|
|
219
|
+
const tgBlob = JSON.stringify({ botToken: tgToken, allowedUserIds: tgAllowedUsers });
|
|
220
|
+
writeSecret(`${agentPaths.root}/telegram.enc`, encryptWithKey(secret, tgBlob));
|
|
221
|
+
}
|
|
194
222
|
const persisted = {
|
|
195
223
|
network: net,
|
|
196
224
|
agentObjectId: agentId,
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-start.d.ts","sourceRoot":"","sources":["../src/telegram-start.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA8CrD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { decryptWithKey, loadConfig, readSecret, agentPaths } from "@sofer_agent/core";
|
|
2
|
+
import { TelegramListener } from "@sofer_agent/plugin-telegram";
|
|
3
|
+
import { loadSecrets } from "./env.js";
|
|
4
|
+
export async function telegramCommand() {
|
|
5
|
+
const secrets = loadSecrets();
|
|
6
|
+
if (!secrets.suiSecretKey) {
|
|
7
|
+
console.error("No wallet found. Run `sofer init` first.");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
// Decrypt Telegram config
|
|
11
|
+
const tgPath = `${agentPaths.root}/telegram.enc`;
|
|
12
|
+
const encBlob = readSecret(tgPath);
|
|
13
|
+
if (!encBlob) {
|
|
14
|
+
console.error("Telegram not configured. Run `sofer init` and set up a bot.");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
let tgConfig;
|
|
18
|
+
try {
|
|
19
|
+
const raw = decryptWithKey(secrets.suiSecretKey, encBlob);
|
|
20
|
+
if (!raw)
|
|
21
|
+
throw new Error("decryption failed");
|
|
22
|
+
tgConfig = JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
console.error("Failed to decrypt Telegram config. Run `sofer init` again.");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const config = loadConfig();
|
|
29
|
+
const listener = new TelegramListener({
|
|
30
|
+
botToken: tgConfig.botToken,
|
|
31
|
+
allowedUserIds: tgConfig.allowedUserIds,
|
|
32
|
+
agentName: "sofer",
|
|
33
|
+
});
|
|
34
|
+
// Wire brain dispatch
|
|
35
|
+
listener.onDispatch(async (input) => {
|
|
36
|
+
const { SoferAgent } = await import("@sofer_agent/core");
|
|
37
|
+
const agent = await SoferAgent.create(config, { suiSecretKey: secrets.suiSecretKey, anthropicApiKey: secrets.anthropicApiKey });
|
|
38
|
+
const { text } = await agent.chat(input.text);
|
|
39
|
+
return text;
|
|
40
|
+
});
|
|
41
|
+
await listener.start();
|
|
42
|
+
// Keep alive
|
|
43
|
+
process.on("SIGINT", async () => { await listener.stop(); process.exit(0); });
|
|
44
|
+
process.on("SIGTERM", async () => { await listener.stop(); process.exit(0); });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=telegram-start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-start.js","sourceRoot":"","sources":["../src/telegram-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,eAAe,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAwD,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/C,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,sBAAsB;IACtB,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAa,EAAE,eAAe,EAAE,OAAO,CAAC,eAAgB,EAAE,CAAC,CAAC;QAClI,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,aAAa;IACb,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sofer_agent/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sofer": "./bin/sofer"
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"@clack/prompts": "^1.5.1",
|
|
30
30
|
"@types/blessed": "^0.1.27",
|
|
31
31
|
"blessed": "^0.1.81",
|
|
32
|
-
"@sofer_agent/core": "0.5.
|
|
32
|
+
"@sofer_agent/core": "0.5.1",
|
|
33
|
+
"@sofer_agent/plugin-telegram": "0.1.0"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@types/node": "^22.10.2",
|
package/src/bin.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { agentPaths } from "@sofer_agent/core";
|
|
|
3
3
|
import { chatCommand } from "./chat.js";
|
|
4
4
|
import { infoCommand } from "./info.js";
|
|
5
5
|
import { initCommand } from "./init.js";
|
|
6
|
+
import { telegramCommand } from "./telegram-start.js";
|
|
6
7
|
|
|
7
8
|
function printHelp(): void {
|
|
8
9
|
console.log(
|
|
@@ -12,6 +13,7 @@ function printHelp(): void {
|
|
|
12
13
|
sofer --resume <id> resume a previous session
|
|
13
14
|
sofer init interactive setup — mint agent + provision memory
|
|
14
15
|
sofer info print on-chain agent state
|
|
16
|
+
sofer telegram start the Telegram bot
|
|
15
17
|
sofer help show this help
|
|
16
18
|
|
|
17
19
|
Chat commands: /sessions /reset /exit /quit
|
|
@@ -37,6 +39,9 @@ async function main(): Promise<void> {
|
|
|
37
39
|
case "info":
|
|
38
40
|
await infoCommand();
|
|
39
41
|
break;
|
|
42
|
+
case "telegram":
|
|
43
|
+
await telegramCommand();
|
|
44
|
+
break;
|
|
40
45
|
case "help":
|
|
41
46
|
case "-h":
|
|
42
47
|
case "--help":
|
package/src/init.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cancel, intro, isCancel, note, outro, password, select, spinner } from "@clack/prompts";
|
|
1
|
+
import { cancel, confirm, intro, isCancel, note, outro, password, select, spinner, text } from "@clack/prompts";
|
|
2
2
|
import {
|
|
3
3
|
AgentClient,
|
|
4
4
|
type PersistedConfig,
|
|
@@ -212,7 +212,32 @@ export async function initCommand(): Promise<void> {
|
|
|
212
212
|
sLink.stop(`link failed (may already be linked): ${String(e).slice(0, 80)}`);
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
// ── 8.
|
|
215
|
+
// ── 8. Telegram bot setup ──────────────────────────────────────────────
|
|
216
|
+
let tgToken = "";
|
|
217
|
+
let tgAllowedUsers: number[] = [];
|
|
218
|
+
const tgChoice = await confirm({
|
|
219
|
+
message: "Configure a Telegram bot for this agent?",
|
|
220
|
+
initialValue: true,
|
|
221
|
+
});
|
|
222
|
+
if (!isCancel(tgChoice) && tgChoice) {
|
|
223
|
+
const token = (await password({
|
|
224
|
+
message: "Telegram bot token (from @BotFather)",
|
|
225
|
+
mask: "*",
|
|
226
|
+
})) as string | symbol;
|
|
227
|
+
if (!isCancel(token) && token) tgToken = token;
|
|
228
|
+
|
|
229
|
+
if (tgToken) {
|
|
230
|
+
const users = (await text({
|
|
231
|
+
message: "Allowed Telegram user IDs (comma-separated, empty = all)",
|
|
232
|
+
placeholder: "123456789,987654321",
|
|
233
|
+
})) as string | symbol;
|
|
234
|
+
if (!isCancel(users) && typeof users === "string") {
|
|
235
|
+
tgAllowedUsers = users.split(",").map((s) => Number(s.trim())).filter((n) => !Number.isNaN(n));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ── 9. Persist config + secrets to ~/.sofer/ ───────────────────────────
|
|
216
241
|
if (!delegateKey) {
|
|
217
242
|
cancel("Memory delegate key missing. Re-run `sofer init`.");
|
|
218
243
|
return;
|
|
@@ -221,6 +246,10 @@ export async function initCommand(): Promise<void> {
|
|
|
221
246
|
sSave.start("Saving to ~/.sofer/");
|
|
222
247
|
writeSecret(agentPaths.suiKey, secret);
|
|
223
248
|
writeSecret(`${agentPaths.brainKey}.enc`, encryptWithKey(secret, apiKey));
|
|
249
|
+
if (tgToken) {
|
|
250
|
+
const tgBlob = JSON.stringify({ botToken: tgToken, allowedUserIds: tgAllowedUsers });
|
|
251
|
+
writeSecret(`${agentPaths.root}/telegram.enc`, encryptWithKey(secret, tgBlob));
|
|
252
|
+
}
|
|
224
253
|
const persisted: PersistedConfig = {
|
|
225
254
|
network: net,
|
|
226
255
|
agentObjectId: agentId,
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { decryptWithKey, loadConfig, readSecret, agentPaths } from "@sofer_agent/core";
|
|
2
|
+
import { TelegramListener } from "@sofer_agent/plugin-telegram";
|
|
3
|
+
import { loadSecrets } from "./env.js";
|
|
4
|
+
|
|
5
|
+
export async function telegramCommand(): Promise<void> {
|
|
6
|
+
const secrets = loadSecrets();
|
|
7
|
+
if (!secrets.suiSecretKey) {
|
|
8
|
+
console.error("No wallet found. Run `sofer init` first.");
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Decrypt Telegram config
|
|
13
|
+
const tgPath = `${agentPaths.root}/telegram.enc`;
|
|
14
|
+
const encBlob = readSecret(tgPath);
|
|
15
|
+
if (!encBlob) {
|
|
16
|
+
console.error("Telegram not configured. Run `sofer init` and set up a bot.");
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let tgConfig: { botToken: string; allowedUserIds: number[] };
|
|
21
|
+
try {
|
|
22
|
+
const raw = decryptWithKey(secrets.suiSecretKey, encBlob);
|
|
23
|
+
if (!raw) throw new Error("decryption failed");
|
|
24
|
+
tgConfig = JSON.parse(raw);
|
|
25
|
+
} catch {
|
|
26
|
+
console.error("Failed to decrypt Telegram config. Run `sofer init` again.");
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const config = loadConfig();
|
|
31
|
+
|
|
32
|
+
const listener = new TelegramListener({
|
|
33
|
+
botToken: tgConfig.botToken,
|
|
34
|
+
allowedUserIds: tgConfig.allowedUserIds,
|
|
35
|
+
agentName: "sofer",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Wire brain dispatch
|
|
39
|
+
listener.onDispatch(async (input) => {
|
|
40
|
+
const { SoferAgent } = await import("@sofer_agent/core");
|
|
41
|
+
const agent = await SoferAgent.create(config, { suiSecretKey: secrets.suiSecretKey!, anthropicApiKey: secrets.anthropicApiKey! });
|
|
42
|
+
const { text } = await agent.chat(input.text);
|
|
43
|
+
return text;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
await listener.start();
|
|
47
|
+
|
|
48
|
+
// Keep alive
|
|
49
|
+
process.on("SIGINT", async () => { await listener.stop(); process.exit(0); });
|
|
50
|
+
process.on("SIGTERM", async () => { await listener.stop(); process.exit(0); });
|
|
51
|
+
}
|