@deepseek-harness-tui/dsh-tui 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +70 -24
  2. package/assets/whale-girl/whale-girl-dark.png +0 -0
  3. package/assets/whale-girl/whale-girl-happy.png +0 -0
  4. package/assets/whale-girl/whale-girl.png +0 -0
  5. package/bin/dsh-tui.js +93 -6
  6. package/cordis.patch.yml +63 -22
  7. package/cordis.yml +3 -2
  8. package/guide/dsh-tui-guide/SKILL.md +37 -0
  9. package/guide/dsh-tui-guide/configuration.en.md +410 -0
  10. package/guide/dsh-tui-guide/configuration.md +349 -0
  11. package/guide/dsh-tui-guide/getting-started.en.md +398 -0
  12. package/guide/dsh-tui-guide/getting-started.md +397 -0
  13. package/guide/dsh-tui-guide/interaction.en.md +674 -0
  14. package/guide/dsh-tui-guide/interaction.md +747 -0
  15. package/guide/dsh-tui-guide/migrate.en.md +166 -0
  16. package/guide/dsh-tui-guide/migrate.md +132 -0
  17. package/guide/dsh-tui-guide/plugins.en.md +68 -0
  18. package/guide/dsh-tui-guide/plugins.md +56 -0
  19. package/guide/dsh-tui-guide/themes.en.md +192 -0
  20. package/guide/dsh-tui-guide/themes.md +185 -0
  21. package/guide/dsh-tui-guide/user-guide.en.md +608 -0
  22. package/guide/dsh-tui-guide/user-guide.md +586 -0
  23. package/guide/dsh-tui-guide/vscode.en.md +301 -0
  24. package/guide/dsh-tui-guide/vscode.md +272 -0
  25. package/lib/settings.json +1272 -0
  26. package/lib/types/adapter/channel/ui-policy.d.ts +10 -2
  27. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  28. package/lib/types/adapter/channel/ui-policy.js +17 -0
  29. package/lib/types/adapter/kernel/replay.d.ts.map +1 -1
  30. package/lib/types/adapter/kernel/replay.js +2 -0
  31. package/lib/types/adapter/ports/channel-display.d.ts +12 -0
  32. package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
  33. package/lib/types/adapter/ports/channel-session.d.ts +38 -0
  34. package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
  35. package/lib/types/adapter/ports/channel-settings.d.ts +14 -1
  36. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  37. package/lib/types/adapter/ports/channel-ui.d.ts +75 -6
  38. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  39. package/lib/types/adapter/ports/channel-view.d.ts +86 -9
  40. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  41. package/lib/types/commands.d.ts.map +1 -1
  42. package/lib/types/commands.js +2 -0
  43. package/lib/types/components/BalanceReportRow.d.ts +10 -2
  44. package/lib/types/components/BalanceReportRow.d.ts.map +1 -1
  45. package/lib/types/components/BalanceReportRow.js +18 -4
  46. package/lib/types/components/Chat/JobCard.d.ts +9 -0
  47. package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
  48. package/lib/types/components/Chat/JobCard.js +42 -15
  49. package/lib/types/components/Chat/SubagentMessage.js +6 -6
  50. package/lib/types/components/CompactionStatusRow.d.ts +24 -0
  51. package/lib/types/components/CompactionStatusRow.d.ts.map +1 -0
  52. package/lib/types/components/CompactionStatusRow.js +72 -0
  53. package/lib/types/components/GoalTodoPanel.js +2 -2
  54. package/lib/types/components/HelpMenu.d.ts +2 -2
  55. package/lib/types/components/HelpMenu.d.ts.map +1 -1
  56. package/lib/types/components/HelpMenu.js +5 -4
  57. package/lib/types/components/InlineMathParagraph.d.ts +22 -0
  58. package/lib/types/components/InlineMathParagraph.d.ts.map +1 -0
  59. package/lib/types/components/InlineMathParagraph.js +178 -0
  60. package/lib/types/components/JobsPanel.d.ts.map +1 -1
  61. package/lib/types/components/JobsPanel.js +80 -33
  62. package/lib/types/components/LogoV2.d.ts +41 -3
  63. package/lib/types/components/LogoV2.d.ts.map +1 -1
  64. package/lib/types/components/LogoV2.js +148 -24
  65. package/lib/types/components/Markdown.d.ts +10 -3
  66. package/lib/types/components/Markdown.d.ts.map +1 -1
  67. package/lib/types/components/Markdown.js +47 -14
  68. package/lib/types/components/MathBlock.d.ts +13 -0
  69. package/lib/types/components/MathBlock.d.ts.map +1 -0
  70. package/lib/types/components/MathBlock.js +136 -0
  71. package/lib/types/components/MessageList.d.ts +10 -1
  72. package/lib/types/components/MessageList.d.ts.map +1 -1
  73. package/lib/types/components/MessageList.js +16 -7
  74. package/lib/types/components/MigratePicker.d.ts +30 -0
  75. package/lib/types/components/MigratePicker.d.ts.map +1 -0
  76. package/lib/types/components/MigratePicker.js +38 -0
  77. package/lib/types/components/PresetPicker.d.ts +4 -0
  78. package/lib/types/components/PresetPicker.d.ts.map +1 -1
  79. package/lib/types/components/PresetPicker.js +5 -1
  80. package/lib/types/components/PromptInput.d.ts +17 -0
  81. package/lib/types/components/PromptInput.d.ts.map +1 -1
  82. package/lib/types/components/PromptInput.js +60 -8
  83. package/lib/types/components/SplitDiffView.d.ts.map +1 -1
  84. package/lib/types/components/SplitDiffView.js +2 -1
  85. package/lib/types/components/StarPrompt.d.ts +59 -0
  86. package/lib/types/components/StarPrompt.d.ts.map +1 -0
  87. package/lib/types/components/StarPrompt.js +326 -0
  88. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
  89. package/lib/types/components/StreamingMarkdown.js +20 -3
  90. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  91. package/lib/types/components/SubagentCard.js +8 -8
  92. package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
  93. package/lib/types/components/SubagentDetailScene.js +108 -10
  94. package/lib/types/components/TimelineRail.d.ts.map +1 -1
  95. package/lib/types/components/TimelineRail.js +9 -1
  96. package/lib/types/components/Whale.d.ts +17 -8
  97. package/lib/types/components/Whale.d.ts.map +1 -1
  98. package/lib/types/components/Whale.js +25 -15
  99. package/lib/types/components/WhaleGirl.d.ts +35 -0
  100. package/lib/types/components/WhaleGirl.d.ts.map +1 -0
  101. package/lib/types/components/WhaleGirl.js +50 -0
  102. package/lib/types/components/WorkingSpinner.d.ts +4 -1
  103. package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
  104. package/lib/types/components/WorkingSpinner.js +2 -2
  105. package/lib/types/components/bigfont.d.ts +47 -18
  106. package/lib/types/components/bigfont.d.ts.map +1 -1
  107. package/lib/types/components/bigfont.js +55 -40
  108. package/lib/types/components/design-system/ThemeProvider.d.ts +6 -0
  109. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
  110. package/lib/types/components/design-system/ThemeProvider.js +40 -1
  111. package/lib/types/components/maidPortrait.d.ts +44 -0
  112. package/lib/types/components/maidPortrait.d.ts.map +1 -0
  113. package/lib/types/components/maidPortrait.js +178 -0
  114. package/lib/types/components/mathPreview.d.ts +25 -0
  115. package/lib/types/components/mathPreview.d.ts.map +1 -0
  116. package/lib/types/components/mathPreview.js +48 -0
  117. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
  118. package/lib/types/components/messages/AssistantThinkingMessage.js +6 -5
  119. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  120. package/lib/types/components/messages/AssistantToolUseMessage.js +3 -2
  121. package/lib/types/components/messages/TranscriptImages.d.ts.map +1 -1
  122. package/lib/types/components/messages/TranscriptImages.js +11 -1
  123. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +14 -2
  124. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  125. package/lib/types/components/questions/AskUserQuestionPanel.js +80 -38
  126. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  127. package/lib/types/components/questions/PlanReviewPanel.js +3 -3
  128. package/lib/types/components/sessions/ForeignSessionRow.d.ts +34 -0
  129. package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -0
  130. package/lib/types/components/sessions/ForeignSessionRow.js +43 -0
  131. package/lib/types/components/sessions/SourceTabs.d.ts +52 -0
  132. package/lib/types/components/sessions/SourceTabs.d.ts.map +1 -0
  133. package/lib/types/components/sessions/SourceTabs.js +70 -0
  134. package/lib/types/components/splashEggs.d.ts +56 -0
  135. package/lib/types/components/splashEggs.d.ts.map +1 -0
  136. package/lib/types/components/splashEggs.js +67 -0
  137. package/lib/types/components/splashFonts.d.ts +119 -0
  138. package/lib/types/components/splashFonts.d.ts.map +1 -0
  139. package/lib/types/components/splashFonts.js +267 -0
  140. package/lib/types/components/splashLayout.d.ts +41 -0
  141. package/lib/types/components/splashLayout.d.ts.map +1 -0
  142. package/lib/types/components/splashLayout.js +40 -0
  143. package/lib/types/components/trajectory/MiniWake.d.ts +11 -1
  144. package/lib/types/components/trajectory/MiniWake.d.ts.map +1 -1
  145. package/lib/types/components/trajectory/MiniWake.js +9 -3
  146. package/lib/types/components/whaleGirlSprite.d.ts +17 -0
  147. package/lib/types/components/whaleGirlSprite.d.ts.map +1 -0
  148. package/lib/types/components/whaleGirlSprite.js +47 -0
  149. package/lib/types/deepseekPricing.d.ts +74 -0
  150. package/lib/types/deepseekPricing.d.ts.map +1 -1
  151. package/lib/types/deepseekPricing.js +110 -11
  152. package/lib/types/dsh-adapter/channel/action-readiness.d.ts +1 -1
  153. package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
  154. package/lib/types/dsh-adapter/channel/action-readiness.js +6 -1
  155. package/lib/types/dsh-adapter/channel/background-action.d.ts +1 -0
  156. package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/background-action.js +1 -0
  158. package/lib/types/dsh-adapter/channel/binding-events.d.ts +8 -9
  159. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  160. package/lib/types/dsh-adapter/channel/binding-events.js +69 -21
  161. package/lib/types/dsh-adapter/channel/compaction.d.ts +2 -1
  162. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  163. package/lib/types/dsh-adapter/channel/compaction.js +35 -2
  164. package/lib/types/dsh-adapter/channel/external-commands.d.ts.map +1 -1
  165. package/lib/types/dsh-adapter/channel/external-commands.js +8 -2
  166. package/lib/types/dsh-adapter/channel/job-projection.d.ts +1 -0
  167. package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/job-projection.js +88 -3
  169. package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
  170. package/lib/types/dsh-adapter/channel/local-actions.js +6 -1
  171. package/lib/types/dsh-adapter/channel/mode-actions.d.ts +13 -0
  172. package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
  173. package/lib/types/dsh-adapter/channel/mode-actions.js +48 -7
  174. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  175. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +25 -9
  176. package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
  177. package/lib/types/dsh-adapter/channel/model-switch.js +5 -1
  178. package/lib/types/dsh-adapter/channel/paths.d.ts.map +1 -1
  179. package/lib/types/dsh-adapter/channel/paths.js +7 -1
  180. package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
  181. package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
  182. package/lib/types/dsh-adapter/channel/preferences.js +31 -5
  183. package/lib/types/dsh-adapter/channel/projection.d.ts +1 -2
  184. package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
  185. package/lib/types/dsh-adapter/channel/projection.js +127 -17
  186. package/lib/types/dsh-adapter/channel/question-record.d.ts +76 -0
  187. package/lib/types/dsh-adapter/channel/question-record.d.ts.map +1 -0
  188. package/lib/types/dsh-adapter/channel/question-record.js +107 -0
  189. package/lib/types/dsh-adapter/channel/session-lineage.d.ts +42 -0
  190. package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +1 -0
  191. package/lib/types/dsh-adapter/channel/session-lineage.js +51 -0
  192. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts +2 -0
  193. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts.map +1 -1
  194. package/lib/types/dsh-adapter/channel/session-live-adoption.js +9 -3
  195. package/lib/types/dsh-adapter/channel/session-metadata.d.ts +2 -1
  196. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  197. package/lib/types/dsh-adapter/channel/session-metadata.js +39 -7
  198. package/lib/types/dsh-adapter/channel/session-reset.d.ts +1 -1
  199. package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
  200. package/lib/types/dsh-adapter/channel/session-reset.js +7 -0
  201. package/lib/types/dsh-adapter/channel/session-resume.d.ts +1 -0
  202. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  203. package/lib/types/dsh-adapter/channel/session-resume.js +4 -2
  204. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  205. package/lib/types/dsh-adapter/channel/settings-host.js +8 -0
  206. package/lib/types/dsh-adapter/channel/state.d.ts +17 -2
  207. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  208. package/lib/types/dsh-adapter/channel/state.js +6 -1
  209. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts +30 -35
  210. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  211. package/lib/types/dsh-adapter/channel/subagent-projection.js +143 -4
  212. package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
  213. package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
  214. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  215. package/lib/types/dsh-adapter/channel.js +35 -5
  216. package/lib/types/dsh-adapter/compat/messages.d.ts +6 -0
  217. package/lib/types/dsh-adapter/compat/messages.d.ts.map +1 -1
  218. package/lib/types/dsh-adapter/compat/messages.js +9 -0
  219. package/lib/types/dsh-adapter/contract.d.ts +6 -5
  220. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  221. package/lib/types/dsh-adapter/contract.js +14 -6
  222. package/lib/types/dsh-adapter/index.d.ts +36 -1
  223. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  224. package/lib/types/dsh-adapter/index.js +22 -6
  225. package/lib/types/dsh-adapter/jobs.d.ts +82 -16
  226. package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
  227. package/lib/types/dsh-adapter/jobs.js +104 -9
  228. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts +3 -0
  229. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts.map +1 -0
  230. package/lib/types/dsh-adapter/migrate/adapters/claude-code.js +131 -0
  231. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts +17 -0
  232. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts.map +1 -0
  233. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.js +329 -0
  234. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts +3 -0
  235. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts.map +1 -0
  236. package/lib/types/dsh-adapter/migrate/adapters/codex.js +102 -0
  237. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts +16 -0
  238. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts.map +1 -0
  239. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.js +289 -0
  240. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts +3 -0
  241. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts.map +1 -0
  242. package/lib/types/dsh-adapter/migrate/adapters/grok-build.js +117 -0
  243. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts +13 -0
  244. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts.map +1 -0
  245. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.js +178 -0
  246. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts +3 -0
  247. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts.map +1 -0
  248. package/lib/types/dsh-adapter/migrate/adapters/omp.js +133 -0
  249. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts +60 -0
  250. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts.map +1 -0
  251. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.js +178 -0
  252. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts +8 -0
  253. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts.map +1 -0
  254. package/lib/types/dsh-adapter/migrate/adapters/scan.js +40 -0
  255. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts +3 -0
  256. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts.map +1 -0
  257. package/lib/types/dsh-adapter/migrate/adapters/zcode.js +93 -0
  258. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts +9 -0
  259. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts.map +1 -0
  260. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.js +89 -0
  261. package/lib/types/dsh-adapter/migrate/bin-path.d.ts +6 -0
  262. package/lib/types/dsh-adapter/migrate/bin-path.d.ts.map +1 -0
  263. package/lib/types/dsh-adapter/migrate/bin-path.js +30 -0
  264. package/lib/types/dsh-adapter/migrate/browse.d.ts +42 -0
  265. package/lib/types/dsh-adapter/migrate/browse.d.ts.map +1 -0
  266. package/lib/types/dsh-adapter/migrate/browse.js +90 -0
  267. package/lib/types/dsh-adapter/migrate/cli.d.ts +9 -0
  268. package/lib/types/dsh-adapter/migrate/cli.d.ts.map +1 -0
  269. package/lib/types/dsh-adapter/migrate/cli.js +106 -0
  270. package/lib/types/dsh-adapter/migrate/import-one.d.ts +89 -0
  271. package/lib/types/dsh-adapter/migrate/import-one.d.ts.map +1 -0
  272. package/lib/types/dsh-adapter/migrate/import-one.js +133 -0
  273. package/lib/types/dsh-adapter/migrate/index.d.ts +35 -0
  274. package/lib/types/dsh-adapter/migrate/index.d.ts.map +1 -0
  275. package/lib/types/dsh-adapter/migrate/index.js +107 -0
  276. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts +40 -0
  277. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts.map +1 -0
  278. package/lib/types/dsh-adapter/migrate/parse/injection.js +127 -0
  279. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +28 -0
  280. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -0
  281. package/lib/types/dsh-adapter/migrate/parse/jsonl.js +40 -0
  282. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts +28 -0
  283. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts.map +1 -0
  284. package/lib/types/dsh-adapter/migrate/parse/role-turns.js +50 -0
  285. package/lib/types/dsh-adapter/migrate/parse/title.d.ts +18 -0
  286. package/lib/types/dsh-adapter/migrate/parse/title.d.ts.map +1 -0
  287. package/lib/types/dsh-adapter/migrate/parse/title.js +29 -0
  288. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts +62 -0
  289. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts.map +1 -0
  290. package/lib/types/dsh-adapter/migrate/parse/tools.js +110 -0
  291. package/lib/types/dsh-adapter/migrate/picker.d.ts +64 -0
  292. package/lib/types/dsh-adapter/migrate/picker.d.ts.map +1 -0
  293. package/lib/types/dsh-adapter/migrate/picker.js +86 -0
  294. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts +40 -0
  295. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts.map +1 -0
  296. package/lib/types/dsh-adapter/migrate/recent-agents.js +100 -0
  297. package/lib/types/dsh-adapter/migrate/sessionize.d.ts +39 -0
  298. package/lib/types/dsh-adapter/migrate/sessionize.d.ts.map +1 -0
  299. package/lib/types/dsh-adapter/migrate/sessionize.js +271 -0
  300. package/lib/types/dsh-adapter/migrate/types.d.ts +176 -0
  301. package/lib/types/dsh-adapter/migrate/types.d.ts.map +1 -0
  302. package/lib/types/dsh-adapter/migrate/types.js +11 -0
  303. package/lib/types/dsh-adapter/migrate/uuid.d.ts +7 -0
  304. package/lib/types/dsh-adapter/migrate/uuid.d.ts.map +1 -0
  305. package/lib/types/dsh-adapter/migrate/uuid.js +25 -0
  306. package/lib/types/dsh-adapter/oauth/bonus.d.ts +27 -0
  307. package/lib/types/dsh-adapter/oauth/bonus.d.ts.map +1 -0
  308. package/lib/types/dsh-adapter/oauth/bonus.js +69 -0
  309. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.d.ts +2 -1
  310. package/lib/types/dsh-adapter/oauth/command.d.ts.map +1 -0
  311. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.js +7 -4
  312. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.d.ts +13 -10
  313. package/lib/types/dsh-adapter/oauth/credentials.d.ts.map +1 -0
  314. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.js +61 -23
  315. package/lib/types/dsh-adapter/oauth/deepseek.d.ts +39 -0
  316. package/lib/types/dsh-adapter/oauth/deepseek.d.ts.map +1 -0
  317. package/lib/types/dsh-adapter/oauth/deepseek.js +189 -0
  318. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.d.ts +24 -16
  319. package/lib/types/dsh-adapter/oauth/index.d.ts.map +1 -0
  320. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.js +34 -20
  321. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/interaction.d.ts +14 -12
  322. package/lib/types/dsh-adapter/oauth/interaction.d.ts.map +1 -0
  323. package/lib/types/dsh-adapter/oauth/interaction.js +283 -0
  324. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.d.ts +2 -1
  325. package/lib/types/dsh-adapter/oauth/opener.d.ts.map +1 -0
  326. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.js +1 -1
  327. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.d.ts +10 -3
  328. package/lib/types/dsh-adapter/oauth/pi-ai.d.ts.map +1 -0
  329. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.js +8 -3
  330. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.d.ts +6 -3
  331. package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -0
  332. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.js +11 -3
  333. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.d.ts +14 -7
  334. package/lib/types/dsh-adapter/oauth/service.d.ts.map +1 -0
  335. package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.js +82 -17
  336. package/lib/types/dsh-adapter/plugin.d.ts +12 -3
  337. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  338. package/lib/types/dsh-adapter/plugin.js +215 -376
  339. package/lib/types/dsh-adapter/presets.d.ts +6 -4
  340. package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
  341. package/lib/types/dsh-adapter/presets.js +6 -4
  342. package/lib/types/dsh-adapter/providerWizard.d.ts +17 -0
  343. package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
  344. package/lib/types/dsh-adapter/providerWizard.js +260 -68
  345. package/lib/types/dsh-adapter/questions.d.ts +22 -15
  346. package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
  347. package/lib/types/dsh-adapter/questions.js +47 -45
  348. package/lib/types/dsh-adapter/sessions/digest.d.ts +11 -6
  349. package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
  350. package/lib/types/dsh-adapter/sessions/digest.js +20 -13
  351. package/lib/types/dsh-adapter/sessions/frames.d.ts +3 -1
  352. package/lib/types/dsh-adapter/sessions/frames.d.ts.map +1 -1
  353. package/lib/types/dsh-adapter/sessions/frames.js +5 -4
  354. package/lib/types/dsh-adapter/sessions/list.d.ts +6 -1
  355. package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
  356. package/lib/types/dsh-adapter/sessions/list.js +188 -164
  357. package/lib/types/dsh-adapter/sessions/recovery.d.ts +16 -0
  358. package/lib/types/dsh-adapter/sessions/recovery.d.ts.map +1 -0
  359. package/lib/types/dsh-adapter/sessions/recovery.js +108 -0
  360. package/lib/types/dsh-adapter/sessions/snapshot.d.ts +7 -0
  361. package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -0
  362. package/lib/types/dsh-adapter/sessions/snapshot.js +90 -0
  363. package/lib/types/dsh-adapter/sessions/store.d.ts +10 -4
  364. package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
  365. package/lib/types/dsh-adapter/sessions/store.js +62 -25
  366. package/lib/types/dsh-adapter/sideQuestion.d.ts +41 -2
  367. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  368. package/lib/types/dsh-adapter/sideQuestion.js +98 -2
  369. package/lib/types/dsh-adapter/subagents.d.ts +29 -3
  370. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  371. package/lib/types/dsh-adapter/subagents.js +87 -3
  372. package/lib/types/herdr.d.ts +2 -0
  373. package/lib/types/herdr.d.ts.map +1 -1
  374. package/lib/types/herdr.js +9 -3
  375. package/lib/types/i18n.d.ts +598 -60
  376. package/lib/types/i18n.d.ts.map +1 -1
  377. package/lib/types/i18n.js +198 -31
  378. package/lib/types/ink/components/App.d.ts +2 -2
  379. package/lib/types/ink/components/App.d.ts.map +1 -1
  380. package/lib/types/ink/components/App.js +15 -2
  381. package/lib/types/ink/components/Image.d.ts +14 -1
  382. package/lib/types/ink/components/Image.d.ts.map +1 -1
  383. package/lib/types/ink/components/Image.js +2 -2
  384. package/lib/types/ink/events/input-event.js +3 -3
  385. package/lib/types/ink/hooks/use-terminal-images.d.ts +12 -0
  386. package/lib/types/ink/hooks/use-terminal-images.d.ts.map +1 -1
  387. package/lib/types/ink/hooks/use-terminal-images.js +13 -0
  388. package/lib/types/ink/ink.d.ts +6 -0
  389. package/lib/types/ink/ink.d.ts.map +1 -1
  390. package/lib/types/ink/ink.js +16 -1
  391. package/lib/types/ink/kitty-graphics.d.ts +44 -3
  392. package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
  393. package/lib/types/ink/kitty-graphics.js +184 -23
  394. package/lib/types/ink/output.d.ts +24 -2
  395. package/lib/types/ink/output.d.ts.map +1 -1
  396. package/lib/types/ink/output.js +83 -5
  397. package/lib/types/ink/parse-keypress.d.ts +61 -1
  398. package/lib/types/ink/parse-keypress.d.ts.map +1 -1
  399. package/lib/types/ink/parse-keypress.js +764 -93
  400. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  401. package/lib/types/ink/render-node-to-output.js +8 -1
  402. package/lib/types/ink/screen.d.ts +24 -0
  403. package/lib/types/ink/screen.d.ts.map +1 -1
  404. package/lib/types/ink/screen.js +89 -0
  405. package/lib/types/ink/selection.d.ts +40 -18
  406. package/lib/types/ink/selection.d.ts.map +1 -1
  407. package/lib/types/ink/selection.js +142 -30
  408. package/lib/types/ink/sixel-codec.d.ts +12 -1
  409. package/lib/types/ink/sixel-codec.d.ts.map +1 -1
  410. package/lib/types/ink/sixel-codec.js +29 -5
  411. package/lib/types/ink/sixel-graphics.d.ts.map +1 -1
  412. package/lib/types/ink/sixel-graphics.js +5 -3
  413. package/lib/types/ink/styles.d.ts +9 -0
  414. package/lib/types/ink/styles.d.ts.map +1 -1
  415. package/lib/types/ink/terminal-image.d.ts +8 -0
  416. package/lib/types/ink/terminal-image.d.ts.map +1 -1
  417. package/lib/types/ink/terminal-querier.d.ts +32 -1
  418. package/lib/types/ink/terminal-querier.d.ts.map +1 -1
  419. package/lib/types/ink/terminal-querier.js +54 -2
  420. package/lib/types/ink/timeline-rail.d.ts +5 -0
  421. package/lib/types/ink/timeline-rail.d.ts.map +1 -1
  422. package/lib/types/ink/update-overflow-guard.d.ts +24 -0
  423. package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
  424. package/lib/types/ink/update-overflow-guard.js +25 -3
  425. package/lib/types/math/inline-layout.d.ts +29 -0
  426. package/lib/types/math/inline-layout.d.ts.map +1 -0
  427. package/lib/types/math/inline-layout.js +106 -0
  428. package/lib/types/math/layout.d.ts +58 -0
  429. package/lib/types/math/layout.d.ts.map +1 -0
  430. package/lib/types/math/layout.js +59 -0
  431. package/lib/types/math/renderer.d.ts +64 -0
  432. package/lib/types/math/renderer.d.ts.map +1 -0
  433. package/lib/types/math/renderer.js +256 -0
  434. package/lib/types/minimalUiMode.d.ts +19 -0
  435. package/lib/types/minimalUiMode.d.ts.map +1 -0
  436. package/lib/types/minimalUiMode.js +23 -0
  437. package/lib/types/oauth.d.ts +5 -10
  438. package/lib/types/oauth.d.ts.map +1 -1
  439. package/lib/types/oauth.js +5 -10
  440. package/lib/types/screens/Chat.d.ts +17 -1
  441. package/lib/types/screens/Chat.d.ts.map +1 -1
  442. package/lib/types/screens/Chat.js +627 -54
  443. package/lib/types/screens/SessionSupervisor.d.ts +2 -1
  444. package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
  445. package/lib/types/screens/SessionSupervisor.js +156 -19
  446. package/lib/types/screens/Settings.d.ts.map +1 -1
  447. package/lib/types/screens/Settings.js +49 -11
  448. package/lib/types/screens/StatusLine.d.ts +4 -0
  449. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  450. package/lib/types/screens/StatusLine.js +57 -27
  451. package/lib/types/screens/chatOverlay.d.ts +5 -0
  452. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  453. package/lib/types/screens/chatOverlay.js +1 -0
  454. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +47 -0
  455. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -0
  456. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +65 -0
  457. package/lib/types/screens/sessionSupervisor/model.d.ts +12 -0
  458. package/lib/types/screens/sessionSupervisor/model.d.ts.map +1 -1
  459. package/lib/types/screens/sessionSupervisor/model.js +26 -0
  460. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts +107 -0
  461. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts.map +1 -0
  462. package/lib/types/screens/sessionSupervisor/useForeignSessions.js +312 -0
  463. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +4 -1
  464. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
  465. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +97 -14
  466. package/lib/types/sessionHistory.d.ts +2 -2
  467. package/lib/types/sessionHistory.d.ts.map +1 -1
  468. package/lib/types/sessionHistory.js +31 -5
  469. package/lib/types/settings/definitions.d.ts +681 -0
  470. package/lib/types/settings/definitions.d.ts.map +1 -0
  471. package/lib/types/settings/definitions.js +511 -0
  472. package/lib/types/starAction.d.ts +44 -0
  473. package/lib/types/starAction.d.ts.map +1 -0
  474. package/lib/types/starAction.js +52 -0
  475. package/lib/types/terminal-utils/latex.d.ts +10 -0
  476. package/lib/types/terminal-utils/latex.d.ts.map +1 -0
  477. package/lib/types/terminal-utils/latex.js +1417 -0
  478. package/lib/types/terminal-utils/markdown.d.ts +3 -1
  479. package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
  480. package/lib/types/terminal-utils/markdown.js +26 -1
  481. package/lib/types/terminal-utils/math.d.ts +66 -0
  482. package/lib/types/terminal-utils/math.d.ts.map +1 -0
  483. package/lib/types/terminal-utils/math.js +337 -0
  484. package/lib/types/tips.d.ts.map +1 -1
  485. package/lib/types/tips.js +16 -4
  486. package/lib/types/tuiDisplayPrefs.d.ts +67 -0
  487. package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
  488. package/lib/types/tuiDisplayPrefs.js +59 -0
  489. package/lib/types/ui.d.ts +1 -1
  490. package/lib/types/ui.d.ts.map +1 -1
  491. package/lib/types/ui.js +1 -1
  492. package/lib/types/update.js +2 -2
  493. package/lib/types/usageStats.d.ts +98 -0
  494. package/lib/types/usageStats.d.ts.map +1 -0
  495. package/lib/types/usageStats.js +169 -0
  496. package/lib/types/utils/bmp.d.ts +17 -0
  497. package/lib/types/utils/bmp.d.ts.map +1 -0
  498. package/lib/types/utils/bmp.js +154 -0
  499. package/lib/types/utils/clipboard.d.ts +14 -2
  500. package/lib/types/utils/clipboard.d.ts.map +1 -1
  501. package/lib/types/utils/clipboard.js +143 -8
  502. package/lib/types/utils/fold-long-lines.d.ts.map +1 -1
  503. package/lib/types/utils/fold-long-lines.js +2 -1
  504. package/lib/types/utils/keymap.d.ts +4 -1
  505. package/lib/types/utils/keymap.d.ts.map +1 -1
  506. package/lib/types/utils/keymap.js +8 -0
  507. package/lib/types/utils/modifiers.d.ts +4 -3
  508. package/lib/types/utils/modifiers.d.ts.map +1 -1
  509. package/lib/types/utils/modifiers.js +4 -3
  510. package/lib/types/utils/pastedImagePath.d.ts +8 -0
  511. package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
  512. package/lib/types/utils/pastedImagePath.js +29 -5
  513. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/LICENSE +202 -0
  514. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/NOTICE +20 -0
  515. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/index.d.ts +16 -0
  516. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/bundled-packages.json +4 -0
  517. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs +20 -0
  518. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs.LEGAL.txt +35 -0
  519. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/package.json +29 -0
  520. package/package.json +127 -102
  521. package/presets/liangshen/agent.cordis.yml +4 -1
  522. package/presets/liangshen/preset.yml +1 -1
  523. package/lib/types/minimalMode.d.ts +0 -13
  524. package/lib/types/minimalMode.d.ts.map +0 -1
  525. package/lib/types/minimalMode.js +0 -17
  526. package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +0 -21
  527. package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +0 -143
  528. package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +0 -11
  529. package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +0 -44
  530. package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +0 -193
  531. package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +0 -69
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Import ONE foreign conversation through the host's persistence service —
3
+ * the session screen's "select to start" path (the CLI batch keeps
4
+ * importSessions, which mounts its own backend).
5
+ *
6
+ * Order is chosen so a failure never leaves a half-written log that the
7
+ * next click would take for "already imported":
8
+ * 1. the deterministic id already exists → open it, nothing is written;
9
+ * 2. the working directory must exist (resuming into a missing cwd fails
10
+ * later and less clearly);
11
+ * 3. the whole conversation is parsed and sessionized in memory;
12
+ * 4. only then create → append → flush → close; a write failure removes
13
+ * what was written, best effort — except a create that lost to a
14
+ * concurrent writer of the same deterministic id: that log is the
15
+ * winner's, and the import simply opens it.
16
+ *
17
+ * @module @deepseek-harness-tui/dsh-tui/migrate/import-one
18
+ */
19
+ import { SessionId } from '@deepseek-ai/dsh-session';
20
+ import { existsSync } from 'node:fs';
21
+ import { deleteSessionLog } from '../compat/index.js';
22
+ import { sessionize } from './sessionize.js';
23
+ import { migrationUuid } from './uuid.js';
24
+ /** Deterministic DSH session id of one foreign conversation (same as /migrate). */
25
+ export function foreignSessionId(agentId, sourceId) {
26
+ return SessionId(migrationUuid(`${agentId}:${sourceId}`));
27
+ }
28
+ /**
29
+ * Write one sessionized conversation (the CLI batch path; the single import
30
+ * phases create/append itself so a create race stays out of its cleanup).
31
+ * Both paths produce byte-identical logs: sessionize is deterministic in
32
+ * the id and the events.
33
+ */
34
+ export async function writeImportedSession(persistence, id, agentId, session) {
35
+ const { header, events } = sessionize(id, agentId, session);
36
+ const handle = await persistence.create(header);
37
+ try {
38
+ await handle.append(events);
39
+ await handle.flush();
40
+ }
41
+ finally {
42
+ // A close failure must not mask an append/flush error, nor (on the
43
+ // single-import path) turn a completed write into a cleanup candidate.
44
+ await handle.close().catch(() => { });
45
+ }
46
+ }
47
+ async function exists(persistence, id) {
48
+ if (persistence.stat !== undefined)
49
+ return (await persistence.stat(id)) !== undefined;
50
+ return (await persistence.list()).some(entry => entry.header.id === id);
51
+ }
52
+ /**
53
+ * Import one conversation unless it is already present.
54
+ * @returns ready (with whether it was written now), cwd-missing, or failed.
55
+ */
56
+ export async function importForeignSession(persistence, adapter, request, deps = {}) {
57
+ const cwdExists = deps.cwdExists ?? existsSync;
58
+ let id = foreignSessionId(adapter.id, request.sessionKey);
59
+ if (await exists(persistence, id))
60
+ return { kind: 'ready', sessionId: id, created: false };
61
+ if (request.cwd !== '' && !cwdExists(request.cwd))
62
+ return { kind: 'cwd-missing', cwd: request.cwd };
63
+ if (adapter.load === undefined)
64
+ return { kind: 'failed', reason: 'not-a-session' };
65
+ const loaded = await adapter.load(request.ref);
66
+ if ('skip' in loaded)
67
+ return { kind: 'failed', reason: loaded.skip };
68
+ if (!cwdExists(loaded.cwd))
69
+ return { kind: 'cwd-missing', cwd: loaded.cwd };
70
+ // The artifact may have changed identity since it was listed; the id always
71
+ // follows what is actually imported, exactly as /migrate derives it.
72
+ if (loaded.sourceId !== request.sessionKey) {
73
+ id = foreignSessionId(adapter.id, loaded.sourceId);
74
+ if (await exists(persistence, id))
75
+ return { kind: 'ready', sessionId: id, created: false };
76
+ }
77
+ // create is its own phase: losing the race for the deterministic id to a
78
+ // concurrent writer (the /migrate batch, another TUI) means the log that is
79
+ // already there is theirs — complete or becoming complete — and never this
80
+ // failure's to delete. Any other create failure wrote nothing at all.
81
+ const { header, events } = sessionize(id, adapter.id, loaded);
82
+ let handle;
83
+ try {
84
+ handle = await persistence.create(header);
85
+ }
86
+ catch (error) {
87
+ if (await exists(persistence, id))
88
+ return { kind: 'ready', sessionId: id, created: false };
89
+ return { kind: 'failed', reason: 'write-failed', detail: error instanceof Error ? error.message : String(error) };
90
+ }
91
+ try {
92
+ await handle.append(events);
93
+ await handle.flush();
94
+ }
95
+ catch (error) {
96
+ await handle.close().catch(() => { });
97
+ (deps.discard ?? deleteSessionLog)(id);
98
+ return { kind: 'failed', reason: 'write-failed', detail: error instanceof Error ? error.message : String(error) };
99
+ }
100
+ await handle.close().catch(() => { });
101
+ return { kind: 'ready', sessionId: id, created: true };
102
+ }
103
+ /**
104
+ * One importer per host: a second request for a conversation already being
105
+ * imported joins the running one instead of starting another write.
106
+ *
107
+ * Requests are keyed by the conversation's IDENTITY (the id it will be written
108
+ * under), not by its locator: two artifacts of one source can carry the same
109
+ * source id (a Claude session continued in another project directory), and
110
+ * two concurrent writes to one id would have the loser's cleanup delete the
111
+ * winner's log. The locator is the key only when the identity is not known yet.
112
+ */
113
+ export function createForeignImporter(persistence, deps = {}) {
114
+ const inFlight = new Map();
115
+ return {
116
+ import(adapter, request) {
117
+ const key = request.sessionKey !== ''
118
+ ? `id:${foreignSessionId(adapter.id, request.sessionKey)}`
119
+ : `ref:${adapter.id}|${request.ref}`;
120
+ const running = inFlight.get(key);
121
+ if (running !== undefined)
122
+ return running;
123
+ const service = persistence();
124
+ if (service === undefined)
125
+ return Promise.resolve({ kind: 'failed', reason: 'write-failed', detail: 'session persistence unavailable' });
126
+ const started = importForeignSession(service, adapter, request, deps)
127
+ .catch((error) => ({ kind: 'failed', reason: 'write-failed', detail: error instanceof Error ? error.message : String(error) }))
128
+ .finally(() => inFlight.delete(key));
129
+ inFlight.set(key, started);
130
+ return started;
131
+ },
132
+ };
133
+ }
@@ -0,0 +1,35 @@
1
+ import { SessionId } from '@deepseek-ai/dsh-session';
2
+ import type { MigrationAdapter, MigrationSession } from './types.js';
3
+ export declare const MIGRATION_ADAPTERS: readonly MigrationAdapter[];
4
+ /**
5
+ * The default import target: the shared DSH session store, resolved exactly
6
+ * like the persistence backend's root (cordis.patch.yml): an explicit
7
+ * `DSH_TUI_SESSION_ROOT` first, then `$DSH_HOME/sessions`, then
8
+ * `~/.dsh/sessions`. Resolving it any other way would let the CLI import into
9
+ * a store the TUI (and the source tabs) never read.
10
+ */
11
+ export declare function defaultSessionRoot(): string;
12
+ /** Deterministic session id for one foreign conversation. */
13
+ export declare function migrationSessionId(adapter: MigrationAdapter, session: MigrationSession): SessionId;
14
+ export interface ImportRun {
15
+ readonly imported: number;
16
+ readonly existing: number;
17
+ readonly failed: number;
18
+ /** One-line cause per failed conversation, for the CLI summary. */
19
+ readonly failures: readonly string[];
20
+ }
21
+ /**
22
+ * Import every discovered conversation of one adapter into the DSH store.
23
+ *
24
+ * The persistence backend is mounted ONCE per run (one Context, one plugin
25
+ * lifecycle) and disposed after the loop; sessions already present (same
26
+ * deterministic id) are skipped, and a failed conversation never aborts the
27
+ * batch — both properties the retired-store migration established first.
28
+ *
29
+ * @param adapter - the foreign agent to import from.
30
+ * @param root - the DSH session root to write into.
31
+ * @param sessions - the conversations to import (usually adapter.discover()).
32
+ * @returns the per-run counters.
33
+ */
34
+ export declare function importSessions(adapter: MigrationAdapter, root: string, sessions: readonly MigrationSession[]): Promise<ImportRun>;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/migrate/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AASpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEpE,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAMzD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAElG;AAuBD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GACpC,OAAO,CAAC,SAAS,CAAC,CAkCpB"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Cross-agent conversation migration: orchestration over the official
3
+ * persistence backend.
4
+ *
5
+ * Discovery is read-only against foreign stores (adapters never write their
6
+ * source). Import goes EXCLUSIVELY through `JsonlSessionPersistence` — the
7
+ * same plugin the retired-store migration (scripts/migrate-sessions-to-jsonl.mts)
8
+ * writes through — so physical encoding, `projectKey`/directory layout, zstd
9
+ * frames, atomic writes and Windows path handling are upstream's, not ours.
10
+ * Re-importing the same source conversation deterministically lands on the
11
+ * same session id and is skipped when already present: repeats neither stack
12
+ * duplicates nor rewrite existing logs.
13
+ *
14
+ * @module @deepseek-harness-tui/dsh-tui/migrate
15
+ */
16
+ import { Context } from '@deepseek-ai/cordis';
17
+ import JsonlSessionPersistence from '@deepseek-ai/dsh-session-persistence-jsonl';
18
+ import { homedir } from 'node:os';
19
+ import { join } from 'node:path';
20
+ import { claudeCodeAdapter } from './adapters/claude-code.js';
21
+ import { codexAdapter } from './adapters/codex.js';
22
+ import { ompAdapter } from './adapters/omp.js';
23
+ import { grokBuildAdapter } from './adapters/grok-build.js';
24
+ import { zcodeAdapter } from './adapters/zcode.js';
25
+ import { foreignSessionId, writeImportedSession } from './import-one.js';
26
+ export const MIGRATION_ADAPTERS = [
27
+ claudeCodeAdapter,
28
+ codexAdapter,
29
+ ompAdapter,
30
+ zcodeAdapter,
31
+ grokBuildAdapter,
32
+ ];
33
+ /**
34
+ * The default import target: the shared DSH session store, resolved exactly
35
+ * like the persistence backend's root (cordis.patch.yml): an explicit
36
+ * `DSH_TUI_SESSION_ROOT` first, then `$DSH_HOME/sessions`, then
37
+ * `~/.dsh/sessions`. Resolving it any other way would let the CLI import into
38
+ * a store the TUI (and the source tabs) never read.
39
+ */
40
+ export function defaultSessionRoot() {
41
+ const override = process.env.DSH_TUI_SESSION_ROOT?.trim();
42
+ if (override)
43
+ return override;
44
+ const dshHome = process.env.DSH_HOME?.trim();
45
+ return join(dshHome ? dshHome : join(homedir(), '.dsh'), 'sessions');
46
+ }
47
+ /** Deterministic session id for one foreign conversation. */
48
+ export function migrationSessionId(adapter, session) {
49
+ return foreignSessionId(adapter.id, session.sourceId);
50
+ }
51
+ /** Wait until the plugin's service is published on the context. */
52
+ async function awaitPersistence(ctx) {
53
+ for (let i = 0; i < 200; i++) {
54
+ const service = ctx.get('sessionPersistence');
55
+ if (service !== undefined)
56
+ return service;
57
+ await new Promise(resolve => setTimeout(resolve, 25));
58
+ }
59
+ throw new Error('session persistence service did not become ready');
60
+ }
61
+ /**
62
+ * Import every discovered conversation of one adapter into the DSH store.
63
+ *
64
+ * The persistence backend is mounted ONCE per run (one Context, one plugin
65
+ * lifecycle) and disposed after the loop; sessions already present (same
66
+ * deterministic id) are skipped, and a failed conversation never aborts the
67
+ * batch — both properties the retired-store migration established first.
68
+ *
69
+ * @param adapter - the foreign agent to import from.
70
+ * @param root - the DSH session root to write into.
71
+ * @param sessions - the conversations to import (usually adapter.discover()).
72
+ * @returns the per-run counters.
73
+ */
74
+ export async function importSessions(adapter, root, sessions) {
75
+ const ctx = new Context();
76
+ const fiber = ctx.plugin(JsonlSessionPersistence, { root });
77
+ let imported = 0;
78
+ let existing = 0;
79
+ let failed = 0;
80
+ const failures = [];
81
+ try {
82
+ const persistence = await awaitPersistence(ctx);
83
+ const present = new Set((await persistence.list()).map(entry => entry.header.id));
84
+ for (const session of sessions) {
85
+ const id = migrationSessionId(adapter, session);
86
+ if (present.has(id)) {
87
+ existing += 1;
88
+ continue;
89
+ }
90
+ try {
91
+ await writeImportedSession(persistence, id, adapter.id, session);
92
+ present.add(id);
93
+ imported += 1;
94
+ }
95
+ catch (error) {
96
+ failed += 1;
97
+ failures.push(`${session.sourceId}: ${error instanceof Error ? error.message : String(error)}`);
98
+ }
99
+ }
100
+ }
101
+ finally {
102
+ // The mounted plugin fiber owns the backend's file handles; dispose it
103
+ // so a CLI process with nothing left to do can exit promptly.
104
+ await Promise.resolve(fiber.dispose()).catch(() => { });
105
+ }
106
+ return { imported, existing, failed, failures };
107
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Harness-injection recognition and user-text unwrapping.
3
+ *
4
+ * Every foreign agent writes machine text into its user role: environment
5
+ * blocks, instruction files, reminders, slash-command echoes. None of it is
6
+ * the human's words, so it must never open a turn or become a title. The
7
+ * other half is wrappers the harness puts AROUND real words (`<user_query>`,
8
+ * pasted-content envelopes, interrupt notices): those keep the words and
9
+ * drop the frame.
10
+ *
11
+ * Every scan here is linear: tag bodies are located with indexOf, never a
12
+ * lazy `[\s\S]*?` regex, whose per-unclosed-tag rescans a hostile single
13
+ * line can turn quadratic (deep-review m1 on the first claude adapter).
14
+ *
15
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/injection
16
+ */
17
+ /**
18
+ * Line-start markers of injected blocks, matched case-insensitively after
19
+ * trimming. A user text that STARTS with one of these is harness output.
20
+ */
21
+ export declare const INJECTED_PREFIXES: readonly string[];
22
+ /** Whether a user text is harness injection rather than the human's words. */
23
+ export declare function isInjectedText(text: string): boolean;
24
+ /** Strip inline `<system-reminder>` blocks (Claude Code puts them anywhere). */
25
+ export declare function stripSystemReminders(text: string): string;
26
+ /** Whether a user text is an interrupt notice (the previous turn was cut short). */
27
+ export declare function isInterruptNotice(text: string): boolean;
28
+ /**
29
+ * Reduce a user text to the human's own words.
30
+ *
31
+ * - `<user_query>` wrappers keep only their bodies — this also covers the
32
+ * interrupt / "sent a message while you were working" notices, whose
33
+ * human part is always inside a `<user_query>`;
34
+ * - a notice without a `<user_query>` keeps what follows the notice line;
35
+ * - pasted-content envelopes lose their tags but keep the pasted text.
36
+ *
37
+ * @returns The unwrapped, trimmed text ('' when nothing human remains).
38
+ */
39
+ export declare function unwrapUserText(text: string): string;
40
+ //# sourceMappingURL=injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/parse/injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAa9C,CAAA;AAID,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAsBD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzD;AAyBD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Harness-injection recognition and user-text unwrapping.
3
+ *
4
+ * Every foreign agent writes machine text into its user role: environment
5
+ * blocks, instruction files, reminders, slash-command echoes. None of it is
6
+ * the human's words, so it must never open a turn or become a title. The
7
+ * other half is wrappers the harness puts AROUND real words (`<user_query>`,
8
+ * pasted-content envelopes, interrupt notices): those keep the words and
9
+ * drop the frame.
10
+ *
11
+ * Every scan here is linear: tag bodies are located with indexOf, never a
12
+ * lazy `[\s\S]*?` regex, whose per-unclosed-tag rescans a hostile single
13
+ * line can turn quadratic (deep-review m1 on the first claude adapter).
14
+ *
15
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/injection
16
+ */
17
+ /**
18
+ * Line-start markers of injected blocks, matched case-insensitively after
19
+ * trimming. A user text that STARTS with one of these is harness output.
20
+ */
21
+ export const INJECTED_PREFIXES = [
22
+ '<environment_context>',
23
+ '<system-reminder>',
24
+ '<user_instructions>',
25
+ '<local-command-caveat>',
26
+ '<local-command-stdout>',
27
+ '<command-name>',
28
+ '<command-message>',
29
+ '<task-notification>',
30
+ '<permissions>',
31
+ '<user_info>',
32
+ '# AGENTS.md instructions',
33
+ '# Context from my IDE setup:',
34
+ ];
35
+ const LOWER_PREFIXES = INJECTED_PREFIXES.map(prefix => prefix.toLowerCase());
36
+ /** Whether a user text is harness injection rather than the human's words. */
37
+ export function isInjectedText(text) {
38
+ const head = text.trimStart().slice(0, 64).toLowerCase();
39
+ return LOWER_PREFIXES.some(prefix => head.startsWith(prefix));
40
+ }
41
+ /**
42
+ * Remove every `<tag>…</tag>` span. An opening tag with no closing tag
43
+ * swallows the rest of the text (the block was cut off, nothing after it is
44
+ * the user's).
45
+ */
46
+ function removeTagSpans(text, tag) {
47
+ const open = `<${tag}>`;
48
+ const close = `</${tag}>`;
49
+ let out = '';
50
+ let from = 0;
51
+ for (;;) {
52
+ const start = text.indexOf(open, from);
53
+ if (start === -1)
54
+ return out + text.slice(from);
55
+ out += text.slice(from, start);
56
+ const end = text.indexOf(close, start + open.length);
57
+ if (end === -1)
58
+ return out;
59
+ from = end + close.length;
60
+ }
61
+ }
62
+ /** Strip inline `<system-reminder>` blocks (Claude Code puts them anywhere). */
63
+ export function stripSystemReminders(text) {
64
+ if (!text.includes('<system-reminder>'))
65
+ return text.trim();
66
+ return removeTagSpans(text, 'system-reminder').trim();
67
+ }
68
+ /** Bodies of every `<user_query>` block; an unclosed tag runs to the end. */
69
+ function userQueryBodies(text) {
70
+ const open = '<user_query>';
71
+ const close = '</user_query>';
72
+ const bodies = [];
73
+ let from = 0;
74
+ for (;;) {
75
+ const start = text.indexOf(open, from);
76
+ if (start === -1)
77
+ return bodies;
78
+ const bodyStart = start + open.length;
79
+ const end = text.indexOf(close, bodyStart);
80
+ bodies.push(text.slice(bodyStart, end === -1 ? undefined : end).trim());
81
+ if (end === -1)
82
+ return bodies;
83
+ from = end + close.length;
84
+ }
85
+ }
86
+ /** Notices a harness prepends when the user speaks over a running turn. */
87
+ const INTERJECTION_PREFIXES = [
88
+ 'The user interrupted the previous turn:',
89
+ 'The user sent a message while you were working:',
90
+ ];
91
+ /** Whether a user text is an interrupt notice (the previous turn was cut short). */
92
+ export function isInterruptNotice(text) {
93
+ return text.trimStart().startsWith(INTERJECTION_PREFIXES[0]);
94
+ }
95
+ /** Drop `<pasted_content …>` / `</pasted_content …>` tags, keeping the pasted body. */
96
+ function stripPastedTags(text) {
97
+ if (!text.includes('pasted_content'))
98
+ return text;
99
+ return text.replace(/<\/?pasted_content(?:\s[^<>]*)?>/gu, ' ').replace(/[ \t]{2,}/gu, ' ');
100
+ }
101
+ /**
102
+ * Reduce a user text to the human's own words.
103
+ *
104
+ * - `<user_query>` wrappers keep only their bodies — this also covers the
105
+ * interrupt / "sent a message while you were working" notices, whose
106
+ * human part is always inside a `<user_query>`;
107
+ * - a notice without a `<user_query>` keeps what follows the notice line;
108
+ * - pasted-content envelopes lose their tags but keep the pasted text.
109
+ *
110
+ * @returns The unwrapped, trimmed text ('' when nothing human remains).
111
+ */
112
+ export function unwrapUserText(text) {
113
+ const lead = text.trimStart();
114
+ if (!text.includes('<') && !lead.startsWith('The user '))
115
+ return text.trim();
116
+ let body = text;
117
+ const queries = userQueryBodies(body);
118
+ if (queries.length > 0) {
119
+ body = queries.join('\n\n');
120
+ }
121
+ else {
122
+ const notice = INTERJECTION_PREFIXES.find(prefix => lead.startsWith(prefix));
123
+ if (notice !== undefined)
124
+ body = lead.slice(notice.length);
125
+ }
126
+ return stripPastedTags(body).trim();
127
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Line-delimited JSON reading shared by every migration source.
3
+ *
4
+ * Foreign stores are read defensively: a malformed line costs that line,
5
+ * never the file. Legal JSON that is not a record (`null`, scalars, arrays)
6
+ * is skipped silently — it is well-formed, just not a row — while text that
7
+ * fails to parse is COUNTED, so a truncated or corrupted source shows up in
8
+ * the import stats instead of vanishing quietly.
9
+ *
10
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/jsonl
11
+ */
12
+ /** A decoded JSON object row. */
13
+ export type JsonRecord = Record<string, unknown>;
14
+ /** Narrow an unknown JSON value to an object record (rejects `null` and arrays). */
15
+ export declare function isRecord(value: unknown): value is JsonRecord;
16
+ /** Parsed rows of one JSONL document. */
17
+ export interface JsonlRows {
18
+ readonly records: readonly JsonRecord[];
19
+ /** Non-empty lines that were not valid JSON. */
20
+ readonly badLines: number;
21
+ }
22
+ /**
23
+ * Split and decode a JSONL document.
24
+ * @param raw - Whole file text; `\n` and `\r\n` line ends are both accepted.
25
+ * @returns Every object row in file order plus the count of unparseable lines.
26
+ */
27
+ export declare function parseJsonl(raw: string): JsonlRows;
28
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/parse/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAE5D;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAA;IACvC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAgBjD"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Line-delimited JSON reading shared by every migration source.
3
+ *
4
+ * Foreign stores are read defensively: a malformed line costs that line,
5
+ * never the file. Legal JSON that is not a record (`null`, scalars, arrays)
6
+ * is skipped silently — it is well-formed, just not a row — while text that
7
+ * fails to parse is COUNTED, so a truncated or corrupted source shows up in
8
+ * the import stats instead of vanishing quietly.
9
+ *
10
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/jsonl
11
+ */
12
+ /** Narrow an unknown JSON value to an object record (rejects `null` and arrays). */
13
+ export function isRecord(value) {
14
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
15
+ }
16
+ /**
17
+ * Split and decode a JSONL document.
18
+ * @param raw - Whole file text; `\n` and `\r\n` line ends are both accepted.
19
+ * @returns Every object row in file order plus the count of unparseable lines.
20
+ */
21
+ export function parseJsonl(raw) {
22
+ const records = [];
23
+ let badLines = 0;
24
+ for (const line of raw.split('\n')) {
25
+ const text = line.endsWith('\r') ? line.slice(0, -1) : line;
26
+ if (text.trim() === '')
27
+ continue;
28
+ let value;
29
+ try {
30
+ value = JSON.parse(text);
31
+ }
32
+ catch {
33
+ badLines += 1;
34
+ continue;
35
+ }
36
+ if (isRecord(value))
37
+ records.push(value);
38
+ }
39
+ return { records, badLines };
40
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Flat role list → imported turns, plus the shared size measure.
3
+ *
4
+ * The first migration adapters normalized every source into an alternating
5
+ * user/assistant list. {@link fromRoleTurns} folds that list into the turn
6
+ * model mechanically — a user message opens a turn, every assistant message
7
+ * after it is one step — so an adapter that still produces the list imports
8
+ * exactly as it did before the turn model existed.
9
+ *
10
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/role-turns
11
+ */
12
+ import type { ImportStats, ImportTurn, MigrationSession, MigrationTurn } from '../types.js';
13
+ /** Counters for a source that reports nothing it left out. */
14
+ export declare function emptyStats(): ImportStats;
15
+ /**
16
+ * Fold a role list into turns.
17
+ *
18
+ * A list that starts with an assistant message opens a turn with no prompt
19
+ * (the source lost its head); a trailing user message is a step-less turn.
20
+ */
21
+ export declare function fromRoleTurns(list: readonly MigrationTurn[]): ImportTurn[];
22
+ /**
23
+ * How many conversation messages an imported session carries: prompts,
24
+ * mid-turn inputs and assistant steps (tool results are not counted). For a
25
+ * role-list source this equals the list length.
26
+ */
27
+ export declare function messageCount(session: Pick<MigrationSession, 'turns'>): number;
28
+ //# sourceMappingURL=role-turns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-turns.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/parse/role-turns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAe,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGxG,8DAA8D;AAC9D,wBAAgB,UAAU,IAAI,WAAW,CAExC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,GAAG,UAAU,EAAE,CAqB1E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,50 @@
1
+ import { newStep } from './tools.js';
2
+ /** Counters for a source that reports nothing it left out. */
3
+ export function emptyStats() {
4
+ return { badLines: 0, droppedToolResults: 0, filtered: 0, meta: 0 };
5
+ }
6
+ /**
7
+ * Fold a role list into turns.
8
+ *
9
+ * A list that starts with an assistant message opens a turn with no prompt
10
+ * (the source lost its head); a trailing user message is a step-less turn.
11
+ */
12
+ export function fromRoleTurns(list) {
13
+ const turns = [];
14
+ let current;
15
+ for (const message of list) {
16
+ if (message.role === 'user') {
17
+ current = { prompt: message.text, steps: [] };
18
+ turns.push(current);
19
+ continue;
20
+ }
21
+ if (current === undefined) {
22
+ current = { prompt: '', steps: [] };
23
+ turns.push(current);
24
+ }
25
+ const step = newStep(message.model);
26
+ const blocks = [];
27
+ if (message.reasoning !== undefined && message.reasoning !== '')
28
+ blocks.push({ type: 'reasoning', text: message.reasoning });
29
+ if (message.text !== '')
30
+ blocks.push({ type: 'text', text: message.text });
31
+ step.blocks = blocks;
32
+ current.steps.push(step);
33
+ }
34
+ return turns;
35
+ }
36
+ /**
37
+ * How many conversation messages an imported session carries: prompts,
38
+ * mid-turn inputs and assistant steps (tool results are not counted). For a
39
+ * role-list source this equals the list length.
40
+ */
41
+ export function messageCount(session) {
42
+ let count = 0;
43
+ for (const turn of session.turns) {
44
+ if (turn.prompt !== '')
45
+ count += 1;
46
+ for (const step of turn.steps)
47
+ count += 1 + step.inputs.length;
48
+ }
49
+ return count;
50
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Title normalization shared by every migration source.
3
+ *
4
+ * One rule for all sources, so the same conversation shows the same title
5
+ * whichever entry imported it: trim, collapse inner whitespace (a title is
6
+ * one line), cap at {@link TITLE_MAX_CHARS} code points with a trailing `…`.
7
+ *
8
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/title
9
+ */
10
+ /** Longest normalized title, in code points (the ellipsis included). */
11
+ export declare const TITLE_MAX_CHARS = 80;
12
+ /**
13
+ * Normalize a candidate title.
14
+ * @param text - Raw title or first prompt.
15
+ * @returns The one-line title, or '' when the input is blank.
16
+ */
17
+ export declare function normalizeTitle(text: string | undefined): string;
18
+ //# sourceMappingURL=title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/parse/title.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wEAAwE;AACxE,eAAO,MAAM,eAAe,KAAK,CAAA;AAIjC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ/D"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Title normalization shared by every migration source.
3
+ *
4
+ * One rule for all sources, so the same conversation shows the same title
5
+ * whichever entry imported it: trim, collapse inner whitespace (a title is
6
+ * one line), cap at {@link TITLE_MAX_CHARS} code points with a trailing `…`.
7
+ *
8
+ * @module @deepseek-harness-tui/dsh-tui/migrate/parse/title
9
+ */
10
+ /** Longest normalized title, in code points (the ellipsis included). */
11
+ export const TITLE_MAX_CHARS = 80;
12
+ const ELLIPSIS = '…';
13
+ /**
14
+ * Normalize a candidate title.
15
+ * @param text - Raw title or first prompt.
16
+ * @returns The one-line title, or '' when the input is blank.
17
+ */
18
+ export function normalizeTitle(text) {
19
+ if (text === undefined)
20
+ return '';
21
+ const flat = text.trim().replace(/\s+/gu, ' ');
22
+ if (flat === '')
23
+ return '';
24
+ // Code points, not UTF-16 units: a cut must never split a surrogate pair.
25
+ const points = Array.from(flat);
26
+ if (points.length <= TITLE_MAX_CHARS)
27
+ return flat;
28
+ return `${points.slice(0, TITLE_MAX_CHARS - ELLIPSIS.length).join('').trimEnd()}${ELLIPSIS}`;
29
+ }