tomo-ai 0.8.4 → 0.8.5

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 (126) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +14 -2
  3. package/dist/agent/claude-login.d.ts +32 -0
  4. package/dist/agent/claude-login.d.ts.map +1 -0
  5. package/dist/agent/claude-login.js +176 -0
  6. package/dist/agent/claude-login.js.map +1 -0
  7. package/dist/agent/commands.d.ts +6 -1
  8. package/dist/agent/commands.d.ts.map +1 -1
  9. package/dist/agent/commands.js +97 -19
  10. package/dist/agent/commands.js.map +1 -1
  11. package/dist/agent/sdk-options.js +11 -1
  12. package/dist/agent/sdk-options.js.map +1 -1
  13. package/dist/agent.d.ts +7 -3
  14. package/dist/agent.d.ts.map +1 -1
  15. package/dist/agent.js +102 -15
  16. package/dist/agent.js.map +1 -1
  17. package/dist/auth.d.ts +19 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +56 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/channels/imessage-dedupe.d.ts +25 -0
  22. package/dist/channels/imessage-dedupe.d.ts.map +1 -0
  23. package/dist/channels/imessage-dedupe.js +85 -0
  24. package/dist/channels/imessage-dedupe.js.map +1 -0
  25. package/dist/channels/imessage.d.ts +3 -0
  26. package/dist/channels/imessage.d.ts.map +1 -1
  27. package/dist/channels/imessage.js +18 -1
  28. package/dist/channels/imessage.js.map +1 -1
  29. package/dist/channels/telegram.d.ts.map +1 -1
  30. package/dist/channels/telegram.js +2 -1
  31. package/dist/channels/telegram.js.map +1 -1
  32. package/dist/cli/backup-workspace.d.ts +9 -0
  33. package/dist/cli/backup-workspace.d.ts.map +1 -0
  34. package/dist/cli/backup-workspace.js +76 -0
  35. package/dist/cli/backup-workspace.js.map +1 -0
  36. package/dist/cli/backup.d.ts.map +1 -1
  37. package/dist/cli/backup.js +11 -39
  38. package/dist/cli/backup.js.map +1 -1
  39. package/dist/cli/config/auth.d.ts +2 -0
  40. package/dist/cli/config/auth.d.ts.map +1 -0
  41. package/dist/cli/config/auth.js +60 -0
  42. package/dist/cli/config/auth.js.map +1 -0
  43. package/dist/cli/config/identities.js +3 -3
  44. package/dist/cli/config/identities.js.map +1 -1
  45. package/dist/cli/config/index.d.ts.map +1 -1
  46. package/dist/cli/config/index.js +4 -0
  47. package/dist/cli/config/index.js.map +1 -1
  48. package/dist/cli/config/sessions.js +2 -2
  49. package/dist/cli/config/sessions.js.map +1 -1
  50. package/dist/cli/config/shared.d.ts +1 -0
  51. package/dist/cli/config/shared.d.ts.map +1 -1
  52. package/dist/cli/config/shared.js +10 -8
  53. package/dist/cli/config/shared.js.map +1 -1
  54. package/dist/cli/daemon.js +4 -4
  55. package/dist/cli/daemon.js.map +1 -1
  56. package/dist/cli/init.d.ts.map +1 -1
  57. package/dist/cli/init.js +19 -19
  58. package/dist/cli/init.js.map +1 -1
  59. package/dist/cli/lcm.d.ts.map +1 -1
  60. package/dist/cli/lcm.js +28 -27
  61. package/dist/cli/lcm.js.map +1 -1
  62. package/dist/cli/service.d.ts.map +1 -1
  63. package/dist/cli/service.js +2 -2
  64. package/dist/cli/service.js.map +1 -1
  65. package/dist/cli/sessions.d.ts.map +1 -1
  66. package/dist/cli/sessions.js +3 -6
  67. package/dist/cli/sessions.js.map +1 -1
  68. package/dist/cli/start.js +13 -10
  69. package/dist/cli/start.js.map +1 -1
  70. package/dist/cli/uninstall.d.ts.map +1 -1
  71. package/dist/cli/uninstall.js +2 -4
  72. package/dist/cli/uninstall.js.map +1 -1
  73. package/dist/config.d.ts +8 -2
  74. package/dist/config.d.ts.map +1 -1
  75. package/dist/config.js +19 -10
  76. package/dist/config.js.map +1 -1
  77. package/dist/fs-utils.d.ts +6 -2
  78. package/dist/fs-utils.d.ts.map +1 -1
  79. package/dist/fs-utils.js +5 -3
  80. package/dist/fs-utils.js.map +1 -1
  81. package/dist/lcm/blocks.d.ts +3 -3
  82. package/dist/lcm/blocks.d.ts.map +1 -1
  83. package/dist/lcm/blocks.js +8 -8
  84. package/dist/lcm/blocks.js.map +1 -1
  85. package/dist/lcm/compact.d.ts +4 -2
  86. package/dist/lcm/compact.d.ts.map +1 -1
  87. package/dist/lcm/compact.js +7 -7
  88. package/dist/lcm/compact.js.map +1 -1
  89. package/dist/lcm/prune-tools.d.ts +2 -0
  90. package/dist/lcm/prune-tools.d.ts.map +1 -1
  91. package/dist/lcm/prune-tools.js +2 -2
  92. package/dist/lcm/prune-tools.js.map +1 -1
  93. package/dist/lcm/runner.d.ts.map +1 -1
  94. package/dist/lcm/runner.js +6 -2
  95. package/dist/lcm/runner.js.map +1 -1
  96. package/dist/lcm/stats.d.ts +2 -2
  97. package/dist/lcm/stats.d.ts.map +1 -1
  98. package/dist/lcm/stats.js +4 -4
  99. package/dist/lcm/stats.js.map +1 -1
  100. package/dist/mcp/internal-server.d.ts +5 -4
  101. package/dist/mcp/internal-server.d.ts.map +1 -1
  102. package/dist/mcp/internal-server.js +6 -5
  103. package/dist/mcp/internal-server.js.map +1 -1
  104. package/dist/router.d.ts.map +1 -1
  105. package/dist/router.js +7 -0
  106. package/dist/router.js.map +1 -1
  107. package/dist/runtime-paths.d.ts +29 -0
  108. package/dist/runtime-paths.d.ts.map +1 -0
  109. package/dist/runtime-paths.js +33 -0
  110. package/dist/runtime-paths.js.map +1 -0
  111. package/dist/sessions/index.d.ts +1 -1
  112. package/dist/sessions/index.d.ts.map +1 -1
  113. package/dist/sessions/index.js +1 -1
  114. package/dist/sessions/index.js.map +1 -1
  115. package/dist/sessions/repair.d.ts +1 -1
  116. package/dist/sessions/repair.d.ts.map +1 -1
  117. package/dist/sessions/repair.js +2 -2
  118. package/dist/sessions/repair.js.map +1 -1
  119. package/dist/sessions/store.d.ts +11 -4
  120. package/dist/sessions/store.d.ts.map +1 -1
  121. package/dist/sessions/store.js +60 -13
  122. package/dist/sessions/store.js.map +1 -1
  123. package/dist/workspace/index.d.ts.map +1 -1
  124. package/dist/workspace/index.js +2 -3
  125. package/dist/workspace/index.js.map +1 -1
  126. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.5 (2026-06-26)
4
+
5
+ ### Features
6
+
7
+ - **API key authentication config** (#158). Adds explicit API-key auth configuration and prevents the Anthropic API key from leaking to custom gateways/base URLs.
8
+ - **Claude login from the owner DM** (#165). The owner can authenticate Claude directly through a DM command instead of the CLI only, with clearer messaging when login verification fails.
9
+ - **Custom workspace for SDK sessions** (#175). SDK sessions now honor a configured custom workspace path. Runtime path resolution was consolidated into a new `runtime-paths` module.
10
+
11
+ ### Bug fixes
12
+
13
+ - **iMessage inbound webhook dedupe is now persisted** (#163). Webhook dedupe state survives daemon restarts instead of living only in memory, so restarts no longer risk re-processing recently seen messages.
14
+ - **Direct-send note attribution** (#148). Summoned-group direct sends are attributed to the correct caller, attribution is caller-aware, and pending notes are capped.
15
+ - **Suppress group LCM output** (#164). Lifecycle-management chatter no longer leaks into group chats.
16
+
17
+ ### Other
18
+
19
+ - Test against Node 26 in CI and align Node typings (#171).
20
+ - Extract `backup-workspace` out of the backup command.
21
+ - Bump `@anthropic-ai/claude-agent-sdk` `0.3.181` → `0.3.195` (#173, #169, #176).
22
+ - Bump `grammy` `1.44.0` (#168), `@clack/prompts` `1.6.0` (#170), `eslint` `10.6.0`, `actions/checkout` v7 (#166), and the dev-dependencies group (#174).
23
+
3
24
  ## 0.8.4 (2026-06-19)
4
25
 
5
26
  ### Features
package/README.md CHANGED
@@ -32,7 +32,7 @@ That's it. Open Telegram and message your bot.
32
32
  ## Requirements
33
33
 
34
34
  - Node.js 22.12+
35
- - [Claude Code](https://claude.com/claude-code) installed. Authenticate Claude Code for direct Claude models, or configure a LiteLLM gateway for non-Claude backends.
35
+ - [Claude Code](https://claude.com/claude-code) installed. Direct Claude models can use a Claude subscription or an Anthropic API key; LiteLLM gateways support other backends.
36
36
  - At least one channel:
37
37
  - **Telegram** — bot token from [@BotFather](https://t.me/BotFather)
38
38
  - **iMessage** — [BlueBubbles](https://bluebubbles.app) server running on a Mac with iMessage signed in
@@ -41,7 +41,7 @@ That's it. Open Telegram and message your bot.
41
41
 
42
42
  ```bash
43
43
  tomo init # First-time setup
44
- tomo config # Interactive settings (model, LiteLLM, channels, identities, groups)
44
+ tomo config # Interactive settings (authentication, model, LiteLLM, channels, identities, groups)
45
45
  tomo start # Start in background (daemon)
46
46
  tomo start -f # Start in foreground (for dev)
47
47
  tomo stop # Stop the daemon
@@ -60,6 +60,7 @@ tomo sessions clear # Reset all sessions
60
60
  | `/new` | Start a new conversation (resets session) |
61
61
  | `/model` | Switch model (Claude aliases or LiteLLM `provider/model` names) |
62
62
  | `/restore` | Restore `config.json` from `config.json.bak` and restart |
63
+ | `/login` | Refresh Claude login from a configured owner's private DM |
63
64
  | `/status` | Show session info (model, channel, message count) |
64
65
  | `/pet` | Check Tomo's pet's mood, growth stage, and stats |
65
66
 
@@ -203,6 +204,10 @@ Run `tomo config` for interactive setup, or edit `~/.tomo/config.json` directly:
203
204
 
204
205
  ```json
205
206
  {
207
+ "auth": {
208
+ "method": "api-key",
209
+ "apiKey": "sk-ant-..."
210
+ },
206
211
  "channels": {
207
212
  "telegram": {
208
213
  "token": "your-bot-token",
@@ -246,6 +251,7 @@ Environment variables override config file values:
246
251
 
247
252
  | Variable | Description |
248
253
  |----------|-------------|
254
+ | `ANTHROPIC_API_KEY` | Use Anthropic API-key authentication; overrides the authentication stored in `config.json` |
249
255
  | `TELEGRAM_BOT_TOKEN` | Override Telegram token |
250
256
  | `IMESSAGE_URL` | Override BlueBubbles URL |
251
257
  | `IMESSAGE_TYPING_START_DELAY_MS` | Delay before showing iMessage typing for ordinary turns (default: `1200`) |
@@ -263,6 +269,12 @@ Environment variables override config file values:
263
269
  | `TOMO_CONTINUITY_SCRIPT_MAX_OUTPUT_CHARS` | Override continuity script stdout/stderr cap (default: `8000`) |
264
270
  | `LOG_LEVEL` | Log level (default: `debug`) |
265
271
 
272
+ ### Anthropic Authentication
273
+
274
+ Direct Claude models use your existing Claude Code subscription login by default. To use Anthropic API billing instead, run `tomo config`, choose **Anthropic authentication**, and enter an API key. Tomo stores the selected method under `auth` in `~/.tomo/config.json` and passes the key only to direct Claude Agent SDK child processes. `ANTHROPIC_API_KEY` remains supported and takes precedence over the saved setting.
275
+
276
+ Because the config contains channel credentials and may now contain an Anthropic API key, Tomo writes both `config.json` and `config.json.bak` with owner-only (`0600`) permissions.
277
+
266
278
  `continuityScript` can also be a simple path string, e.g. `"continuityScript": "~/bin/tomo-continuity.sh"`. Relative paths resolve under `~/.tomo`; the script runs once per scheduled heartbeat and manual `tomo continuity` trigger, and its stdout/stderr or failure status is appended to the normal continuity prompt.
267
279
 
268
280
  ### Steering
@@ -0,0 +1,32 @@
1
+ import { type ChildProcessWithoutNullStreams } from "node:child_process";
2
+ export interface ClaudeLoginManagerOptions {
3
+ spawnLogin?: () => ChildProcessWithoutNullStreams;
4
+ verifyLogin?: () => Promise<void>;
5
+ timeoutMs?: number;
6
+ }
7
+ export interface ClaudeLoginStart {
8
+ url: string;
9
+ reused: boolean;
10
+ }
11
+ export interface ClaudeLoginCompletion {
12
+ verified: boolean;
13
+ verificationError?: string;
14
+ }
15
+ /**
16
+ * Owns the single machine-global Claude OAuth flow. The PKCE verifier lives in
17
+ * the waiting `claude auth login` child, so the process must stay alive between
18
+ * sending the URL and receiving the one-time code from the owner.
19
+ */
20
+ export declare class ClaudeLoginManager {
21
+ private pending;
22
+ private readonly spawnLogin;
23
+ private readonly verifyLogin;
24
+ private readonly timeoutMs;
25
+ constructor(options?: ClaudeLoginManagerOptions);
26
+ start(owner: string): Promise<ClaudeLoginStart>;
27
+ complete(owner: string, code: string): Promise<ClaudeLoginCompletion>;
28
+ cancel(owner: string): boolean;
29
+ stop(): void;
30
+ private clearPending;
31
+ }
32
+ //# sourceMappingURL=claude-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-login.d.ts","sourceRoot":"","sources":["../../src/agent/claude-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAoB1F,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,8BAA8B,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,GAAE,yBAA8B;IAQ7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuF/C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAiC3E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAW9B,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,YAAY;CAIrB"}
@@ -0,0 +1,176 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ const LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
3
+ const LOGIN_URL_RE = /https:\/\/claude\.com\/cai\/oauth\/authorize\?[^\s]+/;
4
+ /**
5
+ * Owns the single machine-global Claude OAuth flow. The PKCE verifier lives in
6
+ * the waiting `claude auth login` child, so the process must stay alive between
7
+ * sending the URL and receiving the one-time code from the owner.
8
+ */
9
+ export class ClaudeLoginManager {
10
+ pending = null;
11
+ spawnLogin;
12
+ verifyLogin;
13
+ timeoutMs;
14
+ constructor(options = {}) {
15
+ this.spawnLogin = options.spawnLogin ?? (() => spawn("claude", ["auth", "login"], {
16
+ stdio: ["pipe", "pipe", "pipe"],
17
+ }));
18
+ this.verifyLogin = options.verifyLogin ?? verifyClaudeLogin;
19
+ this.timeoutMs = options.timeoutMs ?? LOGIN_TIMEOUT_MS;
20
+ }
21
+ async start(owner) {
22
+ const normalizedOwner = owner.toLowerCase();
23
+ if (this.pending) {
24
+ if (this.pending.owner !== normalizedOwner) {
25
+ throw new Error("Another owner already has a Claude login in progress");
26
+ }
27
+ return {
28
+ url: this.pending.url ?? await this.pending.urlPromise,
29
+ reused: true,
30
+ };
31
+ }
32
+ const child = this.spawnLogin();
33
+ let resolveUrl;
34
+ let rejectUrl;
35
+ const urlPromise = new Promise((resolve, reject) => {
36
+ resolveUrl = resolve;
37
+ rejectUrl = reject;
38
+ });
39
+ let resolveCompletion;
40
+ let rejectCompletion;
41
+ const completionPromise = new Promise((resolve, reject) => {
42
+ resolveCompletion = resolve;
43
+ rejectCompletion = reject;
44
+ });
45
+ // A child can fail before `/login <code>` attaches its await. Keep that
46
+ // rejection observed while preserving it for the eventual caller.
47
+ void completionPromise.catch(() => { });
48
+ const pending = {
49
+ owner: normalizedOwner,
50
+ child,
51
+ output: "",
52
+ codeSubmitted: false,
53
+ timeout: setTimeout(() => {
54
+ const err = new Error("Claude login expired after 10 minutes; run /login again");
55
+ rejectUrl(err);
56
+ rejectCompletion(err);
57
+ child.kill();
58
+ this.clearPending(pending);
59
+ }, this.timeoutMs),
60
+ urlPromise,
61
+ resolveUrl,
62
+ rejectUrl,
63
+ completionPromise,
64
+ resolveCompletion,
65
+ rejectCompletion,
66
+ };
67
+ this.pending = pending;
68
+ const capture = (chunk) => {
69
+ pending.output = (pending.output + chunk.toString()).slice(-16_000);
70
+ if (pending.url)
71
+ return;
72
+ const match = LOGIN_URL_RE.exec(pending.output);
73
+ if (match) {
74
+ pending.url = match[0];
75
+ pending.resolveUrl(match[0]);
76
+ }
77
+ };
78
+ child.stdout.on("data", capture);
79
+ child.stderr.on("data", capture);
80
+ child.stdin.on("error", (err) => {
81
+ pending.rejectCompletion(new Error(`Could not submit Claude login code: ${err.message}`));
82
+ });
83
+ child.once("error", (err) => {
84
+ pending.rejectUrl(new Error(`Could not start Claude login: ${err.message}`));
85
+ pending.rejectCompletion(err);
86
+ this.clearPending(pending);
87
+ });
88
+ child.once("exit", (code, signal) => {
89
+ // Exit 0 after a submitted code means the CLI accepted the exchange. The
90
+ // separate authenticated probe below is the authoritative verification.
91
+ if (code === 0 && pending.codeSubmitted) {
92
+ pending.resolveCompletion();
93
+ }
94
+ else {
95
+ const reason = signal ? `signal ${signal}` : `exit code ${code ?? "unknown"}`;
96
+ const err = new Error(`Claude login did not complete (${reason})`);
97
+ pending.rejectUrl(err);
98
+ pending.rejectCompletion(err);
99
+ }
100
+ this.clearPending(pending);
101
+ });
102
+ return { url: await urlPromise, reused: false };
103
+ }
104
+ async complete(owner, code) {
105
+ const pending = this.pending;
106
+ if (!pending)
107
+ throw new Error("No Claude login is waiting; send /login first");
108
+ if (pending.owner !== owner.toLowerCase()) {
109
+ throw new Error("This Claude login belongs to another owner");
110
+ }
111
+ if (pending.codeSubmitted)
112
+ throw new Error("That Claude login code is already being verified");
113
+ const trimmed = code.trim();
114
+ const hash = trimmed.lastIndexOf("#");
115
+ if (hash <= 0 || hash === trimmed.length - 1 || /\s/.test(trimmed)) {
116
+ throw new Error("Invalid authorization code; paste the complete code returned by Claude");
117
+ }
118
+ const expectedState = pending.url ? new URL(pending.url).searchParams.get("state") : null;
119
+ const receivedState = trimmed.slice(hash + 1);
120
+ if (!expectedState || receivedState !== expectedState) {
121
+ throw new Error("Authorization code does not match the active /login request");
122
+ }
123
+ pending.codeSubmitted = true;
124
+ pending.child.stdin.end(`${trimmed}\n`);
125
+ await pending.completionPromise;
126
+ try {
127
+ await this.verifyLogin();
128
+ return { verified: true };
129
+ }
130
+ catch (err) {
131
+ return {
132
+ verified: false,
133
+ verificationError: err instanceof Error ? err.message : String(err),
134
+ };
135
+ }
136
+ }
137
+ cancel(owner) {
138
+ const pending = this.pending;
139
+ if (!pending || pending.owner !== owner.toLowerCase())
140
+ return false;
141
+ const err = new Error("Claude login cancelled");
142
+ pending.rejectUrl(err);
143
+ pending.rejectCompletion(err);
144
+ pending.child.kill();
145
+ this.clearPending(pending);
146
+ return true;
147
+ }
148
+ stop() {
149
+ const pending = this.pending;
150
+ if (!pending)
151
+ return;
152
+ const err = new Error("Tomo stopped during Claude login");
153
+ pending.rejectUrl(err);
154
+ pending.rejectCompletion(err);
155
+ pending.child.kill();
156
+ this.clearPending(pending);
157
+ }
158
+ clearPending(pending) {
159
+ clearTimeout(pending.timeout);
160
+ if (this.pending === pending)
161
+ this.pending = null;
162
+ }
163
+ }
164
+ function verifyClaudeLogin() {
165
+ return new Promise((resolve, reject) => {
166
+ execFile("claude", ["-p", "Reply with exactly OK.", "--safe-mode", "--no-session-persistence", "--tools", ""], { timeout: 60_000 }, (err, stdout, stderr) => {
167
+ if (!err) {
168
+ resolve();
169
+ return;
170
+ }
171
+ const detail = `${stderr || stdout}`.trim().split("\n")[0]?.slice(0, 300);
172
+ reject(new Error(`Claude login verification failed${detail ? `: ${detail}` : ""}`));
173
+ });
174
+ });
175
+ }
176
+ //# sourceMappingURL=claude-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-login.js","sourceRoot":"","sources":["../../src/agent/claude-login.ts"],"names":[],"mappings":"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"}
@@ -13,15 +13,18 @@ export interface ChatCommandDeps {
13
13
  queuePendingNote(sessionKey: string, note: string): void;
14
14
  }
15
15
  /**
16
- * Handles slash commands typed in chat (/new, /model, /status, /pet, /restore).
16
+ * Handles slash commands typed in chat (/new, /model, /status, /pet,
17
+ * /restore, /login).
17
18
  * Wired to Channel.onCommand by the Agent.
18
19
  */
19
20
  export declare class ChatCommandHandler {
20
21
  private readonly deps;
21
22
  private restoringConfig;
23
+ private readonly claudeLogin;
22
24
  constructor(deps: ChatCommandDeps);
23
25
  /** True once /restore has begun — the Agent drops inbound messages until restart. */
24
26
  get isRestoring(): boolean;
27
+ stop(): void;
25
28
  handle(channel: Channel, command: string, chatId: string, senderName: string, args?: string, senderId?: string): Promise<void>;
26
29
  /**
27
30
  * /summon pulls the owner's main dm: session into a group: subsequent group
@@ -31,6 +34,8 @@ export declare class ChatCommandHandler {
31
34
  */
32
35
  private handleSummonCommand;
33
36
  private persistModelOverride;
37
+ private handleClaudeLogin;
38
+ private scheduleRestart;
34
39
  private restoreConfigAndRestart;
35
40
  }
36
41
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAYzD,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1D;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,eAAe,CAAS;gBAEH,IAAI,EAAE,eAAe;IAElD,qFAAqF;IACrF,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwJpI;;;;;OAKG;YACW,mBAAmB;IA8DjC,OAAO,CAAC,oBAAoB;YAed,uBAAuB;CAoCtC"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAazD,iEAAiE;AACjE,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1D;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE3B,IAAI,EAAE,eAAe;IAElD,qFAAqF;IACrF,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI;IAIN,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+JpI;;;;;OAKG;YACW,mBAAmB;IA8DjC,OAAO,CAAC,oBAAoB;YAed,iBAAiB;IAuE/B,OAAO,CAAC,eAAe;YAgBT,uBAAuB;CAwBtC"}
@@ -1,5 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
- import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import { dirname, join } from "node:path";
4
4
  import { config, CONFIG_BACKUP_PATH, CONFIG_PATH, RESTART_REASON_FILE } from "../config.js";
5
5
  import { backupFileIfExistsSync, writeJsonAtomicSync } from "../fs-utils.js";
@@ -8,18 +8,21 @@ import { MODEL_ALIASES, isLiteLlmProviderModel, modelHelpText, resolveModelName
8
8
  import { CHATGPT_SUBSCRIPTION_DEFAULT_MODEL, CHATGPT_SUBSCRIPTION_MODE, isChatGptSubscriptionModel, liteLlmModeLabel, } from "../litellm.js";
9
9
  import { log } from "../logger.js";
10
10
  import { PetStore } from "../mcp/pet-store.js";
11
+ import { ClaudeLoginManager } from "./claude-login.js";
11
12
  /** Back up ~/.tomo/config.json before a programmatic rewrite. */
12
13
  export function backupConfigFile() {
13
14
  mkdirSync(dirname(CONFIG_BACKUP_PATH), { recursive: true });
14
- backupFileIfExistsSync(CONFIG_PATH, CONFIG_BACKUP_PATH);
15
+ backupFileIfExistsSync(CONFIG_PATH, CONFIG_BACKUP_PATH, { mode: 0o600 });
15
16
  }
16
17
  /**
17
- * Handles slash commands typed in chat (/new, /model, /status, /pet, /restore).
18
+ * Handles slash commands typed in chat (/new, /model, /status, /pet,
19
+ * /restore, /login).
18
20
  * Wired to Channel.onCommand by the Agent.
19
21
  */
20
22
  export class ChatCommandHandler {
21
23
  deps;
22
24
  restoringConfig = false;
25
+ claudeLogin = new ClaudeLoginManager();
23
26
  constructor(deps) {
24
27
  this.deps = deps;
25
28
  }
@@ -27,12 +30,21 @@ export class ChatCommandHandler {
27
30
  get isRestoring() {
28
31
  return this.restoringConfig;
29
32
  }
33
+ stop() {
34
+ this.claudeLogin.stop();
35
+ }
30
36
  async handle(channel, command, chatId, senderName, args, senderId) {
31
- const { sessionKey: key } = this.deps.router.resolve(channel.name, chatId, false);
32
37
  if (this.restoringConfig) {
33
38
  await channel.send({ chatId, text: "Restore is already in progress. Restarting Tomo..." });
34
39
  return;
35
40
  }
41
+ // Check /login before resolving a session: a rejected group login must not
42
+ // create or mutate a conversation entry as a side effect.
43
+ if (command === "login") {
44
+ await this.handleClaudeLogin(channel, chatId, senderId, args);
45
+ return;
46
+ }
47
+ const { sessionKey: key } = this.deps.router.resolve(channel.name, chatId, false);
36
48
  if (command === "summon" || command === "dismiss") {
37
49
  await this.handleSummonCommand(channel, command, chatId, senderName, senderId);
38
50
  return;
@@ -221,7 +233,85 @@ export class ChatCommandHandler {
221
233
  cfg.sessionModelOverrides = overrides;
222
234
  mkdirSync(dirname(CONFIG_PATH), { recursive: true });
223
235
  backupConfigFile();
224
- writeJsonAtomicSync(CONFIG_PATH, cfg);
236
+ writeJsonAtomicSync(CONFIG_PATH, cfg, { mode: 0o600 });
237
+ }
238
+ async handleClaudeLogin(channel, chatId, senderId, args) {
239
+ const rawKey = `${channel.name}:${chatId}`;
240
+ if (isGroupSessionKey(rawKey)) {
241
+ await channel.send({ chatId, text: "/login is only available in a configured owner's private DM." });
242
+ return;
243
+ }
244
+ const identity = senderId ? this.deps.router.identityForSender(channel.name, senderId) : undefined;
245
+ if (!identity) {
246
+ log.warn({ channel: channel.name, chatId }, "/login refused (sender is not a configured identity)");
247
+ await channel.send({ chatId, text: "Only a configured owner can refresh Claude login." });
248
+ return;
249
+ }
250
+ const arg = args?.trim() ?? "";
251
+ if (arg.toLowerCase() === "cancel") {
252
+ const cancelled = this.claudeLogin.cancel(identity.name);
253
+ await channel.send({
254
+ chatId,
255
+ text: cancelled ? "Claude login cancelled." : "No Claude login is currently waiting.",
256
+ });
257
+ return;
258
+ }
259
+ try {
260
+ if (!arg) {
261
+ const { url, reused } = await this.claudeLogin.start(identity.name);
262
+ await channel.send({
263
+ chatId,
264
+ text: [
265
+ reused ? "Claude login is already waiting." : "Claude login started.",
266
+ "",
267
+ url,
268
+ "",
269
+ "Authorize in your browser, then send the returned code here as:",
270
+ "/login <code>",
271
+ "",
272
+ "The request expires after 10 minutes. Use /login cancel to abort it.",
273
+ ].join("\n"),
274
+ });
275
+ return;
276
+ }
277
+ const completion = await this.claudeLogin.complete(identity.name, arg);
278
+ const reason = completion.verified
279
+ ? "Claude login refreshed via owner DM"
280
+ : "Claude login refreshed via owner DM; verification probe failed";
281
+ mkdirSync(dirname(RESTART_REASON_FILE), { recursive: true });
282
+ writeFileSync(RESTART_REASON_FILE, reason, "utf-8");
283
+ await channel.send({
284
+ chatId,
285
+ text: completion.verified
286
+ ? "Claude login verified. Restarting Tomo..."
287
+ : [
288
+ "[warning] Claude credentials were saved, but the verification probe failed. Restarting Tomo...",
289
+ completion.verificationError ? `\n${completion.verificationError}` : "",
290
+ ].join(""),
291
+ });
292
+ this.scheduleRestart();
293
+ }
294
+ catch (err) {
295
+ const detail = err instanceof Error ? err.message : String(err);
296
+ log.warn({ err, identity: identity.name }, "Claude login command failed");
297
+ await channel.send({ chatId, text: `[error] Claude login failed: ${detail}` });
298
+ }
299
+ }
300
+ scheduleRestart() {
301
+ if (process.env.NODE_ENV === "test")
302
+ return;
303
+ setTimeout(() => {
304
+ const cli = process.argv[1];
305
+ if (!cli) {
306
+ process.kill(process.pid, "SIGTERM");
307
+ return;
308
+ }
309
+ const child = spawn(process.execPath, [cli, "restart"], {
310
+ detached: true,
311
+ stdio: "ignore",
312
+ });
313
+ child.unref();
314
+ }, 100);
225
315
  }
226
316
  async restoreConfigAndRestart(channel, chatId) {
227
317
  if (!existsSync(CONFIG_BACKUP_PATH)) {
@@ -231,25 +321,13 @@ export class ChatCommandHandler {
231
321
  try {
232
322
  mkdirSync(dirname(CONFIG_PATH), { recursive: true });
233
323
  copyFileSync(CONFIG_BACKUP_PATH, CONFIG_PATH);
324
+ chmodSync(CONFIG_PATH, 0o600);
234
325
  const reason = "Restored ~/.tomo/config.json from ~/.tomo/config.json.bak";
235
326
  mkdirSync(dirname(RESTART_REASON_FILE), { recursive: true });
236
327
  writeFileSync(RESTART_REASON_FILE, reason, "utf-8");
237
328
  this.restoringConfig = true;
238
329
  await channel.send({ chatId, text: "Restored config.json from config.json.bak. Restarting Tomo..." });
239
- if (process.env.NODE_ENV === "test")
240
- return;
241
- setTimeout(() => {
242
- const cli = process.argv[1];
243
- if (!cli) {
244
- process.kill(process.pid, "SIGTERM");
245
- return;
246
- }
247
- const child = spawn(process.execPath, [cli, "restart"], {
248
- detached: true,
249
- stdio: "ignore",
250
- });
251
- child.unref();
252
- }, 100);
330
+ this.scheduleRestart();
253
331
  }
254
332
  catch (err) {
255
333
  const detail = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/agent/commands.ts"],"names":[],"mappings":"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"}
@@ -152,7 +152,8 @@ function buildSdkEnv(args) {
152
152
  const litellm = config.litellm;
153
153
  const useGateway = Boolean(litellm?.baseUrl)
154
154
  && (litellm.mode !== CHATGPT_SUBSCRIPTION_MODE || isChatGptSubscriptionModel(args.model));
155
- if (!args.disableAutoCompact && !useGateway)
155
+ const useDirectApiKey = !useGateway && config.auth.method === "api-key";
156
+ if (!args.disableAutoCompact && !useGateway && !useDirectApiKey)
156
157
  return null;
157
158
  // Note: SDK `env` fully replaces the child's env (not merged despite the
158
159
  // d.ts claim), so we must spread process.env ourselves — otherwise the
@@ -160,6 +161,9 @@ function buildSdkEnv(args) {
160
161
  const env = { ...process.env };
161
162
  if (useGateway && litellm) {
162
163
  env.ANTHROPIC_BASE_URL = litellm.baseUrl;
164
+ // Never forward a direct Anthropic credential inherited by the daemon to
165
+ // a gateway. Only the gateway's explicitly configured key belongs here.
166
+ delete env.ANTHROPIC_API_KEY;
163
167
  if (litellm.apiKey) {
164
168
  env.ANTHROPIC_API_KEY = litellm.apiKey;
165
169
  }
@@ -169,6 +173,12 @@ function buildSdkEnv(args) {
169
173
  // LiteLLM, a deliberate chatgpt-subscription bypass must scrub it so Claude
170
174
  // models really go to Anthropic direct.
171
175
  delete env.ANTHROPIC_BASE_URL;
176
+ if (useDirectApiKey && config.auth.apiKey) {
177
+ env.ANTHROPIC_API_KEY = config.auth.apiKey;
178
+ }
179
+ else {
180
+ delete env.ANTHROPIC_API_KEY;
181
+ }
172
182
  }
173
183
  if (args.disableAutoCompact) {
174
184
  env.DISABLE_AUTO_COMPACT = "1";