{"_id":"@cetridr/cetridr","_rev":"5-b7aebea9d0bf41bf20ea409971c486ec","name":"@cetridr/cetridr","dist-tags":{"latest":"0.2.4"},"versions":{"0.2.0-alpha.0":{"name":"@cetridr/cetridr","version":"0.2.0-alpha.0","license":"MIT","_id":"@cetridr/cetridr@0.2.0-alpha.0","maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"bin":{"cetridr":"lib/cli.js"},"dist":{"shasum":"161565b1110397f1099d972136d3324069683f31","tarball":"https://registry.npmjs.org/@cetridr/cetridr/-/cetridr-0.2.0-alpha.0.tgz","fileCount":21,"integrity":"sha512-br14hiRnNUwc33LT5OMtMSaQq5pgK5bMnoaDsp2ULTE+0wJJgdHWDnQxWnqAjFCgcLXe2qHgAsbwnT8CblZiLQ==","signatures":[{"sig":"MEUCIHuvkK9D73pcQxDm70Tp/rsb4MqwjCN674MZm6LTESbFAiEA/IPeBmzrfg2glzfJX+QiWPd+iMVOzuyRksdEHeYFomk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68381},"main":"lib/index.js","type":"module","_from":"file:cetridr-cetridr-0.2.0-alpha.0.tgz","types":"lib/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test test/*.test.mjs","build":"tsc -p tsconfig.json && node scripts/copy-assets.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"fishead","email":"zhchuan7@gmail.com"},"_resolved":"/private/var/folders/ly/t00fyzlj1fx2n75rbkzc8md00000gn/T/3448519a9c7dbb88d4301c785acb0c3e/cetridr-cetridr-0.2.0-alpha.0.tgz","_integrity":"sha512-br14hiRnNUwc33LT5OMtMSaQq5pgK5bMnoaDsp2ULTE+0wJJgdHWDnQxWnqAjFCgcLXe2qHgAsbwnT8CblZiLQ==","_npmVersion":"10.9.8","description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.20.0"},"_npmOperationalInternal":{"tmp":"tmp/cetridr_0.2.0-alpha.0_1786722723991_0.3781935475694138","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cetridr/cetridr","version":"0.2.0","license":"MIT","_id":"@cetridr/cetridr@0.2.0","maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"homepage":"https://github.com/cetridr/cetridr#readme","bugs":{"url":"https://github.com/cetridr/cetridr/issues"},"bin":{"cetridr":"lib/cli.js"},"dist":{"shasum":"a1074cf841e8c0105f21e12480124a07a21df99f","tarball":"https://registry.npmjs.org/@cetridr/cetridr/-/cetridr-0.2.0.tgz","fileCount":21,"integrity":"sha512-/Toow8OtJz5gqQNfx+tYLK1xjsnZ6+u7M8N13erXPfQJpVAp/9uQlS9TVl34YrkT4s87KeXHzlKK5lFXLdSsrg==","signatures":[{"sig":"MEQCIEB3yVD2PnrzEeiHAf7jijn+SfxhXSsf7v1oF2nk/yK/AiBBtG+8u/Hpa9aDHPvMEfjmBODhPcqGFuYj++prh6Ly6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cetridr%2fcetridr@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69816},"main":"lib/index.js","type":"module","_from":"file:cetridr-cetridr-0.2.0.tgz","types":"lib/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test test/*.test.mjs","build":"tsc -p tsconfig.json && node scripts/copy-assets.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:262fc091-3390-4303-96ff-3c30f9069e92"}},"_resolved":"/tmp/d11a70924cb5495e1f637c7880e60337/cetridr-cetridr-0.2.0.tgz","_integrity":"sha512-/Toow8OtJz5gqQNfx+tYLK1xjsnZ6+u7M8N13erXPfQJpVAp/9uQlS9TVl34YrkT4s87KeXHzlKK5lFXLdSsrg==","repository":{"url":"git+https://github.com/cetridr/cetridr.git","type":"git"},"_npmVersion":"11.17.0","description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.20.0"},"_npmOperationalInternal":{"tmp":"tmp/cetridr_0.2.0_1786725886445_0.1198857691881472","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@cetridr/cetridr","version":"0.2.1","license":"MIT","_id":"@cetridr/cetridr@0.2.1","maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"homepage":"https://github.com/cetridr/cetridr#readme","bugs":{"url":"https://github.com/cetridr/cetridr/issues"},"bin":{"cetridr":"lib/cli.js"},"dist":{"shasum":"e32295d2d4d75fb786534f5413ba2023bb298257","tarball":"https://registry.npmjs.org/@cetridr/cetridr/-/cetridr-0.2.1.tgz","fileCount":21,"integrity":"sha512-TPktQtw5QC7z7WPDQXXHOi7F3G1BHIITkvsL+lzJ4WaB6lYcvcEt+jvteiR2ORyxA3fPL4RYflNVGqTBzdZxRw==","signatures":[{"sig":"MEYCIQCC3lMRVCJQdBgZohIQWdjop01UXuuIp5y1QEBR5x3oMAIhAJK47iMU0z9p4YJGGysFwvCkM0uuN1Lil91yJ1amDR0U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cetridr%2fcetridr@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69514},"main":"lib/index.js","type":"module","_from":"file:cetridr-cetridr-0.2.1.tgz","types":"lib/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test test/*.test.mjs","build":"tsc -p tsconfig.json && node scripts/copy-assets.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:262fc091-3390-4303-96ff-3c30f9069e92"}},"_resolved":"/tmp/18c2987a13125bf92ec86c9a99acde42/cetridr-cetridr-0.2.1.tgz","_integrity":"sha512-TPktQtw5QC7z7WPDQXXHOi7F3G1BHIITkvsL+lzJ4WaB6lYcvcEt+jvteiR2ORyxA3fPL4RYflNVGqTBzdZxRw==","repository":{"url":"git+https://github.com/cetridr/cetridr.git","type":"git"},"_npmVersion":"11.17.0","description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.20.0"},"_npmOperationalInternal":{"tmp":"tmp/cetridr_0.2.1_1786726745984_0.07690729382270334","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@cetridr/cetridr","version":"0.2.3","license":"MIT","_id":"@cetridr/cetridr@0.2.3","maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"homepage":"https://github.com/cetridr/cetridr#readme","bugs":{"url":"https://github.com/cetridr/cetridr/issues"},"bin":{"cetridr":"lib/cli.js"},"dist":{"shasum":"e7a9ab644e1b7f2082c70ed2a2c59080c631f77b","tarball":"https://registry.npmjs.org/@cetridr/cetridr/-/cetridr-0.2.3.tgz","fileCount":21,"integrity":"sha512-mhxSTdzMNAjBVH19mKASdUa1QftGo+qfqtnLq2zxqoLISrvAg6V3A7le+fts2Hshx9p+wjiw55GX4OjGpgyrVg==","signatures":[{"sig":"MEQCIBbPBZ5dYW2rXgRQqXEef9FthPF8FWsK4msOCYdJ6uC4AiBNHXeUE+58MPodjRLVHLRv1xBwXDPA0KBW1BhweFJp+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cetridr%2fcetridr@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69514},"main":"lib/index.js","type":"module","_from":"file:cetridr-cetridr-0.2.3.tgz","types":"lib/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test test/*.test.mjs","build":"tsc -p tsconfig.json && node scripts/copy-assets.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:262fc091-3390-4303-96ff-3c30f9069e92"}},"_resolved":"/tmp/b7acd4f1e93cc1bd04fdbae0f9ab2bdb/cetridr-cetridr-0.2.3.tgz","_integrity":"sha512-mhxSTdzMNAjBVH19mKASdUa1QftGo+qfqtnLq2zxqoLISrvAg6V3A7le+fts2Hshx9p+wjiw55GX4OjGpgyrVg==","repository":{"url":"git+https://github.com/cetridr/cetridr.git","type":"git"},"_npmVersion":"11.17.0","description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^22.20.0"},"_npmOperationalInternal":{"tmp":"tmp/cetridr_0.2.3_1786727398866_0.47695232409671795","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@cetridr/cetridr","version":"0.2.4","description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","type":"module","main":"lib/index.js","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"bin":{"cetridr":"lib/cli.js"},"engines":{"node":">=24"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/cetridr/cetridr.git"},"devDependencies":{"@types/node":"^22.20.0","typescript":"^5.6.0"},"scripts":{"build":"tsc -p tsconfig.json && node scripts/copy-assets.mjs","typecheck":"tsc -p tsconfig.json --noEmit","test":"node --test test/*.test.mjs"},"_id":"@cetridr/cetridr@0.2.4","bugs":{"url":"https://github.com/cetridr/cetridr/issues"},"homepage":"https://github.com/cetridr/cetridr#readme","_integrity":"sha512-dn7sQkAINg/xz0gkedNZBSGX6pghwCCu1xq8jnTfD8B3be3KFEA5R6xMy6Od7zSrK53VtZIaa51XAeM/irXrdg==","_resolved":"/tmp/507b646bbf500a81a25fb01ad988eede/cetridr-cetridr-0.2.4.tgz","_from":"file:cetridr-cetridr-0.2.4.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-dn7sQkAINg/xz0gkedNZBSGX6pghwCCu1xq8jnTfD8B3be3KFEA5R6xMy6Od7zSrK53VtZIaa51XAeM/irXrdg==","shasum":"ad110bd94b54661bf8479eaf79b5c3d84e9b21f4","tarball":"https://registry.npmjs.org/@cetridr/cetridr/-/cetridr-0.2.4.tgz","fileCount":21,"unpackedSize":69514,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cetridr%2fcetridr@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHu6OYv/b731Y5UE8dn9c/XOgN+b8tc1XTL7s7mWhQqbAiAimDp12Zy3qlTdTBlcsOI7VHwFyDXf82DlyQrY3ysq9Q=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:262fc091-3390-4303-96ff-3c30f9069e92"}},"directories":{},"maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cetridr_0.2.4_1786933686763_0.13916191854153137"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T15:52:03.789Z","modified":"2026-08-17T02:28:08.015Z","0.2.0-alpha.0":"2026-08-14T15:52:04.128Z","0.2.0":"2026-08-14T16:44:46.583Z","0.2.1":"2026-08-14T16:59:06.125Z","0.2.3":"2026-08-14T17:09:58.998Z","0.2.4":"2026-08-17T02:28:06.923Z"},"bugs":{"url":"https://github.com/cetridr/cetridr/issues"},"license":"MIT","homepage":"https://github.com/cetridr/cetridr#readme","repository":{"type":"git","url":"git+https://github.com/cetridr/cetridr.git"},"description":"Cetridr — rule the deep. A single-window command center for your DeepSeek Harness agents.","maintainers":[{"name":"fishead","email":"zhchuan7@gmail.com"}],"readme":"# Cetridr 🐋\n\n> **Rule the deep.** —— 一个窗口，统率你所有的 DeepSeek Harness agent。\n\n> ⚠️ **实验性。** DeepSeek Harness 本身仍是实验性的（0.1.0-rc.x），而 cetridr 依赖\n> DSH web 服务器不发 X-Frame-Options / Content-Security-Policy: frame-ancestors。\n> 一旦 DSH 开始发这些头，iframe 嵌入就会失效，cetridr 需要换一种嵌入方案。风险自负。\n\nCetridr 把多个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) profile（每个是\n独立 daemon）并排跑起来，用顶部 header bar 的 tab 切换，内容区用 iframe 嵌入各自的 DSH web UI。\n单用户、本机 loopback 定位。\n\n[English](README.md)\n\n## 安装\n\n```bash\npnpm add -g @cetridr/cetridr   # 命令行：cetridr\n```\n\n### Homebrew\n\n```bash\nbrew tap cetridr/tap\nbrew install cetridr\n```\n\n零运行时依赖，Node >= 24。\n\n## 快速开始\n\n```bash\ncetridr init                          # 生成 ~/.cetridr/config.json\ncetridr add web --port 3080 --external # 嵌入已运行的 3080\ncetridr add web2 --port 3081 --home web2  # spawn 到独立 DSH_HOME\ncetridr start                         # 前台运行；打印带 token 的 URL（?t=…），用那个打开\ncetridr start --daemon                # 后台运行（cetridr stop 停止）\n```\n\n## 命令\n\n| 命令 | 作用 |\n| --- | --- |\n| init | 生成默认配置文件 |\n| start [--config <path>] [--daemon] | 运行门户（前台或后台） |\n| stop | 停止后台运行的门户（pidfile） |\n| list | 列出已配置的 profile |\n| add <id> --port <n> [--label --emoji --home --external] | 添加 profile |\n| rm <id> | 移除 profile |\n| status | 查看运行中门户的状态 |\n| logs <id> [--follow] | 查看（或跟踪）某 profile 日志 |\n| service | 打印 launchd/systemd 自启动 unit |\n\n## 配置\n\n配置在 `~/.cetridr/config.json`（可用环境变量 `CETRIDR_HOME` 覆盖整个目录）：\n\n```json\n{\n  \"host\": \"127.0.0.1\",\n  \"port\": 4000,\n  \"dshBin\": \"dsh\",\n  \"spawnAll\": true,\n  \"restart\": true,\n  \"restartBackoffMs\": 1000,\n  \"profiles\": [\n    { \"id\": \"web\", \"port\": 3080, \"external\": true },\n    { \"id\": \"web2\", \"port\": 3081, \"home\": \"web2\" }\n  ]\n}\n```\n\n- host / port：门户监听地址（默认 127.0.0.1:4000）。\n- dshBin：dsh 可执行文件（默认 dsh）。\n- spawnAll：启动时是否一次性拉起全部 profile（默认 true；false = 点 tab 才启动）。\n- restart：子进程崩溃后自动重启（默认 true）；restartBackoffMs：首次重启退避毫秒（逐次翻倍、上限 30s）。\n- profiles[].port：该 profile 的固定端口；external 为 true 时不 spawn、只嵌入已有 URL。\n- profiles[].home：该 profile 的 DSH_HOME。相对路径相对于 ~/.cetridr/homes，~ 或绝对路径按原样；\n  不设 home 时继承门户进程的 DSH_HOME（即共享状态）。\n- profiles[].command：可选，完全替换默认命令 dsh --profile <id> --port <port>（{port}/{id} 会被替换）。\n- 安全：所有 /api/* 需 x-cetridr-token（token 存 ~/.cetridr/token，0600）；start 打印带 ?t=<token> 的完整 URL。\n\n### 真隔离 vs 共享状态\n\nDSH 用 DSH_HOME 这一个环境变量决定整个 home（profiles/sessions/storages/settings/credentials）。\n要每个 tab 独立数据，给每个 profile 设独立的 home；要共享数据就不设。\n\n### 注意力徽标（working / idle / blocked）\n\n每个 DSH daemon 里装 [whale-rider](packages/whale-rider)（dsh-whale-rider）host 插件，它把\nagent 生命周期上报回 cetridr 的 /api/report；cetridr 在 tab 上显示 working/idle/blocked，\nblocked（待审批）且非活动 tab 会高亮。cetridr 派生子进程时已注入\nCETRIDR_URL / CETRIDR_ID / CETRIDR_TOKEN，插件据此上报。\n\n## 开发\n\n```bash\npnpm install                          # 安装工作区依赖\npnpm run build                        # tsc -> lib/ + 拷贝 cetridr.html\npnpm test                             # node --test test/*.test.mjs\npnpm run typecheck\npnpm --filter dsh-whale-rider run build\n```\n\n源码在 src/（TypeScript，ESM），构建产物在 lib/（已 gitignore）。\n\n## 为什么用 iframe 可行\n\n- DSH web 服务器不发 X-Frame-Options / Content-Security-Policy: frame-ancestors，允许被嵌入。\n- DSH 的 /api 信任栅栏只看 Host 是否为 loopback（无 cookie/认证层），iframe src 直指 DSH 时同源、Host=127.0.0.1:<port> 自然通过。\n- 每个 profile 用 --port 固定端口，门户健康检查轮询 http://127.0.0.1:<port>/。\n\n## 架构\n\n```\nsrc/cli.ts        命令行入口（init/start/stop/list/add/rm/status/logs/service）\nsrc/config.ts     配置 schema + 校验 + 读写 + home 解析\nsrc/paths.ts      CETRIDR_HOME / 数据目录解析\nsrc/supervisor.ts 进程监督：spawn/stop/restart + 健康检查 + 自动重启退避\nsrc/server.ts     HTTP：门户页 + /api/config + /api/status + /api/{start,stop,restart}/:id\nsrc/auth.ts       token 生成/持久化 + x-cetridr-token 校验\nsrc/logger.ts     每 profile 的带时间戳日志文件\nsrc/cetridr.html  header tab + iframe 切换的前端（零依赖）\npackages/whale-rider  DSH host 插件：把 agent 生命周期上报回 cetridr\n```\n\n## 路线图\n\n- [x] M1 立骨：TS 工程化、CLI、配置/数据目录、schema 校验、单测\n- [x] M2 变稳：daemon 化、自动重启退避、懒启动、日志聚合、控制面 token\n- [x] M3 变好用：UI 管理 profile、日志面板、working/idle/blocked 徽标（经 whale-rider）\n- [x] M4 分发：launchd/systemd unit 生成（service）；npm 发布待办\n- [ ] 端口自动分配（延后）\n\n## 发布\n\n一次性设置与发版流程见 [PUBLISHING.md](PUBLISHING.md)。\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.zh.md"}