@chatcode/chatcode-cli 3.0.4-rc.1 → 3.0.4-rc.3

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.
Files changed (136) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +2 -0
  3. package/README.zh.md +2 -0
  4. package/lib/{command-errors-BkCHTQHj.js → command-errors-BJ_ZWzUU.js} +12 -12
  5. package/lib/{command-trees-5HFyC5sI.js → command-trees-C9b7-bci.js} +2 -2
  6. package/lib/{component-identity-De91VHwW.js → component-identity-Jb1DYjke.js} +3 -3
  7. package/lib/{dist-CsDWUvQ4.js → dist-w_sIm4VD.js} +231 -231
  8. package/lib/{extension-events-CdYCRP0o.js → extension-events-DKX4LXOd.js} +26 -26
  9. package/lib/{frames-DOX-Jgk8.js → frames-B89znn_0.js} +4 -4
  10. package/lib/{host-access-Bk4xps5E.js → host-access-CMg6rsWt.js} +1 -1
  11. package/lib/{keymap-CJ1kvLR2.js → keymap-CrC4pSNH.js} +2 -2
  12. package/lib/{plugin-XR7ncbnW.js → plugin-CmyMCGfb.js} +1651 -1365
  13. package/lib/{scenes-CAmWncZD.js → scenes-Cil9RnwU.js} +3 -3
  14. package/lib/{settings-sections-CakcvBv9.js → settings-sections-jVCqXwdH.js} +3 -3
  15. package/lib/{statusBarSettings-BPPS_Usm.js → statusBarSettings-DNoBH3Cq.js} +3 -3
  16. package/lib/{supports-color-DyChQwlI.js → supports-color-CcW-FGjr.js} +2 -2
  17. package/lib/{themes-OjcUpZzw.js → themes-BdgeY3It.js} +12 -12
  18. package/lib/tui-compat-command-trees.js +1 -1
  19. package/lib/tui-compat-extensions.js +3 -3
  20. package/lib/tui-compat-plugin-host.js +5 -5
  21. package/lib/tui-compat-scenes.js +1 -1
  22. package/lib/tui-compat-settings-sections.js +1 -1
  23. package/lib/tui-compat-working-activity.js +4 -4
  24. package/lib/tui-compat-workspaces.js +1 -1
  25. package/lib/tui-compat.js +5 -5
  26. package/lib/{workspaces-XY7UdfXp.js → workspaces-DOatJRYr.js} +2 -2
  27. package/package.json +30 -29
  28. package/runtime/manifest.json +2 -2
  29. package/runtime/node_modules/@deepseek-ai/dsh-agent-default-model/lib/index.js +118 -22
  30. package/runtime/node_modules/@deepseek-ai/dsh-agent-default-model/lib/types/index.d.ts +20 -3
  31. package/runtime/node_modules/@deepseek-ai/dsh-api-remotes/lib/client.js +113 -39
  32. package/runtime/node_modules/@deepseek-ai/dsh-api-remotes/lib/index.js +4 -0
  33. package/runtime/node_modules/@deepseek-ai/dsh-api-remotes/lib/types/remote-events.d.ts +3 -0
  34. package/runtime/node_modules/@deepseek-ai/dsh-api-remotes/lib/types/remote-events.js +1 -0
  35. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/index.js +173 -34
  36. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/typert.host.js +48 -28
  37. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/typert.remote-client.js +24 -19
  38. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/agent.d.ts +9 -1
  39. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/agent.js +36 -6
  40. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/archived-session-gate.js +1 -1
  41. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/catalog.js +4 -1
  42. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/client/sessions/service.d.ts +1 -1
  43. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/commands.d.ts +2 -2
  44. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/commands.js +24 -8
  45. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/index.d.ts +4 -3
  46. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/index.js +31 -14
  47. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/list.d.ts +6 -0
  48. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/list.js +89 -4
  49. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/remote-events.d.ts +1 -1
  50. package/runtime/node_modules/@deepseek-ai/dsh-api-session-controller/lib/types/types.d.ts +18 -1
  51. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/client.js +30 -0
  52. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/index.js +83 -2
  53. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/typert.host.js +104 -11
  54. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/typert.remote-client.d.ts +5 -1
  55. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/typert.remote-client.js +78 -11
  56. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/client/model.d.ts +14 -1
  57. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/client/model.js +17 -0
  58. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/client/service.d.ts +15 -0
  59. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/client/service.js +12 -0
  60. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/commands.d.ts +13 -1
  61. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/commands.js +44 -2
  62. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/index.d.ts +13 -1
  63. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/index.js +22 -0
  64. package/runtime/node_modules/@deepseek-ai/dsh-api-workspace-controller/lib/types/types.d.ts +17 -0
  65. package/runtime/node_modules/@deepseek-ai/dsh-app-boot/lib/index.js +2 -1
  66. package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/index.js +167 -44
  67. package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/index.d.ts +14 -6
  68. package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/linux-lock.d.ts +18 -0
  69. package/runtime/node_modules/@deepseek-ai/dsh-atomic-write/lib/types/windows-lock.d.ts +7 -0
  70. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/client.js +931 -7
  71. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/index.js +57 -19
  72. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/types/client/index.d.ts +5 -2
  73. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/types/config.d.ts +12 -0
  74. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/types/events.d.ts +4 -4
  75. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/lib/types/index.d.ts +3 -8
  76. package/runtime/node_modules/@deepseek-ai/dsh-client-hmr/package.json +6 -2
  77. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-commands/lib/client.js +10 -0
  78. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-deliverables/lib/types/client/present-open.d.ts +1 -1
  79. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-model-selection/lib/client.js +8 -4
  80. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-account/lib/client.js +2 -2
  81. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-settings-general/lib/client.js +1 -1
  82. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-sidebar/lib/client.js +1 -1
  83. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/client.js +1917 -206
  84. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/ArchivedSessions.d.ts +13 -0
  85. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/contract/slots.d.ts +4 -0
  86. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/locales.d.ts +40 -0
  87. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/recent.d.ts +11 -0
  88. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/rows/RecentList.d.ts +15 -0
  89. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/rows/Rows.d.ts +6 -1
  90. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/session-actions/DeleteSession.d.ts +24 -0
  91. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/stores.d.ts +2 -2
  92. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/lib/types/client/tree.d.ts +15 -13
  93. package/runtime/node_modules/@deepseek-ai/dsh-client-ui-workspace/package.json +3 -1
  94. package/runtime/node_modules/@deepseek-ai/dsh-commands/lib/index.js +16 -0
  95. package/runtime/node_modules/@deepseek-ai/dsh-commands/lib/typert.host.js +7 -3
  96. package/runtime/node_modules/@deepseek-ai/dsh-commands/lib/typert.remote-client.js +6 -2
  97. package/runtime/node_modules/@deepseek-ai/dsh-commands/lib/types/index.js +20 -0
  98. package/runtime/node_modules/@deepseek-ai/dsh-commands/lib/types/types.d.ts +5 -0
  99. package/runtime/node_modules/@deepseek-ai/dsh-cordis-client-runner/lib/client.js +5 -2
  100. package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/adapter.d.ts +1 -1
  101. package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek/lib/types/config.d.ts +3 -3
  102. package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek-account/lib/types/config.d.ts +2 -2
  103. package/runtime/node_modules/@deepseek-ai/dsh-llm-deepseek-api-key/lib/types/config.d.ts +2 -2
  104. package/runtime/node_modules/@deepseek-ai/dsh-schedule/lib/index.js +4 -0
  105. package/runtime/node_modules/@deepseek-ai/dsh-schedule/lib/typert.host.js +5 -5
  106. package/runtime/node_modules/@deepseek-ai/dsh-schedule/lib/typert.remote-client.js +5 -5
  107. package/runtime/node_modules/@deepseek-ai/dsh-schedule/lib/types/index.js +5 -0
  108. package/runtime/node_modules/@deepseek-ai/dsh-session/lib/types/index.d.ts +21 -0
  109. package/runtime/node_modules/@deepseek-ai/dsh-session-persistence/lib/index.js +12 -0
  110. package/runtime/node_modules/@deepseek-ai/dsh-session-persistence/lib/types/index.d.ts +15 -0
  111. package/runtime/node_modules/@deepseek-ai/dsh-session-persistence-jsonl/lib/index.js +95 -2
  112. package/runtime/node_modules/@deepseek-ai/dsh-session-persistence-jsonl/lib/types/index.d.ts +3 -1
  113. package/runtime/node_modules/@deepseek-ai/dsh-session-projection-cache/lib/index.js +25 -1
  114. package/runtime/node_modules/@deepseek-ai/dsh-session-projection-cache/lib/types/index.d.ts +1 -0
  115. package/runtime/node_modules/@deepseek-ai/dsh-session-projection-cache/package.json +2 -1
  116. package/runtime/node_modules/@deepseek-ai/dsh-session-query/lib/index.js +13 -0
  117. package/runtime/node_modules/@deepseek-ai/dsh-session-query/lib/types/observation.d.ts +5 -0
  118. package/runtime/node_modules/@deepseek-ai/dsh-session-query-sqlite/lib/index.js +26 -0
  119. package/runtime/node_modules/@deepseek-ai/dsh-session-query-sqlite/package.json +2 -1
  120. package/runtime/node_modules/@deepseek-ai/dsh-storage-domain/lib/index.js +5 -1
  121. package/runtime/node_modules/@deepseek-ai/dsh-storage-domain/lib/types/domain.d.ts +2 -2
  122. package/runtime/node_modules/@deepseek-ai/dsh-subagent/lib/types/control.d.ts +1 -1
  123. package/runtime/node_modules/@deepseek-ai/dsh-tianti/lib/index.js +106 -56
  124. package/runtime/node_modules/@deepseek-ai/dsh-tianti/lib/types/config.d.ts +2 -2
  125. package/runtime/node_modules/@deepseek-ai/dsh-tianti/lib/types/index.d.ts +2 -1
  126. package/runtime/node_modules/@deepseek-ai/dsh-tianti/lib/types/services/tianti/config.d.ts +4 -2
  127. package/runtime/node_modules/@deepseek-ai/dsh-tianti/lib/types/tools.d.ts +2 -2
  128. package/runtime/node_modules/@deepseek-ai/dsh-tianti/package.json +2 -0
  129. package/runtime/node_modules/@deepseek-ai/dsh-tool-cordis/lib/types/api-catalog.js +104 -13
  130. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/index.js +215 -4
  131. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/invariant.js +6 -1
  132. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/types/index.d.ts +31 -0
  133. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/types/index.js +219 -2
  134. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/types/spec.d.ts +4 -0
  135. package/runtime/node_modules/@deepseek-ai/dsh-workspace/lib/types/spec.js +4 -0
  136. package/scripts/launch.mjs +8 -0
@@ -121,15 +121,14 @@ function environmentSwitch(name) {
121
121
  throw new Error(`${name} must be a boolean switch.`);
122
122
  }
123
123
  /** Get tianti runtime config for Tianti operations.
124
- * @returns The invocation's configured endpoints and current integration switches. */
125
- function getTiantiRuntimeConfig() {
126
- const runtime = operation().runtime;
127
- const settings = getInitialSettings().tianti;
128
- const enabled = environmentSwitch("TIANTI_ENABLED") ?? settings?.enabled ?? runtime.config.enabled;
124
+ * @param runtime Mounted Tianti runtime; defaults to the current invocation.
125
+ * @returns The runtime's configured endpoints and effective integration switches. */
126
+ function getTiantiRuntimeConfig(runtime = operation().runtime) {
127
+ const enabled = environmentSwitch("TIANTI_ENABLED") ?? runtime.switches.enabled ?? runtime.config.enabled;
129
128
  return {
130
129
  enabled,
131
130
  enableModelTools: enabled && runtime.config.enableModelTools,
132
- enableWriteActions: environmentSwitch("TIANTI_WRITE_ACTIONS_ENABLED") ?? settings?.enableWriteActions ?? false,
131
+ enableWriteActions: environmentSwitch("TIANTI_WRITE_ACTIONS_ENABLED") ?? runtime.switches.enableWriteActions ?? runtime.config.enableWriteActions,
133
132
  environment: "prod",
134
133
  baseUrl: runtime.config.baseUrl.replace(/\/+$/u, "")
135
134
  };
@@ -2313,7 +2312,15 @@ async function handleList(flags) {
2313
2312
  async function call$1(args) {
2314
2313
  const parsed = parseArgs(args);
2315
2314
  const [command, subCommand, third] = parsed.positionals;
2316
- if (!command || command === "help" || command === "-h") return text$1(help$1());
2315
+ if (!command) return text$1([
2316
+ `天梯功能当前${getTiantiRuntimeConfig().enabled ? "已开启(on)" : "已关闭(off)"},默认关闭。`,
2317
+ "",
2318
+ " /tianti on 打开天梯功能",
2319
+ " /tianti off 关闭天梯功能",
2320
+ "",
2321
+ "开启后可使用天梯相关功能;运行 /tianti help 查看完整命令。"
2322
+ ].join("\n"));
2323
+ if (command === "help" || command === "-h") return text$1(help$1());
2317
2324
  if (command === "status") return handleStatus$1();
2318
2325
  if (command === "on" || command === "enable") {
2319
2326
  await updateTiantiSettings({
@@ -4922,7 +4929,7 @@ function getLatestRunMessage() {
4922
4929
  return "没有找到本地研发流程记录。可以先运行 /tianti-deliver latest 或 /tianti-deliver workitem <id> --title <title>。";
4923
4930
  }
4924
4931
  function ensureTiantiEnabled() {
4925
- if (!getTiantiRuntimeConfig().enabled) return "Tianti integration is off. Run /tianti on before using /tianti-deliver latest.";
4932
+ if (!getTiantiRuntimeConfig().enabled) return "Tianti integration is off. Run /tianti on before using /tianti-deliver.";
4926
4933
  }
4927
4934
  async function createAndSaveRun(workItem, scenario) {
4928
4935
  return saveDevelopmentRun(createDevelopmentRun({
@@ -4931,8 +4938,6 @@ async function createAndSaveRun(workItem, scenario) {
4931
4938
  }));
4932
4939
  }
4933
4940
  async function handleLatest(flags) {
4934
- const disabled = ensureTiantiEnabled();
4935
- if (disabled) return text(disabled);
4936
4941
  const workItem = latestTaskToWorkItem(await createTiantiClient().getLatestDevelopmentTaskForCurrentUser({ includeDetail: true }));
4937
4942
  if (!workItem) return text("没有读取到可交付的天梯开发任务。");
4938
4943
  if (isCompletedWorkItemState(workItem.stateName)) return text(`最新开发任务 ${workItem.id} 当前状态为「${workItem.stateName}」,已完成任务不会进入研发交付流程。请指定一个新建或活动中的开发任务。`);
@@ -5182,6 +5187,8 @@ async function call(args) {
5182
5187
  const parsed = parseArgs(args);
5183
5188
  const [command] = parsed.positionals;
5184
5189
  if (!command || command === "help" || command === "-h") return text(help());
5190
+ const disabled = ensureTiantiEnabled();
5191
+ if (disabled) return text(disabled);
5185
5192
  if (command === "latest") return handleLatest(parsed.flags);
5186
5193
  if (command === "workitem" || command === "task") return handleWorkItem(parsed);
5187
5194
  if (command === "status") return handleStatus(void 0, parsed.positionals[1] ?? taskIdFlag(parsed));
@@ -5218,7 +5225,7 @@ async function call(args) {
5218
5225
  //#region lib/types/config.js
5219
5226
  /** Deployment configuration for the Tianti integration. */
5220
5227
  const Config = z.object({
5221
- enabled: z.boolean().default(true),
5228
+ enabled: z.boolean().default(false),
5222
5229
  enableWriteActions: z.boolean().default(false),
5223
5230
  enableModelTools: z.boolean().default(true),
5224
5231
  baseUrl: z.string().default("https://devops.chinaunicom.cn"),
@@ -5251,10 +5258,10 @@ const id = {
5251
5258
  required: true,
5252
5259
  description: "Tianti numeric id/globalId, rather than the internal Mongo _id."
5253
5260
  };
5254
- /** Install reversible model tools with invocation-owned cancellation.
5261
+ /** Install model tools for one enabled Tianti activation; its owner unregisters them on off.
5255
5262
  * @param ctx Harness tool registry.
5256
5263
  * @param runtime Plugin-owned endpoint and switch state.
5257
- * @param signal Plugin lifetime cancellation.
5264
+ * @param signal Cancellation for this activation, aborted on off or plugin disposal.
5258
5265
  * @param track Track active work until plugin disposal settles.
5259
5266
  * @returns Registration disposers, removed before active work is drained.
5260
5267
  */
@@ -5397,13 +5404,18 @@ function validateEndpoint(value) {
5397
5404
  /** Register migrated commands without changing the agent loop or existing model providers.
5398
5405
  * @param ctx Harness command and tool registries.
5399
5406
  * @param config Deployment endpoints, switches, and timeouts.
5407
+ * @returns Startup after persisted switches and command descriptions are ready.
5400
5408
  */
5401
- function apply(ctx, config) {
5409
+ async function apply(ctx, config) {
5402
5410
  validateEndpoint(config.baseUrl);
5403
5411
  validateEndpoint(config.cvpApiBaseUrl);
5404
5412
  const runtime = new TiantiRuntime(ctx, config);
5413
+ await runtime.loadSwitches();
5405
5414
  const lifetime = new AbortController();
5406
5415
  const active = /* @__PURE__ */ new Set();
5416
+ const switchCommands = [];
5417
+ let disposeModelTools;
5418
+ let appliedState;
5407
5419
  const track = (task) => {
5408
5420
  active.add(task);
5409
5421
  task.then(() => active.delete(task), () => active.delete(task));
@@ -5416,56 +5428,94 @@ function apply(ctx, config) {
5416
5428
  cwd: invocation.agent.session.header.cwd ?? process.cwd()
5417
5429
  }, async () => {
5418
5430
  await runtime.loadSwitches();
5419
- return {
5420
- kind: "success",
5421
- text: (await command(invocation.rawInput)).value
5422
- };
5431
+ try {
5432
+ return {
5433
+ kind: "success",
5434
+ text: (await command(invocation.rawInput)).value
5435
+ };
5436
+ } finally {
5437
+ refreshIntegration();
5438
+ }
5423
5439
  }));
5440
+ const disposeSwitchCommands = () => {
5441
+ for (const dispose of switchCommands.splice(0)) dispose();
5442
+ };
5443
+ const unloadModelTools = () => {
5444
+ const disposal = disposeModelTools?.();
5445
+ disposeModelTools = void 0;
5446
+ runtime.auth.clear();
5447
+ return disposal;
5448
+ };
5449
+ const refreshIntegration = () => {
5450
+ if (lifetime.signal.aborted) return;
5451
+ const enabled = getTiantiRuntimeConfig(runtime).enabled;
5452
+ if (enabled === appliedState) return;
5453
+ const state = enabled ? "on" : "off";
5454
+ unloadModelTools();
5455
+ if (enabled && config.enableModelTools) {
5456
+ const activation = new AbortController();
5457
+ const signal = AbortSignal.any([lifetime.signal, activation.signal]);
5458
+ disposeModelTools = ctx.effect(function* () {
5459
+ yield ctx.on("tools/pre-execute", async (exec, next) => {
5460
+ if (exec.name !== "TiantiProjectSwitch") return next();
5461
+ const decision = await next();
5462
+ if (decision.kind !== "allow") return decision;
5463
+ return {
5464
+ kind: "ask",
5465
+ reason: "Switch the shared Tianti project context.",
5466
+ displayReason: {
5467
+ en: "Switch the Tianti project?",
5468
+ zh: "切换当前天梯项目?"
5469
+ }
5470
+ };
5471
+ });
5472
+ yield* installTools(ctx, runtime, signal, track);
5473
+ yield () => {
5474
+ activation.abort();
5475
+ };
5476
+ }, "enabled tianti model tools");
5477
+ }
5478
+ disposeSwitchCommands();
5479
+ for (const name of ["tianti", "tt"]) switchCommands.push(ctx.commands.register({
5480
+ name,
5481
+ description: `天梯功能(当前:${state},默认关闭):on 打开,off 关闭${name === "tt" ? "(/tianti 的别名)" : ""}`,
5482
+ handler: handler(call$1),
5483
+ input: {
5484
+ hint: `当前:${state} | on 打开 | off 关闭(默认关闭)`,
5485
+ suggestions: [{
5486
+ value: "on",
5487
+ description: `打开天梯功能${enabled ? "(当前:on)" : ""}`
5488
+ }, {
5489
+ value: "off",
5490
+ description: `关闭天梯功能${enabled ? "" : "(当前:off)"}`
5491
+ }]
5492
+ }
5493
+ }));
5494
+ appliedState = enabled;
5495
+ };
5424
5496
  ctx.effect(function* () {
5425
5497
  yield async () => {
5426
5498
  lifetime.abort();
5427
5499
  await Promise.allSettled(active);
5428
5500
  runtime.auth.clear();
5429
5501
  };
5430
- yield ctx.on("tools/pre-execute", async (exec, next) => {
5431
- if (exec.name !== "TiantiProjectSwitch") return next();
5432
- const decision = await next();
5433
- if (decision.kind !== "allow") return decision;
5434
- return {
5435
- kind: "ask",
5436
- reason: "Switch the shared Tianti project context.",
5437
- displayReason: {
5438
- en: "Switch the Tianti project?",
5439
- zh: "切换当前天梯项目?"
5440
- }
5441
- };
5442
- });
5443
- for (const command of [
5444
- {
5445
- name: "tianti",
5446
- description: "查询天梯任务、项目、SCM 和流水线,审核外部写操作",
5447
- handler: handler(call$1)
5448
- },
5449
- {
5450
- name: "tt",
5451
- description: "天梯工具箱(/tianti 的别名)",
5452
- handler: handler(call$1)
5453
- },
5454
- {
5455
- name: "tianti-deliver",
5456
- description: "引导天梯任务从需求、验证到研发交付",
5457
- handler: handler(call)
5458
- },
5459
- {
5460
- name: "td",
5461
- description: "天梯研发交付(/tianti-deliver 的别名)",
5462
- handler: handler(call)
5463
- }
5464
- ]) yield ctx.commands.register({
5465
- ...command,
5502
+ yield disposeSwitchCommands;
5503
+ yield unloadModelTools;
5504
+ refreshIntegration();
5505
+ for (const command of [{
5506
+ name: "tianti-deliver",
5507
+ description: "引导天梯任务从需求、验证到研发交付",
5508
+ handler: handler(call),
5466
5509
  input: { hint: "help | status | 子命令与参数" }
5467
- });
5468
- yield* installTools(ctx, runtime, lifetime.signal, track);
5510
+ }, {
5511
+ name: "td",
5512
+ description: "天梯研发交付(/tianti-deliver 的别名)",
5513
+ handler: handler(call),
5514
+ input: { hint: "help | status | 子命令与参数" }
5515
+ }]) yield ctx.commands.register(command);
5516
+ yield () => {
5517
+ lifetime.abort();
5518
+ };
5469
5519
  }, "tianti lifecycle");
5470
5520
  }
5471
5521
  //#endregion
@@ -2,11 +2,11 @@
2
2
  import z from '@deepseek-ai/schemastery';
3
3
  /** Tianti endpoints, switches, and bounded execution settings. */
4
4
  export interface Config {
5
- /** Enable Tianti resource commands without contacting the platform at boot. */
5
+ /** Initially enable Tianti; defaults off until the user runs /tianti on. */
6
6
  enabled: boolean;
7
7
  /** Allow execution of human-approved external write reviews. */
8
8
  enableWriteActions: boolean;
9
- /** Publish model-facing Tianti query and review-proposal tools. */
9
+ /** Register model-facing query and review-proposal tools only while Tianti is on. */
10
10
  enableModelTools: boolean;
11
11
  /** Tianti DevOps origin; HTTPS except for loopback test deployments. */
12
12
  baseUrl: string;
@@ -7,6 +7,7 @@ export declare const inject: string[];
7
7
  /** Register migrated commands without changing the agent loop or existing model providers.
8
8
  * @param ctx Harness command and tool registries.
9
9
  * @param config Deployment endpoints, switches, and timeouts.
10
+ * @returns Startup after persisted switches and command descriptions are ready.
10
11
  */
11
- export declare function apply(ctx: Context, config: Config): void;
12
+ export declare function apply(ctx: Context, config: Config): Promise<void>;
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,4 @@
1
+ import type { TiantiRuntime } from '../../runtime.ts';
1
2
  import type { TiantiRuntimeConfig } from './types.ts';
2
3
  /** Tianti write actions disabled message for Tianti operations.
3
4
  */
@@ -6,8 +7,9 @@ export declare const TIANTI_WRITE_ACTIONS_DISABLED_MESSAGE = "\u7814\u53D1\u5E73
6
7
  */
7
8
  export declare const TIANTI_WRITE_ACTIONS_ENABLED_MESSAGE = "\u7814\u53D1\u5E73\u53F0\u5199\u64CD\u4F5C\u6267\u884C\u6743\u9650\u5DF2\u5F00\u542F\u3002\u6240\u6709\u5916\u90E8\u5199\u64CD\u4F5C\u4ECD\u5FC5\u987B\u5148\u751F\u6210\u5BA1\u6838\u9879\uFF0C\u5E76\u901A\u8FC7 /tianti approve <reviewId> --execute \u660E\u786E\u6279\u51C6\u540E\u624D\u4F1A\u6267\u884C\u3002";
8
9
  /** Get tianti runtime config for Tianti operations.
9
- * @returns The invocation's configured endpoints and current integration switches. */
10
- export declare function getTiantiRuntimeConfig(): TiantiRuntimeConfig;
10
+ * @param runtime Mounted Tianti runtime; defaults to the current invocation.
11
+ * @returns The runtime's configured endpoints and effective integration switches. */
12
+ export declare function getTiantiRuntimeConfig(runtime?: TiantiRuntime): TiantiRuntimeConfig;
11
13
  /** Is tianti enabled for Tianti operations.
12
14
  * @returns Whether Tianti resource operations are enabled. */
13
15
  export declare function isTiantiEnabled(): boolean;
@@ -1,10 +1,10 @@
1
1
  /** Model-facing Tianti queries and review proposals; human commands execute writes. */
2
2
  import type { Context } from '@deepseek-ai/cordis';
3
3
  import { TiantiRuntime } from './runtime.ts';
4
- /** Install reversible model tools with invocation-owned cancellation.
4
+ /** Install model tools for one enabled Tianti activation; its owner unregisters them on off.
5
5
  * @param ctx Harness tool registry.
6
6
  * @param runtime Plugin-owned endpoint and switch state.
7
- * @param signal Plugin lifetime cancellation.
7
+ * @param signal Cancellation for this activation, aborted on off or plugin disposal.
8
8
  * @param track Track active work until plugin disposal settles.
9
9
  * @returns Registration disposers, removed before active work is drained.
10
10
  */
@@ -35,6 +35,8 @@
35
35
  "@deepseek-ai/dsh-home-paths": "workspace:*"
36
36
  },
37
37
  "devDependencies": {
38
+ "@deepseek-ai/dsh-agent-loop": "workspace:*",
39
+ "@deepseek-ai/dsh-session-projection": "workspace:*",
38
40
  "@deepseek-ai/dsh-bash-local": "workspace:*",
39
41
  "@deepseek-ai/dsh-subprocess-local": "workspace:*",
40
42
  "@deepseek-ai/cordis": "workspace:~",
@@ -20,20 +20,32 @@ export const SERVICE_API = [
20
20
  methods: [
21
21
  {
22
22
  signature: 'currentSelection(): ModelSelection',
23
- description: 'Read the current default model selection.',
23
+ description: 'Read the current default model selection. A first launch without a valid preference adopts the first complete Config default when it arrives; that process-local choice then stays cached.',
24
24
  parameters: [],
25
25
  returns: 'a detached provider, model, and optional reasoning selection.',
26
26
  },
27
+ {
28
+ signature: 'usesSharedPreference(): boolean',
29
+ description: 'Whether this product uses a process-local selection initialized from Home at startup.',
30
+ parameters: [],
31
+ returns: 'true for the integrated ChatCode CLI and Web profiles.',
32
+ },
33
+ {
34
+ signature: 'async resolveSelection(): Promise<ModelSelection>',
35
+ description: 'Resolve the cached route against the live catalog without reading or writing preferences. A first launch without a valid preference may adopt an advertised fallback until its first available default is resolved. Saved or initialized choices never switch implicitly. Catalog errors preserve the candidate for retry.',
36
+ parameters: [],
37
+ returns: 'the exact available selection, an unverified candidate, or an empty provider/model pair.',
38
+ },
27
39
  {
28
40
  signature: 'sharedDisplayName(): { provider: string; model: string; name: string } | undefined',
29
- description: 'Read the latest shared display name without changing this process\'s model selection.',
41
+ description: 'Read this process\'s cached display name without observing another process\'s saves.',
30
42
  parameters: [],
31
43
  returns: 'The saved provider/model/name tuple, or undefined for missing or invalid name metadata.',
32
44
  },
33
45
  {
34
- signature: 'async saveSelection(next: ModelSelection): Promise<void>',
35
- description: 'Save the complete default model selection to the shared ChatCode Home file, or the owning profile entry in other deployments. Saves commit in submission order; a failed save rejects its caller without blocking later saves. A shared save also retains an available catalog name; metadata failures do not reject the route save.',
36
- parameters: [{ name: 'next', description: 'resolved selection accepted by an entry point.' }],
46
+ signature: 'async saveSelection(next: ModelSelection, name?: string): Promise<void>',
47
+ description: 'Save the complete default model selection to the shared ChatCode Home file, or the owning profile entry in other deployments. Saves commit in submission order; a failed save rejects its caller without blocking later saves. A shared save uses the caller\'s already resolved catalog name without an additional lookup.',
48
+ parameters: [{ name: 'next', description: 'resolved selection accepted by an entry point.' }, { name: 'name', description: 'optional display name from the entry point\'s catalog.' }],
37
49
  returns: 'fulfillment after the preference or optional profile write settles.',
38
50
  },
39
51
  ],
@@ -1843,20 +1855,20 @@ export const SERVICE_API = [
1843
1855
  returns: 'authorized bounded Session search results.',
1844
1856
  },
1845
1857
  {
1846
- signature: '@Remote(\'create\') create(request: SessionCreateRequest): Promise<SessionCreateValue>',
1858
+ signature: '@Remote(\'create\') async create(request: SessionCreateRequest): Promise<SessionCreateValue>',
1847
1859
  description: 'Create or idempotently adopt one ordinary Session.',
1848
1860
  parameters: [{ name: 'request', description: 'requested identity, location, and Agent preset.' }],
1849
1861
  returns: 'the Session identity and resolved preset when configured.',
1850
1862
  },
1851
1863
  {
1852
1864
  signature: '@Remote(\'selectModel\') selectModel(request: SessionSelectModelRequest): Promise<SessionSelectModelValue>',
1853
- description: 'Select one Session-local model after explicitly resuming the Session; save the default in the background.',
1865
+ description: 'Select a model after explicitly resuming the Session and awaiting default persistence.',
1854
1866
  parameters: [{ name: 'request', description: 'Session identity and requested model selection.' }],
1855
- returns: 'the normalized selection installed for the Session, without waiting for default persistence.',
1867
+ returns: 'the normalized selection after the shared save and Session selection succeed.',
1856
1868
  },
1857
1869
  {
1858
1870
  signature: '@Remote async initializeDefaultModel(): Promise<void>',
1859
- description: 'Select the first available account model after login when no provider API key is configured.',
1871
+ description: 'Initialize legacy account deployments without changing a product process\'s cached selection.',
1860
1872
  parameters: [],
1861
1873
  returns: 'after saving the first available model or retaining the existing default.',
1862
1874
  },
@@ -1935,7 +1947,7 @@ export const SERVICE_API = [
1935
1947
  returns: 'one chronological page.',
1936
1948
  },
1937
1949
  {
1938
- signature: '@Remote({ mode: \'stream\' }) follow(request: SessionFollowRequest, signal: AbortSignal): AsyncIterable<SessionFollowFrame>',
1950
+ signature: '@Remote({ mode: \'stream\' }) async *follow(request: SessionFollowRequest, signal: AbortSignal): AsyncIterable<SessionFollowFrame>',
1939
1951
  description: 'Follow one Session log from its opening or resume cursor.',
1940
1952
  parameters: [{ name: 'request', description: 'durable address and last committed sequence already held by the caller.' }, { name: 'signal', description: 'cancellation owned by the Remote stream carrier.' }],
1941
1953
  returns: 'a complete opening snapshot followed by gap-free durable event frames and optional cursorless assistant-stream frames.',
@@ -2023,6 +2035,13 @@ export const SERVICE_API = [
2023
2035
  parameters: [{ name: 'options', description: 'optional cancellation.' }],
2024
2036
  returns: 'one snapshot per stored session.',
2025
2037
  },
2038
+ {
2039
+ signature: 'prepareDeletion(sessionIds: readonly SessionId[]): Promise<SessionDeletion>',
2040
+ description: 'Reserve every target\'s write ownership before any deletion is committed. The caller persists its recovery journal while this reservation is held, calls commit, and always disposes it to release ownership. Backends must retain deletion identities so old generations cannot reappear or be recreated.',
2041
+ parameters: [{ name: 'sessionIds', description: 'complete deletion scope, including owned descendants.' }],
2042
+ returns: 'an exclusive deletion reservation; missing targets are idempotent.',
2043
+ throws: ['when a writer holds any target, or the backend does not support deletion.'],
2044
+ },
2026
2045
  ],
2027
2046
  },
2028
2047
  {
@@ -3526,6 +3545,18 @@ export const SERVICE_API = [
3526
3545
  parameters: [{ name: 'request', description: 'Session identity to unarchive.' }],
3527
3546
  returns: 'the complete resulting archive set.',
3528
3547
  },
3548
+ {
3549
+ signature: '@Remote(\'sessionDeletionScope\') sessionDeletionScope(request: WorkspaceSessionDeletionPreviewRequest): Promise<WorkspaceSessionDeletionValue>',
3550
+ description: 'Preview the archived root and owned subagent Sessions covered by deletion.',
3551
+ parameters: [{ name: 'request', description: 'archived root to preview.' }],
3552
+ returns: 'complete deletion scope for confirmation.',
3553
+ },
3554
+ {
3555
+ signature: '@Remote(\'deleteSession\') deleteSession(request: WorkspaceSessionDeletionRequest): Promise<WorkspaceSessionDeletionValue>',
3556
+ description: 'Permanently remove an archived Session and its confirmed owned subagents.',
3557
+ parameters: [{ name: 'request', description: 'archived root and confirmed scope.' }],
3558
+ returns: 'identities permanently removed.',
3559
+ },
3529
3560
  {
3530
3561
  signature: '@Remote(\'pinSession\') pinSession(request: WorkspacePinSessionRequest): Promise<WorkspacePinValue>',
3531
3562
  description: 'Surface one known unarchived Session ahead of unpinned Sessions.',
@@ -3630,6 +3661,18 @@ export const SERVICE_API = [
3630
3661
  parameters: [{ name: 'id', description: 'Workspace to move.' }, { name: 'beforeId', description: 'Workspace anchor; omitted appends.' }],
3631
3662
  returns: 'the complete committed workspace order.',
3632
3663
  },
3664
+ {
3665
+ signature: 'deleteSession(sessionId: SessionId, expectedIds?: readonly SessionId[]): Promise<readonly SessionId[]>',
3666
+ description: 'Permanently delete an archived, inactive root and its owned subagent descendants. Independent forks are preserved. Reserve every writer before recording a recovery marker; a failure after that marker is retried on refresh or restart.',
3667
+ parameters: [{ name: 'sessionId', description: 'archived root identity; repeated deletion is idempotent.' }, { name: 'expectedIds', description: 'identities confirmed by the user; a changed scope refuses deletion.' }],
3668
+ returns: 'deleted root and descendant identities after durable cleanup.',
3669
+ },
3670
+ {
3671
+ signature: 'sessionDeletionScope(sessionId: SessionId): Promise<readonly SessionId[]>',
3672
+ description: 'Preview the root and owned descendants without opening their histories.',
3673
+ parameters: [{ name: 'sessionId', description: 'archived root to preview.' }],
3674
+ returns: 'identities to show in the deletion confirmation.',
3675
+ },
3633
3676
  {
3634
3677
  signature: 'archiveSession(sessionId: SessionId, options: ArchiveSessionOptions = {}): Promise<void>',
3635
3678
  description: 'Archive one session durably. The session must exist (live or in session persistence); its workspace accounting — or lack of one — is irrelevant. Without `stopActivity` the session must also be inactive: the `workspace/session-activity` waterfall is asked once, and any reported activity rejects with WorkspaceActiveSessionError before anything is written. With `stopActivity` the archive is written without an activity check, and the `workspace/session-stop` providers are then asked to stop the session\'s work: the durable archive set is what a provider\'s `agent/pre-step` gate reads, so every wake the stops induce is already blocked. Archiving drops the session\'s pin in the same durable write (pinning and archival are mutually exclusive). An already archived id resolves without writing, asking, or stopping.',
@@ -3801,6 +3844,14 @@ export const EVENT_API = [
3801
3844
  description: 'One Agent failed outside a durable turn position.',
3802
3845
  parameters: [{ name: 'sessionId', description: 'Agent and Session identity.' }, { name: 'message', description: 'user-safe failure chain.' }],
3803
3846
  },
3847
+ {
3848
+ name: 'api-session/model-updated',
3849
+ mode: 'emit',
3850
+ signature: '\'api-session/model-updated\'(): void',
3851
+ summary: 'The Host process committed a user-selected default; browser catalogs must reload from that process.',
3852
+ description: 'The Host process committed a user-selected default; browser catalogs must reload from that process.',
3853
+ parameters: [],
3854
+ },
3804
3855
  {
3805
3856
  name: 'api-session/removed',
3806
3857
  mode: 'emit',
@@ -4097,6 +4148,30 @@ export const EVENT_API = [
4097
4148
  description: 'Creation announcement during session publication. A synchronous throw vetoes and rolls back with a paired disposal; detach requested during dispatch is deferred. A returned-promise rejection is logged but cannot retroactively veto this synchronous boundary. Scope-filtered dispatch (`@deepseek-ai/dsh-scope`): agent-scoped listeners receive only sessions entered through that agent\'s context.',
4098
4149
  parameters: [{ name: 'session', description: 'the session just entered and announced.' }],
4099
4150
  },
4151
+ {
4152
+ name: 'session/delete-release',
4153
+ mode: 'parallel',
4154
+ signature: '\'session/delete-release\'(request: { readonly sessionIds: readonly SessionId[] }): Promise<void> | void',
4155
+ summary: 'Ask capability owners to release idle, archived Sessions before writer reservation.',
4156
+ description: 'Ask capability owners to release idle, archived Sessions before writer reservation. Owners release only handles they own; foreign or running Sessions remain protected.',
4157
+ parameters: [{ name: 'request', description: 'confirmed root and owned subagent identities.' }],
4158
+ },
4159
+ {
4160
+ name: 'session/deleted',
4161
+ mode: 'emit',
4162
+ signature: '\'session/deleted\'(sessionIds: readonly SessionId[]): void',
4163
+ summary: 'Permanent deletion observed locally or from shared storage.',
4164
+ description: 'Permanent deletion observed locally or from shared storage.',
4165
+ parameters: [{ name: 'sessionIds', description: 'removed identities, including owned descendants.' }],
4166
+ },
4167
+ {
4168
+ name: 'session/deleting',
4169
+ mode: 'parallel',
4170
+ signature: '\'session/deleting\'(request: { readonly sessionIds: readonly SessionId[] }): Promise<void> | void',
4171
+ summary: 'Permanently remove secondary Session records after stored payload deletion.',
4172
+ description: 'Permanently remove secondary Session records after stored payload deletion. Listeners are idempotent; failures leave the deletion journal pending for recovery.',
4173
+ parameters: [{ name: 'request', description: 'confirmed root and owned subagent identities.' }],
4174
+ },
4100
4175
  {
4101
4176
  name: 'session/disposed',
4102
4177
  mode: 'emit',
@@ -4666,7 +4741,7 @@ export const TYPE_API = [
4666
4741
  },
4667
4742
  {
4668
4743
  name: 'CommandInputDescriptor',
4669
- declaration: 'export interface CommandInputDescriptor {\n readonly hint: string;\n readonly attachments?: boolean;\n}',
4744
+ declaration: 'export interface CommandInputDescriptor {\n readonly hint: string;\n readonly suggestions?: readonly {\n readonly value: string;\n readonly description: string;\n }[];\n readonly attachments?: boolean;\n}',
4670
4745
  },
4671
4746
  {
4672
4747
  name: 'CommandInvocation',
@@ -5714,7 +5789,7 @@ export const TYPE_API = [
5714
5789
  },
5715
5790
  {
5716
5791
  name: 'ModelCatalog',
5717
- declaration: 'export interface ModelCatalog {\n readonly default: ModelSelection;\n readonly savedDisplayName?: {\n readonly provider: string;\n readonly model: string;\n readonly name: string;\n };\n readonly routableProviders: readonly string[];\n readonly groups: readonly ModelProviderGroup[];\n readonly failures: readonly ModelCatalogFailure[];\n}',
5792
+ declaration: 'export interface ModelCatalog {\n readonly default: ModelSelection;\n readonly selectionScope?: \'process\';\n readonly savedDisplayName?: {\n readonly provider: string;\n readonly model: string;\n readonly name: string;\n };\n readonly routableProviders: readonly string[];\n readonly groups: readonly ModelProviderGroup[];\n readonly failures: readonly ModelCatalogFailure[];\n}',
5718
5793
  },
5719
5794
  {
5720
5795
  name: 'ModelCatalogFailure',
@@ -6066,7 +6141,7 @@ export const TYPE_API = [
6066
6141
  },
6067
6142
  {
6068
6143
  name: 'RecordTable',
6069
- declaration: 'export type RecordTable<K extends string, V> = Pick<KvTable<K, V>, \'read\' | \'put\'>;',
6144
+ declaration: 'export type RecordTable<K extends string, V> = Pick<KvTable<K, V>, \'read\' | \'put\' | \'delete\'>;',
6070
6145
  },
6071
6146
  {
6072
6147
  name: 'RecurringScheduleRecord',
@@ -6408,6 +6483,10 @@ export const TYPE_API = [
6408
6483
  name: 'SessionCreateValue',
6409
6484
  declaration: 'export interface SessionCreateValue {\n readonly sessionId: SessionId;\n readonly agentPreset?: string;\n}',
6410
6485
  },
6486
+ {
6487
+ name: 'SessionDeletion',
6488
+ declaration: 'export interface SessionDeletion extends AsyncDisposable {\n commit(): Promise<void>;\n}',
6489
+ },
6411
6490
  {
6412
6491
  name: 'SessionEvent',
6413
6492
  declaration: 'export type SessionEvent<T extends SessionEventType = SessionEventType> = {\n [K in SessionEventType]: {\n type: K;\n seq: SessionSeq;\n time: number;\n data: SessionEventMap[K];\n ignorable?: true;\n } & (K extends SurfaceEventType ? SurfaceIntent<K> : {\n surfaceOp?: never;\n sourceEventSeqs?: never;\n });\n}[T];',
@@ -8028,6 +8107,18 @@ export const TYPE_API = [
8028
8107
  name: 'WorkspaceRenameRequest',
8029
8108
  declaration: 'export interface WorkspaceRenameRequest {\n readonly workspaceId: WorkspaceId;\n readonly title: string;\n}',
8030
8109
  },
8110
+ {
8111
+ name: 'WorkspaceSessionDeletionPreviewRequest',
8112
+ declaration: 'export interface WorkspaceSessionDeletionPreviewRequest {\n readonly sessionId: SessionId;\n}',
8113
+ },
8114
+ {
8115
+ name: 'WorkspaceSessionDeletionRequest',
8116
+ declaration: 'export interface WorkspaceSessionDeletionRequest extends WorkspaceSessionDeletionPreviewRequest {\n readonly expectedSessionIds: readonly SessionId[];\n}',
8117
+ },
8118
+ {
8119
+ name: 'WorkspaceSessionDeletionValue',
8120
+ declaration: 'export interface WorkspaceSessionDeletionValue {\n readonly sessionIds: readonly SessionId[];\n}',
8121
+ },
8031
8122
  {
8032
8123
  name: 'WorkspaceUnarchiveSessionRequest',
8033
8124
  declaration: 'export interface WorkspaceUnarchiveSessionRequest {\n readonly sessionId: SessionId;\n}',