tomo-ai 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 +198 -0
- package/defaults/AGENT.md +27 -0
- package/defaults/IDENTITY.md +27 -0
- package/defaults/SOUL.md +34 -0
- package/defaults/skills/cron/SKILL.md +68 -0
- package/dist/agent.d.ts +25 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +334 -0
- package/dist/agent.js.map +1 -0
- package/dist/channels/index.d.ts +3 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +2 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/telegram.d.ts +22 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +189 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +53 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/cli/cron.d.ts +3 -0
- package/dist/cli/cron.d.ts.map +1 -0
- package/dist/cli/cron.js +87 -0
- package/dist/cli/cron.js.map +1 -0
- package/dist/cli/daemon.d.ts +6 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +100 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +246 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/sessions.d.ts +3 -0
- package/dist/cli/sessions.d.ts.map +1 -0
- package/dist/cli/sessions.js +81 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/start.d.ts +3 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +86 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/cron/scheduler.d.ts +12 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/scheduler.js +48 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/cron/store.d.ts +24 -0
- package/dist/cron/store.d.ts.map +1 -0
- package/dist/cron/store.js +143 -0
- package/dist/cron/store.js.map +1 -0
- package/dist/cron/types.d.ts +35 -0
- package/dist/cron/types.d.ts.map +1 -0
- package/dist/cron/types.js +2 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +26 -0
- package/dist/logger.js.map +1 -0
- package/dist/sessions/index.d.ts +3 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +36 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +216 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/types.d.ts +32 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +2 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/skills/sync.d.ts +12 -0
- package/dist/skills/sync.d.ts.map +1 -0
- package/dist/skills/sync.js +71 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +99 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACzE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpG,MAAM,WAAW,OAAO;IACtB,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,+CAA+C;IAC/C,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAEzC,4CAA4C;IAC5C,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAEzC,0CAA0C;IAC1C,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,sDAAsD;IACtD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAExC,mCAAmC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,uCAAuC;IACvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/cli/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SACgB,CAAC"}
|
package/dist/cli/cron.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { CronStore, parseScheduleString } from "../cron/store.js";
|
|
3
|
+
const store = new CronStore();
|
|
4
|
+
export const cronCommand = new Command("cron")
|
|
5
|
+
.description("Manage scheduled tasks");
|
|
6
|
+
cronCommand
|
|
7
|
+
.command("add")
|
|
8
|
+
.description("Add a scheduled task")
|
|
9
|
+
.requiredOption("--name <name>", "Job name")
|
|
10
|
+
.requiredOption("--schedule <schedule>", 'Schedule: "in 20m", "every 1h", "0 9 * * *"')
|
|
11
|
+
.requiredOption("--message <message>", "Message to send when triggered")
|
|
12
|
+
.option("--channel <channel>", "Channel to deliver to (e.g. telegram)")
|
|
13
|
+
.option("--chat-id <chatId>", "Chat ID to deliver to")
|
|
14
|
+
.option("--once", "Delete after successful run", false)
|
|
15
|
+
.action((opts) => {
|
|
16
|
+
const schedule = parseScheduleString(opts.schedule);
|
|
17
|
+
const job = store.add({
|
|
18
|
+
name: opts.name,
|
|
19
|
+
schedule,
|
|
20
|
+
message: opts.message,
|
|
21
|
+
channel: opts.channel,
|
|
22
|
+
chatId: opts.chatId,
|
|
23
|
+
deleteAfterRun: opts.once ?? (schedule.kind === "at"),
|
|
24
|
+
});
|
|
25
|
+
console.log(`Created job ${job.id}: "${job.name}"`);
|
|
26
|
+
console.log(` Schedule: ${formatSchedule(job.schedule)}`);
|
|
27
|
+
console.log(` Next run: ${job.nextRunAt ? new Date(job.nextRunAt).toLocaleString() : "never"}`);
|
|
28
|
+
});
|
|
29
|
+
cronCommand
|
|
30
|
+
.command("list")
|
|
31
|
+
.description("List all scheduled tasks")
|
|
32
|
+
.action(() => {
|
|
33
|
+
const jobs = store.list();
|
|
34
|
+
if (jobs.length === 0) {
|
|
35
|
+
console.log("No scheduled tasks.");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const job of jobs) {
|
|
39
|
+
const status = job.enabled ? "enabled" : "disabled";
|
|
40
|
+
const next = job.nextRunAt ? new Date(job.nextRunAt).toLocaleString() : "—";
|
|
41
|
+
const last = job.lastRunAt
|
|
42
|
+
? `${new Date(job.lastRunAt).toLocaleString()} (${job.lastStatus})`
|
|
43
|
+
: "never";
|
|
44
|
+
console.log(`[${job.id}] ${job.name} (${status})`);
|
|
45
|
+
console.log(` Schedule: ${formatSchedule(job.schedule)}`);
|
|
46
|
+
console.log(` Message: ${job.message}`);
|
|
47
|
+
console.log(` Next run: ${next}`);
|
|
48
|
+
console.log(` Last run: ${last}`);
|
|
49
|
+
if (job.channel)
|
|
50
|
+
console.log(` Deliver: ${job.channel}:${job.chatId ?? "?"}`);
|
|
51
|
+
console.log();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
cronCommand
|
|
55
|
+
.command("remove <id>")
|
|
56
|
+
.description("Remove a scheduled task")
|
|
57
|
+
.action((id) => {
|
|
58
|
+
if (store.remove(id)) {
|
|
59
|
+
console.log(`Removed job ${id}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.error(`Job ${id} not found`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
cronCommand
|
|
67
|
+
.command("run <id>")
|
|
68
|
+
.description("Trigger a job immediately (for testing)")
|
|
69
|
+
.action((id) => {
|
|
70
|
+
const job = store.get(id);
|
|
71
|
+
if (!job) {
|
|
72
|
+
console.error(`Job ${id} not found`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
console.log(`Would trigger: [${job.id}] ${job.name}`);
|
|
76
|
+
console.log(`Message: ${job.message}`);
|
|
77
|
+
console.log("(Use 'tomo start' to run jobs — this just previews)");
|
|
78
|
+
});
|
|
79
|
+
function formatSchedule(s) {
|
|
80
|
+
switch (s.kind) {
|
|
81
|
+
case "at": return `once at ${s.at}`;
|
|
82
|
+
case "every": return `every ${(s.everyMs / 60_000).toFixed(0)}m`;
|
|
83
|
+
case "cron": return `${s.expr}${s.tz ? ` (${s.tz})` : ""}`;
|
|
84
|
+
default: return JSON.stringify(s);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/cli/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,eAAO,MAAM,WAAW,SAUpB,CAAC;AAEL,eAAO,MAAM,cAAc,SAkBvB,CAAC;AAEL,eAAO,MAAM,aAAa,SAmBtB,CAAC;AAEL,eAAO,MAAM,WAAW,SAqBpB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { existsSync, readFileSync, unlinkSync, statSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
const TOMO_HOME = join(homedir(), ".tomo");
|
|
7
|
+
const PID_FILE = join(TOMO_HOME, "tomo.pid");
|
|
8
|
+
const LOG_FILE = join(TOMO_HOME, "logs", "tomo.log");
|
|
9
|
+
function isRunning(pid) {
|
|
10
|
+
try {
|
|
11
|
+
process.kill(pid, 0);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function getRunningPid() {
|
|
19
|
+
if (!existsSync(PID_FILE))
|
|
20
|
+
return null;
|
|
21
|
+
const pid = Number(readFileSync(PID_FILE, "utf-8").trim());
|
|
22
|
+
if (isNaN(pid) || !isRunning(pid)) {
|
|
23
|
+
try {
|
|
24
|
+
unlinkSync(PID_FILE);
|
|
25
|
+
}
|
|
26
|
+
catch { }
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return pid;
|
|
30
|
+
}
|
|
31
|
+
export const stopCommand = new Command("stop")
|
|
32
|
+
.description("Stop Tomo daemon")
|
|
33
|
+
.action(() => {
|
|
34
|
+
const pid = getRunningPid();
|
|
35
|
+
if (!pid) {
|
|
36
|
+
console.log("Tomo is not running.");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
process.kill(pid, "SIGTERM");
|
|
40
|
+
console.log(`Stopped Tomo (PID ${pid})`);
|
|
41
|
+
});
|
|
42
|
+
export const restartCommand = new Command("restart")
|
|
43
|
+
.description("Restart Tomo daemon")
|
|
44
|
+
.action(async () => {
|
|
45
|
+
const pid = getRunningPid();
|
|
46
|
+
if (pid) {
|
|
47
|
+
process.kill(pid, "SIGTERM");
|
|
48
|
+
console.log(`Stopped Tomo (PID ${pid})`);
|
|
49
|
+
// Wait for process to exit
|
|
50
|
+
while (isRunning(pid)) {
|
|
51
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Import and run start as daemon
|
|
55
|
+
const { spawn } = await import("node:child_process");
|
|
56
|
+
const child = spawn(process.execPath, [process.argv[1], "start"], {
|
|
57
|
+
stdio: "inherit",
|
|
58
|
+
});
|
|
59
|
+
child.on("exit", (code) => process.exit(code ?? 0));
|
|
60
|
+
});
|
|
61
|
+
export const statusCommand = new Command("status")
|
|
62
|
+
.description("Show Tomo status")
|
|
63
|
+
.action(() => {
|
|
64
|
+
const pid = getRunningPid();
|
|
65
|
+
if (!pid) {
|
|
66
|
+
console.log("Tomo is not running.");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let uptime = "";
|
|
70
|
+
if (existsSync(PID_FILE)) {
|
|
71
|
+
const started = statSync(PID_FILE).mtimeMs;
|
|
72
|
+
const ms = Date.now() - started;
|
|
73
|
+
const hours = Math.floor(ms / 3_600_000);
|
|
74
|
+
const mins = Math.floor((ms % 3_600_000) / 60_000);
|
|
75
|
+
uptime = hours > 0 ? `${hours}h ${mins}m` : `${mins}m`;
|
|
76
|
+
}
|
|
77
|
+
console.log(`Tomo is running (PID ${pid}, uptime: ${uptime})`);
|
|
78
|
+
});
|
|
79
|
+
export const logsCommand = new Command("logs")
|
|
80
|
+
.description("Tail Tomo logs")
|
|
81
|
+
.option("-n, --lines <number>", "Number of lines", "50")
|
|
82
|
+
.option("-f, --follow", "Follow log output", false)
|
|
83
|
+
.action((opts) => {
|
|
84
|
+
if (!existsSync(LOG_FILE)) {
|
|
85
|
+
console.log("No log file found. Start Tomo with 'tomo start -d' first.");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const tailArgs = ["-n", opts.lines];
|
|
89
|
+
if (opts.follow)
|
|
90
|
+
tailArgs.push("-f");
|
|
91
|
+
tailArgs.push(LOG_FILE);
|
|
92
|
+
const tail = spawn("tail", tailArgs, { stdio: ["ignore", "pipe", "inherit"] });
|
|
93
|
+
const pretty = spawn("npx", ["pino-pretty", "--ignore", "pid,hostname", "--translateTime", "HH:MM:ss"], {
|
|
94
|
+
stdio: ["pipe", "inherit", "inherit"],
|
|
95
|
+
});
|
|
96
|
+
tail.stdout.pipe(pretty.stdin);
|
|
97
|
+
pretty.on("exit", (code) => process.exit(code ?? 0));
|
|
98
|
+
tail.on("exit", () => pretty.stdin.end());
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,eAAO,MAAM,WAAW,SA+KpB,CAAC"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { existsSync, mkdirSync, copyFileSync, writeFileSync, readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { join, dirname, resolve } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import * as p from "@clack/prompts";
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const TOMO_HOME = join(homedir(), ".tomo");
|
|
9
|
+
const DEFAULTS_DIR = resolve(__dirname, "../../defaults");
|
|
10
|
+
const TONE_DESCRIPTIONS = {
|
|
11
|
+
chill: {
|
|
12
|
+
vibe: "Relaxed, casual, low-key. Like texting a smart friend who's always chill.",
|
|
13
|
+
style: "Lowercase is fine. Short replies. Emoji when it fits. Never formal.",
|
|
14
|
+
},
|
|
15
|
+
sharp: {
|
|
16
|
+
vibe: "Sharp, witty, slightly opinionated. Like a clever friend who has a take on everything but knows when to shut up.",
|
|
17
|
+
style: "Direct and concise. Has strong opinions. Dry humor. Doesn't sugarcoat.",
|
|
18
|
+
},
|
|
19
|
+
warm: {
|
|
20
|
+
vibe: "Warm, supportive, thoughtful. Like a kind friend who genuinely cares and pays attention.",
|
|
21
|
+
style: "Encouraging but honest. Takes time to understand. Gentle humor. Never dismissive.",
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export const initCommand = new Command("init")
|
|
25
|
+
.description("Initialize Tomo — set up config and workspace")
|
|
26
|
+
.option("--force", "Overwrite existing config", false)
|
|
27
|
+
.action(async (opts) => {
|
|
28
|
+
p.intro("Welcome to Tomo");
|
|
29
|
+
const configPath = join(TOMO_HOME, "config.json");
|
|
30
|
+
const isReinit = existsSync(configPath) && !opts.force;
|
|
31
|
+
// 1. Prerequisites check (before anything else)
|
|
32
|
+
const s0 = p.spinner();
|
|
33
|
+
s0.start("Checking prerequisites");
|
|
34
|
+
const { execSync } = await import("node:child_process");
|
|
35
|
+
let claudeOk = false;
|
|
36
|
+
try {
|
|
37
|
+
const version = execSync("claude --version 2>/dev/null", { encoding: "utf-8" }).trim();
|
|
38
|
+
s0.stop(`Claude Code found (${version})`);
|
|
39
|
+
const s1 = p.spinner();
|
|
40
|
+
s1.start("Verifying Claude Code authentication");
|
|
41
|
+
try {
|
|
42
|
+
execSync('claude -p "say ok" --max-turns 1 2>/dev/null', {
|
|
43
|
+
encoding: "utf-8",
|
|
44
|
+
timeout: 30_000,
|
|
45
|
+
});
|
|
46
|
+
claudeOk = true;
|
|
47
|
+
s1.stop("Claude Code authenticated");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
s1.stop("Claude Code not authenticated");
|
|
51
|
+
p.log.error("Run `claude` in your terminal to log in, then try `tomo init` again.");
|
|
52
|
+
p.outro("Setup incomplete");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
s0.stop("Claude Code not found");
|
|
58
|
+
p.log.error("Claude Code is required. Install it: npm install -g @anthropic-ai/claude-code");
|
|
59
|
+
p.outro("Setup incomplete");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
if (isReinit) {
|
|
63
|
+
p.log.info("Existing config found. Use --force to overwrite.");
|
|
64
|
+
}
|
|
65
|
+
// 2. Personalization
|
|
66
|
+
const personality = isReinit ? null : await askPersonality();
|
|
67
|
+
if (personality === null && !isReinit) {
|
|
68
|
+
p.cancel("Setup cancelled.");
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
// 2. Directories
|
|
72
|
+
const s = p.spinner();
|
|
73
|
+
s.start("Creating directory structure");
|
|
74
|
+
const dirs = [
|
|
75
|
+
TOMO_HOME,
|
|
76
|
+
join(TOMO_HOME, "workspace"),
|
|
77
|
+
join(TOMO_HOME, "workspace", "memory"),
|
|
78
|
+
join(TOMO_HOME, "data", "cron"),
|
|
79
|
+
join(TOMO_HOME, "data", "sessions"),
|
|
80
|
+
join(TOMO_HOME, "logs"),
|
|
81
|
+
];
|
|
82
|
+
for (const dir of dirs) {
|
|
83
|
+
mkdirSync(dir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
s.stop("Directory structure ready");
|
|
86
|
+
// 3. Workspace templates
|
|
87
|
+
s.start("Setting up workspace");
|
|
88
|
+
const templates = ["SOUL.md", "AGENT.md", "IDENTITY.md"];
|
|
89
|
+
const copied = [];
|
|
90
|
+
for (const file of templates) {
|
|
91
|
+
const dest = join(TOMO_HOME, "workspace", file);
|
|
92
|
+
const src = join(DEFAULTS_DIR, file);
|
|
93
|
+
if ((!existsSync(dest) || opts.force) && existsSync(src)) {
|
|
94
|
+
let content = readFileSync(src, "utf-8");
|
|
95
|
+
if (personality) {
|
|
96
|
+
content = applyPersonality(file, content, personality);
|
|
97
|
+
}
|
|
98
|
+
writeFileSync(dest, content);
|
|
99
|
+
copied.push(file);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Skills — write directly to .claude/skills/ with tomo- prefix
|
|
103
|
+
const skillsDir = join(DEFAULTS_DIR, "skills");
|
|
104
|
+
const claudeSkillsDir = join(TOMO_HOME, "workspace", ".claude", "skills");
|
|
105
|
+
if (existsSync(skillsDir)) {
|
|
106
|
+
for (const skill of readdirSync(skillsDir, { withFileTypes: true })) {
|
|
107
|
+
if (!skill.isDirectory())
|
|
108
|
+
continue;
|
|
109
|
+
const destDir = join(claudeSkillsDir, `tomo-${skill.name}`);
|
|
110
|
+
const destFile = join(destDir, "SKILL.md");
|
|
111
|
+
const srcFile = join(skillsDir, skill.name, "SKILL.md");
|
|
112
|
+
if ((!existsSync(destFile) || opts.force) && existsSync(srcFile)) {
|
|
113
|
+
mkdirSync(destDir, { recursive: true });
|
|
114
|
+
copyFileSync(srcFile, destFile);
|
|
115
|
+
copied.push(`skill/tomo-${skill.name}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// MEMORY.md with initial content
|
|
120
|
+
const memoryDir = join(TOMO_HOME, "workspace", "memory");
|
|
121
|
+
const memoryFile = join(memoryDir, "MEMORY.md");
|
|
122
|
+
if (!existsSync(memoryFile) || opts.force) {
|
|
123
|
+
if (personality) {
|
|
124
|
+
writeMemory(memoryDir, personality);
|
|
125
|
+
copied.push("MEMORY.md");
|
|
126
|
+
}
|
|
127
|
+
else if (!existsSync(memoryFile)) {
|
|
128
|
+
writeFileSync(memoryFile, "");
|
|
129
|
+
copied.push("MEMORY.md");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (copied.length > 0) {
|
|
133
|
+
s.stop(`Workspace ready (${copied.join(", ")})`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
s.stop("Workspace unchanged (files already exist)");
|
|
137
|
+
}
|
|
138
|
+
// 4. Configuration
|
|
139
|
+
if (!isReinit) {
|
|
140
|
+
const token = await p.text({
|
|
141
|
+
message: "Telegram bot token",
|
|
142
|
+
placeholder: "Paste token from @BotFather",
|
|
143
|
+
validate: (val) => {
|
|
144
|
+
if (!val?.trim())
|
|
145
|
+
return "Token is required. Get one from @BotFather on Telegram.";
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
if (p.isCancel(token)) {
|
|
149
|
+
p.cancel("Setup cancelled.");
|
|
150
|
+
process.exit(0);
|
|
151
|
+
}
|
|
152
|
+
const model = await p.select({
|
|
153
|
+
message: "Default model",
|
|
154
|
+
options: [
|
|
155
|
+
{ value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6", hint: "fast, recommended" },
|
|
156
|
+
{ value: "claude-opus-4-6", label: "Claude Opus 4.6", hint: "most capable" },
|
|
157
|
+
{ value: "claude-haiku-4-5", label: "Claude Haiku 4.5", hint: "cheapest" },
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
if (p.isCancel(model)) {
|
|
161
|
+
p.cancel("Setup cancelled.");
|
|
162
|
+
process.exit(0);
|
|
163
|
+
}
|
|
164
|
+
const config = {
|
|
165
|
+
channels: {
|
|
166
|
+
telegram: { token: token },
|
|
167
|
+
},
|
|
168
|
+
model,
|
|
169
|
+
};
|
|
170
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
171
|
+
p.log.success("Config saved");
|
|
172
|
+
}
|
|
173
|
+
// 5. Summary
|
|
174
|
+
const agentLabel = personality ? personality.agentName : "your assistant";
|
|
175
|
+
p.note([
|
|
176
|
+
`Personality: ~/.tomo/workspace/SOUL.md`,
|
|
177
|
+
`Agent rules: ~/.tomo/workspace/AGENT.md`,
|
|
178
|
+
`Identity: ~/.tomo/workspace/IDENTITY.md`,
|
|
179
|
+
`Memory: ~/.tomo/workspace/memory/`,
|
|
180
|
+
`Config: ~/.tomo/config.json`,
|
|
181
|
+
`Logs: ~/.tomo/logs/`,
|
|
182
|
+
].join("\n"), "Your files");
|
|
183
|
+
p.outro(`Run \`tomo start\` to meet ${agentLabel}!`);
|
|
184
|
+
});
|
|
185
|
+
async function askPersonality() {
|
|
186
|
+
const agentName = await p.text({
|
|
187
|
+
message: "What do you want to name your assistant?",
|
|
188
|
+
placeholder: "Tomo",
|
|
189
|
+
defaultValue: "Tomo",
|
|
190
|
+
});
|
|
191
|
+
if (p.isCancel(agentName))
|
|
192
|
+
return null;
|
|
193
|
+
const userName = await p.text({
|
|
194
|
+
message: "What should your assistant call you?",
|
|
195
|
+
placeholder: "Your name or nickname",
|
|
196
|
+
});
|
|
197
|
+
if (p.isCancel(userName))
|
|
198
|
+
return null;
|
|
199
|
+
const tone = await p.select({
|
|
200
|
+
message: "What tone should your assistant have?",
|
|
201
|
+
options: [
|
|
202
|
+
{ value: "chill", label: "Chill", hint: "relaxed, casual, like texting a friend" },
|
|
203
|
+
{ value: "sharp", label: "Sharp", hint: "witty, opinionated, direct" },
|
|
204
|
+
{ value: "warm", label: "Warm", hint: "supportive, thoughtful, encouraging" },
|
|
205
|
+
],
|
|
206
|
+
});
|
|
207
|
+
if (p.isCancel(tone))
|
|
208
|
+
return null;
|
|
209
|
+
return {
|
|
210
|
+
agentName: agentName.trim() || "Tomo",
|
|
211
|
+
userName: userName.trim(),
|
|
212
|
+
tone: tone,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function applyPersonality(file, content, p) {
|
|
216
|
+
// Replace "Tomo" with the chosen agent name in all templates
|
|
217
|
+
if (p.agentName !== "Tomo") {
|
|
218
|
+
content = content.replace(/\bTomo\b/g, p.agentName);
|
|
219
|
+
}
|
|
220
|
+
if (file === "IDENTITY.md") {
|
|
221
|
+
const tone = TONE_DESCRIPTIONS[p.tone];
|
|
222
|
+
content = content.replace(/\*\*Vibe:\*\*.*/, `**Vibe:** ${tone.vibe}`);
|
|
223
|
+
content = content.replace(/\*\*Energy:\*\*.*/, `**Energy:** ${tone.style}`);
|
|
224
|
+
}
|
|
225
|
+
return content;
|
|
226
|
+
}
|
|
227
|
+
function writeMemory(memoryDir, personality) {
|
|
228
|
+
// User profile memory
|
|
229
|
+
const profileContent = [
|
|
230
|
+
"---",
|
|
231
|
+
"name: user-profile",
|
|
232
|
+
`description: Key facts about ${personality.userName}`,
|
|
233
|
+
"type: user",
|
|
234
|
+
"---",
|
|
235
|
+
"",
|
|
236
|
+
`Name: ${personality.userName}`,
|
|
237
|
+
`Preferred name to use: ${personality.userName}`,
|
|
238
|
+
`Set up ${personality.agentName} on ${new Date().toISOString().split("T")[0]}.`,
|
|
239
|
+
"",
|
|
240
|
+
].join("\n");
|
|
241
|
+
writeFileSync(join(memoryDir, "user_profile.md"), profileContent);
|
|
242
|
+
// MEMORY.md index
|
|
243
|
+
const index = `- [User profile](user_profile.md) — ${personality.userName}'s preferences and info\n`;
|
|
244
|
+
writeFileSync(join(memoryDir, "MEMORY.md"), index);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SACU,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { SessionStore } from "../sessions/store.js";
|
|
5
|
+
const TOMO_HOME = join(homedir(), ".tomo");
|
|
6
|
+
const SESSIONS_DIR = join(TOMO_HOME, "data", "sessions");
|
|
7
|
+
export const sessionsCommand = new Command("sessions")
|
|
8
|
+
.description("Manage chat sessions");
|
|
9
|
+
sessionsCommand
|
|
10
|
+
.command("list")
|
|
11
|
+
.description("List all sessions")
|
|
12
|
+
.action(() => {
|
|
13
|
+
const store = new SessionStore(SESSIONS_DIR, 0);
|
|
14
|
+
const entries = store.listAllSessions();
|
|
15
|
+
if (entries.length === 0) {
|
|
16
|
+
console.log("No sessions.");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const active = entries.filter((e) => e.unlinkedAt === null);
|
|
20
|
+
const unlinked = entries.filter((e) => e.unlinkedAt !== null);
|
|
21
|
+
if (active.length > 0) {
|
|
22
|
+
console.log("Active sessions:\n");
|
|
23
|
+
for (const e of active) {
|
|
24
|
+
const age = formatAge(Date.now() - e.createdAt);
|
|
25
|
+
const lastActive = formatAge(Date.now() - e.lastActiveAt);
|
|
26
|
+
console.log(` ${e.channelKey}`);
|
|
27
|
+
console.log(` Session: ${e.sdkSessionId}`);
|
|
28
|
+
console.log(` Created: ${age} ago`);
|
|
29
|
+
console.log(` Last use: ${lastActive} ago`);
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (unlinked.length > 0) {
|
|
34
|
+
console.log("Unlinked sessions (pending deletion):\n");
|
|
35
|
+
for (const e of unlinked) {
|
|
36
|
+
const expiresIn = e.expiresAt ? formatAge(e.expiresAt - Date.now()) : "?";
|
|
37
|
+
console.log(` ${e.channelKey} (was)`);
|
|
38
|
+
console.log(` Session: ${e.sdkSessionId}`);
|
|
39
|
+
console.log(` Expires: in ${expiresIn}`);
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
sessionsCommand
|
|
45
|
+
.command("clear [key]")
|
|
46
|
+
.description("Unlink a session (or all sessions)")
|
|
47
|
+
.action((key) => {
|
|
48
|
+
const store = new SessionStore(SESSIONS_DIR, 0);
|
|
49
|
+
if (key) {
|
|
50
|
+
if (!store.getSdkSessionId(key)) {
|
|
51
|
+
console.error(`No active session for "${key}"`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
store.clearSdkSessionId(key);
|
|
55
|
+
console.log(`Unlinked session for "${key}" (will be deleted in 30 days)`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const entries = store.listSdkSessionIds();
|
|
59
|
+
if (entries.length === 0) {
|
|
60
|
+
console.log("No active sessions.");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
for (const [k] of entries) {
|
|
64
|
+
store.clearSdkSessionId(k);
|
|
65
|
+
}
|
|
66
|
+
console.log(`Unlinked ${entries.length} session(s) (will be deleted in 30 days)`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
function formatAge(ms) {
|
|
70
|
+
if (ms < 0)
|
|
71
|
+
return "0s";
|
|
72
|
+
const days = Math.floor(ms / 86_400_000);
|
|
73
|
+
const hours = Math.floor((ms % 86_400_000) / 3_600_000);
|
|
74
|
+
const mins = Math.floor((ms % 3_600_000) / 60_000);
|
|
75
|
+
if (days > 0)
|
|
76
|
+
return `${days}d ${hours}h`;
|
|
77
|
+
if (hours > 0)
|
|
78
|
+
return `${hours}h ${mins}m`;
|
|
79
|
+
return `${mins}m`;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,YAAY,SAQrB,CAAC"}
|