claude-code-telegram-gateway 1.0.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/LICENSE +21 -0
- package/README.md +156 -0
- package/SETUP.md +75 -0
- package/bin/claude-tg.js +30 -0
- package/com.claude.telegram-gateway.plist +49 -0
- package/config.example.json +29 -0
- package/gateway.js +1311 -0
- package/install-service.sh +64 -0
- package/package.json +56 -0
- package/resume-hook.js +17 -0
- package/setup.js +108 -0
- package/systemd/claude-gateway.service +23 -0
- package/test/MANUAL-TESTS.md +85 -0
- package/test/check-telegram.js +55 -0
- package/test/gateway.test.js +523 -0
- package/test/inject-probe.sh +49 -0
- package/test/reset-topics.js +42 -0
- package/uninstall-service.sh +17 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 hacctarr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Claude Code Multi-Session Telegram Gateway (macOS)
|
|
2
|
+
|
|
3
|
+
A private, local-first gateway that connects your **iPhone** to the **Claude Code sessions running on your Mac** over **Telegram Forum Topics**. It works in both directions:
|
|
4
|
+
|
|
5
|
+
- **Desk → phone (live mirror):** run Claude normally in the native TUI on your Mac; every *active* session automatically gets its own Telegram topic, and the conversation (your desk input, Claude's replies, tool activity) mirrors into it within ~2s.
|
|
6
|
+
- **Phone → desk (inject):** reply inside a topic to steer that session. When the desk session is idle, your message runs headlessly and streams back live. This is ideal when you're **away from the desk**.
|
|
7
|
+
|
|
8
|
+
It is a transcript **watcher**, not a terminal scraper — it reads Claude's own session logs (`~/.claude/projects/**/<uuid>.jsonl`) and drives turns via headless `claude -p`. No `node-pty`, no ANSI parsing. Zero runtime dependencies.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## How it works
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
~/.claude/projects/<repo>/<uuid>.jsonl (written by the native Claude TUI)
|
|
16
|
+
|
|
|
17
|
+
[poll loop, every ~2s]
|
|
18
|
+
├─ active + no topic → createForumTopic + opener (auto-initiate)
|
|
19
|
+
├─ new transcript lines → mirror to the topic (🖥️ desk / assistant / 🔧 tool)
|
|
20
|
+
└─ idle 7 days → closeForumTopic (prune)
|
|
21
|
+
▲
|
|
22
|
+
reply in a topic → idle? → claude -p --resume (streams back) │ busy? → queue, run when idle
|
|
23
|
+
/new <msg> → new topic + independent session
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- **1 supergroup per repo** (`REPO_MAPPINGS`), **1 topic per session**, isolated end-to-end.
|
|
27
|
+
- A session's `cwd` (stored in its transcript) maps it to the right supergroup automatically.
|
|
28
|
+
- Session ↔ topic links persist in `links.json`, so topics survive restarts. `sessions.json` from
|
|
29
|
+
older versions is migrated automatically on first run.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
- **macOS** with Node.js 18+ (tested on v26).
|
|
36
|
+
- **Claude Code CLI** installed and logged in (`claude` on your PATH).
|
|
37
|
+
- A Telegram bot that is a **group Admin with the "Manage Topics" permission** (required so the
|
|
38
|
+
gateway can create/close topics). Without it, mirroring is skipped and you fall back to manually
|
|
39
|
+
creating topics + `/resume`.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Quick start
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
git clone https://github.com/hacctarr/claude-code-telegram-gateway
|
|
47
|
+
cd claude-code-telegram-gateway
|
|
48
|
+
npm run setup # interactive: validates your bot, auto-detects your
|
|
49
|
+
# user id + group chat id, writes config.json, and can
|
|
50
|
+
# install the background service for you
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
First create the bot + group (Telegram side) as in **[SETUP.md](SETUP.md)** — it takes ~2 minutes —
|
|
54
|
+
then `npm run setup` does the rest. Everything below is the manual equivalent.
|
|
55
|
+
|
|
56
|
+
## Setup (manual)
|
|
57
|
+
|
|
58
|
+
1. **Create a bot** via `@BotFather` (`/newbot`) and copy the HTTP API token.
|
|
59
|
+
2. **Create a Supergroup** per repo, enable **Topics**, add the bot, and promote it to
|
|
60
|
+
**Admin → Manage Topics + Post Messages**.
|
|
61
|
+
3. **Get IDs:** your numeric user id (`@userinfobot`) and the group chat id (`-100…`, via the
|
|
62
|
+
`getUpdates` URL in [SETUP.md](SETUP.md)).
|
|
63
|
+
4. **Configure:** `cp config.example.json config.json` and fill it in:
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"BOT_TOKEN": "…",
|
|
67
|
+
"ALLOWED_USER_IDS": ["<your_user_id>"],
|
|
68
|
+
"REPO_MAPPINGS": { "-1001654782309": "/Users/you/Documents" },
|
|
69
|
+
"CLAUDE_PATH": "/Users/you/.nvm/versions/node/vXX/bin/claude"
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
Optional keys (defaults shown): `MIRROR` (true), `AUTO_CREATE_TOPICS` (true),
|
|
73
|
+
`SHOW_TOOL_ACTIVITY` (true), `PERMISSION_MODE` ("bypassPermissions"), `MODEL`,
|
|
74
|
+
`IDLE_INJECT_SECONDS` (15), `ACTIVE_WINDOW_MIN` (30), `PRUNE_AFTER_DAYS` (7),
|
|
75
|
+
`PRUNE_MODE` ("close" | "delete"), `POLL_MS` (2000).
|
|
76
|
+
|
|
77
|
+
> **Permissions — two ways to run it:**
|
|
78
|
+
> - **`bypassPermissions`** (default): phone-injected turns run tools without prompts. Anyone
|
|
79
|
+
> allowed to post in the group gets unattended tool access to that repo — `ALLOWED_USER_IDS` is
|
|
80
|
+
> what protects it.
|
|
81
|
+
> - **Any stricter mode** (e.g. `"PERMISSION_MODE": "acceptEdits"` or `"manual"`): tool-permission
|
|
82
|
+
> prompts appear **in the Telegram topic as ✅ Allow / ❌ Deny buttons** — tap to approve from your
|
|
83
|
+
> phone (only `ALLOWED_USER_IDS` presses are honored). Unanswered requests deny after
|
|
84
|
+
> `APPROVAL_TIMEOUT_SECONDS` (default 300) so turns can't hang. Your configured allow/deny rules
|
|
85
|
+
> still apply first; buttons appear only for what would genuinely prompt.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Run
|
|
90
|
+
|
|
91
|
+
Foreground (for testing):
|
|
92
|
+
```bash
|
|
93
|
+
npm start
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
As a background service (auto-start on login, auto-restart on crash):
|
|
97
|
+
```bash
|
|
98
|
+
./install-service.sh # loads a launchd agent, logs to gateway.log, adds a `cr` alias
|
|
99
|
+
tail -f gateway.log # watch it live
|
|
100
|
+
./uninstall-service.sh # stop + remove
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`npm test` runs the unit suite (no network, no `claude` spawn).
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Using it
|
|
108
|
+
|
|
109
|
+
- **From the Mac:** just run `claude` in a mapped repo. Within ~30 min of activity a topic appears
|
|
110
|
+
on your phone and mirrors the session live.
|
|
111
|
+
- **From the phone:**
|
|
112
|
+
- Reply in a topic to steer that session (runs when the desk session is idle).
|
|
113
|
+
- `/new <message>` — start a brand-new, independent session in its own topic.
|
|
114
|
+
- `/new` (bare) — detach the current topic so your next message starts a fresh session there.
|
|
115
|
+
- `/exit` (or `/close`) — close this topic and stop mirroring its session. The session stays
|
|
116
|
+
resumable on disk, and fresh desk activity re-opens a topic for it automatically.
|
|
117
|
+
- **`/desk`** — open this topic's session in the editor on your Mac (VS Code by default). The
|
|
118
|
+
clean "hand it back to the desk" move: it opens the exact session so you continue there.
|
|
119
|
+
- `/sessions` — list recent sessions in the repo.
|
|
120
|
+
- `/resume <uuid | text>` — link this topic to an existing session (searches first message + content).
|
|
121
|
+
- **Back at the desk:** two ways, pick per moment —
|
|
122
|
+
- **VS Code / editor:** tap **`/desk`** in the topic; the exact session opens in your editor on the
|
|
123
|
+
Mac via a `vscode://` deep link (configurable for Cursor/Windsurf via `DESK_URL_TEMPLATE`).
|
|
124
|
+
- **Terminal:** just open one — an auto-resume hook (installed into `~/.zshrc`) drops you into that
|
|
125
|
+
branch, multi-repo aware, then clears itself. `cr` remains as a manual resume.
|
|
126
|
+
|
|
127
|
+
### Phone continuation — works whether or not the desk session is closed
|
|
128
|
+
- **Desk session closed:** your phone reply continues the *same* session and is saved — seamless,
|
|
129
|
+
and `cr` at the Mac picks it right up.
|
|
130
|
+
- **Desk session left open:** the desk process owns the transcript, so a plain resume wouldn't
|
|
131
|
+
persist. With `AUTO_FORK` (default on) the gateway instead **forks a saved phone branch** and the
|
|
132
|
+
topic follows it — full context kept, one-line notice posted, desk copy untouched. If you later
|
|
133
|
+
keep working the desk copy, it earns its own topic automatically. Three safeguards make this
|
|
134
|
+
race-free (each was a real bug once):
|
|
135
|
+
- held-detection runs **before** the turn (`lsof`, excluding the gateway's own pid) — the prompt
|
|
136
|
+
and its tool side effects execute exactly once, and idle-but-open sessions aren't re-forked;
|
|
137
|
+
- the fork's session id is **pre-minted and reserved**, so the poller can never create a
|
|
138
|
+
duplicate topic for the branch mid-turn;
|
|
139
|
+
- a reply resolves its target session **when it runs**, so back-to-back messages follow the
|
|
140
|
+
first one's fork instead of forking the original twice.
|
|
141
|
+
Set `AUTO_FORK: false` to disable; held-session replies then run with full context but aren't
|
|
142
|
+
persisted (and say so).
|
|
143
|
+
|
|
144
|
+
### Other notes
|
|
145
|
+
- Mirror latency ≈ `POLL_MS` (~2s); it posts completed turns, not token-by-token (phone-injected
|
|
146
|
+
turns *do* stream token-by-token via the live-edited message). Failing desk tool calls are
|
|
147
|
+
surfaced as `⚠️ tool error`; successful tool output is kept quiet.
|
|
148
|
+
- **Stall/approval notices:** a desk permission prompt is editor-UI state and never appears in the
|
|
149
|
+
transcript — from the phone the session just looks stuck. If a desk tool call stays unresolved
|
|
150
|
+
past `STALL_NOTICE_SECONDS` (default 60, 0 = off), the topic gets a one-time notice naming the
|
|
151
|
+
tool ("may be running long — or waiting for approval at the desk"), and a follow-up when it
|
|
152
|
+
completes. Approval itself must happen at the desk; `/desk` jumps you there.
|
|
153
|
+
- With `bypassPermissions` (default), phone-injected turns never block on a tool-permission prompt.
|
|
154
|
+
A clarifying question in Claude's reply just streams to you; answer in the topic to continue.
|
|
155
|
+
- A single-instance lock prevents two gateways from fighting over `getUpdates`. Linux users: a
|
|
156
|
+
`systemd --user` unit is in `systemd/` (macOS uses the bundled launchd installer).
|
package/SETUP.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Telegram Setup Guide
|
|
2
|
+
|
|
3
|
+
Complete steps to configure Telegram for the Claude Code gateway. The gateway connects your phone
|
|
4
|
+
to the Claude Code sessions running on your Mac: active desk sessions **auto-appear as Telegram
|
|
5
|
+
topics and mirror live**, and you can **reply from your phone** to steer a session when it's idle.
|
|
6
|
+
|
|
7
|
+
> One bot + one supergroup per repository, per Mac. Each Forum Topic is one Claude session.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1 — Create a bot
|
|
12
|
+
|
|
13
|
+
1. In Telegram, open **@BotFather** → send `/newbot`.
|
|
14
|
+
2. Give it a **name** (e.g. `My Mac Claude`) and a **username ending in `bot`** (e.g. `mymac_claude_bot`).
|
|
15
|
+
3. Copy the **HTTP API token** (looks like `123456789:AAH...`). You'll put it in `config.json`.
|
|
16
|
+
|
|
17
|
+
> **Privacy mode:** you do **not** need to disable it. The bot must be a group **admin** (Step 2),
|
|
18
|
+
> and admins receive all messages regardless of privacy mode.
|
|
19
|
+
|
|
20
|
+
## Step 2 — Create the supergroup with Topics
|
|
21
|
+
|
|
22
|
+
1. **New Group** → add your bot → name it after the repo (e.g. `Mac1: auth-service`).
|
|
23
|
+
2. **Enable Topics:** Group Info → Edit → turn on **Topics** (this converts the group to a supergroup).
|
|
24
|
+
3. **Promote the bot to Admin** (Group Info → Edit → Administrators) with **Manage Topics** and
|
|
25
|
+
**Post Messages** enabled. *This is required* — the gateway creates/closes topics via the bot.
|
|
26
|
+
|
|
27
|
+
## Step 3 — Get your IDs
|
|
28
|
+
|
|
29
|
+
- **Your user ID** (the security allowlist): message **@userinfobot**, copy the number → goes in
|
|
30
|
+
`ALLOWED_USER_IDS`.
|
|
31
|
+
- **Group chat ID:** post any message in the group's **General** topic, then open in a browser:
|
|
32
|
+
`https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates`
|
|
33
|
+
Find the `"chat": { "id": -100... }` value (a negative number starting `-100`) → the key in
|
|
34
|
+
`REPO_MAPPINGS`.
|
|
35
|
+
|
|
36
|
+
## Step 4 — Configure
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cp config.example.json config.json
|
|
40
|
+
```
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"BOT_TOKEN": "123456789:AAH...",
|
|
44
|
+
"ALLOWED_USER_IDS": ["<your_user_id>"],
|
|
45
|
+
"REPO_MAPPINGS": { "-1001234567890": "/Users/you/projects/auth-service" },
|
|
46
|
+
"CLAUDE_PATH": "/Users/you/.nvm/versions/node/vXX/bin/claude"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
`config.json` is gitignored — your token stays local. Optional tuning keys (mirror/prune/idle
|
|
50
|
+
timings) are listed in `config.example.json`.
|
|
51
|
+
|
|
52
|
+
Run `node test/check-telegram.js` to verify the bot's identity and that it can create/delete a
|
|
53
|
+
topic (self-cleaning). Expect `✅ All checks passed`.
|
|
54
|
+
|
|
55
|
+
## Step 5 — Run
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm start # foreground (testing)
|
|
59
|
+
# or run it as a background service:
|
|
60
|
+
./install-service.sh # launchd: auto-start on login, restart on crash, logs to gateway.log
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Using it
|
|
64
|
+
|
|
65
|
+
- **From the Mac:** run `claude` in a mapped repo. Within ~30 min of activity a topic appears on your
|
|
66
|
+
phone and mirrors the session (🖥️ desk / assistant / 🔧 tool) within ~2s.
|
|
67
|
+
- **From the phone:**
|
|
68
|
+
- Reply in a topic to steer that session (runs when the desk session is idle).
|
|
69
|
+
- `/new <message>` — start a fresh, independent session in its own topic.
|
|
70
|
+
- `/sessions` — list recent sessions; `/resume <id | text>` — link a topic to an existing session.
|
|
71
|
+
- **Back at the desk:** `cr` (installed alias for `claude -c`) resumes the most recent session,
|
|
72
|
+
including turns you sent from the phone.
|
|
73
|
+
|
|
74
|
+
See the main [README](README.md) for the architecture and the known limitations of the
|
|
75
|
+
"native TUI primary" model.
|
package/bin/claude-tg.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// Thin CLI so the package works via `npx claude-code-telegram-gateway <cmd>` or a global install.
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { execFileSync } = require('child_process');
|
|
6
|
+
|
|
7
|
+
const ROOT = path.join(__dirname, '..');
|
|
8
|
+
const run = (file, args = []) => execFileSync(file, args, { cwd: ROOT, stdio: 'inherit' });
|
|
9
|
+
const node = (rel) => run(process.execPath, [path.join(ROOT, rel)]);
|
|
10
|
+
|
|
11
|
+
const cmd = process.argv[2];
|
|
12
|
+
try {
|
|
13
|
+
switch (cmd) {
|
|
14
|
+
case 'setup': node('setup.js'); break;
|
|
15
|
+
case 'start': node('gateway.js'); break;
|
|
16
|
+
case 'check': node('test/check-telegram.js'); break;
|
|
17
|
+
case 'install': case 'install-service': run(path.join(ROOT, 'install-service.sh')); break;
|
|
18
|
+
case 'uninstall': case 'uninstall-service': run(path.join(ROOT, 'uninstall-service.sh')); break;
|
|
19
|
+
default:
|
|
20
|
+
console.log(`claude-tg <command>
|
|
21
|
+
|
|
22
|
+
setup interactive config (bot token, your id, group→repo mappings)
|
|
23
|
+
start run the gateway in the foreground
|
|
24
|
+
check verify the bot's Telegram permissions
|
|
25
|
+
install install as a launchd background service (auto-start + restart)
|
|
26
|
+
uninstall stop and remove the service`);
|
|
27
|
+
}
|
|
28
|
+
} catch (e) {
|
|
29
|
+
process.exit(e.status || 1);
|
|
30
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<!--
|
|
4
|
+
launchd service for the Claude Code Telegram gateway.
|
|
5
|
+
Placeholders __NODE__, __DIR__, __PATH__ are filled in by install-service.sh.
|
|
6
|
+
Do not edit the installed copy at ~/Library/LaunchAgents directly — re-run the installer.
|
|
7
|
+
-->
|
|
8
|
+
<plist version="1.0">
|
|
9
|
+
<dict>
|
|
10
|
+
<key>Label</key>
|
|
11
|
+
<string>com.claude.telegram-gateway</string>
|
|
12
|
+
|
|
13
|
+
<key>ProgramArguments</key>
|
|
14
|
+
<array>
|
|
15
|
+
<string>__NODE__</string>
|
|
16
|
+
<string>__DIR__/gateway.js</string>
|
|
17
|
+
</array>
|
|
18
|
+
|
|
19
|
+
<key>WorkingDirectory</key>
|
|
20
|
+
<string>__DIR__</string>
|
|
21
|
+
|
|
22
|
+
<key>EnvironmentVariables</key>
|
|
23
|
+
<dict>
|
|
24
|
+
<key>PATH</key>
|
|
25
|
+
<string>__PATH__</string>
|
|
26
|
+
<key>HOME</key>
|
|
27
|
+
<string>__HOME__</string>
|
|
28
|
+
</dict>
|
|
29
|
+
|
|
30
|
+
<key>RunAtLoad</key>
|
|
31
|
+
<true/>
|
|
32
|
+
|
|
33
|
+
<key>KeepAlive</key>
|
|
34
|
+
<dict>
|
|
35
|
+
<key>SuccessfulExit</key>
|
|
36
|
+
<false/>
|
|
37
|
+
<key>Crashed</key>
|
|
38
|
+
<true/>
|
|
39
|
+
</dict>
|
|
40
|
+
|
|
41
|
+
<key>ThrottleInterval</key>
|
|
42
|
+
<integer>10</integer>
|
|
43
|
+
|
|
44
|
+
<key>StandardOutPath</key>
|
|
45
|
+
<string>__DIR__/gateway.log</string>
|
|
46
|
+
<key>StandardErrorPath</key>
|
|
47
|
+
<string>__DIR__/gateway.log</string>
|
|
48
|
+
</dict>
|
|
49
|
+
</plist>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"BOT_TOKEN": "123456789:AAHfiqksKZ8...",
|
|
3
|
+
"ALLOWED_USER_IDS": [
|
|
4
|
+
"412587349"
|
|
5
|
+
],
|
|
6
|
+
"REPO_MAPPINGS": {
|
|
7
|
+
"-1001654782309": "/Users/you/projects/auth-service",
|
|
8
|
+
"-1001987654321": "/Users/you/projects/frontend-ui"
|
|
9
|
+
},
|
|
10
|
+
"CLAUDE_PATH": "/Users/you/.nvm/versions/node/v26.2.0/bin/claude",
|
|
11
|
+
"PERMISSION_MODE": "bypassPermissions",
|
|
12
|
+
"MODEL": "opus",
|
|
13
|
+
"MIRROR": true,
|
|
14
|
+
"AUTO_CREATE_TOPICS": true,
|
|
15
|
+
"SHOW_TOOL_ACTIVITY": true,
|
|
16
|
+
"IDLE_INJECT_SECONDS": 15,
|
|
17
|
+
"ACTIVE_WINDOW_MIN": 30,
|
|
18
|
+
"PRUNE_AFTER_DAYS": 7,
|
|
19
|
+
"PRUNE_MODE": "close",
|
|
20
|
+
"POLL_MS": 2000,
|
|
21
|
+
"MIRROR_FLUSH_MS": 4000,
|
|
22
|
+
"DESK_URL_TEMPLATE": "vscode://anthropic.claude-code/open?session={session}",
|
|
23
|
+
"DESK_OPEN_CMD": "open",
|
|
24
|
+
"TITLE_MODE": "generated",
|
|
25
|
+
"TITLE_MODEL": "haiku",
|
|
26
|
+
"AUTO_FORK": true,
|
|
27
|
+
"STALL_NOTICE_SECONDS": 60,
|
|
28
|
+
"APPROVAL_TIMEOUT_SECONDS": 300
|
|
29
|
+
}
|