@crazx/dsh-api-session-controller 0.1.5-rc.2.zw.1 → 0.1.6-alpha.1.zw.2

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 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: 24cfbba626ddec510452e3b6c8bc4333c03876bd
6
- README.zh.md: 883fa2343693e6512638fa437a3f8bd0db09310c
5
+ README.md: 9b2cdeed600cd597ecfab076fe98a3a334533ba8
6
+ README.zh.md: 04ed7808dc7ea581b489921f88349479d46d8037
package/README.md CHANGED
@@ -26,7 +26,7 @@ English | [中文](README.zh.md)
26
26
 
27
27
  History pages and follow opening snapshots carry one `{ type: 'event', event: SessionWireEvent }` record per durable Session event. The Client retains each accepted record as one durable `SessionEventLikeEntry`; Assistant token boundaries remain inside the compact stream on `assistant/message` or `assistant/attempt`. Tool arguments, result content, failures, and `tool/result.data.meta` pass through unchanged; the controller does not resolve a Tool definition, run a presenter, or attach UI data.
28
28
 
29
- The Client journal validates exact V3 event envelopes before publishing follow snapshots, live entries, or history pages. It reuses the browser-safe Session validators for required surface markers, exact replacement endpoints, earlier unique source seqs, embedded Assistant provenance, request-header omissions, and tool-error consistency. Invalid records fail without field stripping or normalization; range membership and source existence remain durable-log checks on the Host.
29
+ The Client journal validates exact V3 event envelopes before publishing follow snapshots, live entries, or history pages. It reuses the browser-safe Session validators for required surface markers, exact replacement endpoints, earlier unique source seqs, embedded Assistant provider metadata, request-header omissions, and tool-error consistency. Invalid records fail without field stripping or normalization; range membership and source existence remain durable-log checks on the Host.
30
30
 
31
31
  Each endpoint states its activation policy. List reads only stored headers and projection-cache rows: it never calls per-session stat or opens a cold Session body. A current-format cache identity may supply every list hint; a lifecycle-matching predecessor cache may supply only its version-compatible title as a stale display fact, never as an authoritative fold seed. Search, attachment, history pages, log following, skill discovery, and workspace-path opening can inspect persistence without activating an Agent; `canOpenWorkspacePath()` reports native-opening availability without addressing a Session. Queue mutation and cancellation require live state; model, rename, prompt, and file-reference operations may resolve or resume an ordinary Session. Prompt rejects content with neither non-whitespace text nor an attachment before resolving the Agent or appending Session events; queue edits accept only non-empty text content. Prompt admission consumes opaque receipts from the injected [`fileUploads`](../../client/file-upload/README.md) Host service and resolves every same-Agent receipt before sending the complete ordered content list through `ctx.attachments`. Prompt retries whose `requestId` is already queued or logged return the original acceptance without inserting another message. Create and fork are the only operations that create a new Agent directly. The service applies one preset-aware resume policy and subagent ownership fence to its own methods and to the Typert Agent and Session lookups used by other Remote namespaces. Queue mutation has one narrow exception: a live child whose current projected identity is continuable and comes from its own non-seed suffix accepts the ordinary Edit, Remove, and QueueDock Steer actions across both inbox destinations. One-shot, missing, unknown, corrupt, seed-only, or cold children remain rejected without resume. The skill catalog uses a live Agent when present or the recorded preset's standing scope when cold, so listing never starts an Agent. The authenticated delivery routes use `workspaceDesktop()` for the serving Host name and file-manager behavior. `openWorkspacePath({ path, action: "reveal" })` delegates file-manager navigation to the native adapter; omitting `action` opens the default application.
32
32
 
@@ -35,6 +35,10 @@ The Client adapter exposes `SessionEventStream`, a Gateway `RemoteJournalStream`
35
35
  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 while serialization is in flight. The prompt's `requestId` is the correlation identity: the Host echoes it as the durable user source's `rpcId`, and queue occurrences project it as `SessionQueuedItem.rpcId`. An echo retires one animation frame after its durable event or queue occurrence is observed, immediately when its identified prompt fails or is abandoned, and as failed on disposal. 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.
36
36
 
37
37
 
38
+ The user-invocable `skills/list` metadata includes the winning provider’s optional instruction-file `path`. The composer can preview that file without loading every skill body or activating a cold Agent.
39
+
40
+ Fork copies history through the selected completed turn, including its `turn/end`. Events after that point, including queued input and model-setting changes, are excluded. An omitted or past-end anchor selects the last completed turn; an anchor inside an unfinished turn is rejected.
41
+
38
42
  <a id="session-media-references"></a>
39
43
  ## Session media references
40
44
 
package/README.zh.md CHANGED
@@ -26,7 +26,7 @@ kind: "package-reference"
26
26
 
27
27
  历史页与 follow opening 快照为每个持久 Session 事件携带一条 `{ type: 'event', event: SessionWireEvent }` record。Client 把每条已接受 record 保留为一个持久 `SessionEventLikeEntry`;Assistant token 边界保留在 `assistant/message` 或 `assistant/attempt` 的紧凑流内。工具参数、结果内容、失败信息和 `tool/result.data.meta` 原样通过;控制器不解析工具定义、不运行展示转换器,也不附加 UI 数据。
28
28
 
29
- Client journal 在发布 follow 快照、live entry 或历史页之前验证精确的 V3 事件 envelope。它复用浏览器安全的 Session validator,检查必需的 surface marker、精确的 replacement endpoint、更早且唯一的 source seq、内嵌 Assistant 来源、request header 可选字段的省略规则以及工具错误一致性。无效 record 直接失败,不删除字段或归一化;范围成员与来源存在性仍由 Host 的持久日志检查。
29
+ Client journal 在发布 follow 快照、live entry 或历史页之前验证精确的 V3 事件 envelope。它复用浏览器安全的 Session validator,检查必需的 surface marker、精确的 replacement endpoint、更早且唯一的 source seq、内嵌 Assistant 提供方元数据、request header 可选字段的省略规则以及工具错误一致性。无效 record 直接失败,不删除字段或归一化;范围成员与来源存在性仍由 Host 的持久日志检查。
30
30
 
31
31
  每个 endpoint 都声明自己的激活策略。列表只读取持久化 header 与 projection cache row,绝不调用逐 Session stat 或打开冷 Session body。当前格式 cache identity 可以提供全部列表 hint;生命周期匹配的 predecessor cache 只能提供版本兼容的 title,作为可能过时的展示事实,绝不能作为权威 fold seed。搜索、附件、历史页、日志跟随、skill 发现和工作区路径打开可以在不激活 Agent 的情况下检查 persistence;`canOpenWorkspacePath()` 无需指定 Session 即可报告原生打开能力。queue 变更与取消要求 live 状态;模型、重命名、prompt 和文件引用操作可以解析或恢复普通 Session。提示词会在解析 Agent 或追加 Session 事件前,拒绝既没有非空白文本也没有附件的 content;queue edit 只接受非空文本 content。prompt 准入从注入的 [`fileUploads`](../../client/file-upload/README.zh.md) Host 服务取得不透明凭证,在把完整有序内容列表交给 `ctx.attachments` 前解析每个属于同一 Agent 的凭证。`requestId` 已进入 queue 或日志时,prompt 重试直接返回原来的接受结果,不会重复插入消息。只有 create 与 fork 会直接创建新 Agent。该服务把同一套感知 preset 的恢复策略和 subagent ownership fence 同时用于自身方法,以及其他 Remote namespace 使用的 Typert Agent 与 Session lookup。Queue 变更只有一个狭窄例外:当前 projection identity 为 continuable 且来自自身非 seed suffix 的在线 child,可以在两个 inbox 目标上使用普通 Edit、Remove 与 QueueDock Steer action。One-shot、缺失、未知、损坏、仅含 seed identity 或冷 child 继续被拒绝,且不会恢复。skill 目录优先使用已有 live Agent,否则使用所记录 preset 的常驻 scope,因此列表查询绝不会启动 Agent。经过鉴权的文件交付路由通过 `workspaceDesktop()` 获取提供服务的 Host 名称和文件管理器行为。`openWorkspacePath({ path, action: "reveal" })` 将文件管理器导航委托给原生适配器;省略 `action` 时打开默认应用。
32
32
 
@@ -35,6 +35,10 @@ Client 适配器提供 `SessionEventStream`,即绑定到一个普通 Session
35
35
  Session 对象还承载本地提交回显:`session.beginSubmission` 在调用方序列化与提示词之前,同步把一条回显写入 `SessionSnapshot.pendingSubmissions`,会话 UI 因此能在点击提交的当帧显示消息。回显按顺序存放图片预览与持久文件引用。Session 根据当前运行状态与请求的投递模式推导其 `transcript`、`queued` 或 `steering` 位置,并在序列化期间保留该位置。提示词的 `requestId` 是关联标识:Host 把它回显为 durable user source 的 `rpcId`,queue occurrence 也把它投影为 `SessionQueuedItem.rpcId`。回显在观察到其 durable event 或 queue occurrence 后延迟一个动画帧退休,带标识的提示词失败或被放弃时立即退休,销毁时按 failed 退休。每次退休恰好触发一次 `onRetire`;observed 退休还会携带有序的持久附件引用,让 composer 释放成功卡片并保留失败草稿。回显只存在于 Client 内存;刷新与重连只从持久事件重建会话。
36
36
 
37
37
 
38
+ 面向用户调用的 `skills/list` 元数据包含胜出提供方可选的指令文件 `path`。输入框可据此预览文件,无需加载每个 skill 的正文或激活冷态 Agent。
39
+
40
+ 分叉复制截至选中已结束轮次的历史,并包含其 `turn/end`。该位置之后的事件均被排除,包括排队输入和模型设置变更。省略锚点或锚点超出日志末尾时,选择最后一个已结束轮次;位于未结束轮次内的锚点会被拒绝。
41
+
38
42
  <a id="session-media-references"></a>
39
43
  ## 会话媒体引用
40
44
 
package/lib/client.js CHANGED
@@ -134,6 +134,7 @@ window.__ModuleLoader__.load({
134
134
  "goal/change",
135
135
  "hook/invoked",
136
136
  "hook/result",
137
+ "image/offload",
137
138
  "llm/retry",
138
139
  "llm/retry-started",
139
140
  "model/selection",
@@ -244,7 +245,7 @@ window.__ModuleLoader__.load({
244
245
  return op;
245
246
  }
246
247
  /** Validate cited source-event seqs against prior log entries and the replacement range. */
247
- function assertProvenance(event, shadowedSeqs) {
248
+ function assertSourceEventReferences(event, shadowedSeqs) {
248
249
  const raw = event.sourceEventSeqs;
249
250
  if (event.type === "assistant/message" && raw !== void 0) throw new Error("assistant/message embeds its source stream and cannot carry sourceEventSeqs");
250
251
  const sources = /* @__PURE__ */ new Set();
@@ -273,7 +274,7 @@ window.__ModuleLoader__.load({
273
274
  function validateSurfaceMetadata(event) {
274
275
  const op = surfaceOpOf(event);
275
276
  if (op !== void 0 && op !== "append" && (op.startSeq >= event.seq || op.endSeq >= event.seq)) throw new Error(`surface replace at seq ${event.seq}: startSeq and endSeq must reference earlier events`);
276
- if (op !== void 0) assertProvenance(event, []);
277
+ if (op !== void 0) assertSourceEventReferences(event, []);
277
278
  return op;
278
279
  }
279
280
  //#endregion
@@ -938,7 +939,7 @@ window.__ModuleLoader__.load({
938
939
  };
939
940
  //#endregion
940
941
  //#region lib/types/client/time-zone.js
941
- /** Browser-owned time-zone sampling for prompt RPC provenance. */
942
+ /** Browser-owned time-zone sampling for one prompt RPC. */
942
943
  /**
943
944
  * Resolve the current browser IANA zone for one outbound operation.
944
945
  * @returns The browser-provided canonical zone.
package/lib/index.js CHANGED
@@ -698,8 +698,7 @@ var SessionCommandController = class {
698
698
  const lastSeq = source.events.at(-1)?.seq ?? -1;
699
699
  const boundary = (atSeq === void 0 ? void 0 : source.events.find((event) => event.type === "turn/end" && event.seq >= atSeq)) ?? (atSeq === void 0 || atSeq > lastSeq ? source.events.findLast((event) => event.type === "turn/end") : void 0);
700
700
  if (boundary === void 0) throw new RemoteError("session/fork-unavailable", atSeq !== void 0 && atSeq <= lastSeq ? `session "${request.sessionId}" has not completed the turn containing event ${String(atSeq)}` : `session "${request.sessionId}" has no completed turn to fork from`, { sessionId: request.sessionId });
701
- let cut = SessionLogOffset(boundary.seq + 1);
702
- while (cut < source.events.length && source.events[cut]?.type !== "turn/start") cut = SessionLogOffset(cut + 1);
701
+ const cut = SessionLogOffset(boundary.seq + 1);
703
702
  let workspace;
704
703
  try {
705
704
  workspace = await this.forkWorkspace(source.header);
@@ -2296,6 +2295,7 @@ let SessionSkillCatalog = (() => {
2296
2295
  scope
2297
2296
  })).filter(isUserInvocable).map((skill) => ({
2298
2297
  name: skill.name,
2298
+ ...skill.path === void 0 ? {} : { path: skill.path },
2299
2299
  description: skill.description,
2300
2300
  ...skill.whenToUse === void 0 ? {} : { whenToUse: skill.whenToUse },
2301
2301
  modelInvocable: skill.invocation.modelInvocable
@@ -25,6 +25,7 @@ const ContentBlockRemoteCodec$schema = z.union([z.object({
25
25
  'height': z.number(),
26
26
  }).optional(),
27
27
  }),
28
+ 'offloaded': z.literal(true).optional(),
28
29
  }), z.object({
29
30
  'type': z.literal("reasoning"),
30
31
  'text': z.string(),
@@ -132,6 +133,9 @@ const _deepseek_ai_dsh_api_session_controller_session_control_result$schema = z.
132
133
  'model': z.string().readonly(),
133
134
  'reasoningEffort': z.string().readonly().optional(),
134
135
  })]).readonly(),
136
+ }).optional(),
137
+ 'permissions': z.object({
138
+ 'currentValue': z.string(),
135
139
  }).optional(),
136
140
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
137
141
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -310,6 +314,9 @@ const _deepseek_ai_dsh_api_session_controller_session_follow_result$schema = z.u
310
314
  'model': z.string().readonly(),
311
315
  'reasoningEffort': z.string().readonly().optional(),
312
316
  })]).readonly(),
317
+ }).optional(),
318
+ 'permissions': z.object({
319
+ 'currentValue': z.string(),
313
320
  }).optional(),
314
321
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
315
322
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -454,6 +461,9 @@ const _deepseek_ai_dsh_api_session_controller_session_list_result$schema = z.obj
454
461
  'model': z.string().readonly(),
455
462
  'reasoningEffort': z.string().readonly().optional(),
456
463
  })]).readonly(),
464
+ }).optional(),
465
+ 'permissions': z.object({
466
+ 'currentValue': z.string(),
457
467
  }).optional(),
458
468
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
459
469
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -651,6 +661,7 @@ const _deepseek_ai_dsh_api_session_controller_session_updateQueue_parameter_0$sc
651
661
  'height': z.number(),
652
662
  }).optional(),
653
663
  }),
664
+ 'offloaded': z.literal(true).optional(),
654
665
  }), z.object({
655
666
  'type': z.literal("reasoning"),
656
667
  'text': z.string(),
@@ -679,6 +690,7 @@ const _deepseek_ai_dsh_api_session_controller_skills_list_parameter_0$schema = z
679
690
  })
680
691
  const _deepseek_ai_dsh_api_session_controller_skills_list_result$schema = z.object({
681
692
  'skills': z.array(z.object({
693
+ 'path': z.string().readonly().optional(),
682
694
  'name': z.string().readonly(),
683
695
  'description': z.string().readonly(),
684
696
  'whenToUse': z.string().readonly().optional(),
@@ -756,7 +768,7 @@ export const TYPERT = {
756
768
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionAttachmentValue',
757
769
  schema: _deepseek_ai_dsh_api_session_controller_session_attachment_result$schema,
758
770
  },
759
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":357,"column":3},
771
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":358,"column":3},
760
772
  },
761
773
  {
762
774
  id: '@deepseek-ai/dsh-api-session-controller#session/cancel',
@@ -781,7 +793,7 @@ export const TYPERT = {
781
793
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionCancelValue',
782
794
  schema: _deepseek_ai_dsh_api_session_controller_session_cancel_result$schema,
783
795
  },
784
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":377,"column":3},
796
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":378,"column":3},
785
797
  },
786
798
  {
787
799
  id: '@deepseek-ai/dsh-api-session-controller#session/canOpenWorkspacePath',
@@ -796,7 +808,7 @@ export const TYPERT = {
796
808
  typeSymbol: '@deepseek-ai/dsh-api-session-controller#session/canOpenWorkspacePath:result',
797
809
  schema: _deepseek_ai_dsh_api_session_controller_session_canOpenWorkspacePath_result$schema,
798
810
  },
799
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":272,"column":3},
811
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":273,"column":3},
800
812
  },
801
813
  {
802
814
  id: '@deepseek-ai/dsh-api-session-controller#session/control',
@@ -813,7 +825,7 @@ export const TYPERT = {
813
825
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionControlFrame',
814
826
  schema: _deepseek_ai_dsh_api_session_controller_session_control_result$schema,
815
827
  },
816
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":410,"column":3},
828
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":411,"column":3},
817
829
  },
818
830
  {
819
831
  id: '@deepseek-ai/dsh-api-session-controller#session/create',
@@ -838,7 +850,7 @@ export const TYPERT = {
838
850
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionCreateValue',
839
851
  schema: _deepseek_ai_dsh_api_session_controller_session_create_result$schema,
840
852
  },
841
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":244,"column":3},
853
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":245,"column":3},
842
854
  },
843
855
  {
844
856
  id: '@deepseek-ai/dsh-api-session-controller#session/follow',
@@ -865,7 +877,7 @@ export const TYPERT = {
865
877
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionFollowFrame',
866
878
  schema: _deepseek_ai_dsh_api_session_controller_session_follow_result$schema,
867
879
  },
868
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":400,"column":3},
880
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":401,"column":3},
869
881
  },
870
882
  {
871
883
  id: '@deepseek-ai/dsh-api-session-controller#session/fork',
@@ -890,7 +902,7 @@ export const TYPERT = {
890
902
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionForkValue',
891
903
  schema: _deepseek_ai_dsh_api_session_controller_session_fork_result$schema,
892
904
  },
893
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":335,"column":3},
905
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":336,"column":3},
894
906
  },
895
907
  {
896
908
  id: '@deepseek-ai/dsh-api-session-controller#session/list',
@@ -916,7 +928,7 @@ export const TYPERT = {
916
928
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionListValue',
917
929
  schema: _deepseek_ai_dsh_api_session_controller_session_list_result$schema,
918
930
  },
919
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":223,"column":9},
931
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":224,"column":9},
920
932
  },
921
933
  {
922
934
  id: '@deepseek-ai/dsh-api-session-controller#session/modelCatalog',
@@ -931,7 +943,7 @@ export const TYPERT = {
931
943
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#ModelCatalog',
932
944
  schema: _deepseek_ai_dsh_api_session_controller_session_modelCatalog_result$schema,
933
945
  },
934
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":263,"column":3},
946
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":264,"column":3},
935
947
  },
936
948
  {
937
949
  id: '@deepseek-ai/dsh-api-session-controller#session/openWorkspacePath',
@@ -957,7 +969,7 @@ export const TYPERT = {
957
969
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionOpenWorkspacePathValue',
958
970
  schema: _deepseek_ai_dsh_api_session_controller_session_openWorkspacePath_result$schema,
959
971
  },
960
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":293,"column":9},
972
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":294,"column":9},
961
973
  },
962
974
  {
963
975
  id: '@deepseek-ai/dsh-api-session-controller#session/page',
@@ -983,7 +995,7 @@ export const TYPERT = {
983
995
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionPage',
984
996
  schema: _deepseek_ai_dsh_api_session_controller_session_page_result$schema,
985
997
  },
986
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":388,"column":3},
998
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":389,"column":3},
987
999
  },
988
1000
  {
989
1001
  id: '@deepseek-ai/dsh-api-session-controller#session/prompt',
@@ -1009,7 +1021,7 @@ export const TYPERT = {
1009
1021
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionPromptValue',
1010
1022
  schema: _deepseek_ai_dsh_api_session_controller_session_prompt_result$schema,
1011
1023
  },
1012
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":346,"column":3},
1024
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":347,"column":3},
1013
1025
  },
1014
1026
  {
1015
1027
  id: '@deepseek-ai/dsh-api-session-controller#session/rename',
@@ -1034,7 +1046,7 @@ export const TYPERT = {
1034
1046
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionRenameValue',
1035
1047
  schema: _deepseek_ai_dsh_api_session_controller_session_rename_result$schema,
1036
1048
  },
1037
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":325,"column":3},
1049
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":326,"column":3},
1038
1050
  },
1039
1051
  {
1040
1052
  id: '@deepseek-ai/dsh-api-session-controller#session/search',
@@ -1060,7 +1072,7 @@ export const TYPERT = {
1060
1072
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionSearchValue',
1061
1073
  schema: _deepseek_ai_dsh_api_session_controller_session_search_result$schema,
1062
1074
  },
1063
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":234,"column":3},
1075
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":235,"column":3},
1064
1076
  },
1065
1077
  {
1066
1078
  id: '@deepseek-ai/dsh-api-session-controller#session/selectModel',
@@ -1085,7 +1097,7 @@ export const TYPERT = {
1085
1097
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionSelectModelValue',
1086
1098
  schema: _deepseek_ai_dsh_api_session_controller_session_selectModel_result$schema,
1087
1099
  },
1088
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":254,"column":3},
1100
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":255,"column":3},
1089
1101
  },
1090
1102
  {
1091
1103
  id: '@deepseek-ai/dsh-api-session-controller#session/updateQueue',
@@ -1110,7 +1122,7 @@ export const TYPERT = {
1110
1122
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionUpdateQueueValue',
1111
1123
  schema: _deepseek_ai_dsh_api_session_controller_session_updateQueue_result$schema,
1112
1124
  },
1113
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":367,"column":3},
1125
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":368,"column":3},
1114
1126
  },
1115
1127
  {
1116
1128
  id: '@deepseek-ai/dsh-api-session-controller#skills/list',
@@ -1329,8 +1341,8 @@ export const TYPERT = {
1329
1341
  "declaration": "export interface AssistantMessage extends Message {\n readonly role: 'assistant';\n readonly source: ModelMessageSource;\n}"
1330
1342
  },
1331
1343
  {
1332
- "name": "AssistantProvenance",
1333
- "declaration": "export interface AssistantProvenance {\n provider: string;\n model: string;\n replayState?: unknown;\n}"
1344
+ "name": "AssistantProviderMetadata",
1345
+ "declaration": "export interface AssistantProviderMetadata {\n provider: string;\n model: string;\n replayState?: unknown;\n}"
1334
1346
  },
1335
1347
  {
1336
1348
  "name": "AssistantStreamRecord",
@@ -1474,12 +1486,16 @@ export const TYPERT = {
1474
1486
  },
1475
1487
  {
1476
1488
  "name": "ImageBlock",
1477
- "declaration": "export interface ImageBlock {\n type: 'image';\n attachment: ImageAttachmentRef;\n}"
1489
+ "declaration": "export interface ImageBlock {\n type: 'image';\n attachment: ImageAttachmentRef;\n offloaded?: true;\n}"
1478
1490
  },
1479
1491
  {
1480
1492
  "name": "ImageMediaType",
1481
1493
  "declaration": "export type ImageMediaType = 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif';"
1482
1494
  },
1495
+ {
1496
+ "name": "ImageOffloadTarget",
1497
+ "declaration": "export interface ImageOffloadTarget {\n seq: SessionSeq;\n imageIndexes: number[];\n}"
1498
+ },
1483
1499
  {
1484
1500
  "name": "Inbox",
1485
1501
  "declaration": "export interface Inbox {\n readonly nextTurn: readonly UserMessage[];\n readonly nextStep: readonly UserMessage[];\n clear(): void;\n append(target: InboxTarget, message: UserMessage): void;\n prepend(target: InboxTarget, message: UserMessage): void;\n replace(messageId: MessageId, newMessage: UserMessage): boolean;\n remove(messageId: MessageId): boolean;\n splice(target: InboxTarget, start: number, deleteCount: number, inserted: UserMessage[]): UserMessage[];\n}"
@@ -1514,7 +1530,7 @@ export const TYPERT = {
1514
1530
  },
1515
1531
  {
1516
1532
  "name": "LlmFailure",
1517
- "declaration": "export interface LlmFailure {\n readonly message: string;\n readonly code: string;\n readonly status?: number;\n readonly providerRetryAfterMs?: number;\n readonly requestId?: ProviderRequestId;\n}"
1533
+ "declaration": "export interface LlmFailure {\n readonly message: string;\n readonly code: string;\n readonly status?: number;\n readonly providerRetryAfterMs?: number;\n readonly requestId?: ProviderRequestId;\n readonly offloadImages?: number;\n}"
1518
1534
  },
1519
1535
  {
1520
1536
  "name": "Message",
@@ -1566,7 +1582,7 @@ export const TYPERT = {
1566
1582
  },
1567
1583
  {
1568
1584
  "name": "ModelMessageSource",
1569
- "declaration": "export interface ModelMessageSource extends AssistantProvenance {\n kind: 'model';\n}"
1585
+ "declaration": "export interface ModelMessageSource extends AssistantProviderMetadata {\n kind: 'model';\n}"
1570
1586
  },
1571
1587
  {
1572
1588
  "name": "ModelProviderGroup",
@@ -1596,6 +1612,10 @@ export const TYPERT = {
1596
1612
  "name": "OptionalSessionSeq",
1597
1613
  "declaration": "export type OptionalSessionSeq = SessionSeq | null;"
1598
1614
  },
1615
+ {
1616
+ "name": "PermissionSelection",
1617
+ "declaration": "export interface PermissionSelection {\n currentValue: string;\n}"
1618
+ },
1599
1619
  {
1600
1620
  "name": "PromptContentPart",
1601
1621
  "declaration": "export type PromptContentPart = { readonly type: 'text'; readonly text: string; } | { readonly type: 'image'; readonly mediaType: ImageMediaType; readonly data: string; readonly name?: string; } | { readonly type: 'file'; readonly receiptId: Branded<'file-upload-receipt-id'>; };"
@@ -1606,7 +1626,7 @@ export const TYPERT = {
1606
1626
  },
1607
1627
  {
1608
1628
  "name": "PtcDispatchEventData",
1609
- "declaration": "export interface PtcDispatchEventData extends PtcDispatchStartEventData {\n isError: boolean;\n content: ContentBlock[];\n}"
1629
+ "declaration": "export interface PtcDispatchEventData extends PtcDispatchStartEventData {\n isError: boolean;\n content: ContentBlock[];\n error?: { name: string; code: string; reason?: string; };\n}"
1610
1630
  },
1611
1631
  {
1612
1632
  "name": "PtcDispatchStartEventData",
@@ -1634,7 +1654,7 @@ export const TYPERT = {
1634
1654
  },
1635
1655
  {
1636
1656
  "name": "RemoteErrorDetailsMap",
1637
- "declaration": "export interface RemoteErrorDetailsMap {\n 'gateway/bad-request': { readonly issues?: readonly object[]; };\n 'gateway/cancelled': {};\n 'gateway/internal': {};\n 'llm/model-discovery-rejected': { readonly settingsNs: string; readonly baseURL?: string; };\n 'session/not-found': { readonly sessionId: SessionId; };\n 'agent-preset/not-found': { readonly agentPreset: string; readonly available: readonly string[]; };\n 'agent-preset/invalid': { readonly agentPreset: string; readonly reason: string; };\n 'agent-preset/read-only': { readonly agentPreset: string; readonly reason: string; };\n 'agent-preset/locked': { readonly sessionId: SessionId; readonly agentPreset: string; };\n 'workspace/not-found': { readonly workspaceId: WorkspaceId; };\n 'session/model-unavailable': { readonly provider: string; readonly model: string; };\n 'session/conflict': { readonly sessionId: SessionId; readonly requestedCwd: string; readonly existingCwd?: string; };\n 'session/agent-busy': { readonly reason: string; };\n 'session/invalid-time-zone': { readonly value: string; };\n 'session/workspace-attach-failed': { readonly sessionId: SessionId; readonly workspaceId: string; };\n 'agent-preset/conflict': { readonly sessionId: SessionId; readonly requestedPreset: string; readonly existingPreset?: string; };\n 'session/attachment-invalid': { readonly reason: string; };\n 'session/queue-item-not-found': { readonly itemId: MessageId; };\n 'session/steer-unavailable': { readonly itemId: MessageId; };\n 'session/title-invalid': { readonly sessionId: SessionId; };\n 'session/fork-unavailable': { readonly sessionId: SessionId; };\n 'subagent/not-found': { readonly parentSessionId: SessionId; readonly childSessionId: SessionId; };\n 'subagent/catalog-diagnostic': { readonly parentSessionId: SessionId; readonly childSessionId: SessionId; readonly reason: 'corrupt' | 'unsupported' | 'unavailable'; };\n 'subagent/invalid-time-zone': { readonly value: string; };\n 'subagent/parent-unavailable': { readonly parentSessionId: SessionId; };\n 'subagent/not-resumable': { readonly childSessionId: SessionId; };\n 'subagent/unauthorized': { readonly childSessionId: SessionId; };\n 'subagent/attachment-invalid': { readonly reason: string; };\n 'subagent/delivery-unavailable': { readonly childSessionId: SessionId; };\n 'subagent/projections-unavailable': {};\n 'settings/rejected': { readonly ns: string; };\n 'settings/conflict': { readonly ns: string; readonly expected: number; readonly actual: number; };\n 'credential/rejected': { readonly ref: string; };\n 'workspace/invalid-path': { readonly path: string; };\n 'workspace/name-conflict': { readonly name: string; };\n 'workspace/move-invalid': { readonly workspaceId: WorkspaceId; readonly sessionId: SessionId; readonly beforeSessionId?: SessionId; };\n 'directory-picker/unavailable': { readonly capability: string; };\n 'directory-picker/unreadable': { readonly path: string; };\n 'directory-picker/exists': { readonly path: string; };\n 'directory-picker/create-failed': { readonly path: string; };\n 'workspace-file/not-found': { readonly path: string; };\n 'workspace-file/outside-workspace': { readonly path: string; };\n 'workspace-file/too-large': { readonly path: string; readonly limit: number; };\n 'workspace-file/not-text': { readonly path: string; };\n 'workspace-file/not-regular-file': { readonly path: string; readonly kind: 'directory' | 'symlink' | 'other'; };\n 'workspace-file/not-directory': { readonly path: string; readonly kind: 'file' | 'symlink' | 'other'; };\n}"
1657
+ "declaration": "export interface RemoteErrorDetailsMap {\n 'gateway/bad-request': { readonly issues?: readonly object[]; };\n 'gateway/cancelled': {};\n 'gateway/internal': {};\n 'llm/model-discovery-rejected': { readonly settingsNs: string; readonly baseURL?: string; };\n 'session/not-found': { readonly sessionId: SessionId; };\n 'agent-preset/not-found': { readonly agentPreset: string; readonly available: readonly string[]; };\n 'agent-preset/invalid': { readonly agentPreset: string; readonly reason: string; };\n 'agent-preset/read-only': { readonly agentPreset: string; readonly reason: string; };\n 'agent-preset/locked': { readonly sessionId: SessionId; readonly agentPreset: string; };\n 'workspace/not-found': { readonly workspaceId: WorkspaceId; };\n 'session/model-unavailable': { readonly provider: string; readonly model: string; };\n 'session/conflict': { readonly sessionId: SessionId; readonly requestedCwd: string; readonly existingCwd?: string; };\n 'session/agent-busy': { readonly reason: string; };\n 'session/invalid-time-zone': { readonly value: string; };\n 'session/workspace-attach-failed': { readonly sessionId: SessionId; readonly workspaceId: string; };\n 'agent-preset/conflict': { readonly sessionId: SessionId; readonly requestedPreset: string; readonly existingPreset?: string; };\n 'session/attachment-invalid': { readonly reason: string; };\n 'session/queue-item-not-found': { readonly itemId: MessageId; };\n 'session/steer-unavailable': { readonly itemId: MessageId; };\n 'session/title-invalid': { readonly sessionId: SessionId; };\n 'session/fork-unavailable': { readonly sessionId: SessionId; };\n 'subagent/not-found': { readonly parentSessionId: SessionId; readonly childSessionId: SessionId; };\n 'subagent/catalog-diagnostic': { readonly parentSessionId: SessionId; readonly childSessionId: SessionId; readonly reason: 'corrupt' | 'unsupported' | 'unavailable'; };\n 'subagent/invalid-time-zone': { readonly value: string; };\n 'subagent/parent-unavailable': { readonly parentSessionId: SessionId; };\n 'subagent/not-resumable': { readonly childSessionId: SessionId; };\n 'subagent/unauthorized': { readonly childSessionId: SessionId; };\n 'subagent/attachment-invalid': { readonly reason: string; };\n 'subagent/delivery-unavailable': { readonly childSessionId: SessionId; };\n 'subagent/projections-unavailable': {};\n 'settings/rejected': { readonly ns: string; };\n 'settings/conflict': { readonly ns: string; readonly expected: number; readonly actual: number; };\n 'credential/rejected': { readonly ref: string; };\n 'terminal/control-unavailable': { readonly reason: 'read-only' | 'not-running'; };\n 'terminal/limit-reached': { readonly limit: number; };\n 'workspace/invalid-path': { readonly path: string; };\n 'workspace/name-conflict': { readonly name: string; };\n 'workspace/move-invalid': { readonly workspaceId: WorkspaceId; readonly sessionId: SessionId; readonly beforeSessionId?: SessionId; };\n 'directory-picker/unavailable': { readonly capability: string; };\n 'directory-picker/unreadable': { readonly path: string; };\n 'directory-picker/exists': { readonly path: string; };\n 'directory-picker/create-failed': { readonly path: string; };\n 'workspace-file/not-found': { readonly path: string; };\n 'workspace-file/outside-workspace': { readonly path: string; };\n 'workspace-file/too-large': { readonly path: string; readonly limit: number; };\n 'workspace-file/not-text': { readonly path: string; };\n 'workspace-file/not-regular-file': { readonly path: string; readonly kind: 'directory' | 'symlink' | 'other'; };\n 'workspace-file/not-directory': { readonly path: string; readonly kind: 'file' | 'symlink' | 'other'; };\n}"
1638
1658
  },
1639
1659
  {
1640
1660
  "name": "ReplayEnvelope",
@@ -1714,7 +1734,7 @@ export const TYPERT = {
1714
1734
  },
1715
1735
  {
1716
1736
  "name": "SessionEventMap",
1717
- "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 '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; }; 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 '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 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\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}"
1737
+ "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 '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 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\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}"
1718
1738
  },
1719
1739
  {
1720
1740
  "name": "SessionEventType",
@@ -1798,7 +1818,7 @@ export const TYPERT = {
1798
1818
  },
1799
1819
  {
1800
1820
  "name": "SessionProjectionMap",
1801
- "declaration": "export interface SessionProjectionMap {\n inbox: InboxWireState;\n agentPreset: string | null;\n title: string | null;\n todos: TodoItem[] | null;\n sessionListMetadata: SessionListMetadata;\n imageLimits: ImageAttachmentLimits;\n modelSelection: ModelSelectionProjection;\n subagentCatalog: SubagentCatalogEntry[];\n subagentTiming: SubagentTimingProjection;\n subagent: SubagentIdentityProjection | null;\n goal: GoalProjection | null;\n}"
1821
+ "declaration": "export interface SessionProjectionMap {\n inbox: InboxWireState;\n agentPreset: string | null;\n title: string | null;\n todos: TodoItem[] | null;\n sessionListMetadata: SessionListMetadata;\n imageLimits: ImageAttachmentLimits;\n modelSelection: ModelSelectionProjection;\n permissions: PermissionSelection;\n subagentCatalog: SubagentCatalogEntry[];\n subagentTiming: SubagentTimingProjection;\n subagent: SubagentIdentityProjection | null;\n goal: GoalProjection | null;\n}"
1802
1822
  },
1803
1823
  {
1804
1824
  "name": "SessionProjectionUpdate",
@@ -1878,15 +1898,15 @@ export const TYPERT = {
1878
1898
  },
1879
1899
  {
1880
1900
  "name": "SessionSurface",
1881
- "declaration": "export interface SessionSurface {\n readonly nodes: readonly SessionSeq[];\n readonly replaceGeneration: number;\n}"
1901
+ "declaration": "export interface SessionSurface {\n readonly nodes: readonly SessionSeq[];\n readonly replaceGeneration: number;\n readonly contentGeneration: number;\n}"
1882
1902
  },
1883
1903
  {
1884
1904
  "name": "SessionTitleEventData",
1885
1905
  "declaration": "export interface SessionTitleEventData {\n readonly title: string;\n readonly messageSeqs: SessionSeq[];\n readonly source: SessionTitleSource;\n}"
1886
1906
  },
1887
1907
  {
1888
- "name": "SessionTitleModelProvenance",
1889
- "declaration": "export interface SessionTitleModelProvenance {\n readonly provider: string;\n readonly model: string;\n}"
1908
+ "name": "SessionTitleModelIdentity",
1909
+ "declaration": "export interface SessionTitleModelIdentity {\n readonly provider: string;\n readonly model: string;\n}"
1890
1910
  },
1891
1911
  {
1892
1912
  "name": "SessionTitleProviderId",
@@ -1894,7 +1914,7 @@ export const TYPERT = {
1894
1914
  },
1895
1915
  {
1896
1916
  "name": "SessionTitleSource",
1897
- "declaration": "export type SessionTitleSource = { readonly kind: 'fallback'; } | { readonly kind: 'provider'; readonly provider: SessionTitleProviderId; readonly model?: SessionTitleModelProvenance; } | { readonly kind: 'user'; };"
1917
+ "declaration": "export type SessionTitleSource = { readonly kind: 'fallback'; } | { readonly kind: 'provider'; readonly provider: SessionTitleProviderId; readonly model?: SessionTitleModelIdentity; } | { readonly kind: 'user'; };"
1898
1918
  },
1899
1919
  {
1900
1920
  "name": "SessionUpdateQueueRequest",
@@ -2120,8 +2140,8 @@ export const TYPERT = {
2120
2140
  "declaration": "export interface AssistantMessage extends Message {\n readonly role: 'assistant';\n readonly source: ModelMessageSource;\n}"
2121
2141
  },
2122
2142
  {
2123
- "name": "AssistantProvenance",
2124
- "declaration": "export interface AssistantProvenance {\n provider: string;\n model: string;\n replayState?: unknown;\n}"
2143
+ "name": "AssistantProviderMetadata",
2144
+ "declaration": "export interface AssistantProviderMetadata {\n provider: string;\n model: string;\n replayState?: unknown;\n}"
2125
2145
  },
2126
2146
  {
2127
2147
  "name": "AssistantStreamRecord",
@@ -2261,12 +2281,16 @@ export const TYPERT = {
2261
2281
  },
2262
2282
  {
2263
2283
  "name": "ImageBlock",
2264
- "declaration": "export interface ImageBlock {\n type: 'image';\n attachment: ImageAttachmentRef;\n}"
2284
+ "declaration": "export interface ImageBlock {\n type: 'image';\n attachment: ImageAttachmentRef;\n offloaded?: true;\n}"
2265
2285
  },
2266
2286
  {
2267
2287
  "name": "ImageMediaType",
2268
2288
  "declaration": "export type ImageMediaType = 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif';"
2269
2289
  },
2290
+ {
2291
+ "name": "ImageOffloadTarget",
2292
+ "declaration": "export interface ImageOffloadTarget {\n seq: SessionSeq;\n imageIndexes: number[];\n}"
2293
+ },
2270
2294
  {
2271
2295
  "name": "Inbox",
2272
2296
  "declaration": "export interface Inbox {\n readonly nextTurn: readonly UserMessage[];\n readonly nextStep: readonly UserMessage[];\n clear(): void;\n append(target: InboxTarget, message: UserMessage): void;\n prepend(target: InboxTarget, message: UserMessage): void;\n replace(messageId: MessageId, newMessage: UserMessage): boolean;\n remove(messageId: MessageId): boolean;\n splice(target: InboxTarget, start: number, deleteCount: number, inserted: UserMessage[]): UserMessage[];\n}"
@@ -2289,7 +2313,7 @@ export const TYPERT = {
2289
2313
  },
2290
2314
  {
2291
2315
  "name": "LlmFailure",
2292
- "declaration": "export interface LlmFailure {\n readonly message: string;\n readonly code: string;\n readonly status?: number;\n readonly providerRetryAfterMs?: number;\n readonly requestId?: ProviderRequestId;\n}"
2316
+ "declaration": "export interface LlmFailure {\n readonly message: string;\n readonly code: string;\n readonly status?: number;\n readonly providerRetryAfterMs?: number;\n readonly requestId?: ProviderRequestId;\n readonly offloadImages?: number;\n}"
2293
2317
  },
2294
2318
  {
2295
2319
  "name": "Message",
@@ -2329,7 +2353,7 @@ export const TYPERT = {
2329
2353
  },
2330
2354
  {
2331
2355
  "name": "ModelMessageSource",
2332
- "declaration": "export interface ModelMessageSource extends AssistantProvenance {\n kind: 'model';\n}"
2356
+ "declaration": "export interface ModelMessageSource extends AssistantProviderMetadata {\n kind: 'model';\n}"
2333
2357
  },
2334
2358
  {
2335
2359
  "name": "ModelSelection",
@@ -2349,7 +2373,7 @@ export const TYPERT = {
2349
2373
  },
2350
2374
  {
2351
2375
  "name": "PtcDispatchEventData",
2352
- "declaration": "export interface PtcDispatchEventData extends PtcDispatchStartEventData {\n isError: boolean;\n content: ContentBlock[];\n}"
2376
+ "declaration": "export interface PtcDispatchEventData extends PtcDispatchStartEventData {\n isError: boolean;\n content: ContentBlock[];\n error?: { name: string; code: string; reason?: string; };\n}"
2353
2377
  },
2354
2378
  {
2355
2379
  "name": "PtcDispatchStartEventData",
@@ -2389,7 +2413,7 @@ export const TYPERT = {
2389
2413
  },
2390
2414
  {
2391
2415
  "name": "SessionEventMap",
2392
- "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 '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; }; 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 '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 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'model/selection': ModelSelection;\n 'subagent/descriptor': SubagentDescriptorData;\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'subagent/catalog': SubagentCatalogEvent;\n 'feedback/record': FeedbackRecord;\n 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\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}"
2416
+ "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 '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 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\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}"
2393
2417
  },
2394
2418
  {
2395
2419
  "name": "SessionEventType",
@@ -2421,15 +2445,15 @@ export const TYPERT = {
2421
2445
  },
2422
2446
  {
2423
2447
  "name": "SessionSurface",
2424
- "declaration": "export interface SessionSurface {\n readonly nodes: readonly SessionSeq[];\n readonly replaceGeneration: number;\n}"
2448
+ "declaration": "export interface SessionSurface {\n readonly nodes: readonly SessionSeq[];\n readonly replaceGeneration: number;\n readonly contentGeneration: number;\n}"
2425
2449
  },
2426
2450
  {
2427
2451
  "name": "SessionTitleEventData",
2428
2452
  "declaration": "export interface SessionTitleEventData {\n readonly title: string;\n readonly messageSeqs: SessionSeq[];\n readonly source: SessionTitleSource;\n}"
2429
2453
  },
2430
2454
  {
2431
- "name": "SessionTitleModelProvenance",
2432
- "declaration": "export interface SessionTitleModelProvenance {\n readonly provider: string;\n readonly model: string;\n}"
2455
+ "name": "SessionTitleModelIdentity",
2456
+ "declaration": "export interface SessionTitleModelIdentity {\n readonly provider: string;\n readonly model: string;\n}"
2433
2457
  },
2434
2458
  {
2435
2459
  "name": "SessionTitleProviderId",
@@ -2437,7 +2461,7 @@ export const TYPERT = {
2437
2461
  },
2438
2462
  {
2439
2463
  "name": "SessionTitleSource",
2440
- "declaration": "export type SessionTitleSource = { readonly kind: 'fallback'; } | { readonly kind: 'provider'; readonly provider: SessionTitleProviderId; readonly model?: SessionTitleModelProvenance; } | { readonly kind: 'user'; };"
2464
+ "declaration": "export type SessionTitleSource = { readonly kind: 'fallback'; } | { readonly kind: 'provider'; readonly provider: SessionTitleProviderId; readonly model?: SessionTitleModelIdentity; } | { readonly kind: 'user'; };"
2441
2465
  },
2442
2466
  {
2443
2467
  "name": "SkillInvocationSource",
@@ -2604,7 +2628,7 @@ export const TYPERT = {
2604
2628
  },
2605
2629
  {
2606
2630
  "name": "SkillEntry",
2607
- "declaration": "export interface SkillEntry {\n readonly name: string;\n readonly description: string;\n readonly whenToUse?: string;\n readonly modelInvocable: boolean;\n}"
2631
+ "declaration": "export interface SkillEntry {\n readonly path?: string;\n readonly name: string;\n readonly description: string;\n readonly whenToUse?: string;\n readonly modelInvocable: boolean;\n}"
2608
2632
  },
2609
2633
  {
2610
2634
  "name": "SkillListRequest",
@@ -25,6 +25,7 @@ const ContentBlockRemoteCodec$schema = z.union([z.object({
25
25
  'height': z.number(),
26
26
  }).optional(),
27
27
  }),
28
+ 'offloaded': z.literal(true).optional(),
28
29
  }), z.object({
29
30
  'type': z.literal("reasoning"),
30
31
  'text': z.string(),
@@ -132,6 +133,9 @@ const _deepseek_ai_dsh_api_session_controller_session_control_result$schema = z.
132
133
  'model': z.string().readonly(),
133
134
  'reasoningEffort': z.string().readonly().optional(),
134
135
  })]).readonly(),
136
+ }).optional(),
137
+ 'permissions': z.object({
138
+ 'currentValue': z.string(),
135
139
  }).optional(),
136
140
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
137
141
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -310,6 +314,9 @@ const _deepseek_ai_dsh_api_session_controller_session_follow_result$schema = z.u
310
314
  'model': z.string().readonly(),
311
315
  'reasoningEffort': z.string().readonly().optional(),
312
316
  })]).readonly(),
317
+ }).optional(),
318
+ 'permissions': z.object({
319
+ 'currentValue': z.string(),
313
320
  }).optional(),
314
321
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
315
322
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -454,6 +461,9 @@ const _deepseek_ai_dsh_api_session_controller_session_list_result$schema = z.obj
454
461
  'model': z.string().readonly(),
455
462
  'reasoningEffort': z.string().readonly().optional(),
456
463
  })]).readonly(),
464
+ }).optional(),
465
+ 'permissions': z.object({
466
+ 'currentValue': z.string(),
457
467
  }).optional(),
458
468
  'subagentCatalog': z.array(z.union([z.intersection(z.object({
459
469
  'id': z.intersection(z.string(), z.unknown()).readonly(),
@@ -651,6 +661,7 @@ const _deepseek_ai_dsh_api_session_controller_session_updateQueue_parameter_0$sc
651
661
  'height': z.number(),
652
662
  }).optional(),
653
663
  }),
664
+ 'offloaded': z.literal(true).optional(),
654
665
  }), z.object({
655
666
  'type': z.literal("reasoning"),
656
667
  'text': z.string(),
@@ -679,6 +690,7 @@ const _deepseek_ai_dsh_api_session_controller_skills_list_parameter_0$schema = z
679
690
  })
680
691
  const _deepseek_ai_dsh_api_session_controller_skills_list_result$schema = z.object({
681
692
  'skills': z.array(z.object({
693
+ 'path': z.string().readonly().optional(),
682
694
  'name': z.string().readonly(),
683
695
  'description': z.string().readonly(),
684
696
  'whenToUse': z.string().readonly().optional(),
@@ -753,7 +765,7 @@ export const TYPERT_REMOTE = {
753
765
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionAttachmentValue',
754
766
  schema: _deepseek_ai_dsh_api_session_controller_session_attachment_result$schema,
755
767
  },
756
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":357,"column":3},
768
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":358,"column":3},
757
769
  },
758
770
  {
759
771
  id: '@deepseek-ai/dsh-api-session-controller#session/cancel',
@@ -778,7 +790,7 @@ export const TYPERT_REMOTE = {
778
790
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionCancelValue',
779
791
  schema: _deepseek_ai_dsh_api_session_controller_session_cancel_result$schema,
780
792
  },
781
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":377,"column":3},
793
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":378,"column":3},
782
794
  },
783
795
  {
784
796
  id: '@deepseek-ai/dsh-api-session-controller#session/canOpenWorkspacePath',
@@ -793,7 +805,7 @@ export const TYPERT_REMOTE = {
793
805
  typeSymbol: '@deepseek-ai/dsh-api-session-controller#session/canOpenWorkspacePath:result',
794
806
  schema: _deepseek_ai_dsh_api_session_controller_session_canOpenWorkspacePath_result$schema,
795
807
  },
796
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":272,"column":3},
808
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":273,"column":3},
797
809
  },
798
810
  {
799
811
  id: '@deepseek-ai/dsh-api-session-controller#session/control',
@@ -810,7 +822,7 @@ export const TYPERT_REMOTE = {
810
822
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionControlFrame',
811
823
  schema: _deepseek_ai_dsh_api_session_controller_session_control_result$schema,
812
824
  },
813
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":410,"column":3},
825
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":411,"column":3},
814
826
  },
815
827
  {
816
828
  id: '@deepseek-ai/dsh-api-session-controller#session/create',
@@ -835,7 +847,7 @@ export const TYPERT_REMOTE = {
835
847
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionCreateValue',
836
848
  schema: _deepseek_ai_dsh_api_session_controller_session_create_result$schema,
837
849
  },
838
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":244,"column":3},
850
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":245,"column":3},
839
851
  },
840
852
  {
841
853
  id: '@deepseek-ai/dsh-api-session-controller#session/follow',
@@ -862,7 +874,7 @@ export const TYPERT_REMOTE = {
862
874
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionFollowFrame',
863
875
  schema: _deepseek_ai_dsh_api_session_controller_session_follow_result$schema,
864
876
  },
865
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":400,"column":3},
877
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":401,"column":3},
866
878
  },
867
879
  {
868
880
  id: '@deepseek-ai/dsh-api-session-controller#session/fork',
@@ -887,7 +899,7 @@ export const TYPERT_REMOTE = {
887
899
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionForkValue',
888
900
  schema: _deepseek_ai_dsh_api_session_controller_session_fork_result$schema,
889
901
  },
890
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":335,"column":3},
902
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":336,"column":3},
891
903
  },
892
904
  {
893
905
  id: '@deepseek-ai/dsh-api-session-controller#session/list',
@@ -913,7 +925,7 @@ export const TYPERT_REMOTE = {
913
925
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionListValue',
914
926
  schema: _deepseek_ai_dsh_api_session_controller_session_list_result$schema,
915
927
  },
916
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":223,"column":9},
928
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":224,"column":9},
917
929
  },
918
930
  {
919
931
  id: '@deepseek-ai/dsh-api-session-controller#session/modelCatalog',
@@ -928,7 +940,7 @@ export const TYPERT_REMOTE = {
928
940
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#ModelCatalog',
929
941
  schema: _deepseek_ai_dsh_api_session_controller_session_modelCatalog_result$schema,
930
942
  },
931
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":263,"column":3},
943
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":264,"column":3},
932
944
  },
933
945
  {
934
946
  id: '@deepseek-ai/dsh-api-session-controller#session/openWorkspacePath',
@@ -954,7 +966,7 @@ export const TYPERT_REMOTE = {
954
966
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionOpenWorkspacePathValue',
955
967
  schema: _deepseek_ai_dsh_api_session_controller_session_openWorkspacePath_result$schema,
956
968
  },
957
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":293,"column":9},
969
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":294,"column":9},
958
970
  },
959
971
  {
960
972
  id: '@deepseek-ai/dsh-api-session-controller#session/page',
@@ -980,7 +992,7 @@ export const TYPERT_REMOTE = {
980
992
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionPage',
981
993
  schema: _deepseek_ai_dsh_api_session_controller_session_page_result$schema,
982
994
  },
983
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":388,"column":3},
995
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":389,"column":3},
984
996
  },
985
997
  {
986
998
  id: '@deepseek-ai/dsh-api-session-controller#session/prompt',
@@ -1006,7 +1018,7 @@ export const TYPERT_REMOTE = {
1006
1018
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionPromptValue',
1007
1019
  schema: _deepseek_ai_dsh_api_session_controller_session_prompt_result$schema,
1008
1020
  },
1009
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":346,"column":3},
1021
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":347,"column":3},
1010
1022
  },
1011
1023
  {
1012
1024
  id: '@deepseek-ai/dsh-api-session-controller#session/rename',
@@ -1031,7 +1043,7 @@ export const TYPERT_REMOTE = {
1031
1043
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionRenameValue',
1032
1044
  schema: _deepseek_ai_dsh_api_session_controller_session_rename_result$schema,
1033
1045
  },
1034
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":325,"column":3},
1046
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":326,"column":3},
1035
1047
  },
1036
1048
  {
1037
1049
  id: '@deepseek-ai/dsh-api-session-controller#session/search',
@@ -1057,7 +1069,7 @@ export const TYPERT_REMOTE = {
1057
1069
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionSearchValue',
1058
1070
  schema: _deepseek_ai_dsh_api_session_controller_session_search_result$schema,
1059
1071
  },
1060
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":234,"column":3},
1072
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":235,"column":3},
1061
1073
  },
1062
1074
  {
1063
1075
  id: '@deepseek-ai/dsh-api-session-controller#session/selectModel',
@@ -1082,7 +1094,7 @@ export const TYPERT_REMOTE = {
1082
1094
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionSelectModelValue',
1083
1095
  schema: _deepseek_ai_dsh_api_session_controller_session_selectModel_result$schema,
1084
1096
  },
1085
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":254,"column":3},
1097
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":255,"column":3},
1086
1098
  },
1087
1099
  {
1088
1100
  id: '@deepseek-ai/dsh-api-session-controller#session/updateQueue',
@@ -1107,7 +1119,7 @@ export const TYPERT_REMOTE = {
1107
1119
  typeSymbol: '@deepseek-ai/dsh-api-session-controller/types#SessionUpdateQueueValue',
1108
1120
  schema: _deepseek_ai_dsh_api_session_controller_session_updateQueue_result$schema,
1109
1121
  },
1110
- sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":367,"column":3},
1122
+ sourceLocation: {"file":"packages/api/session-controller/src/index.ts","line":368,"column":3},
1111
1123
  },
1112
1124
  {
1113
1125
  id: '@deepseek-ai/dsh-api-session-controller#skills/list',
@@ -1,4 +1,4 @@
1
- /** Browser-owned time-zone sampling for prompt RPC provenance. */
1
+ /** Browser-owned time-zone sampling for one prompt RPC. */
2
2
  /**
3
3
  * Resolve the current browser IANA zone for one outbound operation.
4
4
  * @returns The browser-provided canonical zone.
@@ -1,4 +1,4 @@
1
- /** Browser-owned time-zone sampling for prompt RPC provenance. */
1
+ /** Browser-owned time-zone sampling for one prompt RPC. */
2
2
  /**
3
3
  * Resolve the current browser IANA zone for one outbound operation.
4
4
  * @returns The browser-provided canonical zone.
@@ -257,10 +257,7 @@ export class SessionCommandController {
257
257
  ? `session "${request.sessionId}" has not completed the turn containing event ${String(atSeq)}`
258
258
  : `session "${request.sessionId}" has no completed turn to fork from`, { sessionId: request.sessionId });
259
259
  }
260
- let cut = SessionLogOffset(boundary.seq + 1);
261
- while (cut < source.events.length && source.events[cut]?.type !== 'turn/start') {
262
- cut = SessionLogOffset(cut + 1);
263
- }
260
+ const cut = SessionLogOffset(boundary.seq + 1);
264
261
  let workspace;
265
262
  try {
266
263
  workspace = await this.forkWorkspace(source.header);
@@ -526,6 +523,7 @@ export class SessionCommandController {
526
523
  async readSessionState(sessionId) {
527
524
  const attached = this.ctx.sessions.get(sessionId);
528
525
  if (attached !== undefined) {
526
+ // oxlint-disable-next-line typescript/no-deprecated -- Existing Session history read; migration deferred.
529
527
  return { id: attached.id, header: attached.header, events: attached.snapshotEvents() };
530
528
  }
531
529
  const inspected = await inspectApiSession(this.ctx, sessionId);
@@ -566,6 +564,7 @@ function hasPromptRequest(agent, requestId) {
566
564
  };
567
565
  if (agent.inbox.nextTurn.some(matches) || agent.inbox.nextStep.some(matches))
568
566
  return true;
567
+ // oxlint-disable-next-line typescript/no-deprecated -- Existing Session history read; migration deferred.
569
568
  return agent.session.snapshotEvents().some((event) => {
570
569
  if (event.type !== 'user/message')
571
570
  return false;
@@ -167,6 +167,7 @@ export class SessionHistoryController {
167
167
  // Constructor seed events have no session/event notification. Normally
168
168
  // only the end-seed suffix is new; if persistence advanced after the
169
169
  // opening observation, replay everything beyond that snapshot cursor.
170
+ // oxlint-disable-next-line typescript/no-deprecated -- Existing Session history read; migration deferred.
170
171
  const suffix = session.snapshotEvents(snapshotCursor === undefined
171
172
  ? session.firstLiveSeq
172
173
  : SessionLogOffset(snapshotCursor + 1));
@@ -281,6 +281,7 @@ let SessionController = (() => {
281
281
  return Promise.resolve({
282
282
  meta: attached.header,
283
283
  inheritedEventCount: attached.inheritedEventCount,
284
+ // oxlint-disable-next-line typescript/no-deprecated -- Existing Session history read; migration deferred.
284
285
  events: attached.snapshotEvents(),
285
286
  });
286
287
  }
@@ -159,6 +159,7 @@ let SessionSkillCatalog = (() => {
159
159
  return {
160
160
  skills: skills.map(skill => ({
161
161
  name: skill.name,
162
+ ...skill.path === undefined ? {} : { path: skill.path },
162
163
  description: skill.description,
163
164
  ...skill.whenToUse === undefined ? {} : { whenToUse: skill.whenToUse },
164
165
  modelInvocable: skill.invocation.modelInvocable,
@@ -219,6 +219,8 @@ export interface SkillListRequest {
219
219
  }
220
220
  /** One skill available to the Session's human-facing composer. */
221
221
  export interface SkillEntry {
222
+ /** Absolute SKILL.md path when supplied by a filesystem provider. */
223
+ readonly path?: string;
222
224
  /** Kebab-case identifier referenced as `/name`. */
223
225
  readonly name: string;
224
226
  /** Short routing description. */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@crazx/dsh-api-session-controller",
3
3
  "description": "Session Remote commands, cold reads, and live control transport",
4
- "version": "0.1.5-rc.2.zw.1",
4
+ "version": "0.1.6-alpha.1.zw.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -47,7 +47,8 @@
47
47
  "@deepseek-ai/dsh-api-gateway/client"
48
48
  ],
49
49
  "inject": [
50
- "@deepseek-ai/dsh-api-gateway"
50
+ "@deepseek-ai/dsh-api-gateway",
51
+ "@deepseek-ai/dsh-client-file-upload"
51
52
  ],
52
53
  "platform": "web"
53
54
  }
@@ -64,42 +65,42 @@
64
65
  ],
65
66
  "license": "MIT",
66
67
  "dependencies": {
67
- "@deepseek-ai/dsh-brand": "^0.1.5-rc.2",
68
- "@deepseek-ai/dsh-deque": "^0.1.5-rc.2",
68
+ "@deepseek-ai/dsh-brand": "^0.1.6-alpha.1",
69
+ "@deepseek-ai/dsh-deque": "^0.1.6-alpha.1",
69
70
  "@deepseek-ai/schemastery": "^3.18.2",
70
71
  "mime-types": "^3.0.2",
71
72
  "zod": "^4.4.3"
72
73
  },
73
74
  "peerDependencies": {
74
75
  "@deepseek-ai/cordis": "^4.0.2",
75
- "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
76
- "@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.2.zw.1",
77
- "@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
78
- "@deepseek-ai/dsh-api-gateway": "^0.1.5-rc.2",
79
- "@deepseek-ai/dsh-attachment": "^0.1.5-rc.2",
80
- "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.2",
81
- "@deepseek-ai/dsh-client-file-upload": "^0.1.5-rc.2",
82
- "@deepseek-ai/dsh-commands": "^0.1.5-rc.2",
83
- "@deepseek-ai/dsh-file-reference": "^0.1.5-rc.2",
84
- "@deepseek-ai/dsh-fs": "^0.1.5-rc.2",
85
- "@deepseek-ai/dsh-jobs": "^0.1.5-rc.2",
86
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
87
- "@deepseek-ai/dsh-native-command": "^0.1.5-rc.2",
88
- "@deepseek-ai/dsh-scope": "^0.1.5-rc.2",
89
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
90
- "@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
91
- "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
92
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.5-rc.2",
93
- "@deepseek-ai/dsh-session-query": "^0.1.5-rc.2",
94
- "@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
95
- "@deepseek-ai/dsh-skill": "^0.1.5-rc.2",
96
- "@deepseek-ai/dsh-subagent": "^0.1.5-rc.2",
97
- "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.2",
98
- "@deepseek-ai/dsh-typert-registry": "^0.1.5-rc.2",
99
- "@deepseek-ai/dsh-util-time": "^0.1.5-rc.2",
100
- "@deepseek-ai/dsh-util-values": "^0.1.5-rc.2",
101
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.5-rc.2",
102
- "@deepseek-ai/dsh-workspace": "^0.1.5-rc.2"
76
+ "@deepseek-ai/dsh-agent": "^0.1.6-alpha.1",
77
+ "@deepseek-ai/dsh-agent-default-model": "0.1.6-alpha.1.zw.2",
78
+ "@deepseek-ai/dsh-agent-presets": "^0.1.6-alpha.1",
79
+ "@deepseek-ai/dsh-api-gateway": "^0.1.6-alpha.1",
80
+ "@deepseek-ai/dsh-attachment": "^0.1.6-alpha.1",
81
+ "@deepseek-ai/dsh-client-connection": "^0.1.6-alpha.1",
82
+ "@deepseek-ai/dsh-client-file-upload": "^0.1.6-alpha.1",
83
+ "@deepseek-ai/dsh-commands": "^0.1.6-alpha.1",
84
+ "@deepseek-ai/dsh-file-reference": "^0.1.6-alpha.1",
85
+ "@deepseek-ai/dsh-fs": "^0.1.6-alpha.1",
86
+ "@deepseek-ai/dsh-jobs": "^0.1.6-alpha.1",
87
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
88
+ "@deepseek-ai/dsh-native-command": "^0.1.6-alpha.1",
89
+ "@deepseek-ai/dsh-scope": "^0.1.6-alpha.1",
90
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
91
+ "@deepseek-ai/dsh-session-persistence": "^0.1.6-alpha.1",
92
+ "@deepseek-ai/dsh-session-projection": "^0.1.6-alpha.1",
93
+ "@deepseek-ai/dsh-session-projection-cache": "^0.1.6-alpha.1",
94
+ "@deepseek-ai/dsh-session-query": "^0.1.6-alpha.1",
95
+ "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.1",
96
+ "@deepseek-ai/dsh-skill": "^0.1.6-alpha.1",
97
+ "@deepseek-ai/dsh-subagent": "^0.1.6-alpha.1",
98
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
99
+ "@deepseek-ai/dsh-typert-registry": "^0.1.6-alpha.1",
100
+ "@deepseek-ai/dsh-util-time": "^0.1.6-alpha.1",
101
+ "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.1",
102
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.6-alpha.1",
103
+ "@deepseek-ai/dsh-workspace": "^0.1.6-alpha.1"
103
104
  },
104
105
  "peerDependenciesMeta": {
105
106
  "@deepseek-ai/dsh-jobs": {
@@ -114,43 +115,45 @@
114
115
  },
115
116
  "devDependencies": {
116
117
  "@deepseek-ai/cordis": "^4.0.2",
117
- "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
118
- "@deepseek-ai/dsh-agent-default-model": "npm:@crazx/dsh-agent-default-model@0.1.5-rc.2.zw.1",
119
- "@deepseek-ai/dsh-agent-loop": "^0.1.5-rc.2",
120
- "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.5-rc.2",
121
- "@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
122
- "@deepseek-ai/dsh-api-gateway": "^0.1.5-rc.2",
123
- "@deepseek-ai/dsh-attachment": "^0.1.5-rc.2",
124
- "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.2",
125
- "@deepseek-ai/dsh-client-file-upload": "^0.1.5-rc.2",
126
- "@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
127
- "@deepseek-ai/dsh-commands": "^0.1.5-rc.2",
128
- "@deepseek-ai/dsh-file-reference": "^0.1.5-rc.2",
129
- "@deepseek-ai/dsh-fs": "^0.1.5-rc.2",
130
- "@deepseek-ai/dsh-fs-local": "^0.1.5-rc.2",
131
- "@deepseek-ai/dsh-jobs": "^0.1.5-rc.2",
132
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
133
- "@deepseek-ai/dsh-native-command": "^0.1.5-rc.2",
134
- "@deepseek-ai/dsh-permission-presets": "^0.1.5-rc.2",
135
- "@deepseek-ai/dsh-scope": "^0.1.5-rc.2",
136
- "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
137
- "@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
138
- "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
139
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.5-rc.2",
140
- "@deepseek-ai/dsh-session-query": "^0.1.5-rc.2",
141
- "@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
142
- "@deepseek-ai/dsh-skill": "^0.1.5-rc.2",
143
- "@deepseek-ai/dsh-storage": "^0.1.5-rc.2",
144
- "@deepseek-ai/dsh-storage-domain": "^0.1.5-rc.2",
145
- "@deepseek-ai/dsh-storage-json": "^0.1.5-rc.2",
146
- "@deepseek-ai/dsh-subagent": "^0.1.5-rc.2",
147
- "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.2",
148
- "@deepseek-ai/dsh-typert-registry": "^0.1.5-rc.2",
149
- "@deepseek-ai/dsh-util-crypto": "^0.1.5-rc.2",
150
- "@deepseek-ai/dsh-util-time": "^0.1.5-rc.2",
151
- "@deepseek-ai/dsh-util-values": "^0.1.5-rc.2",
152
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.5-rc.2",
153
- "@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
118
+ "@deepseek-ai/dsh-agent": "^0.1.6-alpha.1",
119
+ "@deepseek-ai/dsh-agent-default-model": "npm:@crazx/dsh-agent-default-model@0.1.6-alpha.1.zw.2",
120
+ "@deepseek-ai/dsh-agent-loop": "^0.1.6-alpha.1",
121
+ "@deepseek-ai/dsh-agent-loop-testkit": "^0.1.6-alpha.1",
122
+ "@deepseek-ai/dsh-agent-presets": "^0.1.6-alpha.1",
123
+ "@deepseek-ai/dsh-api-gateway": "^0.1.6-alpha.1",
124
+ "@deepseek-ai/dsh-attachment": "^0.1.6-alpha.1",
125
+ "@deepseek-ai/dsh-client-connection": "^0.1.6-alpha.1",
126
+ "@deepseek-ai/dsh-client-file-upload": "^0.1.6-alpha.1",
127
+ "@deepseek-ai/dsh-client-store": "^0.1.6-alpha.1",
128
+ "@deepseek-ai/dsh-client-test-runtime": "npm:@crazx/dsh-client-test-runtime@0.1.6-alpha.1.zw.2",
129
+ "@deepseek-ai/dsh-commands": "^0.1.6-alpha.1",
130
+ "@deepseek-ai/dsh-file-reference": "^0.1.6-alpha.1",
131
+ "@deepseek-ai/dsh-fs": "^0.1.6-alpha.1",
132
+ "@deepseek-ai/dsh-fs-local": "^0.1.6-alpha.1",
133
+ "@deepseek-ai/dsh-jobs": "^0.1.6-alpha.1",
134
+ "@deepseek-ai/dsh-llm": "^0.1.6-alpha.1",
135
+ "@deepseek-ai/dsh-native-command": "^0.1.6-alpha.1",
136
+ "@deepseek-ai/dsh-permission-presets": "^0.1.6-alpha.1",
137
+ "@deepseek-ai/dsh-remote-mock": "^0.1.6-alpha.1",
138
+ "@deepseek-ai/dsh-scope": "^0.1.6-alpha.1",
139
+ "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
140
+ "@deepseek-ai/dsh-session-persistence": "^0.1.6-alpha.1",
141
+ "@deepseek-ai/dsh-session-projection": "^0.1.6-alpha.1",
142
+ "@deepseek-ai/dsh-session-projection-cache": "^0.1.6-alpha.1",
143
+ "@deepseek-ai/dsh-session-query": "^0.1.6-alpha.1",
144
+ "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.1",
145
+ "@deepseek-ai/dsh-skill": "^0.1.6-alpha.1",
146
+ "@deepseek-ai/dsh-storage": "^0.1.6-alpha.1",
147
+ "@deepseek-ai/dsh-storage-domain": "^0.1.6-alpha.1",
148
+ "@deepseek-ai/dsh-storage-json": "^0.1.6-alpha.1",
149
+ "@deepseek-ai/dsh-subagent": "^0.1.6-alpha.1",
150
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
151
+ "@deepseek-ai/dsh-typert-registry": "^0.1.6-alpha.1",
152
+ "@deepseek-ai/dsh-util-crypto": "^0.1.6-alpha.1",
153
+ "@deepseek-ai/dsh-util-time": "^0.1.6-alpha.1",
154
+ "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.1",
155
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.6-alpha.1",
156
+ "@deepseek-ai/dsh-workspace": "^0.1.6-alpha.1",
154
157
  "@types/mime-types": "^3.0.1"
155
158
  },
156
159
  "scripts": {