@deepseek-ai/dsh-api-session-controller 0.1.7-alpha.2 → 0.1.7-rc.1
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/README.i18n.yaml +2 -2
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/lib/client.js +27 -3
- package/lib/typert.host.js +4 -76
- package/lib/types/client/sessions/assistant-stream.d.ts +5 -0
- package/lib/types/client/sessions/assistant-stream.js +16 -1
- package/lib/types/client/sessions/session.js +6 -2
- package/package.json +68 -68
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/api/session-controller/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: 728d98b90aa96829a878b071c03af3ec961c839e
|
|
6
|
+
README.zh.md: 9a2c54b6865302e69daa5f67ec9baa17255f8100
|
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ Projection reads retain loading and failure state independently of their values.
|
|
|
43
43
|
|
|
44
44
|
Accepted prompts and observed running keep their Client display conversion across list refresh, reconnect, and Session-object replacement. The Manager retains these observations by Session id; they do not establish durable history. Drafts, projection stores, and sidebar display rules retain their existing behavior. The [blank rollback decision](../../../.agents/notes/implemented/bug-fix/2026-09-15-client-session-blank-reconciliation.md) defines retention and late-response handling.
|
|
45
45
|
|
|
46
|
-
The Client adapter exposes `SessionEventStream`, a Gateway `RemoteJournalStream` bound to one ordinary or direct-subagent address. It opens follow before the initial page, publishes only contiguous `replace`, `prepend`, `append`, and `settle-assistant` changes, and repairs reconnect or sequence gaps through a tail page. Backwards paging has two verbs: `loadOlder()` pulls one Turn-aligned page, and `loadThrough(seq)` — the turn-jump loader — loops Turn-aligned pages until the window covers the target seq, lowering a shared target on repeated calls, stopping on a page that makes no progress, and reporting busy through the same `loadingOlder` snapshot bit. The Web adapter explicitly opts into cursorless Assistant frames: each opening carries the active attempt's `startedAfterSeq`, `nextIndex`, and compact stream, and every stream member becomes a Client-only `assistant/live-chunk` entry ordered between durable cursors. The Host captures a follower-local arrival ordinal with that baseline and suppresses buffered frames at or before the cut; a replacement Agent may restart frame revision at one. A durable `assistant/message` or `assistant/attempt` arriving after an active opening stays staged only when its seq follows `startedAfterSeq` and its Turn and Step match; the matching end type, seq, and index
|
|
46
|
+
The Client adapter exposes `SessionEventStream`, a Gateway `RemoteJournalStream` bound to one ordinary or direct-subagent address. It opens follow before the initial page, publishes only contiguous `replace`, `prepend`, `append`, and `settle-assistant` changes, and repairs reconnect or sequence gaps through a tail page. Backwards paging has two verbs: `loadOlder()` pulls one Turn-aligned page, and `loadThrough(seq)` — the turn-jump loader — loops Turn-aligned pages until the window covers the target seq, lowering a shared target on repeated calls, stopping on a page that makes no progress, and reporting busy through the same `loadingOlder` snapshot bit. The Web adapter explicitly opts into cursorless Assistant frames: each opening carries the active attempt's `startedAfterSeq`, `nextIndex`, and compact stream, and every stream member becomes a Client-only `assistant/live-chunk` entry ordered between durable cursors. The Host captures a follower-local arrival ordinal with that baseline and suppresses buffered frames at or before the cut; a replacement Agent may restart frame revision at one. A durable `assistant/message` or `assistant/attempt` arriving after an active opening stays staged only when its seq follows `startedAfterSeq` and its Turn and Step match; the matching end type, seq, and index releases the durable entry. A successful message retains its transient rows until the owning `step/end`, so pending tool identities remain available for dispatch. Failed or interrupted settlements retire their rows immediately; earlier same-step retries remain visible. Revision, dense-index, or settlement gaps for a known attempt reopen follow, while a controller that missed the start ignores unknown-attempt frames and publishes their durable settlement normally. An abandoned end publishes a settlement delta without a durable entry so its transient rows retire immediately. A durable gap-repair page has no Assistant baseline, so its held notification reopens follow once for a paired page and baseline. Every history record covers exactly its event seq. A business, persistence, or unresolved continuity failure terminates the stream, while only physical carrier loss selects automatic resumption. `SessionControlStream` is a Gateway `RemoteSnapshotStream`; every generation opens with a complete process-local baseline, so reconnect replaces projection state instead of treating transient values as durable events. At each ready Host generation, a synchronous Client subscription clears retained projection values and watermarks before refreshing queries and restarting the control stream, including Sessions absent from the control baseline. The first control stream waits for generation readiness, so its opening values cannot precede invalidation. Outstanding list responses from the previous generation cannot republish those values. Within a generation, a delayed control baseline cannot overwrite or clear newer sequenced values, whether they arrived through a live Session's list block, a history page, or a frame; a cached list block, viewed from the projection cache for a cold Session, yields to the connected Session's baseline whatever watermark it carries. The durable `inbox` projection carries both pending lists through the same cold-read and reconnect path as other projections. Client Agent contexts provide the identity used by the independent [`fileUpload`](../../client/file-upload/README.md) service; Session objects expose lifecycle, prompt, queue, and history operations rather than file transfer.
|
|
47
47
|
|
|
48
48
|
The Session object also carries local submission echoes: `session.beginSubmission` inserts one into `SessionSnapshot.pendingSubmissions` synchronously, before the caller serializes and prompts, so a conversation UI can show the message on the submit click's own frame. The echo stores ordered image previews and durable file references. Session derives its `transcript`, `queued`, or `steering` placement from the current running state and requested delivery mode, then retains that placement until the display handoff. The prompt's `requestId` is the correlation identity: the Host echoes it as the durable user source's `rpcId`, including pending messages in the `inbox` projection. Queued echoes retire one animation frame after queue acceptance; Chat echoes follow the admission rule below. Identified failures and abandonment retire unadmitted echoes immediately. Disposal preserves observed admission and fails other unsettled submissions. Each retirement fires `onRetire` exactly once; an observed retirement includes the ordered durable attachment references so the composer can release successful cards while preserving failed drafts. Echoes are Client memory only; reload and reconnect rebuild the conversation from durable events alone.
|
|
49
49
|
|
package/README.zh.md
CHANGED
|
@@ -43,7 +43,7 @@ Client 列表刷新保留未变化的行对象,并在顺序和值均相同时
|
|
|
43
43
|
|
|
44
44
|
已受理的提示词与已观察到的运行,会使客户端展示转换跨列表刷新、重连及 Session 对象替换保留。Manager 按 Session id 保留这些观察;它们不证明持久历史已经产生。草稿、投影存储和侧边栏展示规则保留原有行为。[blank 回退修复决策](../../../.agents/notes/implemented/bug-fix/2026-09-15-client-session-blank-reconciliation.zh.md) 定义保留期限及迟到响应处理。
|
|
45
45
|
|
|
46
|
-
Client 适配器提供 `SessionEventStream`,即绑定到一个普通 Session 或 direct subagent address 的 Gateway `RemoteJournalStream`。它在读取首个 page 前打开 follow,只发布连续的 `replace`、`prepend`、`append` 与 `settle-assistant` 变更,并通过 tail page 修复重连或 seq 缺口。向后分页有两个动词:`loadOlder()` 拉一页按轮次开头对齐的历史,而 `loadThrough(seq)`——轮次跳转加载器——按轮次开头对齐页面循环拉取直到窗口覆盖目标 seq,重复调用会下调共享目标,遇到无进展的页即停止,忙碌状态复用同一个 `loadingOlder` 快照位。Web 适配器显式选择接收无 cursor 的 Assistant frame:每个 opening 携带活跃 attempt 的 `startedAfterSeq`、`nextIndex` 与紧凑 stream,每个 stream member 都成为排在持久 cursor 之间的 Client-only `assistant/live-chunk` 条目。Host 会随该 baseline 捕获 follower 本地到达序号,并抑制该 cut 及之前的 buffered frame;replacement Agent 可以从 revision 一重新开始。活跃 opening 之后到达的持久 `assistant/message` 或 `assistant/attempt` 只有在其 seq 晚于 `startedAfterSeq` 且轮次与步骤匹配时才会保持暂存;匹配的 end type、seq 与 index
|
|
46
|
+
Client 适配器提供 `SessionEventStream`,即绑定到一个普通 Session 或 direct subagent address 的 Gateway `RemoteJournalStream`。它在读取首个 page 前打开 follow,只发布连续的 `replace`、`prepend`、`append` 与 `settle-assistant` 变更,并通过 tail page 修复重连或 seq 缺口。向后分页有两个动词:`loadOlder()` 拉一页按轮次开头对齐的历史,而 `loadThrough(seq)`——轮次跳转加载器——按轮次开头对齐页面循环拉取直到窗口覆盖目标 seq,重复调用会下调共享目标,遇到无进展的页即停止,忙碌状态复用同一个 `loadingOlder` 快照位。Web 适配器显式选择接收无 cursor 的 Assistant frame:每个 opening 携带活跃 attempt 的 `startedAfterSeq`、`nextIndex` 与紧凑 stream,每个 stream member 都成为排在持久 cursor 之间的 Client-only `assistant/live-chunk` 条目。Host 会随该 baseline 捕获 follower 本地到达序号,并抑制该 cut 及之前的 buffered frame;replacement Agent 可以从 revision 一重新开始。活跃 opening 之后到达的持久 `assistant/message` 或 `assistant/attempt` 只有在其 seq 晚于 `startedAfterSeq` 且轮次与步骤匹配时才会保持暂存;匹配的 end type、seq 与 index 会发布持久条目。成功消息的瞬态 row 保留到所属 `step/end`,让待派发工具的身份持续可用;失败或中断的 settlement 立即移除对应 row,同一步骤中更早的 retry 仍然保留。已知 attempt 的 revision、密集 index 或 settlement 缺口会重新打开 follow;若 controller 错过 start,则忽略 unknown-attempt frame,并正常发布其持久 settlement。Abandoned end 会发布不含持久条目的 settlement delta,使瞬态 row 立即退出。持久缺口修复 page 不携带 Assistant baseline,因此 held notification 会重新打开 follow 一次,以取得配对的 page 与 baseline。每条历史 record 只覆盖自身的事件 seq。业务、persistence 或无法恢复的连续性错误会终止 stream,只有物理载体断开才触发自动恢复。`SessionControlStream` 是 Gateway `RemoteSnapshotStream`;每代都以完整的进程本地 baseline 开始,因此重连会替换 projection 状态,而不会把瞬态值当作 durable event。每次 Host generation 就绪时,同步的 Client 订阅会先清除保留的投影值及其水位,再刷新查询并重新打开 control stream,其中也包括 control baseline 中没有列出的 Session。首次 control stream 会等待 generation 就绪,确保其 opening 值不会先于旧状态清理到达。上一代尚未完成的 list 响应无法重新发布这些值。同一 generation 内,延迟到达的 control baseline 不能覆盖或清除较新的 sequenced 值,无论它们来自活 Session 的 list block、history page 还是 frame;冷 Session 从 projection cache 看出来的 cached list block 则不论水位都让位于建连 Session 的 baseline。持久 `inbox` 投影通过与其他投影相同的冷读取和重连路径传输两份待处理列表。Client Agent 上下文提供独立 [`fileUpload`](../../client/file-upload/README.zh.md) 服务使用的身份;Session 对象提供生命周期、prompt、queue 与历史操作,不提供文件传输。
|
|
47
47
|
|
|
48
48
|
Session 对象还承载本地提交回显:`session.beginSubmission` 在调用方序列化与提示词之前,同步把一条回显写入 `SessionSnapshot.pendingSubmissions`,会话 UI 因此能在点击提交的当帧显示消息。回显按顺序存放图片预览与持久文件引用。Session 根据当前运行状态与请求的投递模式推导其 `transcript`、`queued` 或 `steering` 位置,并保留该位置直到展示接管。提示词的 `requestId` 是关联标识:Host 把它回显为 durable user source 的 `rpcId`,`inbox` 投影中的待处理消息也保留同一 source。排队回显在队列接受后延迟一个动画帧退休;Chat 回显遵循下述入档规则。尚未入档的回显在带标识的提示词失败或被放弃时立即退休。销毁时保留已观察到的入档结果,其余未结算提交按 failed 退休。每次退休恰好触发一次 `onRetire`;observed 退休还会携带有序的持久附件引用,让 composer 释放成功卡片并保留失败草稿。回显只存在于 Client 内存;刷新与重连只从持久事件重建会话。
|
|
49
49
|
|
package/lib/client.js
CHANGED
|
@@ -1378,6 +1378,7 @@ window.__ModuleLoader__.load({
|
|
|
1378
1378
|
/** Keeps transient Assistant presentation behind one settlement-aware interface. */
|
|
1379
1379
|
var ClientAssistantStream = class {
|
|
1380
1380
|
activeAttempt;
|
|
1381
|
+
retainedAttempt;
|
|
1381
1382
|
pending = /* @__PURE__ */ new Map();
|
|
1382
1383
|
publishedSeqs = /* @__PURE__ */ new Set();
|
|
1383
1384
|
durableCursor = -1;
|
|
@@ -1392,6 +1393,7 @@ window.__ModuleLoader__.load({
|
|
|
1392
1393
|
this.pending.clear();
|
|
1393
1394
|
this.transientInGap = 0;
|
|
1394
1395
|
this.activeAttempt = void 0;
|
|
1396
|
+
this.retainedAttempt = void 0;
|
|
1395
1397
|
const opening = baseline?.activeAttempt;
|
|
1396
1398
|
if (opening !== void 0) this.activeAttempt = {
|
|
1397
1399
|
attemptId: opening.attemptId,
|
|
@@ -1442,13 +1444,15 @@ window.__ModuleLoader__.load({
|
|
|
1442
1444
|
}
|
|
1443
1445
|
/**
|
|
1444
1446
|
* Fold one dense transient frame and release its named durable settlement.
|
|
1447
|
+
* Successful messages retain their transient rows until the owning Step ends;
|
|
1448
|
+
* interrupted messages, failed attempts, and abandonment retire them immediately.
|
|
1445
1449
|
* @param frame - next Assistant stream frame received by the follow connection.
|
|
1446
1450
|
* @returns a transient, publication, or rebaseline decision, or `undefined` when no entry becomes visible.
|
|
1447
1451
|
*/
|
|
1448
1452
|
acceptFrame(frame) {
|
|
1449
1453
|
switch (frame.type) {
|
|
1450
1454
|
case "start":
|
|
1451
|
-
if (this.activeAttempt !== void 0 || this.pending.size > 0) return { type: "rebaseline" };
|
|
1455
|
+
if (this.activeAttempt !== void 0 || this.retainedAttempt !== void 0 || this.pending.size > 0) return { type: "rebaseline" };
|
|
1452
1456
|
this.pending.clear();
|
|
1453
1457
|
this.activeAttempt = {
|
|
1454
1458
|
attemptId: frame.attemptId,
|
|
@@ -1495,6 +1499,14 @@ window.__ModuleLoader__.load({
|
|
|
1495
1499
|
const entry = this.pending.get(frame.outcome.seq);
|
|
1496
1500
|
if (entry === void 0 || entry.event.type !== frame.outcome.eventType) return { type: "rebaseline" };
|
|
1497
1501
|
this.pending.delete(frame.outcome.seq);
|
|
1502
|
+
if (entry.event.type === "assistant/message" && entry.event.data.interrupted !== true) {
|
|
1503
|
+
this.retainedAttempt = {
|
|
1504
|
+
attemptId: attempt.attemptId,
|
|
1505
|
+
turn: attempt.turn,
|
|
1506
|
+
step: attempt.step
|
|
1507
|
+
};
|
|
1508
|
+
return this.publish(entry);
|
|
1509
|
+
}
|
|
1498
1510
|
this.publishedSeqs.add(entry.event.seq);
|
|
1499
1511
|
return {
|
|
1500
1512
|
type: "settlement",
|
|
@@ -1511,6 +1523,15 @@ window.__ModuleLoader__.load({
|
|
|
1511
1523
|
}
|
|
1512
1524
|
publish(entry) {
|
|
1513
1525
|
this.publishedSeqs.add(entry.event.seq);
|
|
1526
|
+
const retained = this.retainedAttempt;
|
|
1527
|
+
if (retained !== void 0 && entry.event.type === "step/end" && entry.event.data.turn === retained.turn && entry.event.data.step === retained.step) {
|
|
1528
|
+
this.retainedAttempt = void 0;
|
|
1529
|
+
return {
|
|
1530
|
+
type: "publish",
|
|
1531
|
+
entry,
|
|
1532
|
+
retireAttemptId: retained.attemptId
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1514
1535
|
return {
|
|
1515
1536
|
type: "publish",
|
|
1516
1537
|
entry
|
|
@@ -2100,8 +2121,11 @@ window.__ModuleLoader__.load({
|
|
|
2100
2121
|
this.notifier.markDirty();
|
|
2101
2122
|
return;
|
|
2102
2123
|
}
|
|
2103
|
-
if (result?.type === "publish"
|
|
2104
|
-
|
|
2124
|
+
if (result?.type === "publish") {
|
|
2125
|
+
const changed = this.appendLive(result.entry);
|
|
2126
|
+
if (result.retireAttemptId !== void 0) this.eventSource.settleAssistant(result.retireAttemptId);
|
|
2127
|
+
if (changed || result.retireAttemptId !== void 0) this.notifier.markDirty();
|
|
2128
|
+
} else if (result?.type === "transient") {
|
|
2105
2129
|
this.eventSource.append(result.entry);
|
|
2106
2130
|
this.notifier.markDirty();
|
|
2107
2131
|
}
|
package/lib/typert.host.js
CHANGED
|
@@ -1718,7 +1718,7 @@ export const TYPERT = {
|
|
|
1718
1718
|
},
|
|
1719
1719
|
{
|
|
1720
1720
|
"name": "MessageSourceMap",
|
|
1721
|
-
"declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'tool-registry': { kind: 'tool-registry'; };\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; };\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'skill-invocation': SkillInvocationSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n
|
|
1721
|
+
"declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'tool-registry': { kind: 'tool-registry'; };\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; };\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'skill-invocation': SkillInvocationSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n goal: GoalMessageSource;\n 'compact-checkpoint': CompactionCheckpointSource;\n 'session-reference': SessionReferenceSource;\n}"
|
|
1722
1722
|
},
|
|
1723
1723
|
{
|
|
1724
1724
|
"name": "ModelCatalog",
|
|
@@ -1910,7 +1910,7 @@ export const TYPERT = {
|
|
|
1910
1910
|
},
|
|
1911
1911
|
{
|
|
1912
1912
|
"name": "SessionEventMap",
|
|
1913
|
-
"declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'agent-preset/selected': { agentPreset: string; };\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'permission/preset': { preset: string; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n '
|
|
1913
|
+
"declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'agent-preset/selected': { agentPreset: string; };\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'permission/preset': { preset: string; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n 'goal/change': GoalChangeMeta;\n 'feedback/message-put': MessageFeedbackPut;\n 'feedback/message-delete': MessageFeedbackDelete;\n 'compaction/start': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; };\n 'compaction/summary': { compactionId: CompactionId; sourceCommandId?: CommandId; summary: ContentBlock[]; shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; provider: string; model: string; maxTokens?: number; usage?: TokenUsage; } & ({ rawOutput: ContentBlock[]; llmStreamCall: true; } | { rawOutput?: ContentBlock[]; llmStreamCall?: never; });\n 'compaction/end': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; error?: string; };\n 'compaction/prune': { shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; };\n}"
|
|
1914
1914
|
},
|
|
1915
1915
|
{
|
|
1916
1916
|
"name": "SessionEventType",
|
|
@@ -2172,42 +2172,6 @@ export const TYPERT = {
|
|
|
2172
2172
|
"name": "SystemPromptUpdate",
|
|
2173
2173
|
"declaration": "export type SystemPromptUpdate = 'in-history';"
|
|
2174
2174
|
},
|
|
2175
|
-
{
|
|
2176
|
-
"name": "TeamId",
|
|
2177
|
-
"declaration": "export type TeamId = Branded<'TeamId'>;"
|
|
2178
|
-
},
|
|
2179
|
-
{
|
|
2180
|
-
"name": "TeamMemberPhase",
|
|
2181
|
-
"declaration": "export type TeamMemberPhase = 'provisioning' | 'active' | 'failed';"
|
|
2182
|
-
},
|
|
2183
|
-
{
|
|
2184
|
-
"name": "TeamMemberSnapshot",
|
|
2185
|
-
"declaration": "export interface TeamMemberSnapshot {\n readonly id: SessionId;\n readonly name: string;\n readonly description: string;\n readonly provider: string;\n readonly context: 'fresh' | 'fork';\n readonly phase: TeamMemberPhase;\n readonly error?: string;\n}"
|
|
2186
|
-
},
|
|
2187
|
-
{
|
|
2188
|
-
"name": "TeamMessageId",
|
|
2189
|
-
"declaration": "export type TeamMessageId = Branded<'TeamMessageId'>;"
|
|
2190
|
-
},
|
|
2191
|
-
{
|
|
2192
|
-
"name": "TeamMessageSnapshot",
|
|
2193
|
-
"declaration": "export interface TeamMessageSnapshot {\n readonly id: TeamMessageId;\n readonly senderId: SessionId;\n readonly senderName: string;\n readonly targetId: SessionId;\n readonly content: ContentBlock[];\n}"
|
|
2194
|
-
},
|
|
2195
|
-
{
|
|
2196
|
-
"name": "TeamMessageSource",
|
|
2197
|
-
"declaration": "export interface TeamMessageSource {\n readonly kind: 'team-message';\n readonly teamId: TeamId;\n readonly messageId: TeamMessageId;\n readonly senderId: SessionId;\n readonly senderName: string;\n}"
|
|
2198
|
-
},
|
|
2199
|
-
{
|
|
2200
|
-
"name": "TeamTaskId",
|
|
2201
|
-
"declaration": "export type TeamTaskId = Branded<'TeamTaskId'>;"
|
|
2202
|
-
},
|
|
2203
|
-
{
|
|
2204
|
-
"name": "TeamTaskSnapshot",
|
|
2205
|
-
"declaration": "export interface TeamTaskSnapshot {\n readonly id: TeamTaskId;\n readonly revision: number;\n readonly subject: string;\n readonly description: string;\n readonly status: TeamTaskStatus;\n readonly ownerId?: SessionId;\n readonly blockedBy: TeamTaskId[];\n readonly writeScopes: string[];\n}"
|
|
2206
|
-
},
|
|
2207
|
-
{
|
|
2208
|
-
"name": "TeamTaskStatus",
|
|
2209
|
-
"declaration": "export type TeamTaskStatus = 'pending' | 'in_progress' | 'completed' | 'deleted';"
|
|
2210
|
-
},
|
|
2211
2175
|
{
|
|
2212
2176
|
"name": "TextBlock",
|
|
2213
2177
|
"declaration": "export interface TextBlock {\n type: 'text';\n text: string;\n}"
|
|
@@ -2557,7 +2521,7 @@ export const TYPERT = {
|
|
|
2557
2521
|
},
|
|
2558
2522
|
{
|
|
2559
2523
|
"name": "MessageSourceMap",
|
|
2560
|
-
"declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'tool-registry': { kind: 'tool-registry'; };\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; };\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'skill-invocation': SkillInvocationSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n
|
|
2524
|
+
"declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'tool-registry': { kind: 'tool-registry'; };\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; };\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'skill-invocation': SkillInvocationSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n goal: GoalMessageSource;\n 'compact-checkpoint': CompactionCheckpointSource;\n 'session-reference': SessionReferenceSource;\n}"
|
|
2561
2525
|
},
|
|
2562
2526
|
{
|
|
2563
2527
|
"name": "ModelMessageSource",
|
|
@@ -2621,7 +2585,7 @@ export const TYPERT = {
|
|
|
2621
2585
|
},
|
|
2622
2586
|
{
|
|
2623
2587
|
"name": "SessionEventMap",
|
|
2624
|
-
"declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'agent-preset/selected': { agentPreset: string; };\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'permission/preset': { preset: string; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n '
|
|
2588
|
+
"declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'agent-preset/selected': { agentPreset: string; };\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'permission/preset': { preset: string; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n 'goal/change': GoalChangeMeta;\n 'feedback/message-put': MessageFeedbackPut;\n 'feedback/message-delete': MessageFeedbackDelete;\n 'compaction/start': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; };\n 'compaction/summary': { compactionId: CompactionId; sourceCommandId?: CommandId; summary: ContentBlock[]; shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; provider: string; model: string; maxTokens?: number; usage?: TokenUsage; } & ({ rawOutput: ContentBlock[]; llmStreamCall: true; } | { rawOutput?: ContentBlock[]; llmStreamCall?: never; });\n 'compaction/end': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; error?: string; };\n 'compaction/prune': { shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; };\n}"
|
|
2625
2589
|
},
|
|
2626
2590
|
{
|
|
2627
2591
|
"name": "SessionEventType",
|
|
@@ -2719,42 +2683,6 @@ export const TYPERT = {
|
|
|
2719
2683
|
"name": "SystemPromptUpdate",
|
|
2720
2684
|
"declaration": "export type SystemPromptUpdate = 'in-history';"
|
|
2721
2685
|
},
|
|
2722
|
-
{
|
|
2723
|
-
"name": "TeamId",
|
|
2724
|
-
"declaration": "export type TeamId = Branded<'TeamId'>;"
|
|
2725
|
-
},
|
|
2726
|
-
{
|
|
2727
|
-
"name": "TeamMemberPhase",
|
|
2728
|
-
"declaration": "export type TeamMemberPhase = 'provisioning' | 'active' | 'failed';"
|
|
2729
|
-
},
|
|
2730
|
-
{
|
|
2731
|
-
"name": "TeamMemberSnapshot",
|
|
2732
|
-
"declaration": "export interface TeamMemberSnapshot {\n readonly id: SessionId;\n readonly name: string;\n readonly description: string;\n readonly provider: string;\n readonly context: 'fresh' | 'fork';\n readonly phase: TeamMemberPhase;\n readonly error?: string;\n}"
|
|
2733
|
-
},
|
|
2734
|
-
{
|
|
2735
|
-
"name": "TeamMessageId",
|
|
2736
|
-
"declaration": "export type TeamMessageId = Branded<'TeamMessageId'>;"
|
|
2737
|
-
},
|
|
2738
|
-
{
|
|
2739
|
-
"name": "TeamMessageSnapshot",
|
|
2740
|
-
"declaration": "export interface TeamMessageSnapshot {\n readonly id: TeamMessageId;\n readonly senderId: SessionId;\n readonly senderName: string;\n readonly targetId: SessionId;\n readonly content: ContentBlock[];\n}"
|
|
2741
|
-
},
|
|
2742
|
-
{
|
|
2743
|
-
"name": "TeamMessageSource",
|
|
2744
|
-
"declaration": "export interface TeamMessageSource {\n readonly kind: 'team-message';\n readonly teamId: TeamId;\n readonly messageId: TeamMessageId;\n readonly senderId: SessionId;\n readonly senderName: string;\n}"
|
|
2745
|
-
},
|
|
2746
|
-
{
|
|
2747
|
-
"name": "TeamTaskId",
|
|
2748
|
-
"declaration": "export type TeamTaskId = Branded<'TeamTaskId'>;"
|
|
2749
|
-
},
|
|
2750
|
-
{
|
|
2751
|
-
"name": "TeamTaskSnapshot",
|
|
2752
|
-
"declaration": "export interface TeamTaskSnapshot {\n readonly id: TeamTaskId;\n readonly revision: number;\n readonly subject: string;\n readonly description: string;\n readonly status: TeamTaskStatus;\n readonly ownerId?: SessionId;\n readonly blockedBy: TeamTaskId[];\n readonly writeScopes: string[];\n}"
|
|
2753
|
-
},
|
|
2754
|
-
{
|
|
2755
|
-
"name": "TeamTaskStatus",
|
|
2756
|
-
"declaration": "export type TeamTaskStatus = 'pending' | 'in_progress' | 'completed' | 'deleted';"
|
|
2757
|
-
},
|
|
2758
2686
|
{
|
|
2759
2687
|
"name": "TextBlock",
|
|
2760
2688
|
"declaration": "export interface TextBlock {\n type: 'text';\n text: string;\n}"
|
|
@@ -6,6 +6,8 @@ import type { SessionAssistantSettlementEntry, SessionEventLikeEntry, SessionLiv
|
|
|
6
6
|
export type ClientAssistantStreamResult = {
|
|
7
7
|
readonly type: 'publish';
|
|
8
8
|
readonly entry: SessionLiveEventEntry;
|
|
9
|
+
/** Retire the successful attempt's transient rows after publishing its Step end. */
|
|
10
|
+
readonly retireAttemptId?: LlmAttemptId;
|
|
9
11
|
} | {
|
|
10
12
|
readonly type: 'settlement';
|
|
11
13
|
readonly attemptId: LlmAttemptId;
|
|
@@ -22,6 +24,7 @@ export type ClientAssistantStreamResult = {
|
|
|
22
24
|
/** Keeps transient Assistant presentation behind one settlement-aware interface. */
|
|
23
25
|
export declare class ClientAssistantStream {
|
|
24
26
|
private activeAttempt;
|
|
27
|
+
private retainedAttempt;
|
|
25
28
|
private readonly pending;
|
|
26
29
|
private publishedSeqs;
|
|
27
30
|
private durableCursor;
|
|
@@ -41,6 +44,8 @@ export declare class ClientAssistantStream {
|
|
|
41
44
|
acceptDurable(entry: SessionLiveEventEntry): ClientAssistantStreamResult;
|
|
42
45
|
/**
|
|
43
46
|
* Fold one dense transient frame and release its named durable settlement.
|
|
47
|
+
* Successful messages retain their transient rows until the owning Step ends;
|
|
48
|
+
* interrupted messages, failed attempts, and abandonment retire them immediately.
|
|
44
49
|
* @param frame - next Assistant stream frame received by the follow connection.
|
|
45
50
|
* @returns a transient, publication, or rebaseline decision, or `undefined` when no entry becomes visible.
|
|
46
51
|
*/
|
|
@@ -3,6 +3,7 @@ import { expandAssistantStream } from '@deepseek-ai/dsh-llm/assistant-stream';
|
|
|
3
3
|
/** Keeps transient Assistant presentation behind one settlement-aware interface. */
|
|
4
4
|
export class ClientAssistantStream {
|
|
5
5
|
activeAttempt;
|
|
6
|
+
retainedAttempt;
|
|
6
7
|
pending = new Map();
|
|
7
8
|
publishedSeqs = new Set();
|
|
8
9
|
durableCursor = -1;
|
|
@@ -17,6 +18,7 @@ export class ClientAssistantStream {
|
|
|
17
18
|
this.pending.clear();
|
|
18
19
|
this.transientInGap = 0;
|
|
19
20
|
this.activeAttempt = undefined;
|
|
21
|
+
this.retainedAttempt = undefined;
|
|
20
22
|
const opening = baseline?.activeAttempt;
|
|
21
23
|
if (opening !== undefined) {
|
|
22
24
|
this.activeAttempt = {
|
|
@@ -73,13 +75,16 @@ export class ClientAssistantStream {
|
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
75
77
|
* Fold one dense transient frame and release its named durable settlement.
|
|
78
|
+
* Successful messages retain their transient rows until the owning Step ends;
|
|
79
|
+
* interrupted messages, failed attempts, and abandonment retire them immediately.
|
|
76
80
|
* @param frame - next Assistant stream frame received by the follow connection.
|
|
77
81
|
* @returns a transient, publication, or rebaseline decision, or `undefined` when no entry becomes visible.
|
|
78
82
|
*/
|
|
79
83
|
acceptFrame(frame) {
|
|
80
84
|
switch (frame.type) {
|
|
81
85
|
case 'start':
|
|
82
|
-
if (this.activeAttempt !== undefined || this.
|
|
86
|
+
if (this.activeAttempt !== undefined || this.retainedAttempt !== undefined
|
|
87
|
+
|| this.pending.size > 0)
|
|
83
88
|
return { type: 'rebaseline' };
|
|
84
89
|
this.pending.clear();
|
|
85
90
|
this.activeAttempt = {
|
|
@@ -140,6 +145,10 @@ export class ClientAssistantStream {
|
|
|
140
145
|
return { type: 'rebaseline' };
|
|
141
146
|
}
|
|
142
147
|
this.pending.delete(frame.outcome.seq);
|
|
148
|
+
if (entry.event.type === 'assistant/message' && entry.event.data.interrupted !== true) {
|
|
149
|
+
this.retainedAttempt = { attemptId: attempt.attemptId, turn: attempt.turn, step: attempt.step };
|
|
150
|
+
return this.publish(entry);
|
|
151
|
+
}
|
|
143
152
|
this.publishedSeqs.add(entry.event.seq);
|
|
144
153
|
return { type: 'settlement', attemptId: attempt.attemptId, entry };
|
|
145
154
|
}
|
|
@@ -157,6 +166,12 @@ export class ClientAssistantStream {
|
|
|
157
166
|
}
|
|
158
167
|
publish(entry) {
|
|
159
168
|
this.publishedSeqs.add(entry.event.seq);
|
|
169
|
+
const retained = this.retainedAttempt;
|
|
170
|
+
if (retained !== undefined && entry.event.type === 'step/end'
|
|
171
|
+
&& entry.event.data.turn === retained.turn && entry.event.data.step === retained.step) {
|
|
172
|
+
this.retainedAttempt = undefined;
|
|
173
|
+
return { type: 'publish', entry, retireAttemptId: retained.attemptId };
|
|
174
|
+
}
|
|
160
175
|
return { type: 'publish', entry };
|
|
161
176
|
}
|
|
162
177
|
}
|
|
@@ -634,8 +634,12 @@ export class Session {
|
|
|
634
634
|
this.notifier.markDirty();
|
|
635
635
|
return;
|
|
636
636
|
}
|
|
637
|
-
if (result?.type === 'publish'
|
|
638
|
-
this.
|
|
637
|
+
if (result?.type === 'publish') {
|
|
638
|
+
const changed = this.appendLive(result.entry);
|
|
639
|
+
if (result.retireAttemptId !== undefined)
|
|
640
|
+
this.eventSource.settleAssistant(result.retireAttemptId);
|
|
641
|
+
if (changed || result.retireAttemptId !== undefined)
|
|
642
|
+
this.notifier.markDirty();
|
|
639
643
|
}
|
|
640
644
|
else if (result?.type === 'transient') {
|
|
641
645
|
this.eventSource.append(result.entry);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-api-session-controller",
|
|
3
3
|
"description": "Session Remote commands, cold reads, and live control transport",
|
|
4
|
-
"version": "0.1.7-
|
|
4
|
+
"version": "0.1.7-rc.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -67,39 +67,39 @@
|
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"mime-types": "^3.0.2",
|
|
69
69
|
"zod": "^4.4.3",
|
|
70
|
+
"@deepseek-ai/dsh-deque": "0.1.7-rc.1",
|
|
70
71
|
"@deepseek-ai/schemastery": "~3.18.4",
|
|
71
|
-
"@deepseek-ai/dsh-brand": "0.1.7-
|
|
72
|
-
"@deepseek-ai/dsh-deque": "0.1.7-alpha.2"
|
|
72
|
+
"@deepseek-ai/dsh-brand": "0.1.7-rc.1"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
|
-
"@deepseek-ai/dsh-agent": "0.1.7-
|
|
75
|
+
"@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
|
|
76
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
|
|
77
|
+
"@deepseek-ai/dsh-api-gateway": "0.1.7-rc.1",
|
|
78
|
+
"@deepseek-ai/dsh-agent": "0.1.7-rc.1",
|
|
79
|
+
"@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
|
|
80
|
+
"@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
|
|
81
|
+
"@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.1",
|
|
82
|
+
"@deepseek-ai/dsh-commands": "0.1.7-rc.1",
|
|
83
|
+
"@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
|
|
76
84
|
"@deepseek-ai/cordis": "~4.0.4",
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-
|
|
90
|
-
"@deepseek-ai/dsh-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-
|
|
95
|
-
"@deepseek-ai/dsh-skill": "0.1.7-alpha.2",
|
|
96
|
-
"@deepseek-ai/dsh-subagent": "0.1.7-alpha.2",
|
|
97
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.7-alpha.2",
|
|
98
|
-
"@deepseek-ai/dsh-typert-registry": "0.1.7-alpha.2",
|
|
99
|
-
"@deepseek-ai/dsh-util-time": "0.1.7-alpha.2",
|
|
100
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-alpha.2",
|
|
101
|
-
"@deepseek-ai/dsh-workspace": "0.1.7-alpha.2",
|
|
102
|
-
"@deepseek-ai/dsh-util-values": "0.1.7-alpha.2"
|
|
85
|
+
"@deepseek-ai/dsh-fs": "0.1.7-rc.1",
|
|
86
|
+
"@deepseek-ai/dsh-native-command": "0.1.7-rc.1",
|
|
87
|
+
"@deepseek-ai/dsh-scope": "0.1.7-rc.1",
|
|
88
|
+
"@deepseek-ai/dsh-session": "0.1.7-rc.1",
|
|
89
|
+
"@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
|
|
90
|
+
"@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
|
|
91
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
|
|
92
|
+
"@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
|
|
93
|
+
"@deepseek-ai/dsh-session-persistence": "0.1.7-rc.1",
|
|
94
|
+
"@deepseek-ai/dsh-skill": "0.1.7-rc.1",
|
|
95
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
|
|
96
|
+
"@deepseek-ai/dsh-typert-registry": "0.1.7-rc.1",
|
|
97
|
+
"@deepseek-ai/dsh-util-time": "0.1.7-rc.1",
|
|
98
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
|
|
99
|
+
"@deepseek-ai/dsh-util-values": "0.1.7-rc.1",
|
|
100
|
+
"@deepseek-ai/dsh-llm": "0.1.7-rc.1",
|
|
101
|
+
"@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
|
|
102
|
+
"@deepseek-ai/dsh-workspace": "0.1.7-rc.1"
|
|
103
103
|
},
|
|
104
104
|
"peerDependenciesMeta": {
|
|
105
105
|
"@deepseek-ai/dsh-session-persistence": {
|
|
@@ -111,45 +111,45 @@
|
|
|
111
111
|
},
|
|
112
112
|
"devDependencies": {
|
|
113
113
|
"@types/mime-types": "^3.0.1",
|
|
114
|
+
"@deepseek-ai/dsh-agent": "0.1.7-rc.1",
|
|
115
|
+
"@deepseek-ai/dsh-agent-default-model": "0.1.7-rc.1",
|
|
116
|
+
"@deepseek-ai/dsh-agent-loop": "0.1.7-rc.1",
|
|
114
117
|
"@deepseek-ai/cordis": "~4.0.4",
|
|
115
|
-
"@deepseek-ai/dsh-agent": "0.1.7-
|
|
116
|
-
"@deepseek-ai/dsh-
|
|
117
|
-
"@deepseek-ai/dsh-
|
|
118
|
-
"@deepseek-ai/dsh-
|
|
119
|
-
"@deepseek-ai/dsh-
|
|
120
|
-
"@deepseek-ai/dsh-
|
|
121
|
-
"@deepseek-ai/dsh-
|
|
122
|
-
"@deepseek-ai/dsh-
|
|
123
|
-
"@deepseek-ai/dsh-
|
|
124
|
-
"@deepseek-ai/dsh-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-permission-presets": "0.1.7-
|
|
129
|
-
"@deepseek-ai/dsh-
|
|
130
|
-
"@deepseek-ai/dsh-
|
|
131
|
-
"@deepseek-ai/dsh-
|
|
132
|
-
"@deepseek-ai/dsh-session": "0.1.7-
|
|
133
|
-
"@deepseek-ai/dsh-
|
|
134
|
-
"@deepseek-ai/dsh-session-projection": "0.1.7-
|
|
135
|
-
"@deepseek-ai/dsh-
|
|
136
|
-
"@deepseek-ai/dsh-session-
|
|
137
|
-
"@deepseek-ai/dsh-
|
|
138
|
-
"@deepseek-ai/dsh-
|
|
139
|
-
"@deepseek-ai/dsh-
|
|
140
|
-
"@deepseek-ai/dsh-
|
|
141
|
-
"@deepseek-ai/dsh-
|
|
142
|
-
"@deepseek-ai/dsh-
|
|
143
|
-
"@deepseek-ai/dsh-
|
|
144
|
-
"@deepseek-ai/dsh-
|
|
145
|
-
"@deepseek-ai/dsh-
|
|
146
|
-
"@deepseek-ai/dsh-
|
|
147
|
-
"@deepseek-ai/dsh-
|
|
148
|
-
"@deepseek-ai/dsh-util-
|
|
149
|
-
"@deepseek-ai/dsh-
|
|
150
|
-
"@deepseek-ai/dsh-util-values": "0.1.7-alpha.2",
|
|
151
|
-
"@deepseek-ai/dsh-workspace": "0.1.7-alpha.2",
|
|
152
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-alpha.2"
|
|
118
|
+
"@deepseek-ai/dsh-agent-loop-testkit": "0.1.7-rc.1",
|
|
119
|
+
"@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
|
|
120
|
+
"@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
|
|
121
|
+
"@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.1",
|
|
122
|
+
"@deepseek-ai/dsh-client-store": "0.1.7-rc.1",
|
|
123
|
+
"@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.1",
|
|
124
|
+
"@deepseek-ai/dsh-commands": "0.1.7-rc.1",
|
|
125
|
+
"@deepseek-ai/dsh-file-reference": "0.1.7-rc.1",
|
|
126
|
+
"@deepseek-ai/dsh-fs": "0.1.7-rc.1",
|
|
127
|
+
"@deepseek-ai/dsh-fs-local": "0.1.7-rc.1",
|
|
128
|
+
"@deepseek-ai/dsh-llm": "0.1.7-rc.1",
|
|
129
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.1",
|
|
130
|
+
"@deepseek-ai/dsh-api-gateway": "0.1.7-rc.1",
|
|
131
|
+
"@deepseek-ai/dsh-permission-presets": "0.1.7-rc.1",
|
|
132
|
+
"@deepseek-ai/dsh-remote-mock": "0.1.7-rc.1",
|
|
133
|
+
"@deepseek-ai/dsh-scope": "0.1.7-rc.1",
|
|
134
|
+
"@deepseek-ai/dsh-session": "0.1.7-rc.1",
|
|
135
|
+
"@deepseek-ai/dsh-session-persistence": "0.1.7-rc.1",
|
|
136
|
+
"@deepseek-ai/dsh-native-command": "0.1.7-rc.1",
|
|
137
|
+
"@deepseek-ai/dsh-session-projection": "0.1.7-rc.1",
|
|
138
|
+
"@deepseek-ai/dsh-session-projection-cache": "0.1.7-rc.1",
|
|
139
|
+
"@deepseek-ai/dsh-session-title": "0.1.7-rc.1",
|
|
140
|
+
"@deepseek-ai/dsh-skill": "0.1.7-rc.1",
|
|
141
|
+
"@deepseek-ai/dsh-storage": "0.1.7-rc.1",
|
|
142
|
+
"@deepseek-ai/dsh-storage-domain": "0.1.7-rc.1",
|
|
143
|
+
"@deepseek-ai/dsh-storage-json": "0.1.7-rc.1",
|
|
144
|
+
"@deepseek-ai/dsh-subagent": "0.1.7-rc.1",
|
|
145
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
|
|
146
|
+
"@deepseek-ai/dsh-session-query": "0.1.7-rc.1",
|
|
147
|
+
"@deepseek-ai/dsh-typert-registry": "0.1.7-rc.1",
|
|
148
|
+
"@deepseek-ai/dsh-util-crypto": "0.1.7-rc.1",
|
|
149
|
+
"@deepseek-ai/dsh-util-values": "0.1.7-rc.1",
|
|
150
|
+
"@deepseek-ai/dsh-util-time": "0.1.7-rc.1",
|
|
151
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
|
|
152
|
+
"@deepseek-ai/dsh-workspace": "0.1.7-rc.1"
|
|
153
153
|
},
|
|
154
154
|
"scripts": {
|
|
155
155
|
"bundle": "tsdown",
|