@ adelie/ 服务器
Adelie Web后端——SDK"人"边界的Web执行. HTTP 载有即时输入、批准和中断; Server-Sent Events 流出 OmniMessage 输出。 添加多用户认证、 项目授权、 会话运行时间、 排程和使用核算 @adelie/core。 。 。 .
建筑
- HTTP 密码: 浩诺+
@hono/node-server; 数据http模块(src/http/app.ts)从每个模块组装业务表面HttpModule.routes贡献和约束没有端口(测试驱动它通过app.request()(三);index.ts是启动条目(dotenv,优雅的关闭). - 存储: SQLite 通过节点的内置
node:sqlite(WAL)只持有索引和汇总(用户、认证会话、项目授权、代理/会议索引、使用、UI预览、错误记录)。 代理状态、追踪和工作空间作为文件保留~/.adelie/data/<project>/agents/<agent>/与SDK和CLI完全共享. - 运行时间:会话管理器保留活动会话(获得或恢复或康复、每会场变换、运行/压缩驱动);批准表面为SSE
approval_request和决定每次重新读取存储的核准模式; 中断等待核准以拒绝中止; 调度器起火agent_state/schedule/*.toml在服务运行时执行任务. - 证监会: 每道单曲事件 ids , 带有有边框的回放缓冲器 (1000 事件 / 2MB); 重新连接从
Last-Event-ID或收到resync_required;心跳每20秒评论一次. - 使用量数字 :
token_usage事件逐行持续;费用在查询时根据目前的按模型定价计算. - 终端数字 :
src/terminal/运行 pty 会话服务器侧(node-pty),并将每个字节输入到一个无头的xterm,所以守护进程——而不是浏览器——拥有屏幕. 控制是JSON通过HTTP(/api/terminals: 列表 / 创建 / 捕获 / 密钥 / 杀死; 创建接受cwd, (中文(简体) ),name, (中文(简体) ),cols编号 :rows(单位:千美元)shell覆盖; 字节流是二进制 WebSocket at/api/terminals/:id/stream(单位:千美元)[opcode, slot, payload],输出组合成 ~5ms 窗口,并立即冲出。 在附加服务器时会使当前网格返回到一个ANSI还原流中,所以一个再装入或第二个设备会重建精确的屏幕——回滚,颜色,光标和DEC输入模式——同时外壳会一直运行. 网络应用程序两次浮出水面:一个内应用码头(Ctrl+), Codex-style) and the standalone最终page ({\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢attaches an existing terminal — the dock's detach handoff —========================================================== (============================= (=============================================================================================== (======================================================================/将一个新的参数化。 会话运行在进程(没有叉子终端工人);这个模块是唯一能触摸节点-pty的东西,这就是如果负载要求它会分裂的地方.
完整路由表和SSE协议的记载见 服务器 API 引用。通过 @adelie/server/api。 。 。 .
环境
| 变量 | 含义 | 默认 |
|---|---|---|
PORT 编号 : HOST | 听取端口/ 地址 | 4000 编号 : 127.0.0.1 |
ADELIE_HOME (曾经是) PENGUIN_HOME(中文(简体) ) | 数据根( 与 SDK/ CLI 共享) | ~/.adelie/data |
ADELIE_WEB_DB (曾经是) PENGUIN_WEB_DB(中文(简体) ) | SQLite 文件路径 | <root>/web.db |
ADELIE_WEB_DIST (曾经是) PENGUIN_WEB_DIST(中文(简体) ) | 前端构建 dir( 静态托管 + SPA 后退当下) | ../web/dist,或捆绑 web-dist/ 在 npm 软件包中 |
ADELIE_TRUST_PROXY | 信托 x-forwarded-proto (单位:千美元)1 以启用 : 它在 HTTPS 上打开热更新网络门并标记会话 cookie Secure – 仅在反向代理后设置/剪切页眉本身 | 未设置( 未信任) |
ADELIE_CLI_ENTRY (曾经是) PENGUIN_CLI_ENTRY(中文(简体) ) | 向代理服务器提供的 CLI 条目脚本: 它被写入 <root>/bin/penguin 并放在每个命令的路径前 | penguin server|web 设置在名称下, 桌面外壳会通过预重命名的 ; 否则此服务器的输入是开始的, 当它有一个 |
上面的每个部署变量都会用括号读取拼写:其写作器在外
此寄存器( 桌面 shell 的发射环境, 现有部署的单位文件, an
更古老的发射台脚本),所以两个名字都被接受,而那些编剧则移动过来——见:
packages/core/src/state/boundary-env.ts。 。 。 .
.env 在进程 cwd 中自动加载.
运行
pnpm --filter @adelie/server dev # tsx watch (front end via the Vite dev proxy)
pnpm --filter @adelie/server build # tsup → dist/
pnpm --filter @adelie/server start # node dist/index.js
pnpm typecheck / test 运行 tsc 和 vitest(测试使用临时根 + 内膜 DB;没有端口,没有LLM 的活电话) .
安全说明(已知MVP限制)
- 中国证监会: 会话饼干是
SameSite=Lax并只接受Content-Type: application/json;还没有CSRF标志. - 登录节流:在连续5次失败后,每个用户名的指数回转(1倍于60斯的上限),
429 too_many_attempts窗口内,在成功时重置;内存,所以重启即可清除. 未知用户名被相同的节制, 因此它不是一个账户存在预告器 。 一个倒置代理仍然可以为公共部署添加IP级限制. - 内建管理员
admin以随机密码播种,该密码被散开并隐去 (单位:千美元)ADELIE_SEED_ADMIN_PASSWORD把它钉入测试/e2e). 在设定出密码之前,每个开始会打印出第一个登录链接,在浏览器中签名以选择一个;一个横幅会一直提醒直到初始旗帜被清除. - 密码的使用
node:crypto挤压( s)scrypt$N$r$p$salt$hash时间保障平等。 一个会话是一行auth_sessions(cookie holds a manual sorder,行其sha256;它在重启后活了下来,续延已就位的过期,并登录删除行. 课会持续30天,并进行滑动更新. - 模型证书在项目所隐藏的0600配置文件中现场直播;API总是掩盖它们.
- 终端是运行服务器的 OS 账户的外壳,即API最有特权的东西——它们没有项目范围. 一个终端只可见于创建它的账户(有人的ID回答404,不是403)和流 WebSocket 检查
Origin在会话 cookie上,因为一个WebSocket握手不受CORS约束. 请不要显示您不会给 SSH 账户的终端部署 . - 在反向代理后, 禁用 SSE 路径的响应缓冲( 服务器已经发送)
X-Accel-Buffering: no)和设置ADELIE_TRUST_PROXY=1与x-forwarded-proto转发后会话 cookie 标记Secure——单发头是不值得信任的,所以没有选入HTTPS部署就发行了它的饼干而不用旗.
部分 爱德莉 • Apache-2.0