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.
Files changed (90) hide show
  1. package/README.md +198 -0
  2. package/defaults/AGENT.md +27 -0
  3. package/defaults/IDENTITY.md +27 -0
  4. package/defaults/SOUL.md +34 -0
  5. package/defaults/skills/cron/SKILL.md +68 -0
  6. package/dist/agent.d.ts +25 -0
  7. package/dist/agent.d.ts.map +1 -0
  8. package/dist/agent.js +334 -0
  9. package/dist/agent.js.map +1 -0
  10. package/dist/channels/index.d.ts +3 -0
  11. package/dist/channels/index.d.ts.map +1 -0
  12. package/dist/channels/index.js +2 -0
  13. package/dist/channels/index.js.map +1 -0
  14. package/dist/channels/telegram.d.ts +22 -0
  15. package/dist/channels/telegram.d.ts.map +1 -0
  16. package/dist/channels/telegram.js +189 -0
  17. package/dist/channels/telegram.js.map +1 -0
  18. package/dist/channels/types.d.ts +53 -0
  19. package/dist/channels/types.d.ts.map +1 -0
  20. package/dist/channels/types.js +2 -0
  21. package/dist/channels/types.js.map +1 -0
  22. package/dist/cli/cron.d.ts +3 -0
  23. package/dist/cli/cron.d.ts.map +1 -0
  24. package/dist/cli/cron.js +87 -0
  25. package/dist/cli/cron.js.map +1 -0
  26. package/dist/cli/daemon.d.ts +6 -0
  27. package/dist/cli/daemon.d.ts.map +1 -0
  28. package/dist/cli/daemon.js +100 -0
  29. package/dist/cli/daemon.js.map +1 -0
  30. package/dist/cli/init.d.ts +3 -0
  31. package/dist/cli/init.d.ts.map +1 -0
  32. package/dist/cli/init.js +246 -0
  33. package/dist/cli/init.js.map +1 -0
  34. package/dist/cli/sessions.d.ts +3 -0
  35. package/dist/cli/sessions.d.ts.map +1 -0
  36. package/dist/cli/sessions.js +81 -0
  37. package/dist/cli/sessions.js.map +1 -0
  38. package/dist/cli/start.d.ts +3 -0
  39. package/dist/cli/start.d.ts.map +1 -0
  40. package/dist/cli/start.js +86 -0
  41. package/dist/cli/start.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +21 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +12 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +37 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/cron/scheduler.d.ts +12 -0
  51. package/dist/cron/scheduler.d.ts.map +1 -0
  52. package/dist/cron/scheduler.js +48 -0
  53. package/dist/cron/scheduler.js.map +1 -0
  54. package/dist/cron/store.d.ts +24 -0
  55. package/dist/cron/store.d.ts.map +1 -0
  56. package/dist/cron/store.js +143 -0
  57. package/dist/cron/store.js.map +1 -0
  58. package/dist/cron/types.d.ts +35 -0
  59. package/dist/cron/types.d.ts.map +1 -0
  60. package/dist/cron/types.js +2 -0
  61. package/dist/cron/types.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +14 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/logger.d.ts +3 -0
  67. package/dist/logger.d.ts.map +1 -0
  68. package/dist/logger.js +26 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/sessions/index.d.ts +3 -0
  71. package/dist/sessions/index.d.ts.map +1 -0
  72. package/dist/sessions/index.js +2 -0
  73. package/dist/sessions/index.js.map +1 -0
  74. package/dist/sessions/store.d.ts +36 -0
  75. package/dist/sessions/store.d.ts.map +1 -0
  76. package/dist/sessions/store.js +216 -0
  77. package/dist/sessions/store.js.map +1 -0
  78. package/dist/sessions/types.d.ts +32 -0
  79. package/dist/sessions/types.d.ts.map +1 -0
  80. package/dist/sessions/types.js +2 -0
  81. package/dist/sessions/types.js.map +1 -0
  82. package/dist/skills/sync.d.ts +12 -0
  83. package/dist/skills/sync.d.ts.map +1 -0
  84. package/dist/skills/sync.js +71 -0
  85. package/dist/skills/sync.js.map +1 -0
  86. package/dist/workspace/index.d.ts +2 -0
  87. package/dist/workspace/index.d.ts.map +1 -0
  88. package/dist/workspace/index.js +99 -0
  89. package/dist/workspace/index.js.map +1 -0
  90. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const cronCommand: Command;
3
+ //# sourceMappingURL=cron.d.ts.map
@@ -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"}
@@ -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,6 @@
1
+ import { Command } from "commander";
2
+ export declare const stopCommand: Command;
3
+ export declare const restartCommand: Command;
4
+ export declare const statusCommand: Command;
5
+ export declare const logsCommand: Command;
6
+ //# sourceMappingURL=daemon.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const sessionsCommand: Command;
3
+ //# sourceMappingURL=sessions.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const startCommand: Command;
3
+ //# sourceMappingURL=start.d.ts.map
@@ -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"}