dsh-mobile-plugin 0.4.8 → 0.5.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/icon.png +0 -0
- package/lib/mobile/history-derive.js +86 -2
- package/lib/mobile/host-settings.js +103 -6
- package/lib/mobile/live-steps.js +356 -0
- package/lib/mobile/model-prices-table.cjs +23 -0
- package/lib/mobile/model-prices.cjs +88 -0
- package/lib/mobile/plugin-update.js +16 -1
- package/lib/mobile/session-cache.js +17 -1
- package/lib/mobile/session-step.js +226 -0
- package/lib/mobile/stats-collect.cjs +40 -0
- package/lib/mobile/stats-ledger.cjs +45 -0
- package/lib/mobile/step-index.js +108 -0
- package/lib/mobile/stream.js +29 -0
- package/lib/panel/index.html +11 -11
- package/lib/reconnect-scheduler.cjs +19 -6
- package/lib/relay/connection-check.js +115 -0
- package/lib/relay/firewall-probe.js +300 -0
- package/lib/relay/preview.js +147 -24
- package/lib/relay/tunnel.js +26 -1
- package/lib/routes/control-plane.js +47 -1
- package/lib/routes/mobile-api.js +3 -0
- package/lib/sidecar-facade-worker.cjs +44 -2
- package/lib/update-install.cjs +301 -43
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +5 -1
package/lib/mobile/stream.js
CHANGED
|
@@ -36,6 +36,7 @@ const { callSessions } = require('./rpc.js');
|
|
|
36
36
|
const { unwrap } = require('./envelope.js');
|
|
37
37
|
const { normalizeJobs } = require('./jobs.js');
|
|
38
38
|
const { cutEvent, createToolNameIndex } = require('./wire-cut.js');
|
|
39
|
+
const { noteLiveEvent, drainLiveSteps, liveStepsOf } = require('./live-steps.js');
|
|
39
40
|
const approvals = require('./approvals.js');
|
|
40
41
|
const questions = require('./questions.js');
|
|
41
42
|
const streamRegistry = require('./stream-registry.js');
|
|
@@ -475,6 +476,18 @@ async function handleStream(ctx, req, res) {
|
|
|
475
476
|
const imageBudget = createTextImageBudget();
|
|
476
477
|
// 过程明细的减法(wire-cut.js)与它要的工具名索引:整条流共用一份,回放与实时帧都往里吸。
|
|
477
478
|
const toolNames = createToolNameIndex();
|
|
479
|
+
/**
|
|
480
|
+
* 跑着那一轮的过程清单一发(`session/live-steps`)。
|
|
481
|
+
*
|
|
482
|
+
* `full: true` = 「到此刻为止跑过哪几步」的全量快照(开流那一刻补发:中途进一条正在跑的
|
|
483
|
+
* 会话、断线重连都靠它);`full: false` = 一次增量(新的一步,或某一步的状态变了),App
|
|
484
|
+
* 按 `key` 替换。**不带 seq**:它不是会话事件,不参与序门与水位(口径同 `session/queue`)。
|
|
485
|
+
* 一行摘要由电脑算好 —— 推理全文与工具参数都不上线路(见 wire-cut.js)。
|
|
486
|
+
*/
|
|
487
|
+
const writeLiveSteps = (steps, full, frameArg) => {
|
|
488
|
+
if (!Array.isArray(steps)) return;
|
|
489
|
+
writeSse(res, { type: 'session/live-steps', sessionId, full, steps }, frameArg, { sealFrame });
|
|
490
|
+
};
|
|
478
491
|
|
|
479
492
|
try {
|
|
480
493
|
// **先开实时流、再回放**:之前是先 replay 再 mux,两步之间的 follow 还没订阅,
|
|
@@ -498,6 +511,12 @@ async function handleStream(ctx, req, res) {
|
|
|
498
511
|
}
|
|
499
512
|
}
|
|
500
513
|
|
|
514
|
+
// 开流先补一份过程清单:这条流从此刻起只发「变化的那几步」,之前跑过的那些靠这份快照
|
|
515
|
+
// 铺出来(中途进会话 / 重连都走这里)。**一步都没有时就一个字都不发** —— 空快照只在
|
|
516
|
+
// 告诉手机「你手上那份作废」,而那种情况由新的一轮开始时清(App 侧 `resetLiveSteps`)。
|
|
517
|
+
const opening = liveStepsOf(ctx, sessionId);
|
|
518
|
+
if (!clientGone && opening.length > 0) writeLiveSteps(opening, true, null);
|
|
519
|
+
|
|
501
520
|
if (!clientGone) {
|
|
502
521
|
// 写一帧并把三种结果统一收口:丢增量、需要等 drain、该收尾。
|
|
503
522
|
// 「需要等 drain」这一步是这次 OOM 的正解 —— 写不动就停手,等底层消化完再继续,
|
|
@@ -535,6 +554,16 @@ async function handleStream(ctx, req, res) {
|
|
|
535
554
|
// 预算按**整条流**共享:本机路径的图片内联(local-images.js)此前是每帧一份,
|
|
536
555
|
// 一条消息里几张截图就能把几百 KB 到几 MB 的 base64 推进去。
|
|
537
556
|
let event = await resolveEventAttachments(ctx, sessionId, p.event, { referencesOnly: true, budget: imageBudget });
|
|
557
|
+
// 过程副本:推理正文与工具参数不上线路,但用户点开「正在读取文件」那一步时要
|
|
558
|
+
// 就地答得出来(落盘之前宿主的历史里还没有这一份,见 live-steps.js)。
|
|
559
|
+
noteLiveEvent(ctx, sessionId, event);
|
|
560
|
+
// 过程清单的增量:这一步刚开、或某一步的状态变了,把变化的那几行发出去。
|
|
561
|
+
// 排在事件本身之前发顺序不影响判断(清单是「到此刻为止」的旁白,不是内容)。
|
|
562
|
+
for (const changed of drainLiveSteps(ctx, sessionId)) {
|
|
563
|
+
const value = { type: 'session/live-steps', sessionId, full: false, steps: [changed] };
|
|
564
|
+
if (await pushOrdered(value, null) === 'closed') { clientGone = true; break; }
|
|
565
|
+
}
|
|
566
|
+
if (clientGone) break;
|
|
538
567
|
// 先吸工具名再减:结果自己不带工具名,正文留不留取决于它(见 wire-cut.js)。
|
|
539
568
|
toolNames.absorb(event);
|
|
540
569
|
event = cutEvent(event, toolNames);
|