virlen-remote 0.3.0 → 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/CHANGELOG.md +56 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol/api.d.ts +83 -1
- package/dist/protocol/api.d.ts.map +1 -1
- package/dist/protocol/api.js.map +1 -1
- package/dist/protocol/host.d.ts +18 -1
- package/dist/protocol/host.d.ts.map +1 -1
- package/dist/protocol/host.js +1 -0
- package/dist/protocol/host.js.map +1 -1
- package/dist/protocol/message-actions.d.ts +58 -0
- package/dist/protocol/message-actions.d.ts.map +1 -0
- package/dist/protocol/message-actions.js +38 -0
- package/dist/protocol/message-actions.js.map +1 -0
- package/dist/testing/mock-host.d.ts.map +1 -1
- package/dist/testing/mock-host.js +51 -1
- package/dist/testing/mock-host.js.map +1 -1
- package/dist/transport/transfer-tier.d.ts +60 -0
- package/dist/transport/transfer-tier.d.ts.map +1 -0
- package/dist/transport/transfer-tier.js +22 -0
- package/dist/transport/transfer-tier.js.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +9 -0
- package/src/protocol/api.ts +79 -1
- package/src/protocol/host.ts +15 -0
- package/src/protocol/message-actions.ts +60 -0
- package/src/testing/mock-host.ts +50 -1
- package/src/transport/transfer-tier.ts +64 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,60 @@
|
|
|
3
3
|
本文件记录对外可见的变更(协议 / 导出面 / 行为)。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
4
|
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
5
5
|
|
|
6
|
+
## [0.5.0] - 2026-10-02
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **消息级操作:引用与删除**(手机端长按气泡菜单的三项能力里,需要电脑端配合的两项)。
|
|
11
|
+
- `SendParams.quotes?: MessageQuote[]`:发消息时**引用若干条历史消息**。电脑端把它组装成
|
|
12
|
+
`{type:'quote'}` 内容块(与桌面输入框的引用附件走**同一个** `buildUserContent`),
|
|
13
|
+
因此下游语义与桌面完全一致:模型看到结构化引用块、桌面显示引用条并可点击跳回原消息。
|
|
14
|
+
引文是**快照**(`MessageQuote.text`)—— 原消息被删 / 被上下文压缩替换后引文仍完整。
|
|
15
|
+
- `MessageDTO.quotes?: MessageQuote[]`:下行方向的结构化引用。
|
|
16
|
+
⚠️ 配套约定:**引用块不再展平进 `MessageDTO.text`** —— 否则消费方会把同一段引文
|
|
17
|
+
显示两遍(引用条 + 正文里的 `[引用] …`)。这是 0.5.0 唯一的行为性变更,只影响
|
|
18
|
+
**带引用的用户消息**(这些消息在 0.4.0 及以前本来就只能由桌面发出)。
|
|
19
|
+
- `host.session.message.delete`(`DeleteMessageParams`):删除单条消息**及其之后的全部消息**
|
|
20
|
+
(截断,与桌面右键菜单同一条路径)。不可逆,必须 `confirm: true`;
|
|
21
|
+
电脑端还会拦两种情况:会话正在回复时拒(`E_BUSY`)、目标是 `role:'tool'` 的消息时拒
|
|
22
|
+
(`E_BAD_REQUEST`)。结果不在应答里回传,而是推 `host.event.session.messages.reset`,
|
|
23
|
+
客户端重拉窗口(与压缩同一条一致性策略 —— 不发明增量协议)。
|
|
24
|
+
- `MESSAGE_QUOTE_CAPABILITY`(`'message.quote'`)与 `MESSAGE_DELETE_CAPABILITY`(`'message.delete'`):
|
|
25
|
+
两个能力名。前者是**功能标记**(只决定界面给不给入口:旧电脑端不认 `quotes` 参数,
|
|
26
|
+
RPC 会成功而引文被静默丢掉);后者是**权限**(删消息是破坏性操作,电脑端必须独立 `assert`)。
|
|
27
|
+
|
|
28
|
+
### Notes
|
|
29
|
+
|
|
30
|
+
- **向后兼容**:`SendParams.quotes` / `MessageDTO.quotes` 均为可选字段,旧消费方忽略即可。
|
|
31
|
+
但**旧电脑端会丢弃 `quotes` 参数**(普通字段,不报错)—— 所以手机端的「引用」入口
|
|
32
|
+
**必须**由 `MESSAGE_QUOTE_CAPABILITY` 挡住,否则用户会以为引用了而 AI 当没看见。
|
|
33
|
+
- `host.session.message.delete` 是**新方法**:旧电脑端没有它,手机端据 `MESSAGE_DELETE_CAPABILITY`
|
|
34
|
+
不显示入口(未声明 = `E_DENIED`,与既有 ACL 默认拒绝一致)。
|
|
35
|
+
- 0.4.0 的导出面保持不变。
|
|
36
|
+
|
|
37
|
+
## [0.4.0] - 2026-10-02
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **传输档位**(`TransferTier` / `transferTierOf` / `MESSAGE_DETAIL_CAPABILITY`):把
|
|
42
|
+
「直连 / 中继」的判定再映射一层成**可执行的传输档位** —— `direct` → `full`(完整),
|
|
43
|
+
`relay` → `lean`(精简),**`unknown` → `lean`**(拍板:开局那一屏消息窗口才是全量最大的一笔,
|
|
44
|
+
宁可把「其实是直连」的链路先按精简发)。这是两端共用的唯一一份口径:电脑端据此裁剪下行正文,
|
|
45
|
+
手机端据此解释「工具输出为什么是空的」并显示当前档位。
|
|
46
|
+
- `MessageDTO.detail`(可选):正文完整性标记。当前只有 `'omitted'` = 正文被档位有意省略
|
|
47
|
+
(**不是**「这次调用没有输出」)。消费方判「有没有这个字段」,不要穷举取值。
|
|
48
|
+
- `MESSAGE_DETAIL_CAPABILITY`(`'message.detail'`):裁剪的**能力闸门**名。手机端声明它 = 能渲染
|
|
49
|
+
省略标记;电脑端列出它 = 会按档位裁剪并打标记。两边缺一就继续全量发送。
|
|
50
|
+
|
|
51
|
+
### Notes
|
|
52
|
+
|
|
53
|
+
- **向后兼容**:`MessageDTO.detail` 为可选字段,旧消费方忽略它即可;但对**旧手机端**而言,
|
|
54
|
+
被省略的正文会被显示成「这次调用没有输出」—— 故裁剪**必须**由上面的能力名挡住,
|
|
55
|
+
旧手机端(未声明该能力)继续收全量,不会出现这句假话。
|
|
56
|
+
- 本轮**只加口径,不加行为**:协议表、帧格式、方法表均无破坏性变更;0.3.0 的导出面保持不变。
|
|
57
|
+
- 已知代价(如实记录):非 WebRTC 链路(同源 Broadcast / 测试注入)永远读不到候选对,
|
|
58
|
+
于是永远落在 `lean`;真机上也存在「其实是直连但首个候选对未定形」的几秒。
|
|
59
|
+
|
|
6
60
|
## [0.3.0] - 2026-10-01
|
|
7
61
|
|
|
8
62
|
### Added
|
|
@@ -111,3 +165,5 @@
|
|
|
111
165
|
[0.1.2]: https://github.com/WeiChens/virlen-remote/releases/tag/v0.1.2
|
|
112
166
|
[0.2.0]: https://github.com/WeiChens/virlen-remote/releases/tag/v0.2.0
|
|
113
167
|
[0.3.0]: https://github.com/WeiChens/virlen-remote/releases/tag/v0.3.0
|
|
168
|
+
[0.4.0]: https://github.com/WeiChens/virlen-remote/releases/tag/v0.4.0
|
|
169
|
+
[0.5.0]: https://github.com/WeiChens/virlen-remote/releases/tag/v0.5.0
|
package/dist/index.d.ts
CHANGED
|
@@ -23,11 +23,13 @@ export type { PairingPayload } from './protocol/pairing.js';
|
|
|
23
23
|
export { normalizeChoiceAnswer, answerActionError, CHOICE_JOINER } from './protocol/answer.js';
|
|
24
24
|
export type { ChoiceAnswer } from './protocol/answer.js';
|
|
25
25
|
export { negotiate, intersectCapabilities } from './protocol/hello.js';
|
|
26
|
+
export { MESSAGE_QUOTE_CAPABILITY, MESSAGE_DELETE_CAPABILITY } from './protocol/message-actions.js';
|
|
27
|
+
export type { MessageQuote } from './protocol/message-actions.js';
|
|
26
28
|
export { Endpoint } from './protocol/endpoint.js';
|
|
27
29
|
export type { CallContext, EventContext, RpcHandler, EventSubscriber, CallOptions, EndpointOptions, } from './protocol/endpoint.js';
|
|
28
30
|
export { createCaller, createSubscriber, registerHandlers } from './protocol/api.js';
|
|
29
31
|
export { DEFAULT_CONTEXT_WINDOW_TOKENS, COMPRESS_MIN_RATIO } from './protocol/api.js';
|
|
30
|
-
export type { ParamsOf, ResultOf, TypedCaller, TypedSubscriber, HandlerImpl, HostApi, MobileApi, HostEvents, MobileEvents, SessionSummaryDTO, MessageDTO, RuntimeDTO, InteractionDTO, InteractionOutcome, StreamMode, ApprovalTier, SendParams, MsgPageParams, MsgPageDTO, AnswerParams, AnswerAction, AnswerResult, AnswerRejectReason, CreateSessionParams, RenameSessionParams, PinSessionParams, DeleteSessionParams, ModelProviderDTO, WorkspaceOptionDTO, ContextInfoDTO, SetModelParams, ContextParams, CompressParams, } from './protocol/api.js';
|
|
32
|
+
export type { ParamsOf, ResultOf, TypedCaller, TypedSubscriber, HandlerImpl, HostApi, MobileApi, HostEvents, MobileEvents, SessionSummaryDTO, MessageDTO, RuntimeDTO, InteractionDTO, InteractionOutcome, StreamMode, ApprovalTier, SendParams, MsgPageParams, MsgPageDTO, AnswerParams, AnswerAction, AnswerResult, AnswerRejectReason, CreateSessionParams, RenameSessionParams, PinSessionParams, DeleteSessionParams, DeleteMessageParams, ModelProviderDTO, WorkspaceOptionDTO, ContextInfoDTO, SetModelParams, ContextParams, CompressParams, } from './protocol/api.js';
|
|
31
33
|
export type { HelloParams, HelloResult, ClientInfo, NegotiationInput, Negotiated } from './protocol/hello.js';
|
|
32
34
|
export { registerHostHandlers } from './protocol/host.js';
|
|
33
35
|
export type { HostDataSource, HostEmit, HostRegistration, RegisterHostOptions } from './protocol/host.js';
|
|
@@ -41,6 +43,8 @@ export { RtcTransport } from './transport/rtc.js';
|
|
|
41
43
|
export type { RtcTransportOptions } from './transport/rtc.js';
|
|
42
44
|
export { LINK_KIND_POLL_MS, classifyLinkKind, probeLinkKind, pickCandidatePair, findCandidate, LinkKindWatcher, } from './transport/link-kind.js';
|
|
43
45
|
export type { LinkKind, LinkStatsEntry, StatsReportLike, StatsProvider, } from './transport/link-kind.js';
|
|
46
|
+
export { MESSAGE_DETAIL_CAPABILITY, transferTierOf } from './transport/transfer-tier.js';
|
|
47
|
+
export type { TransferTier } from './transport/transfer-tier.js';
|
|
44
48
|
export { ICE_CONFIG_VERSION, ICE_API_PATH, ICE_CUSTOM_STORAGE_KEY, ICE_REMOTE_STORAGE_KEY, ICE_CACHE_TTL_MS, ICE_FETCH_TIMEOUT_MS, sanitizeIceServers, parseIceText, formatIceServers, describeIceSource, fetchIceServers, resolveIceServers, readCustomIceText, writeCustomIceText, } from './transport/ice.js';
|
|
45
49
|
export type { IceServerInit, IceSource, IceStoragePort, ResolvedIceServers, ParseIceResult, FetchIceOptions, ResolveIceOptions, } from './transport/ice.js';
|
|
46
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnG,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG7C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,UAAU,EACV,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGtG,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,8 @@ export { HOST_KEY_PREFIX, MOBILE_KEY_PREFIX, GRANT_PREFIX, ROOM_PREFIX, GRANT_TT
|
|
|
21
21
|
export { PAIRING_PAYLOAD_VERSION, PAIRING_TICKET_TTL_MS, PAIRING_OBFUSCATION_PREFIX, PAIRING_URL_BASE, PAIRING_URL_PARAM, buildPairingPayload, encodePairingPayload, buildPairingUrl, parsePairingPayload, roomOfPayload, } from './protocol/pairing.js';
|
|
22
22
|
export { normalizeChoiceAnswer, answerActionError, CHOICE_JOINER } from './protocol/answer.js';
|
|
23
23
|
export { negotiate, intersectCapabilities } from './protocol/hello.js';
|
|
24
|
+
// ── 消息级操作(引用 / 删除)的共用契约:能力名 + 引用快照体 ──
|
|
25
|
+
export { MESSAGE_QUOTE_CAPABILITY, MESSAGE_DELETE_CAPABILITY } from './protocol/message-actions.js';
|
|
24
26
|
export { Endpoint } from './protocol/endpoint.js';
|
|
25
27
|
export { createCaller, createSubscriber, registerHandlers } from './protocol/api.js';
|
|
26
28
|
export { DEFAULT_CONTEXT_WINDOW_TOKENS, COMPRESS_MIN_RATIO } from './protocol/api.js';
|
|
@@ -31,6 +33,8 @@ export { SseSignalingClient, fetchRoomStatus, fetchHostOnlineMap } from './trans
|
|
|
31
33
|
export { RtcTransport } from './transport/rtc.js';
|
|
32
34
|
// ── RTC 链路类型判定(直连 / 中继,两端同一份口径)──
|
|
33
35
|
export { LINK_KIND_POLL_MS, classifyLinkKind, probeLinkKind, pickCandidatePair, findCandidate, LinkKindWatcher, } from './transport/link-kind.js';
|
|
36
|
+
// ── 传输档位(链路类型 → 发不发详细内容,两端同一份口径)──
|
|
37
|
+
export { MESSAGE_DETAIL_CAPABILITY, transferTierOf } from './transport/transfer-tier.js';
|
|
34
38
|
// ── ICE 配置(M7,§31):客户端不再内置任何 TURN 凭证 ──
|
|
35
39
|
export { ICE_CONFIG_VERSION, ICE_API_PATH, ICE_CUSTOM_STORAGE_KEY, ICE_REMOTE_STORAGE_KEY, ICE_CACHE_TTL_MS, ICE_FETCH_TIMEOUT_MS, sanitizeIceServers, parseIceText, formatIceServers, describeIceSource, fetchIceServers, resolveIceServers, readCustomIceText, writeCustomIceText, } from './transport/ice.js';
|
|
36
40
|
//# 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;;;;;;;;;;;GAWG;AAEH,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,UAAU,EACV,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAG5B,yBAAyB;AACzB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG3F,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAU9C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,yBAAyB;AACzB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,eAAe,EACf,UAAU,EACV,cAAc,EACd,UAAU,EACV,UAAU,EACV,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAG5B,yBAAyB;AACzB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,GACd,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAG3F,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAEnE,wCAAwC;AACxC,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAGhG,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAU9C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAuClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAItD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAS/F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,mCAAmC;AACnC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAA;AAQ9B,oCAAoC;AACpC,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAGrF,yCAAyC;AACzC,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA"}
|
package/dist/protocol/api.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* 具体从电脑侧 store 投影到 DTO 的适配在 M2 的 `dto.ts` 落地。
|
|
12
12
|
*/
|
|
13
13
|
import type { CallContext, Endpoint } from './endpoint.js';
|
|
14
|
+
import type { MessageQuote } from './message-actions.js';
|
|
14
15
|
export interface SessionSummaryDTO {
|
|
15
16
|
id: string;
|
|
16
17
|
title: string;
|
|
@@ -39,9 +40,28 @@ export interface SessionSummaryDTO {
|
|
|
39
40
|
export interface MessageDTO {
|
|
40
41
|
id: string;
|
|
41
42
|
role: 'user' | 'assistant' | 'tool' | 'system';
|
|
42
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* 纯文本投影;图片等富内容一期剥离为占位符(§7-⑦)。空串 = 无正文(手机端不渲染空气泡)。
|
|
45
|
+
*
|
|
46
|
+
* ⚠️ 空串有**两种**来源,靠 `detail` 区分:本来就没有正文,与**正文被传输档位省略**
|
|
47
|
+
* (中继 / 类型未知时工具输出不下发,见共享包的 `TransferTier`)。把后者当成前者,
|
|
48
|
+
* 就是给用户写一句不成立的结论。
|
|
49
|
+
*
|
|
50
|
+
* ⚠️ **引用块不在本字段里**(见 `quotes`):引用是结构化下行的,若同时把它展平进
|
|
51
|
+
* `text`,消费方就会把同一段引文显示两遍(引用条 + 正文里的 `[引用] …`)。
|
|
52
|
+
*/
|
|
43
53
|
text: string;
|
|
44
54
|
createdAt: number;
|
|
55
|
+
/**
|
|
56
|
+
* 正文完整性标记(**可选**,只在正文被有意省略时出现)。
|
|
57
|
+
*
|
|
58
|
+
* `'omitted'`:`text` 为空是**档位决定**,不是「这次调用没有输出」—— 工具输出确实存在,
|
|
59
|
+
* 只是这条链路(TURN 中继 / 类型未知)按精简档不下发(§33)。手机端据此显示「输出已省略」。
|
|
60
|
+
*
|
|
61
|
+
* ⚠️ 消费方**不要穷举取值**:判「有没有这个字段」,不认识的值一律按「正文不完整」处理 ——
|
|
62
|
+
* 将来增加别的完整性档(如截断)时,旧消费方仍应给出诚实的提示而不是当成完整正文。
|
|
63
|
+
*/
|
|
64
|
+
detail?: 'omitted';
|
|
45
65
|
/**
|
|
46
66
|
* 工具名(仅 `role:'tool'`,如 `read_file`)。
|
|
47
67
|
*
|
|
@@ -50,6 +70,17 @@ export interface MessageDTO {
|
|
|
50
70
|
* 手机端**不猜**:拿不到就只显示「工具」。
|
|
51
71
|
*/
|
|
52
72
|
toolName?: string;
|
|
73
|
+
/**
|
|
74
|
+
* 本条消息引用了哪些历史消息(快照,**可选**;只有带引用的用户消息才有)。
|
|
75
|
+
*
|
|
76
|
+
* 为什么结构化下行而不展平进 `text`:桌面端把它渲染成气泡上方的引用条(`QuoteChip`),
|
|
77
|
+
* 并可点击跳回原消息 —— 展平成一串文本就再也拆不回来了(`[引用] …` 只是个前缀,
|
|
78
|
+
* 正文里本来就可能有同样的字样)。
|
|
79
|
+
*
|
|
80
|
+
* 消费方注意:`quotes[].text` 是**快照**,可能很长(引用一整段 AI 回答)—— 引用条应**截断显示**,
|
|
81
|
+
* 发给模型的是完整快照(与桌面一致,不要在协议层擅自裁剪用户要引用的内容)。
|
|
82
|
+
*/
|
|
83
|
+
quotes?: MessageQuote[];
|
|
53
84
|
}
|
|
54
85
|
export interface RuntimeDTO {
|
|
55
86
|
working: boolean;
|
|
@@ -140,6 +171,19 @@ export type StreamMode = 'full' | 'delta';
|
|
|
140
171
|
export interface SendParams {
|
|
141
172
|
sessionId: string;
|
|
142
173
|
text: string;
|
|
174
|
+
/**
|
|
175
|
+
* 引用若干条历史消息(可选)。
|
|
176
|
+
*
|
|
177
|
+
* 电脑端把它组装成 `{type:'quote'}` 内容块(与桌面输入框的引用附件走**同一个**
|
|
178
|
+
* `buildUserContent`),因此下游(引擎 / 持久化 / 桌面渲染 / 导出)的语义与桌面完全一致:
|
|
179
|
+
* 模型看到的是结构化的引用块,桌面端显示引用条并可点击跳回原消息,引文是**快照**
|
|
180
|
+
* (原消息被删 / 被压缩也不影响)。
|
|
181
|
+
*
|
|
182
|
+
* ⚠️ **只在电脑端声明 `MESSAGE_QUOTE_CAPABILITY` 时才能发**:旧电脑端不认这个参数,
|
|
183
|
+
* RPC 会「成功」而引文被静默丢掉(用户会以为引用了,AI 却当没看见)。
|
|
184
|
+
* 另外这是 `session.send` 的一个参数,**不是新权限** —— 越权防线仍是 `session.send`。
|
|
185
|
+
*/
|
|
186
|
+
quotes?: MessageQuote[];
|
|
143
187
|
}
|
|
144
188
|
export interface MsgPageParams {
|
|
145
189
|
sessionId: string;
|
|
@@ -293,6 +337,28 @@ export interface DeleteSessionParams {
|
|
|
293
337
|
*/
|
|
294
338
|
confirm: true;
|
|
295
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* 删除单条消息**及其之后的全部消息**(截断)—— 与桌面右键菜单的「删除」同一条路径
|
|
342
|
+
* (`deleteSessionMessage`),**不是**「把这一条从中间抽走」。
|
|
343
|
+
*
|
|
344
|
+
* 为什么是截断而不是单删:一条消息的历史是**因果链** —— 抽走中间一条用户提问,
|
|
345
|
+
* 后面 AI 的回答就失去了提问;抽走一条带 `tool_calls` 的 assistant 消息,后面的
|
|
346
|
+
* 工具结果就成了孤儿(引擎侧要额外做悬空修补)。桌面端已经用「本条及后续」表达了这个
|
|
347
|
+
* 事实,手机端**不得**另立一套更「温和」的语义 —— 那只会让两个入口对同一次操作给出
|
|
348
|
+
* 不同的后果(用户删了中间一条,电脑上的历史却不一样)。
|
|
349
|
+
*
|
|
350
|
+
* 角色限制:`role:'tool'` 的消息**不可删**(工具结果与发起它的 assistant 消息是一体两面,
|
|
351
|
+
* 单独删掉只会留下悬空调用)—— 电脑侧拒绝,手机端也不提供入口。
|
|
352
|
+
*/
|
|
353
|
+
export interface DeleteMessageParams {
|
|
354
|
+
sessionId: string;
|
|
355
|
+
messageId: string;
|
|
356
|
+
/**
|
|
357
|
+
* 必须为 `true`。截断不可逆 —— §16.3-3 要求手机端二次确认,电脑侧独立校验,
|
|
358
|
+
* 缺则 `E_CONFIRM_REQUIRED`(手机端 UI 的确认弹窗不算数)。
|
|
359
|
+
*/
|
|
360
|
+
confirm: true;
|
|
361
|
+
}
|
|
296
362
|
/** 电脑实现、手机调用。 */
|
|
297
363
|
export interface HostApi {
|
|
298
364
|
'host.hello': {
|
|
@@ -380,6 +446,22 @@ export interface HostApi {
|
|
|
380
446
|
ok: true;
|
|
381
447
|
};
|
|
382
448
|
};
|
|
449
|
+
/**
|
|
450
|
+
* 删除单条消息及其之后的全部消息(截断,不可逆)。
|
|
451
|
+
*
|
|
452
|
+
* 与 `host.session.message.get` 同属「消息级」方法。结果**不**在本应答里回传快照:
|
|
453
|
+
* 电脑侧会推 `host.event.session.messages.reset`,手机端据此重拉窗口(§3.5 的同一策略——
|
|
454
|
+
* 不发明增量协议,让「重拉快照」这个天然幂等的动作承担一致性)。
|
|
455
|
+
*
|
|
456
|
+
* 电脑侧还会拦两种情况:会话正在回复(`E_BUSY`,与 `send` / `compress` 同一条并发纪律)、
|
|
457
|
+
* 目标是 `role:'tool'` 的消息(`E_BAD_REQUEST`)。
|
|
458
|
+
*/
|
|
459
|
+
'host.session.message.delete': {
|
|
460
|
+
params: DeleteMessageParams;
|
|
461
|
+
result: {
|
|
462
|
+
ok: true;
|
|
463
|
+
};
|
|
464
|
+
};
|
|
383
465
|
'host.interaction.answer': {
|
|
384
466
|
params: AnswerParams;
|
|
385
467
|
result: AnswerResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/protocol/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/protocol/api.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/protocol/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/protocol/api.ts"],"names":[],"mappings":"AA2PA,uCAAuC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAO,CAAA;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAoUrC,MAAM,UAAU,YAAY,CAAI,QAAkB;IAChD,OAAO;QACL,IAAI,CAA6B,MAAS,EAAE,MAAsB,EAAE,SAAkB;YACpF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAA4B,CAAA;QACtH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAI,QAAkB;IACpD,OAAO;QACL,SAAS,CAA6B,KAAQ,EAAE,QAAiC;YAC/E,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,QAAsC,CAAC,CAAA;QAC1E,CAAC;KACF,CAAA;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAI,QAAkB,EAAE,IAAoB;IAC1E,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,MAA0B,CAAmD,CAAA;QAC7F,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5E,CAAC;AACH,CAAC"}
|
package/dist/protocol/host.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 事件用 `HostEmit` 回填:host 侧(store-bridge / mock)通过它把 `HostEvents` 推给手机。
|
|
12
12
|
*/
|
|
13
13
|
import type { Endpoint } from './endpoint.js';
|
|
14
|
-
import type { AnswerParams, AnswerResult, CompressParams, ContextInfoDTO, ContextParams, CreateSessionParams, DeleteSessionParams, HostEvents, InteractionDTO, MessageDTO, ModelProviderDTO, MsgPageDTO, MsgPageParams, PinSessionParams, RenameSessionParams, SendParams, SessionSummaryDTO, SetModelParams, WorkspaceOptionDTO } from './api.js';
|
|
14
|
+
import type { AnswerParams, AnswerResult, CompressParams, ContextInfoDTO, ContextParams, CreateSessionParams, DeleteMessageParams, DeleteSessionParams, HostEvents, InteractionDTO, MessageDTO, ModelProviderDTO, MsgPageDTO, MsgPageParams, PinSessionParams, RenameSessionParams, SendParams, SessionSummaryDTO, SetModelParams, WorkspaceOptionDTO } from './api.js';
|
|
15
15
|
import type { ClientInfo, HelloParams, HelloResult } from './hello.js';
|
|
16
16
|
/** 电脑端接口层的数据来源(返回已投影好的 DTO,投影逻辑在实现侧)。 */
|
|
17
17
|
export interface HostDataSource {
|
|
@@ -73,6 +73,23 @@ export interface HostDataSource {
|
|
|
73
73
|
} | Promise<{
|
|
74
74
|
ok: true;
|
|
75
75
|
}>;
|
|
76
|
+
/**
|
|
77
|
+
* 删除单条消息及其之后的全部消息(截断)。
|
|
78
|
+
*
|
|
79
|
+
* ⚠️ 实现侧必须自己把三道闸都做上(不得依赖手机 UI):
|
|
80
|
+
* 1. `confirm === true`(缺则 `E_CONFIRM_REQUIRED`);
|
|
81
|
+
* 2. 会话**正在回复**时拒(`E_BUSY`)—— 删断正在跑的 run 会留下悬空工具调用;
|
|
82
|
+
* 3. 目标是 `role:'tool'` 的消息时拒(`E_BAD_REQUEST`)—— 工具结果与发起它的
|
|
83
|
+
* assistant 消息是一体两面,单独删掉只会留下悬空调用。
|
|
84
|
+
*
|
|
85
|
+
* 结果不在应答里回传:实现侧负责推 `host.event.session.messages.reset`,
|
|
86
|
+
* 客户端重拉窗口(与压缩同一条一致性策略)。
|
|
87
|
+
*/
|
|
88
|
+
deleteMessage(params: DeleteMessageParams): {
|
|
89
|
+
ok: true;
|
|
90
|
+
} | Promise<{
|
|
91
|
+
ok: true;
|
|
92
|
+
}>;
|
|
76
93
|
/** 可选:覆盖默认 hello 应答。 */
|
|
77
94
|
hello?(params: HelloParams): HelloResult | Promise<HelloResult>;
|
|
78
95
|
/** 已启用的模型服务与模型(白名单:不含 apiKey / baseUrl)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/protocol/host.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/protocol/host.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol/host.js
CHANGED
|
@@ -33,6 +33,7 @@ export function registerHostHandlers(endpoint, source, options = {}) {
|
|
|
33
33
|
on('host.session.rename', async (params) => source.renameSession(params));
|
|
34
34
|
on('host.session.pin', async (params) => source.setPinned(params));
|
|
35
35
|
on('host.session.delete', async (params) => source.deleteSession(params));
|
|
36
|
+
on('host.session.message.delete', async (params) => source.deleteMessage(params));
|
|
36
37
|
on('host.interaction.answer', async (params) => source.answer(params));
|
|
37
38
|
on('host.interaction.list', async () => ({ interactions: await source.listInteractions() }));
|
|
38
39
|
// ── §22:模型 / 工作目录 / 上下文 ──
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/protocol/host.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/protocol/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息级操作(引用 / 删除)—— **两端共用的契约**:能力名 + 引用引用体。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么这两个东西要放在共享包里
|
|
5
|
+
*
|
|
6
|
+
* 与 §33 的传输档位同一条理由:它们都是**两端各表一半**的约定。
|
|
7
|
+
* - **引用**:手机端发 `SendParams.quotes`,电脑端把它组装成 `{type:'quote'}` 内容块;
|
|
8
|
+
* 手机端还要把 `MessageDTO.quotes` 渲染成引用条。字段名、角色取值域、快照语义
|
|
9
|
+
* 写两份必然漂移(一边 `quote`、一边 `quotes`,或一边 `assistant`、一边 `ai`)。
|
|
10
|
+
* - **删除**:手机端长按菜单里的「删除」项**只在电脑端声明能力时才出现** ——
|
|
11
|
+
* 能力名是这里的常量,不是两边各写一遍的字面量(§33 的 `typeof` 绑定同一条教训)。
|
|
12
|
+
*
|
|
13
|
+
* ## 能力的两类语义(与 §33 的 `MESSAGE_DETAIL_CAPABILITY` 一致)
|
|
14
|
+
*
|
|
15
|
+
* 本包里导出的能力名有两种角色,**消费方必须分清**:
|
|
16
|
+
* - **功能标记**(`MESSAGE_QUOTE_CAPABILITY` 与 §33 的 `MESSAGE_DETAIL_CAPABILITY`):
|
|
17
|
+
* 只用来决定「界面给不给这个入口」,**不会被 ACL 的 `assert()` 拦**——引用本身就是
|
|
18
|
+
* `session.send` 的一个参数,不是新的权限;
|
|
19
|
+
* - **权限**(`MESSAGE_DELETE_CAPABILITY`):删消息是**破坏性操作**,电脑端必须独立
|
|
20
|
+
* `assert` 它,缺失即 `E_DENIED`——手机端不显示按钮**不是**防线(§7-⑪ 的教训)。
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* 一条被引用消息的**快照引用**。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ `text` 是**快照**,不是外键:被引用的原消息可能随后被删除、被上下文压缩替换、
|
|
26
|
+
* 或滚出手机端的已加载窗口(§20.2 分页)—— 只存 `messageId` 的话,发给模型的引用内容
|
|
27
|
+
* 会在那些情形下凭空缺失,而用户界面上一无所知。这与桌面输入框的 `QuoteAttachment`
|
|
28
|
+
* **同一条口径**(`ui/pages/chat/components/input/hooks.ts`)。
|
|
29
|
+
*
|
|
30
|
+
* 角色取值域只有 `user` / `assistant`:**只有「有正文的两方发言」可被引用**。
|
|
31
|
+
* `tool`(工具输出)与 `system`(压缩摘要)不是对话发言,引用它们没有语义
|
|
32
|
+
* (桌面端的右键菜单同样不给它们「引用」项)。
|
|
33
|
+
*/
|
|
34
|
+
export interface MessageQuote {
|
|
35
|
+
/** 被引用消息的 id(同时用作 UI 列表 key / 去重键)。 */
|
|
36
|
+
messageId: string;
|
|
37
|
+
/** 被引用消息的发送方。 */
|
|
38
|
+
role: 'user' | 'assistant';
|
|
39
|
+
/** 被引用消息的正文快照(原消息被删 / 被压缩后,引文仍然完整)。 */
|
|
40
|
+
text: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 手机端声明它 = **长按气泡的菜单里提供「引用」**,并能把引用条渲染出来。
|
|
44
|
+
* 电脑端列出它 = **本机认识 `SendParams.quotes` 与 `MessageDTO.quotes`**。
|
|
45
|
+
*
|
|
46
|
+
* 为什么必须有这道闸(不是可选的礼貌):**已部署的旧电脑端不认 `quotes` 参数** ——
|
|
47
|
+
* 它是普通字段,RPC 会正常成功,引文被静默丢掉。用户侧的表现是「我明明引用了,
|
|
48
|
+
* AI 却当没看见」,且没有任何报错可查。宁可对旧电脑端不显示这个入口。
|
|
49
|
+
*/
|
|
50
|
+
export declare const MESSAGE_QUOTE_CAPABILITY = "message.quote";
|
|
51
|
+
/**
|
|
52
|
+
* 删除单条消息(及其后全部)的能力名 —— 电脑端 ACL 必须声明它,手机端才显示「删除」项。
|
|
53
|
+
*
|
|
54
|
+
* 与上面那个不同,**这是权限而不是功能标记**:电脑端在 handler 里独立 `assert`,
|
|
55
|
+
* 未授权即 `E_DENIED`。手机端隐藏入口只是 UI 收敛,绝不构成防线(§7-⑪)。
|
|
56
|
+
*/
|
|
57
|
+
export declare const MESSAGE_DELETE_CAPABILITY = "message.delete";
|
|
58
|
+
//# sourceMappingURL=message-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-actions.d.ts","sourceRoot":"","sources":["../../src/protocol/message-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,kBAAkB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息级操作(引用 / 删除)—— **两端共用的契约**:能力名 + 引用引用体。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么这两个东西要放在共享包里
|
|
5
|
+
*
|
|
6
|
+
* 与 §33 的传输档位同一条理由:它们都是**两端各表一半**的约定。
|
|
7
|
+
* - **引用**:手机端发 `SendParams.quotes`,电脑端把它组装成 `{type:'quote'}` 内容块;
|
|
8
|
+
* 手机端还要把 `MessageDTO.quotes` 渲染成引用条。字段名、角色取值域、快照语义
|
|
9
|
+
* 写两份必然漂移(一边 `quote`、一边 `quotes`,或一边 `assistant`、一边 `ai`)。
|
|
10
|
+
* - **删除**:手机端长按菜单里的「删除」项**只在电脑端声明能力时才出现** ——
|
|
11
|
+
* 能力名是这里的常量,不是两边各写一遍的字面量(§33 的 `typeof` 绑定同一条教训)。
|
|
12
|
+
*
|
|
13
|
+
* ## 能力的两类语义(与 §33 的 `MESSAGE_DETAIL_CAPABILITY` 一致)
|
|
14
|
+
*
|
|
15
|
+
* 本包里导出的能力名有两种角色,**消费方必须分清**:
|
|
16
|
+
* - **功能标记**(`MESSAGE_QUOTE_CAPABILITY` 与 §33 的 `MESSAGE_DETAIL_CAPABILITY`):
|
|
17
|
+
* 只用来决定「界面给不给这个入口」,**不会被 ACL 的 `assert()` 拦**——引用本身就是
|
|
18
|
+
* `session.send` 的一个参数,不是新的权限;
|
|
19
|
+
* - **权限**(`MESSAGE_DELETE_CAPABILITY`):删消息是**破坏性操作**,电脑端必须独立
|
|
20
|
+
* `assert` 它,缺失即 `E_DENIED`——手机端不显示按钮**不是**防线(§7-⑪ 的教训)。
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* 手机端声明它 = **长按气泡的菜单里提供「引用」**,并能把引用条渲染出来。
|
|
24
|
+
* 电脑端列出它 = **本机认识 `SendParams.quotes` 与 `MessageDTO.quotes`**。
|
|
25
|
+
*
|
|
26
|
+
* 为什么必须有这道闸(不是可选的礼貌):**已部署的旧电脑端不认 `quotes` 参数** ——
|
|
27
|
+
* 它是普通字段,RPC 会正常成功,引文被静默丢掉。用户侧的表现是「我明明引用了,
|
|
28
|
+
* AI 却当没看见」,且没有任何报错可查。宁可对旧电脑端不显示这个入口。
|
|
29
|
+
*/
|
|
30
|
+
export const MESSAGE_QUOTE_CAPABILITY = 'message.quote';
|
|
31
|
+
/**
|
|
32
|
+
* 删除单条消息(及其后全部)的能力名 —— 电脑端 ACL 必须声明它,手机端才显示「删除」项。
|
|
33
|
+
*
|
|
34
|
+
* 与上面那个不同,**这是权限而不是功能标记**:电脑端在 handler 里独立 `assert`,
|
|
35
|
+
* 未授权即 `E_DENIED`。手机端隐藏入口只是 UI 收敛,绝不构成防线(§7-⑪)。
|
|
36
|
+
*/
|
|
37
|
+
export const MESSAGE_DELETE_CAPABILITY = 'message.delete';
|
|
38
|
+
//# sourceMappingURL=message-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-actions.js","sourceRoot":"","sources":["../../src/protocol/message-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAA;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-host.d.ts","sourceRoot":"","sources":["../../src/testing/mock-host.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mock-host.d.ts","sourceRoot":"","sources":["../../src/testing/mock-host.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhE,OAAO,KAAK,EAGV,YAAY,EAkBb,MAAM,iBAAiB,CAAA;AAGxB,MAAM,WAAW,eAAe;IAC9B,YAAY;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAA;IACjC,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;CACpC;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,wCAAwC;IACxC,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAA;IACtD,mBAAmB;IACnB,mBAAmB,IAAI,MAAM,EAAE,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;IACxB,gDAAgD;IAChD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI,CAAA;CAC3F;AAqBD,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,eAAoB,GAAG,kBAAkB,CA0kB1F"}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
import { BridgeError } from '../protocol/errors.js';
|
|
24
24
|
import { answerActionError, normalizeChoiceAnswer } from '../protocol/answer.js';
|
|
25
25
|
import { COMPRESS_MIN_RATIO, DEFAULT_CONTEXT_WINDOW_TOKENS } from '../protocol/api.js';
|
|
26
|
+
import { MESSAGE_DELETE_CAPABILITY, MESSAGE_QUOTE_CAPABILITY } from '../protocol/message-actions.js';
|
|
26
27
|
/** 演示用模型服务(与 `sessions` 里的 provider 字段一致)。 */
|
|
27
28
|
const DEMO_PROVIDERS = [
|
|
28
29
|
{ id: 'p-openai', name: 'OpenAI(演示)', models: ['gpt-4o', 'gpt-4o-mini'] },
|
|
@@ -30,6 +31,15 @@ const DEMO_PROVIDERS = [
|
|
|
30
31
|
];
|
|
31
32
|
/** 演示用工作目录候选集(新建会话只能从这里选)。 */
|
|
32
33
|
const DEMO_WORKSPACES = ['E:/code/virlen-demo', 'E:/code/another-project'];
|
|
34
|
+
/**
|
|
35
|
+
* 「只引用了消息、没写正文」时电脑侧补的那句话。
|
|
36
|
+
*
|
|
37
|
+
* 与桌面输入框的兜底**同一条**(`utils/messageContent.ts::buildUserContent` 的「有引用无文本」分支):
|
|
38
|
+
* 不变的话,用例会对着一个与真机不同的正文发绿灯。文案取桌面的中文原文 ——
|
|
39
|
+
* 桌面切成英文时会是另一句,但 mock 只求**行为同形**,不求与 i18n 逐字同步
|
|
40
|
+
* (真要与 i18n 一致,那是 virlen-app 侧的跨端用例该盯的事)。
|
|
41
|
+
*/
|
|
42
|
+
const QUOTE_ONLY_TEXT = '请针对引用的消息回复';
|
|
33
43
|
export function createMockHostDataSource(options = {}) {
|
|
34
44
|
const streamSteps = options.streamSteps ?? 3;
|
|
35
45
|
const streamDelayMs = options.streamDelayMs ?? 40;
|
|
@@ -258,6 +268,10 @@ export function createMockHostDataSource(options = {}) {
|
|
|
258
268
|
'session.workspace',
|
|
259
269
|
'session.context',
|
|
260
270
|
'session.compress',
|
|
271
|
+
// 消息级操作:mock 确实实现了这两项(引用进内容块 / 截断删除),故如实声明 ——
|
|
272
|
+
// 不声明的话手机端会隐藏入口,用例就测不到真实链路
|
|
273
|
+
MESSAGE_QUOTE_CAPABILITY,
|
|
274
|
+
MESSAGE_DELETE_CAPABILITY,
|
|
261
275
|
],
|
|
262
276
|
paired: true,
|
|
263
277
|
deviceName: 'Virlen 电脑(演示)',
|
|
@@ -307,11 +321,15 @@ export function createMockHostDataSource(options = {}) {
|
|
|
307
321
|
const list = messages.get(params.sessionId);
|
|
308
322
|
if (!list)
|
|
309
323
|
throw new BridgeError('E_NOT_FOUND', `session not found: ${params.sessionId}`);
|
|
324
|
+
const quotes = params.quotes ?? [];
|
|
310
325
|
const userMessage = {
|
|
311
326
|
id: nextId('u'),
|
|
312
327
|
role: 'user',
|
|
313
|
-
text
|
|
328
|
+
// 与真实电脑侧的白名单投影同一条规则:引用**不进 `text`**(而是走 `quotes`),
|
|
329
|
+
// 否则客户端会把它显示两遍(引用条 + 正文里的 `[引用] …`)
|
|
330
|
+
text: params.text || (quotes.length > 0 ? QUOTE_ONLY_TEXT : ''),
|
|
314
331
|
createdAt: Date.now(),
|
|
332
|
+
...(quotes.length > 0 ? { quotes: quotes.map((q) => ({ ...q })) } : {}),
|
|
315
333
|
};
|
|
316
334
|
list.push(userMessage);
|
|
317
335
|
emitFor(params.sessionId, 'host.event.message.added', { sessionId: params.sessionId, message: userMessage });
|
|
@@ -490,6 +508,38 @@ export function createMockHostDataSource(options = {}) {
|
|
|
490
508
|
emitList();
|
|
491
509
|
return { ok: true };
|
|
492
510
|
},
|
|
511
|
+
/**
|
|
512
|
+
* 删除单条消息及其之后的全部消息(截断)—— **与真实电脑侧同一条规则**:
|
|
513
|
+
* confirm 必填 / 回复中拒绝(E_BUSY)/ tool 消息不可删 / 删完推 `messages.reset`。
|
|
514
|
+
*
|
|
515
|
+
* ⚠️ mock 偏宽松 = 用例对着假行为发绿灯(§18.6 的教训),故三道闸一道不少。
|
|
516
|
+
*/
|
|
517
|
+
async deleteMessage(params) {
|
|
518
|
+
calls.push('host.session.message.delete');
|
|
519
|
+
if (params.confirm !== true) {
|
|
520
|
+
throw new BridgeError('E_CONFIRM_REQUIRED', '删除消息需二次确认(confirm:true)');
|
|
521
|
+
}
|
|
522
|
+
const list = messages.get(params.sessionId);
|
|
523
|
+
if (!list)
|
|
524
|
+
throw new BridgeError('E_NOT_FOUND', `session not found: ${params.sessionId}`);
|
|
525
|
+
const session = sessions.find((s) => s.id === params.sessionId);
|
|
526
|
+
if (session?.working === true) {
|
|
527
|
+
throw new BridgeError('E_BUSY', '该会话正在回复中,请稍后再试');
|
|
528
|
+
}
|
|
529
|
+
const idx = list.findIndex((m) => m.id === params.messageId);
|
|
530
|
+
if (idx === -1)
|
|
531
|
+
throw new BridgeError('E_NOT_FOUND', `message not found: ${params.messageId}`);
|
|
532
|
+
if (list[idx].role === 'tool') {
|
|
533
|
+
throw new BridgeError('E_BAD_REQUEST', '工具消息不能单独删除');
|
|
534
|
+
}
|
|
535
|
+
// 本条及其后全部删除,并推 `messages.reset` 让客户端重拉窗口
|
|
536
|
+
list.splice(idx);
|
|
537
|
+
if (session)
|
|
538
|
+
session.updatedAt = Date.now();
|
|
539
|
+
emitFor(params.sessionId, 'host.event.session.messages.reset', { sessionId: params.sessionId });
|
|
540
|
+
bumpContext(params.sessionId, Math.max(0, (contextTokens.get(params.sessionId) ?? 0) - 1000));
|
|
541
|
+
return { ok: true };
|
|
542
|
+
},
|
|
493
543
|
// ── §22:模型 / 工作目录 / 上下文 ──
|
|
494
544
|
async listModels() {
|
|
495
545
|
calls.push('host.model.list');
|