@love-moon/chat-web 0.17.2 → 0.18.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/CHANGELOG.md +71 -0
- package/README.md +176 -0
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.js +11 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/chatgpt-sse-collector.d.ts +2 -0
- package/dist/providers/chatgpt-sse-collector.js +4 -0
- package/dist/providers/chatgpt-sse-collector.js.map +1 -1
- package/dist/runtime/accounts.d.ts +13 -0
- package/dist/runtime/accounts.js +86 -0
- package/dist/runtime/accounts.js.map +1 -0
- package/dist/runtime/archive.d.ts +9 -0
- package/dist/runtime/archive.js +54 -0
- package/dist/runtime/archive.js.map +1 -0
- package/dist/runtime/browser-worker.d.ts +14 -0
- package/dist/runtime/browser-worker.js +87 -0
- package/dist/runtime/browser-worker.js.map +1 -0
- package/dist/runtime/cli.d.ts +1 -0
- package/dist/runtime/cli.js +141 -0
- package/dist/runtime/cli.js.map +1 -0
- package/dist/runtime/client.d.ts +84 -0
- package/dist/runtime/client.js +258 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/daemon.d.ts +1 -0
- package/dist/runtime/daemon.js +33 -0
- package/dist/runtime/daemon.js.map +1 -0
- package/dist/runtime/engine.d.ts +105 -0
- package/dist/runtime/engine.js +605 -0
- package/dist/runtime/engine.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/managed.d.ts +7 -0
- package/dist/runtime/managed.js +75 -0
- package/dist/runtime/managed.js.map +1 -0
- package/dist/runtime/process-env.d.ts +2 -0
- package/dist/runtime/process-env.js +5 -0
- package/dist/runtime/process-env.js.map +1 -0
- package/dist/runtime/retention.d.ts +15 -0
- package/dist/runtime/retention.js +62 -0
- package/dist/runtime/retention.js.map +1 -0
- package/dist/runtime/server.d.ts +12 -0
- package/dist/runtime/server.js +246 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/sites.d.ts +2 -0
- package/dist/runtime/sites.js +40 -0
- package/dist/runtime/sites.js.map +1 -0
- package/dist/runtime/store.d.ts +17 -0
- package/dist/runtime/store.js +61 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/stream-decoder.d.ts +30 -0
- package/dist/runtime/stream-decoder.js +227 -0
- package/dist/runtime/stream-decoder.js.map +1 -0
- package/dist/runtime/types.d.ts +102 -0
- package/dist/runtime/types.js +12 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/worker.d.ts +1 -0
- package/dist/runtime/worker.js +422 -0
- package/dist/runtime/worker.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
# @love-moon/chat-web
|
|
2
2
|
|
|
3
|
+
## 0.18.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 72324fd: Add a local multi-chat runtime with isolated Chromium workers, persistent profiles,
|
|
8
|
+
per-account concurrency, resumable events, request deduplication, and SDK/CLI access.
|
|
9
|
+
Add experimental Kimi and Claude webpage adapters and optional AI SDK socket transport.
|
|
10
|
+
|
|
11
|
+
Support Kimi Connect JSON envelopes and DeepSeek XHR SSE patches, with verified
|
|
12
|
+
parallel real-account text chats, independent cancellation, and restart recovery.
|
|
13
|
+
|
|
14
|
+
Add DeepSeek --deepthink / --no-deepthink controls and SDK options with persisted
|
|
15
|
+
chat defaults, per-turn overrides, verified UI state, and runtime capability checks.
|
|
16
|
+
|
|
17
|
+
Connect Conductor web-kimi and web-deepseek to managed isolated Chromium workers
|
|
18
|
+
by default. Add conductor chat-web login, account credential bootstrap, automatic
|
|
19
|
+
daemon startup and idle shutdown, stable cross-process resume IDs, and browser
|
|
20
|
+
release when tasks close. Preserve the shared-profile queue for other providers.
|
|
21
|
+
Retain cancelled conversation URLs and report confirmed stops as interruptions.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- bdbda18: Preserve lightweight conversation identity archives across profile/history GC so
|
|
26
|
+
Conductor can resume the same provider conversation using its existing local ID.
|
|
27
|
+
Archive idle, workerless open chats; persist the completed-turn resume guard; and
|
|
28
|
+
distinguish slow page loading from confirmed authentication failures.
|
|
29
|
+
|
|
30
|
+
Upgrading a CLI while an older managed runtime is running can report
|
|
31
|
+
RUNTIME_UPGRADE_REQUIRED when queuedStartup or durableResume support is missing.
|
|
32
|
+
After active chats finish, run `conductor chat-web runtime stop` and retry;
|
|
33
|
+
the next managed session starts the updated runtime. Alternatively, a runtime
|
|
34
|
+
with no active turns or pinned login windows exits after ten minutes without
|
|
35
|
+
requests. The CLI never terminates running chats automatically.
|
|
36
|
+
|
|
37
|
+
Profile deletion now starts only after the retention checkpoint commits, and
|
|
38
|
+
closed chats awaiting uncertainty review retain their profiles and turn history.
|
|
39
|
+
Accepted prompts refresh idle activity before collection, keeping their parent
|
|
40
|
+
conversation resident even when a client submits directly after a long idle.
|
|
41
|
+
|
|
42
|
+
- d31f07b: Show actionable Kimi and DeepSeek account concurrency errors in Conductor chat.
|
|
43
|
+
Preserve bounded provider messages and typed errors through the existing runtime,
|
|
44
|
+
AI SDK and chat error channel without automatically retrying submitted turns.
|
|
45
|
+
- 063b97c: Show daemon-host inspection and acknowledgement commands on uncertain chat-web
|
|
46
|
+
errors and REVIEW_REQUIRED, including interrupted sends and timeouts. Keep
|
|
47
|
+
acknowledgement explicit: it does not replay a request, and the user sends the
|
|
48
|
+
next message after checking the provider conversation. The web error message
|
|
49
|
+
contains the commands; acknowledgement currently runs through the host CLI.
|
|
50
|
+
|
|
51
|
+
Compact streamed event history into full text snapshots instead of failing
|
|
52
|
+
after 2000 events. Sequence numbers remain monotonic across compaction and
|
|
53
|
+
restart; replay cursors may cross gaps and recover through a message_snapshot.
|
|
54
|
+
The one-million-character text limit remains enforced.
|
|
55
|
+
|
|
56
|
+
Return CHAT*CLOSED when closing a chat races a headed resume. Strip CONDUCTOR*\*
|
|
57
|
+
identity variables from detached runtime and browser-worker environments while
|
|
58
|
+
preserving browser and proxy configuration.
|
|
59
|
+
|
|
60
|
+
Upgrade note: an already-running shared runtime continues executing its old
|
|
61
|
+
code. After active chats finish, run `conductor chat-web runtime stop` and retry
|
|
62
|
+
to launch the updated runtime. Older runtimes lacking required capabilities
|
|
63
|
+
report RUNTIME_UPGRADE_REQUIRED; unused managed runtimes exit after ten minutes
|
|
64
|
+
without requests or pinned login windows. No running chat is stopped
|
|
65
|
+
automatically during upgrade.
|
|
66
|
+
|
|
67
|
+
- 31b61ea: Bound closed-chat and terminal-turn retention, reclaim browser profiles and orphan
|
|
68
|
+
directories, and keep streaming deltas in memory between durable checkpoints.
|
|
69
|
+
Defer saturated or busy chat startup to the turn queue, validate authentication at
|
|
70
|
+
allocation, and expire queued prompts before crash recovery or delayed submission.
|
|
71
|
+
Keep Gemini on its legacy transport with global runtime sockets and consume the
|
|
72
|
+
Conductor wrapper separator before forwarding a packaged CLI command.
|
|
73
|
+
|
|
3
74
|
## 0.17.2
|
|
4
75
|
|
|
5
76
|
### Patch Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Chat web runtime
|
|
2
|
+
|
|
3
|
+
ChatGPT、DeepSeek、Kimi、Claude 网页聊天的本地运行时。第一版使用 Chromium/Playwright,每个 chat 独占一个 Node worker、浏览器进程和持久化 profile。多个 SDK/CLI 客户端通过本地 socket 共享 daemon,同一 chat 的发送有序,不同 chat 可并行。
|
|
4
|
+
|
|
5
|
+
Kimi、Claude 适配标记为 experimental。2026-10-25 UTC 已在 macmini 使用真实 Kimi、DeepSeek 账号验证多轮、四路并行、独立取消与重启恢复;ChatGPT、Claude 仍仅有模拟站点覆盖。Moli 留作后续资源优化。
|
|
6
|
+
|
|
7
|
+
## 在 Conductor 中使用 Kimi 和 DeepSeek
|
|
8
|
+
|
|
9
|
+
使用包含本运行时的 Conductor 版本,在运行 daemon 的主机上登录:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
conductor chat-web login kimi
|
|
13
|
+
conductor chat-web login deepseek
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
命令打开 Chromium 登录窗口,检测到登录后保存账号认证并关闭窗口;超时会明确失败。自定义配置使用 --config-file PATH,命令会读取配置 envs 中的 CHAT_WEB_* 与代理设置,终端显式环境变量优先。登录与 daemon 应使用同一操作系统用户和 CHAT_WEB_HOME。登录过期时按提示重新执行登录,再在原任务发送消息;认证失败的浏览器会释放,重试读取新的认证。
|
|
17
|
+
|
|
18
|
+
daemon 的配置需要包含这些别名。新建配置时会自动提供;已有配置补上缺少的项,重启 daemon 使配置生效:
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
allow_cli_list:
|
|
22
|
+
web-kimi: chat-web --model kimi
|
|
23
|
+
web-deepseek: chat-web --model deepseek
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
在 Conductor 中选择 web-kimi 或 web-deepseek 创建对话;kimi 仍表示 Kimi CLI。这两个网页别名默认自动连接或启动本地隔离运行时,无需先启动 chat-web serve 或设置 socket。每个新对话从 default 账号读取认证,独立保存网页会话和 profile,草稿、当前会话选择和聊天数据库不会从登录 profile 复制。
|
|
27
|
+
|
|
28
|
+
Kimi 默认 headed,主机需有可用图形会话;DeepSeek 默认 headless。配置别名可附加 --headed / --headless,DeepSeek 还可附加 --deepthink / --no-deepthink。例如 web-deepseek: chat-web --model deepseek --no-deepthink。修改图形模式不绕过站点自身的登录或验证。
|
|
29
|
+
|
|
30
|
+
Conductor 使用 chat-web-runtime:CHAT_ID 保存稳定身份,站点会话 id 单独保存。任务关闭会释放该 chat 的浏览器,重启使用同一身份恢复原网页对话。旧版 Kimi/DeepSeek 的站点会话 id 会导入到运行时,同一账号重复导入复用同一个 chat。缺失的运行时 id 会报错,不悄悄创建空白会话。Conductor 的 /clear 通过创建新 chat 开始独立对话。
|
|
31
|
+
|
|
32
|
+
自动启动的 daemon 在无活动 turn、无固定登录窗口且十分钟没有请求后退出;CHAT_WEB_RUNTIME_IDLE_MS 可调整该空闲时间,最小一秒。已有任务在下一次发送前会自动重新连接或启动 daemon,并恢复原 chat;不会重发已提交的消息。手工运行 serve 的 daemon 不受此自动退出策略影响。旧 daemon 缺少账号引导能力时会提示升级,不会自动中断其聊天;显式执行 conductor chat-web runtime stop 后,下次对话会启动新版本。
|
|
33
|
+
|
|
34
|
+
2026-11-01 UTC 的开发验证通过实际 AI SDK 子进程和 Conductor BridgeRunner 完成 Kimi 多轮消息、双 chat 隔离、关闭后恢复,以及停止一条生成时另一条继续完成。用户重新登录后,DeepSeek 也完成两条 headless chat 的四轮并行消息与独立记忆、关闭后恢复;另两轮经 BridgeRunner 验证 DeepThink 开启和关闭,并在运行时退出后恢复同一对话。两站点的回复均由真实网页返回;BridgeRunner 的 Conductor 消息传输使用本地替身,未覆盖已部署 Web 界面的操作。此前独立运行时的真实 DeepSeek 验证见文末。
|
|
35
|
+
|
|
36
|
+
## 启动与登录
|
|
37
|
+
|
|
38
|
+
安装包和 Playwright Chromium 后:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
chat-web serve --max-workers 4 --per-account-concurrency 2
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
daemon 默认在前台运行。在另一个终端创建会话并打开该会话的登录窗口:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
chat-web chat create chatgpt --account personal
|
|
48
|
+
chat-web chat create deepseek --account personal
|
|
49
|
+
chat-web chat login CHAT_A
|
|
50
|
+
chat-web chat login CHAT_B
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
create 输出 JSON,其中 id 是稳定的本地 chat id。把 CHAT_A、CHAT_B 替换为对应 id。login 返回后浏览器仍由 daemon 持有,在窗口中手动登录;凭证和验证步骤由用户处理。每个隔离 profile 首次需要单独授权,`chat-web login kimi|deepseek` 成功后会保存 default 账号认证,新建 default chat 自动导入;其他 accountId 仍需在对应 chat 窗口中登录。不会直接复制运行中的共享 profile。
|
|
54
|
+
|
|
55
|
+
create 默认 headless。login 将该 chat 切为 headed。当前实测 Kimi 的已有登录态切换到 headless 后,发送返回 HTTP 401,切回 headed 可用;建议 Kimi 保持 headed(创建时可传 --headed),原因尚未确认,不自动重试提交。DeepSeek 已验证 headless 和 headed。确认站点支持后,需要后台模式时运行:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
chat-web chat close CHAT_A
|
|
59
|
+
chat-web chat resume CHAT_A --headless
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
手动打开的登录窗口会保留,不会为其他 chat 回收;开始该 chat 的发送或显式 close 后才解除保留。登录窗口可以继续用于生成;不要求手动关闭它。人工关闭了窗口后可用 resume 重新打开。
|
|
63
|
+
|
|
64
|
+
## 并行发送与事件
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
chat-web chat send CHAT_A "比较这两种方案" --request-id job-1 --detach
|
|
68
|
+
chat-web chat send CHAT_B "给出独立分析" --request-id job-2 --detach
|
|
69
|
+
chat-web turn events TURN_A
|
|
70
|
+
chat-web turn events TURN_B --after 3
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
send 默认等待终态并输出 JSON,`--detach` 立即返回 turn id,`--jsonl` 连续输出事件。turn events 支持从序号 after 之后重放;断开订阅不取消生成。
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
chat-web turn get TURN_A
|
|
77
|
+
chat-web turn cancel TURN_A
|
|
78
|
+
chat-web chat list
|
|
79
|
+
chat-web chat get CHAT_A
|
|
80
|
+
chat-web chat close CHAT_A
|
|
81
|
+
chat-web runtime status
|
|
82
|
+
chat-web runtime stop
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
取消排队中的 turn 不会发送网页消息。取消已提交的 turn 会尝试点击该页面的 stop,并检查控件消失。未确认停止时记录 uncertain,不宣称服务端已停。close 只操作对应 chat,并阻止继续发送,直到显式 resume。
|
|
86
|
+
|
|
87
|
+
## DeepSeek DeepThink
|
|
88
|
+
|
|
89
|
+
创建时指定每轮默认值,或发送时覆盖单轮:
|
|
90
|
+
|
|
91
|
+
~~~bash
|
|
92
|
+
chat-web chat create deepseek --deepthink
|
|
93
|
+
chat-web chat send CHAT_ID "分析这个方案" --deepthink
|
|
94
|
+
chat-web chat send CHAT_ID "直接回答" --no-deepthink
|
|
95
|
+
~~~
|
|
96
|
+
|
|
97
|
+
--deepthink 开启,--no-deepthink 关闭;两者不可同时使用,仅支持 DeepSeek。发送参数优先于 chat 创建时的默认值;两者都不指定则保持该页面当前状态。单轮覆盖不修改保存的 chat 默认值,但会改变该 profile 的网页开关。SDK 对应 deepThink: true/false,支持 client.create、client.submit、RuntimeChatSession.open 和 session.send;session.send 优先于 session.open 的默认值。
|
|
98
|
+
|
|
99
|
+
运行时在发送前读取 DeepThink 控件的 aria-pressed/aria-checked,仅在状态不符时点击,并确认切换成功。控件缺失或状态无法确认时,本轮失败且不发送消息。设置随 turn 持久化,同一 requestId 更换设置会报冲突。新客户端会先检查 daemon 能力,旧版 daemon 需要重启升级。
|
|
100
|
+
|
|
101
|
+
AI SDK 的 runtime 模式可使用 chatWebProvider: "deepseek"、chatWebDeepThink: true/false;该选项不支持旧版直连模式。2026-10-26 UTC 已使用真实账号验证开启、重复开启、关闭和保持现状四轮,均确认页面实际状态及 SSE 回复。
|
|
102
|
+
|
|
103
|
+
## SDK
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { ChatRuntimeClient } from "@love-moon/chat-web";
|
|
107
|
+
|
|
108
|
+
const client = new ChatRuntimeClient(); // 连接已有 daemon
|
|
109
|
+
const first = await client.create({ provider: "kimi", accountId: "personal" });
|
|
110
|
+
const second = await client.create({ provider: "claude", accountId: "personal" });
|
|
111
|
+
|
|
112
|
+
// 首次使用:client.resume(id, { headed: true }) 打开对应页面供用户登录。
|
|
113
|
+
// 登录完成后可同时提交;这里的 id 对应已经授权的 chat。
|
|
114
|
+
const turns = await Promise.all([first, second].map((chat, index) =>
|
|
115
|
+
client.submit({
|
|
116
|
+
conversationId: chat.id,
|
|
117
|
+
requestId: "comparison-" + index,
|
|
118
|
+
input: "独立评估这个设计",
|
|
119
|
+
}),
|
|
120
|
+
));
|
|
121
|
+
|
|
122
|
+
const results = await Promise.all(turns.map((turn) => client.wait(turn.id)));
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`client.events(turnId, after, signal)` 是异步迭代器,事件包括 queued、starting、submitting、message_delta、message_snapshot 和终态。message_delta 追加文本,message_snapshot 替换文本;终态事件包含最终或部分文本。事件按 turnId/seq 去重。长流会定期把文本增量历史压缩为完整 message_snapshot;文本替换也会立即压缩旧文本事件。seq 保持单调递增,但压缩后可能不连续;旧游标通过快照恢复当前正文,不保证永久保留每一条历史 delta。wait 自动尝试重连,稳定 requestId 可在请求确认丢失时再次查询同一次提交;同 id 不同输入或超时报 REQUEST_CONFLICT。
|
|
126
|
+
|
|
127
|
+
`RuntimeChatSession.open(provider, { socketPath, conversationId, accountId })` 提供接近旧 ChatSession 的 open/isLoggedIn/send/interruptCurrentTurn/close 接口。默认 close 只断开 SDK 会话;releaseOnClose: true 会关闭远程 chat 并释放浏览器,Conductor 的自动运行时使用此选项。显式释放也可使用 client.closeConversation。未传 socketPath 时 open 会自动确保 daemon 可用;传入 socketPath 时连接该已有 daemon。运行时会话没有原地 clear,创建新 chat 即开始独立对话。
|
|
128
|
+
|
|
129
|
+
## AI SDK 接入
|
|
130
|
+
|
|
131
|
+
```js
|
|
132
|
+
const session = createAiSession("chat-web", {
|
|
133
|
+
chatWebRuntimeSocket: "/absolute/path/to/runtime.sock",
|
|
134
|
+
chatWebProvider: "claude",
|
|
135
|
+
chatWebConversationId: "已登录的本地-chat-id",
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Kimi、DeepSeek 默认自动启用运行时,例如 createAiSession("chat-web", { model: "kimi" })。显式 chatWebRuntimeSocket 或 CHAT_WEB_RUNTIME_SOCKET 可连接已运行的 daemon,并使用 chatgpt、deepseek、kimi、claude。自动模式的 Conductor 身份为 chat-web-runtime:CHAT_ID,显式 socket 模式继续使用本地 chat id;站点 id 存于 providerConversationId。ChatGPT/Gemini 默认使用 QueuedChatSession;chatWebRuntime: false 可显式选择共享 profile 路径。
|
|
140
|
+
|
|
141
|
+
## 隔离与恢复
|
|
142
|
+
|
|
143
|
+
- 全局默认四个 worker,同站点同 accountId 默认同时生成两路,可在 serve 时配置。accountId 是用户给登录身份的标签,运行时不验证多个标签是否实际对应同一个账号;站点限流与配额不会因 profile 隔离而增加。
|
|
144
|
+
- 空闲 worker 可回收,恢复依赖已保存的站点会话 URL。已发送但没有可靠 URL 的 chat 不会在资源回收或重启后悄悄打开新会话。
|
|
145
|
+
- 已开始的 turn 在异常或重启后进入 uncertain;重启只重新调度仍在 timeoutMs 等待期限内、从未开始的 queued turn;过期队列记录 cancelled / QUEUE_EXPIRED,分配 worker 前也会再次检查,不重放已提交消息。
|
|
146
|
+
- uncertain 会阻止该 chat 后续发送,其他 chat 继续运行。打开页面核对结果后,使用 `chat-web chat resume CHAT_ID --acknowledge` 显式解除;解除不重发旧 turn。 Conductor 会在首次 uncertain 错误和后续 REVIEW_REQUIRED 错误中给出打开同一会话、确认恢复的完整命令(包含实际 chat id 和 socket)。目前确认操作仍需在 daemon 主机通过 CLI 执行,网页聊天错误消息提供操作指引;核对确认后再手动发送需要的新消息。
|
|
147
|
+
- 回复优先从 fetch/XHR 的 SSE 或 Kimi Connect JSON 流增量解析。终态 source 字段区分 sse、connect 与 dom,DOM 文本可能丢失 Markdown 格式。DOM 降级需要新回复节点及观察到 stop 控件出现再消失;静默两秒或超时不会直接被当作完成。WebSocket、Connect 压缩帧或变化后的站点协议可能需要更新适配器。
|
|
148
|
+
- 本地状态目录默认 `CHAT_WEB_HOME/runtime`,CHAT_WEB_HOME 默认 ~/.chat-web。Unix 目录权限 0700,socket 与状态文件 0600,凭证保存在各 chat 的 profile。没有开放 TCP 监听端口。
|
|
149
|
+
- 第一版使用原子 JSON 状态快照,快照中最多常驻 256 个 chat、4096 个 turn,每次输入上限 10 万字符、输出上限 100 万字符。关闭且无需核对的 chat 的完整本地资源最多保留最近 32 个、最长七天;在创建、发送、关闭和运行时启动时清理,容量不足时优先回收最早关闭的 chat,同时删除其 turn 和 profile。终态 turn 保留最长七天;达到 4096 上限前批量淘汰旧记录,最近一分钟的结果、活跃订阅和仍需核对的 uncertain turn 保留用于取回与核对。正在使用的 chat 不会被回收;若容量全被活跃或受保护的记录占用,仍会明确拒绝操作。回收 profile 和历史前,会在 archive/<id>.json 持久化小型身份记录(原 id、provider、account、站点会话 id/URL 和恢复保护标记),不包含正文或浏览器凭证。chat get 可按原 id 返回 archived: true;resume 从身份记录恢复原 id 和站点会话,并按需创建 profile。身份记录持续保留,不计入 256 个常驻 chat 的上限。chat list 仅列出常驻记录。已回收的 turn id 返回 NOT_FOUND,去重仅对尚未回收的 turn 生效。状态含输入与回复,应按本地聊天记录管理。
|
|
150
|
+
|
|
151
|
+
所有客户端命令接受 --socket PATH。daemon 接受 --runtime-dir PATH、--browser-executable PATH、--browser-channel NAME;原有 CHAT_WEB_BROWSER_EXECUTABLE、CHAT_WEB_BROWSER_CHANNEL 环境变量也有效。
|
|
152
|
+
|
|
153
|
+
## 开发与验证
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
cd modules/chat-web
|
|
157
|
+
pnpm build
|
|
158
|
+
pnpm test
|
|
159
|
+
node dist/cli.js serve
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
测试包括本地 RPC/SDK/CLI、并发与顺序、幂等、取消、断线重放、异常检查点恢复,以及独立 Chromium 进程中的四种站点模拟页面。Kimi 模拟 Connect 二进制分帧、done 后网页主动 abort、UI 延迟解除生成状态与截断流;DeepSeek 模拟 XHR SSE、负数分片下标及 BATCH 终态。真实浏览器测试在 Chromium 不可用时跳过;可设置 CHAT_WEB_TEST_BROWSER 指定测试二进制,不会自动安装或使用真实账号。
|
|
163
|
+
|
|
164
|
+
真实账号验证覆盖同一 daemon 内 Kimi 两路(headed)和 DeepSeek 两路(headless),四条生成区间共同重叠 1024 ms,四个站点会话 id 不同。各 chat 只回忆自己的标记;取消每站点的一条生成均得到 stopConfirmed=true,另一条继续完成;重启后两站点均可继续原对话。此轮联合验证 14 个 turn,其中 12 个 completed、2 个按要求 cancelled。它验证当前网页版本的基础文本路径,不代表账号配额、附件、工具调用或长时间负载已验收。凭证、原始网络数据和执行日志不进入仓库。
|
|
165
|
+
|
|
166
|
+
流式正文与事件在内存中逐条更新并供订阅重放,不再每个增量重写状态文件。首次进入 streaming 和生命周期变化(包括终态)仍持久化完整检查点;异常退出可能丢失检查点之后的正文尾部,已开始的请求仍进入 uncertain,不自动重发。
|
|
167
|
+
|
|
168
|
+
Conductor 的启动检查在 worker 池忙或恢复活跃 chat 时可返回排队状态,实际分配 worker 后再核实登录;无需预先占用浏览器才能进入发送队列。Gemini 不属于隔离运行时站点,设置全局 runtime socket 后仍使用原共享 profile 队列。
|
|
169
|
+
|
|
170
|
+
无 worker、无非终态 turn、无待核对错误且超过七天未活动的 open chat 也会归档;最近活动和仍在使用的 chat 不会清理。关闭或归档只释放本地资源,不表示 Conductor 任务不可继续。hasCompletedTurn 标记独立于 turn 历史保留;完成过回复但缺少可靠 URL 时仍报 RESUME_UNSUPPORTED,避免静默创建新会话。新的 profile 如需续期认证,会给出登录提示。
|
|
171
|
+
|
|
172
|
+
页面十秒内未准备好但没有明确登录证据时返回 PAGE_NOT_READY,不提示续期登录;只有登录路径,或输入框可见但缺少站点认证标记时,才报告 AUTH_REQUIRED。
|
|
173
|
+
|
|
174
|
+
2026-11-02 UTC 已使用真实 Kimi 账号验证 profile 回收后的恢复:通过 Conductor 使用的 managed AI SDK 发送标记,关闭原 chat 并关闭另外 33 个空 chat,确认原 profile 已删除;停止并重新启动 runtime 后,沿用原本地 id、站点会话 id 和 URL,以新 profile 成功回忆原标记,回复来源为 Connect。
|
|
175
|
+
|
|
176
|
+
2026-11-05 UTC 用户重新登录后,真实 DeepSeek 账号也通过同一条 managed AI SDK 的 headless 验证路径:首轮记住唯一标记,关闭原 chat 和另外 33 个空 chat 后确认原记录已归档、profile 已删除;停止并重启 runtime,沿用同一个本地 id、站点会话 id 和 URL 创建新 profile,后续消息正确回忆原标记,回复来源为 SSE。此项 profile 回收后的真实恢复验证现已覆盖 Kimi 和 DeepSeek;验证通过 SDK 完成,不包含已部署 Conductor Web 界面的完整操作验收。
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/* eslint-disable no-console */
|
|
3
|
+
import { RuntimeError } from "./runtime/types.js";
|
|
4
|
+
import { runRuntimeCli } from "./runtime/cli.js";
|
|
3
5
|
import { doctor, formatDoctorReport } from "./commands/doctor.js";
|
|
4
6
|
import { info, formatInfo } from "./commands/info.js";
|
|
5
7
|
import { login } from "./commands/login.js";
|
|
@@ -9,6 +11,8 @@ import { registerBuiltinProviders } from "./providers/index.js";
|
|
|
9
11
|
const USAGE = `chat-web — chat web automation runtime
|
|
10
12
|
|
|
11
13
|
Usage:
|
|
14
|
+
chat-web serve [--max-workers 4] [--per-account-concurrency 2]
|
|
15
|
+
chat-web chat --help Isolated multi-chat SDK/CLI runtime.
|
|
12
16
|
chat-web login <provider> Open a browser to sign in; profile is persisted.
|
|
13
17
|
chat-web doctor <provider> [--snapshot] Inspect provider page state.
|
|
14
18
|
[--screenshot]
|
|
@@ -72,6 +76,8 @@ async function main() {
|
|
|
72
76
|
return 0;
|
|
73
77
|
}
|
|
74
78
|
const [command, ...rest] = argv;
|
|
79
|
+
if (["serve", "chat", "turn", "runtime"].includes(command))
|
|
80
|
+
return runRuntimeCli(argv);
|
|
75
81
|
const { positional, flags } = parseArgs(rest);
|
|
76
82
|
const logLevel = flagString(flags, "log") ?? undefined;
|
|
77
83
|
const logger = createLogger(logLevel ?? process.env.CHAT_WEB_LOG ?? "info");
|
|
@@ -130,9 +136,9 @@ main().then((code) => {
|
|
|
130
136
|
if (typeof code === "number")
|
|
131
137
|
process.exit(code);
|
|
132
138
|
}, (err) => {
|
|
133
|
-
if (err instanceof ChatWebError) {
|
|
139
|
+
if (err instanceof ChatWebError || err instanceof RuntimeError) {
|
|
134
140
|
process.stderr.write(`Error [${err.code}]: ${err.message}\n`);
|
|
135
|
-
if (err.hint)
|
|
141
|
+
if (err instanceof ChatWebError && err.hint)
|
|
136
142
|
process.stderr.write(`Hint: ${err.hint}\n`);
|
|
137
143
|
process.exit(1);
|
|
138
144
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,+BAA+B;AAE/B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import readline from "node:readline";
|
|
2
2
|
import { defaultLogger } from "../core/logger.js";
|
|
3
|
+
import { saveRuntimeAccount } from "../runtime/accounts.js";
|
|
4
|
+
import { NotLoggedInError } from "../core/errors.js";
|
|
3
5
|
import { ChatSession } from "../session.js";
|
|
4
6
|
/**
|
|
5
7
|
* Open a headed browser so the user can sign in manually.
|
|
@@ -19,7 +21,8 @@ export async function login(providerName, options = {}) {
|
|
|
19
21
|
logger.info(`Opened ${session.provider} in a Chromium window backed by ${session.userDataDir}.`);
|
|
20
22
|
logger.info("Complete the sign-in flow in the browser window.");
|
|
21
23
|
if (options.autoExit) {
|
|
22
|
-
await waitForLoggedIn(session, options, logger)
|
|
24
|
+
if (!(await waitForLoggedIn(session, options, logger)))
|
|
25
|
+
throw new NotLoggedInError(providerName);
|
|
23
26
|
logger.info(`Detected logged-in state for ${providerName}. Closing browser.`);
|
|
24
27
|
}
|
|
25
28
|
else {
|
|
@@ -27,9 +30,14 @@ export async function login(providerName, options = {}) {
|
|
|
27
30
|
await waitForEnter();
|
|
28
31
|
}
|
|
29
32
|
if (await session.isLoggedIn()) {
|
|
33
|
+
if (["kimi", "deepseek"].includes(providerName)) {
|
|
34
|
+
await saveRuntimeAccount(providerName, await session.page.context().storageState({ indexedDB: true }));
|
|
35
|
+
}
|
|
30
36
|
logger.info(`Saved persistent profile for ${providerName} at ${session.userDataDir}.`);
|
|
31
37
|
}
|
|
32
38
|
else {
|
|
39
|
+
if (options.autoExit)
|
|
40
|
+
throw new NotLoggedInError(providerName);
|
|
33
41
|
logger.warn(`Could not verify login for ${providerName}. The browser was closed without a confirmed signed-in state.`);
|
|
34
42
|
}
|
|
35
43
|
}
|
|
@@ -53,9 +61,10 @@ async function waitForLoggedIn(session, options, logger) {
|
|
|
53
61
|
while (Date.now() < deadline) {
|
|
54
62
|
const ok = await session.isLoggedIn().catch(() => false);
|
|
55
63
|
if (ok)
|
|
56
|
-
return;
|
|
64
|
+
return true;
|
|
57
65
|
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
58
66
|
}
|
|
59
67
|
logger.warn("Timed out waiting for login.");
|
|
68
|
+
return false;
|
|
60
69
|
}
|
|
61
70
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,YAAoB,EAAE,UAAwB,EAAE;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE;QACnD,QAAQ,EAAE,KAAK;QACf,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CACT,UAAU,OAAO,CAAC,QAAQ,mCAAmC,OAAO,CAAC,WAAW,GAAG,CACpF,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAEhE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public entry point for `@love-moon/chat-web`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* ChatRuntimeClient and RuntimeChatSession connect to an isolated multi-chat
|
|
5
|
+
* daemon. The CLI exposes serve/chat/turn commands.
|
|
6
|
+
* QueuedChatSession shares a browser and turn queue across tasks/processes.
|
|
7
|
+
* ChatSession offers exclusive ownership and direct Playwright Page access.
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* import { ChatSession, registerBuiltinProviders } from "@love-moon/chat-web";
|
|
@@ -33,3 +33,4 @@ export * from "./core/snapshot.js";
|
|
|
33
33
|
export * from "./core/locator-score.js";
|
|
34
34
|
export * from "./core/logger.js";
|
|
35
35
|
export * from "./commands/index.js";
|
|
36
|
+
export * from "./runtime/index.js";
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public entry point for `@love-moon/chat-web`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* ChatRuntimeClient and RuntimeChatSession connect to an isolated multi-chat
|
|
5
|
+
* daemon. The CLI exposes serve/chat/turn commands.
|
|
6
|
+
* QueuedChatSession shares a browser and turn queue across tasks/processes.
|
|
7
|
+
* ChatSession offers exclusive ownership and direct Playwright Page access.
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* import { ChatSession, registerBuiltinProviders } from "@love-moon/chat-web";
|
|
@@ -39,4 +39,6 @@ export * from "./core/logger.js";
|
|
|
39
39
|
// CLI commands as SDK functions, in case callers want to drive them
|
|
40
40
|
// programmatically (e.g. a UI that runs doctor and renders the report).
|
|
41
41
|
export * from "./commands/index.js";
|
|
42
|
+
// Isolated multi-chat runtime and local socket client.
|
|
43
|
+
export * from "./runtime/index.js";
|
|
42
44
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,WAAW,GAIZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAqB;AACrB,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAErC,4EAA4E;AAC5E,8EAA8E;AAC9E,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AAEjC,oEAAoE;AACpE,wEAAwE;AACxE,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,WAAW,GAIZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAqB;AACrB,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAErC,4EAA4E;AAC5E,8EAA8E;AAC9E,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AAEjC,oEAAoE;AACpE,wEAAwE;AACxE,cAAc,qBAAqB,CAAC;AAEpC,uDAAuD;AACvD,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Page } from "playwright";
|
|
2
|
+
import { type SSEEvent } from "../core/sse-parser.js";
|
|
2
3
|
/**
|
|
3
4
|
* URL pattern for ChatGPT's streaming conversation endpoint. The exact
|
|
4
5
|
* path has shifted historically (`/backend-api/conversation`,
|
|
@@ -65,6 +66,7 @@ export declare class ChatGPTSSECollector {
|
|
|
65
66
|
* Apply a raw SSE body directly. Exposed for tests and for callers that
|
|
66
67
|
* want to feed in a recorded transcript.
|
|
67
68
|
*/
|
|
69
|
+
ingestEvents(events: SSEEvent[]): void;
|
|
68
70
|
ingest(body: string): void;
|
|
69
71
|
private maybeConsume;
|
|
70
72
|
private applyEvent;
|
|
@@ -104,6 +104,10 @@ export class ChatGPTSSECollector {
|
|
|
104
104
|
* Apply a raw SSE body directly. Exposed for tests and for callers that
|
|
105
105
|
* want to feed in a recorded transcript.
|
|
106
106
|
*/
|
|
107
|
+
ingestEvents(events) {
|
|
108
|
+
for (const event of events)
|
|
109
|
+
this.applyEvent(event);
|
|
110
|
+
}
|
|
107
111
|
ingest(body) {
|
|
108
112
|
const events = parseSSE(body);
|
|
109
113
|
for (const ev of events)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatgpt-sse-collector.js","sourceRoot":"","sources":["../../src/providers/chatgpt-sse-collector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chatgpt-sse-collector.js","sourceRoot":"","sources":["../../src/providers/chatgpt-sse-collector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAiB,MAAM,uBAAuB,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,iDAAiD,CAAC;AAyB1F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAc;IAEpB,WAAW,CAOL;IAEN,WAAW,GAAc,SAAS,EAAE,CAAC;IAE7C,+CAA+C;IAC/C,MAAM,CAAC,IAAU;QACf,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAE,EAAE;YACrC,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,UAAkC,EAAE;QAC5C,wEAAwE;QACxE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK;gBAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,SAAS,EAAE,CAAC;QAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;QAC/C,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACzC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;oBAC7B,+DAA+D;oBAC/D,iEAAiE;oBACjE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,gBAAgB;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,MAAkB;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,MAAM;YAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAkB;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ;YAAE,OAAO;QAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO;QAChD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,MAAM;YAAE,OAAO;QAEnD,mEAAmE;QACnE,mEAAmE;QACnE,qEAAqE;QACrE,2DAA2D;QAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO;QAElD,kEAAkE;QAClE,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;QAEjC,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,qEAAqE;YACrE,qEAAqE;YACrE,mEAAmE;YACnE,mEAAmE;YACnE,8DAA8D;YAC9D,iEAAiE;YACjE,6BAA6B;YAC7B,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gEAAgE;YAChE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAEO,UAAU,CAAC,EAAY;QAC7B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,gEAAgE;YAChE,qEAAqE;YACrE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO;QAClD,MAAM,GAAG,GAAG,MAAiC,CAAC;QAE9C,iCAAiC;QACjC,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAkC,CAAC;YACnD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,CAAE,GAAG,CAAC,MAA8C,EAAE,IAAI,IAAI,EAAE,CAAW,CAAC;YACzF,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAC;YACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,EAAE,CAAC;YACxC,IAAI,MAAM,KAAK,uBAAuB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/D,qEAAqE;YACvE,CAAC;YACD,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;YACvC,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,oEAAoE;IACtE,CAAC;IAEO,UAAU,CAAC,GAA4B;QAC7C,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;QAChF,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,QAAQ,CAAC;QACxF,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9D,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC;QAElC,kEAAkE;QAClE,qEAAqE;QACrE,2CAA2C;QAC3C,yDAAyD;QACzD,+DAA+D;QAC/D,6DAA6D;QAC7D,mEAAmE;QACnE,IAAI,EAAE,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,IAAI,CAAC,UAAU,CAAC,GAA8B,CAAC,CAAC;YACtF,CAAC;YACD,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,+CAA+C;QAC/C,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAExC,qEAAqE;QACrE,wDAAwD;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,IAAI,WAAW,CAAC;QAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YACrE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;QACpD,CAAC;aAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEO,0BAA0B,CAAC,IAAa;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,qEAAqE;QACrE,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,oEAAoE;IAC5D,iBAAiB;QACvB,sEAAsE;QACtE,2CAA2C;QAC3C,IAAI,YAA2C,CAAC;QAChD,IAAI,OAAsC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW;gBAAE,SAAS;YAC9C,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAuB;gBAAE,YAAY,GAAG,IAAI,CAAC;QACnE,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,IAAI,OAAO,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,SAAS,SAAS;IAChB,OAAO;QACL,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,cAAc,EAAE,KAAK;QACrB,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAA4B;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,MAAM,GAAI,GAA+B,CAAC,MAAM,CAAC;IACvD,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BrowserContext } from "playwright";
|
|
2
|
+
type StorageState = Awaited<ReturnType<BrowserContext["storageState"]>>;
|
|
3
|
+
interface AccountAuth {
|
|
4
|
+
version: 1;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
state: StorageState;
|
|
7
|
+
}
|
|
8
|
+
export declare function runtimeAccountsDirectory(): string;
|
|
9
|
+
/** Account snapshots contain credentials, never conversation profiles or browser locks. */
|
|
10
|
+
export declare function saveRuntimeAccount(provider: string, state: StorageState, accountId?: string, directory?: string): Promise<void>;
|
|
11
|
+
export declare function readRuntimeAccount(provider: string, accountId?: string, directory?: string): Promise<AccountAuth | undefined>;
|
|
12
|
+
export declare function applyRuntimeAccount(context: BrowserContext, state: StorageState): Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { rootDir } from "../core/paths.js";
|
|
5
|
+
import { RuntimeError } from "./types.js";
|
|
6
|
+
export function runtimeAccountsDirectory() { return path.join(rootDir(), "runtime", "accounts"); }
|
|
7
|
+
function accountFile(provider, accountId, directory) {
|
|
8
|
+
if (![provider, accountId].every(value => /^[a-zA-Z0-9_-]{1,80}$/.test(value))) {
|
|
9
|
+
throw new RuntimeError("INVALID_PARAMS", "Invalid provider or account id");
|
|
10
|
+
}
|
|
11
|
+
return path.join(directory, provider, accountId + ".json");
|
|
12
|
+
}
|
|
13
|
+
function credentialsOnly(provider, state) {
|
|
14
|
+
const keys = provider === "kimi"
|
|
15
|
+
? /^(access_token|refresh_token|msh_user_id|msh_user_subscription_data|__snaker__id|ntes_utid|volcano-token-info|[A-F0-9]{16,64})$/
|
|
16
|
+
: provider === "deepseek"
|
|
17
|
+
? /^(userToken|__appKit_userInfo|deepseek-device-id:chat|settingsJwt|smidV2|__ds_remote_feature_did)$/
|
|
18
|
+
: undefined;
|
|
19
|
+
if (!keys)
|
|
20
|
+
return state;
|
|
21
|
+
// Draft databases and last-selected conversation keys must never seed a new chat.
|
|
22
|
+
return { cookies: state.cookies, origins: state.origins.map(origin => ({
|
|
23
|
+
origin: origin.origin, localStorage: origin.localStorage.filter(item => keys.test(item.name)),
|
|
24
|
+
})).filter(origin => origin.localStorage.length > 0) };
|
|
25
|
+
}
|
|
26
|
+
/** Account snapshots contain credentials, never conversation profiles or browser locks. */
|
|
27
|
+
export async function saveRuntimeAccount(provider, state, accountId = "default", directory = runtimeAccountsDirectory()) {
|
|
28
|
+
const file = accountFile(provider, accountId, directory);
|
|
29
|
+
await fs.mkdir(directory, { recursive: true, mode: 0o700 });
|
|
30
|
+
await fs.chmod(directory, 0o700);
|
|
31
|
+
await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
32
|
+
await fs.chmod(path.dirname(file), 0o700);
|
|
33
|
+
const temporary = file + "." + randomUUID() + ".tmp";
|
|
34
|
+
try {
|
|
35
|
+
await fs.writeFile(temporary, JSON.stringify({ version: 1, updatedAt: Date.now(), state: credentialsOnly(provider, state) }), { mode: 0o600 });
|
|
36
|
+
await fs.rename(temporary, file);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await fs.rm(temporary, { force: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function readRuntimeAccount(provider, accountId = "default", directory = runtimeAccountsDirectory()) {
|
|
43
|
+
let text;
|
|
44
|
+
try {
|
|
45
|
+
text = await fs.readFile(accountFile(provider, accountId, directory), "utf8");
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error.code === "ENOENT")
|
|
49
|
+
return;
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
const auth = JSON.parse(text);
|
|
53
|
+
if (auth.version !== 1 || !Number.isFinite(auth.updatedAt) || !Array.isArray(auth.state?.cookies) || !Array.isArray(auth.state?.origins)) {
|
|
54
|
+
throw new RuntimeError("INVALID_AUTH_STATE", "Account login state is invalid; sign in again");
|
|
55
|
+
}
|
|
56
|
+
return { ...auth, state: credentialsOnly(provider, auth.state) };
|
|
57
|
+
}
|
|
58
|
+
export async function applyRuntimeAccount(context, state) {
|
|
59
|
+
if (typeof context.setStorageState === "function") {
|
|
60
|
+
await context.setStorageState(state);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (state.origins.some(origin => origin.indexedDB?.length)) {
|
|
64
|
+
throw new RuntimeError("BROWSER_UPGRADE_REQUIRED", "This login uses IndexedDB; upgrade Playwright to restore it");
|
|
65
|
+
}
|
|
66
|
+
// Older Playwright can seed localStorage on an intercepted temporary page.
|
|
67
|
+
// A permanent init script would reset refreshed tokens on every navigation.
|
|
68
|
+
await context.clearCookies();
|
|
69
|
+
await context.addCookies(state.cookies);
|
|
70
|
+
const page = await context.newPage();
|
|
71
|
+
try {
|
|
72
|
+
await page.route("**/*", route => route.fulfill({ status: 200, contentType: "text/html", body: "<!doctype html>" }));
|
|
73
|
+
for (const origin of state.origins) {
|
|
74
|
+
await page.goto(origin.origin, { waitUntil: "domcontentloaded" });
|
|
75
|
+
await page.evaluate(items => {
|
|
76
|
+
localStorage.clear();
|
|
77
|
+
for (const item of items)
|
|
78
|
+
localStorage.setItem(item.name, item.value);
|
|
79
|
+
}, origin.localStorage);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await page.close();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/runtime/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Conversation } from "./types.js";
|
|
2
|
+
/** Small identity records outlive profile/history GC, so Conductor IDs remain resumable. */
|
|
3
|
+
export declare class ConversationArchive {
|
|
4
|
+
private directory;
|
|
5
|
+
constructor(directory: string);
|
|
6
|
+
private file;
|
|
7
|
+
read(id: string): Conversation | undefined;
|
|
8
|
+
save(chat: Conversation): Promise<void>;
|
|
9
|
+
}
|