@peterwangze/claude-trigger-router 1.1.1 → 1.1.2

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 CHANGED
@@ -19,8 +19,8 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
19
19
  - **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
20
20
  - **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
21
21
  - **Governance 观测**:记录 trace、metrics、异常摘要和健康状态,帮助你理解路由选择和运行风险。
22
- - **doctor 诊断**:检查配置、服务可启动性、模型兼容策略和可选模型探测。
23
- - **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
22
+ - **doctor 诊断**:检查配置、服务可启动性、鉴权安全状态、模型兼容策略和可选模型探测。
23
+ - **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、鉴权安全状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
24
24
  - **远程状态基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要。默认用户不需要配置远程模式。
25
25
 
26
26
  ## 部署模式与边界
@@ -33,12 +33,33 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
33
33
 
34
34
  已落地的远程能力聚焦在“远程服务连接配置、状态查询和注册摘要”。它不会默认替代本地代理主路径,也不会自动启用尚未实现的集群、节点调度或托管控制面。
35
35
 
36
- 如果要把当前机器作为远程 `server` 暴露给其他客户端,最小配置仍然是普通的 `Models + Router.default`,再加上服务端监听和鉴权:
36
+ 如果要把当前机器作为远程 `server` 暴露给其他客户端,先生成安全默认的服务端配置:
37
+
38
+ ```bash
39
+ ctr deploy init --target server
40
+ ```
41
+
42
+ 该命令会写入 `HOST: "0.0.0.0"`、随机 bootstrap `APIKEY`、`Runtime.mode: "server"`、日志开关、健康检查所需端口和一份可编辑的 `Models + Router.default` 起步模板。它不会覆盖已有配置;如需重建模板,显式追加 `--force`。
43
+
44
+ npm 包也随附可复制部署模板:
45
+
46
+ - `config/deploy/docker-compose.server.yaml`
47
+ - `config/deploy/systemd/claude-trigger-router.service`
48
+
49
+ 角色化手册:
50
+
51
+ - 配置角色总览:[docs/configuration-roles.md](docs/configuration-roles.md)
52
+ - 服务提供者/维护者:[docs/server-maintainer-guide.md](docs/server-maintainer-guide.md)
53
+ - 远程服务使用者:[docs/remote-client-guide.md](docs/remote-client-guide.md)
54
+
55
+ 这些模板仍以 `ctr deploy init --target server` 生成的配置为起点。首次暴露给其他机器前,请先确认 `APIKEY` 或 active managed key 存在,并优先放在 HTTPS 反向代理或内网之后。
56
+
57
+ 生成后确认或调整的最小结构如下:
37
58
 
38
59
  ```yaml
39
60
  HOST: "0.0.0.0"
40
61
  PORT: 5678
41
- APIKEY: "change-me"
62
+ APIKEY: "ctr_bootstrap_..."
42
63
 
43
64
  Runtime:
44
65
  mode: "server"
@@ -57,10 +78,19 @@ Router:
57
78
  启动方式:
58
79
 
59
80
  ```bash
81
+ ctr doctor
60
82
  ctr start --daemon
61
83
  ```
62
84
 
63
- 注意:如果配置了 `HOST: "0.0.0.0"` 但没有设置 `APIKEY`,运行时会为了安全强制只监听 `127.0.0.1`。远程客户端里的 `Runtime.remote_service.auth_token` 应该填写服务端的 `APIKEY`,并建议把公网入口放在 HTTPS 反向代理之后。启用 `APIKEY` 后 `/ui` 也会受认证保护;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
85
+ 安全边界:
86
+
87
+ - 如果配置了 `HOST: "0.0.0.0"` 但没有设置 `APIKEY` 或 active managed key,运行时会为了安全强制只监听 `127.0.0.1`。
88
+ - `APIKEY` 定位为 bootstrap/admin key;服务端启动后用它调用 `POST /api/auth/keys` 生成给远程使用者的 managed key。
89
+ - 远程日常 token 推荐同时授予 `client + read-only`:`client` 用于模型调用,`read-only` 用于 ready/status、compiled models 和 governance 观测接口。
90
+ - `admin` key 才能访问 `/ui`、配置保存、重启、auth 管理和治理写操作。列表接口只返回 key 前后缀,secret 只在创建时返回一次。
91
+ - managed key 支持过期、撤销和 `quota.request_limit` / `quota.token_limit` / `quota.window_seconds`;窗口配额超限时 429 会返回 `quota.windowResetAt` 和 `Retry-After`。
92
+ - `GET /api/service-info` 会返回脱敏的 `auth` / `security` 摘要和 quota 用量;`GET /api/auth/audit` 可用 admin key 查看最近鉴权允许/拒绝记录。
93
+ - 公网入口仍建议放在 HTTPS 反向代理之后;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
64
94
 
65
95
  ## 安装
66
96
 
@@ -87,12 +117,13 @@ ctr setup
87
117
 
88
118
  - 复用已有 `~/.claude-trigger-router/config.yaml`
89
119
  - 探测并迁移旧 `claude-code-router` 配置
90
- - 在没有可用配置时询问“本地使用”还是“连接远程服务”
120
+ - 在没有可用配置时询问“本地使用”、“连接远程服务”还是“部署为远程服务端”
91
121
  - 本地使用时创建最小可用配置
92
122
  - 连接远程服务时写入 `Runtime.remote_service`,不要求你先填写本地 provider/model
123
+ - 部署为远程服务端时生成 server profile 和 bootstrap admin `APIKEY`,但不会自动启动服务
93
124
  - 本地使用时,引导填写默认模型 ID、接口地址、API Key 和模型名
94
125
  - 本地使用时,可选追加复杂任务模型,并生成 SmartRouter 起步模板
95
- - 保存配置后启动本地服务
126
+ - 保存配置后按角色输出下一步:本地路径提示 `ctr code` 和路由模板,远程客户端路径提示 `ctr status` / 远端 ready 检查,服务端路径提示 `ctr doctor` / `ctr start --daemon`
96
127
 
97
128
  本地使用路径完成后按这个顺序使用:
98
129
 
@@ -103,7 +134,7 @@ ctr code
103
134
 
104
135
  `ctr code` 会带着本地代理环境启动 Claude Code。之后你在 Claude Code 里的请求会经过本地 Trigger Router。
105
136
 
106
- 如果 setup 选择的是“连接远程服务”,当前主要用于生成远程服务连接配置并检查远程状态;首次日常使用仍建议先跑通本地 `Models + Router.default` 主路径。
137
+ 如果 setup 选择的是“连接远程服务”,当前主要用于生成远程服务连接配置并通过 `ctr status` 检查远端 ready 状态;日常直连远程服务时,请按服务维护者提供的 `ANTHROPIC_BASE_URL` 和 `ANTHROPIC_AUTH_TOKEN` 配置 Claude Code。首次日常使用仍建议先跑通本地 `Models + Router.default` 主路径。如果选择“部署为远程服务端”,setup 只生成配置,不会自动启动;请先编辑 `Models[].key` / `Models[].model`,再运行 `ctr doctor` 和 `ctr start --daemon`。
107
138
 
108
139
  ## 手动配置
109
140
 
@@ -297,8 +328,10 @@ http://127.0.0.1:5678/ui
297
328
 
298
329
  - 本地服务 ready 状态、端口、模型数和 `Router.default`
299
330
  - `Runtime.mode` 与当前服务角色
331
+ - 当前监听地址和远程客户端接入建议
300
332
  - 远程服务状态摘要
301
333
  - Registration 模型和上游服务摘要
334
+ - Auth 与 Security 摘要,用于发现 server/cloud 或公网监听无鉴权风险
302
335
 
303
336
  维护者工作台里的 Health 摘要来自 `GET /api/governance/health`,用于快速判断近期治理状态:
304
337
 
@@ -338,6 +371,8 @@ ctr doctor
338
371
  - 配置是否能通过本地校验
339
372
  - 服务是否可启动
340
373
  - 当前服务上下文:`local` / `server` / `cloud`
374
+ - 当前监听地址;server/cloud 会提示远程客户端应设置的 `ANTHROPIC_BASE_URL`
375
+ - 当前鉴权状态;如果 server/cloud 或公网监听没有配置 `APIKEY` / managed key,会提示安全风险
341
376
  - 如果启用了 `Runtime.remote_service`,会单独检查远程服务可达和 ready 状态
342
377
  - 模型兼容策略和请求编译方式
343
378
  - capability hint 可能触发的运行时降级
@@ -357,7 +392,7 @@ Runtime:
357
392
  remote_service:
358
393
  enabled: true
359
394
  base_url: "https://router.example.com"
360
- auth_token: "${CTR_REMOTE_AUTH_TOKEN}" # 对应远程服务端 APIKEY
395
+ auth_token: "${CTR_REMOTE_AUTH_TOKEN}" # 推荐使用远程服务端生成的 managed key;如需 ready/status 探测,同时授予 client 与 read-only scope
361
396
 
362
397
  Router: {}
363
398
  ```
@@ -374,6 +409,7 @@ GET /api/remote-status
374
409
  GET /api/service-info
375
410
  GET /api/remote-status
376
411
  GET /api/registration
412
+ GET /api/auth/audit
377
413
  ```
378
414
 
379
415
  这条能力当前作为远程接入基础 contract 提供,用于服务发现、状态检查和注册摘要;它不表示已经自动把 Claude Code 请求转发到远端。首次使用仍建议从本地 `ctr setup -> ctr start -> ctr code` 开始。
@@ -384,6 +420,7 @@ GET /api/registration
384
420
  |---|---|
385
421
  | `ctr setup` | 首次配置、复用、迁移、修复配置 |
386
422
  | `ctr init --force` | 生成最小配置模板 |
423
+ | `ctr deploy init --target server` | 生成安全默认的自托管 server 配置 |
387
424
  | `ctr start` | 前台启动本地服务 |
388
425
  | `ctr start --daemon` | 后台启动本地服务 |
389
426
  | `ctr status` | 查看服务状态 |
@@ -0,0 +1,36 @@
1
+ # Claude Trigger Router server deployment templates
2
+
3
+ These templates are included in the npm package under `config/deploy`.
4
+
5
+ Role-specific guides live in:
6
+
7
+ - `docs/server-maintainer-guide.md`
8
+ - `docs/remote-client-guide.md`
9
+
10
+ Recommended flow:
11
+
12
+ ```bash
13
+ ctr deploy init --target server
14
+ ctr doctor
15
+ ctr start --daemon
16
+ ```
17
+
18
+ Use `docker-compose.server.yaml` when you want a minimal container profile. Prepare `./ctr-home/.claude-trigger-router/config.yaml` with `ctr deploy init --target server`, edit `Models[].key` and `Models[].model`, then run:
19
+
20
+ ```bash
21
+ docker compose -f docker-compose.server.yaml up -d
22
+ ```
23
+
24
+ Use `systemd/claude-trigger-router.service` when you want a Linux service unit. Copy it to `/etc/systemd/system/`, edit the service user and paths, prepare the service user's config, then run:
25
+
26
+ ```bash
27
+ systemctl daemon-reload
28
+ systemctl enable --now claude-trigger-router
29
+ ```
30
+
31
+ Security notes:
32
+
33
+ - Keep the generated bootstrap `APIKEY` for maintainers only.
34
+ - Generate managed `client + read-only` keys for remote clients.
35
+ - Put public deployments behind HTTPS reverse proxy or private network access.
36
+ - Use `ctr status`, `ctr doctor`, and `/ui` to confirm role, listener, auth state, and remote client connection guidance after deployment.
@@ -0,0 +1,29 @@
1
+ # Claude Trigger Router self-hosted server profile.
2
+ # Prepare ./ctr-home/.claude-trigger-router/config.yaml with:
3
+ # HOME=./ctr-home ctr deploy init --target server
4
+ #
5
+ # The config file must contain a bootstrap APIKEY or active managed key before
6
+ # exposing HOST: 0.0.0.0 to other machines.
7
+ services:
8
+ claude-trigger-router:
9
+ image: node:24-alpine
10
+ container_name: claude-trigger-router
11
+ working_dir: /srv/ctr
12
+ command: >
13
+ sh -lc "npm install -g @peterwangze/claude-trigger-router@latest
14
+ && ctr start --port 5678"
15
+ environment:
16
+ HOME: /srv/ctr
17
+ USERPROFILE: /srv/ctr
18
+ NODE_ENV: production
19
+ volumes:
20
+ - ./ctr-home:/srv/ctr
21
+ ports:
22
+ - "5678:5678"
23
+ restart: unless-stopped
24
+ healthcheck:
25
+ test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/health | grep claude-trigger-router"]
26
+ interval: 30s
27
+ timeout: 5s
28
+ retries: 3
29
+ start_period: 20s
@@ -0,0 +1,33 @@
1
+ # Claude Trigger Router self-hosted server unit.
2
+ # Copy to /etc/systemd/system/claude-trigger-router.service, then edit User,
3
+ # WorkingDirectory, Environment, and ExecStart paths for your host.
4
+ #
5
+ # Prepare the service user's config first:
6
+ # sudo -u ctr env HOME=/var/lib/claude-trigger-router ctr deploy init --target server
7
+ #
8
+ # The generated config must keep APIKEY or an active managed key before
9
+ # exposing HOST: 0.0.0.0.
10
+ [Unit]
11
+ Description=Claude Trigger Router
12
+ After=network-online.target
13
+ Wants=network-online.target
14
+
15
+ [Service]
16
+ Type=simple
17
+ User=ctr
18
+ Group=ctr
19
+ WorkingDirectory=/var/lib/claude-trigger-router
20
+ Environment=HOME=/var/lib/claude-trigger-router
21
+ Environment=USERPROFILE=/var/lib/claude-trigger-router
22
+ Environment=NODE_ENV=production
23
+ ExecStart=/usr/bin/env ctr start --port 5678
24
+ Restart=on-failure
25
+ RestartSec=5
26
+ NoNewPrivileges=true
27
+ PrivateTmp=true
28
+ ProtectSystem=full
29
+ ProtectHome=false
30
+ ReadWritePaths=/var/lib/claude-trigger-router
31
+
32
+ [Install]
33
+ WantedBy=multi-user.target