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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/README.md +50 -20
  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 +63 -3
  6. package/cordis.patch.yml +39 -17
  7. package/cordis.yml +3 -2
  8. package/lib/settings.json +1272 -0
  9. package/lib/types/adapter/channel/ui-policy.d.ts +9 -2
  10. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  11. package/lib/types/adapter/channel/ui-policy.js +13 -0
  12. package/lib/types/adapter/kernel/replay.d.ts.map +1 -1
  13. package/lib/types/adapter/kernel/replay.js +2 -0
  14. package/lib/types/adapter/ports/channel-display.d.ts +12 -0
  15. package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
  16. package/lib/types/adapter/ports/channel-session.d.ts +38 -0
  17. package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
  18. package/lib/types/adapter/ports/channel-settings.d.ts +12 -0
  19. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  20. package/lib/types/adapter/ports/channel-ui.d.ts +46 -4
  21. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  22. package/lib/types/adapter/ports/channel-view.d.ts +43 -0
  23. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  24. package/lib/types/commands.d.ts.map +1 -1
  25. package/lib/types/commands.js +2 -0
  26. package/lib/types/components/BalanceReportRow.d.ts +10 -2
  27. package/lib/types/components/BalanceReportRow.d.ts.map +1 -1
  28. package/lib/types/components/BalanceReportRow.js +18 -4
  29. package/lib/types/components/CompactionStatusRow.d.ts +24 -0
  30. package/lib/types/components/CompactionStatusRow.d.ts.map +1 -0
  31. package/lib/types/components/CompactionStatusRow.js +72 -0
  32. package/lib/types/components/GoalTodoPanel.js +2 -2
  33. package/lib/types/components/HelpMenu.d.ts +2 -2
  34. package/lib/types/components/HelpMenu.d.ts.map +1 -1
  35. package/lib/types/components/HelpMenu.js +5 -4
  36. package/lib/types/components/InlineMathParagraph.d.ts +22 -0
  37. package/lib/types/components/InlineMathParagraph.d.ts.map +1 -0
  38. package/lib/types/components/InlineMathParagraph.js +178 -0
  39. package/lib/types/components/LogoV2.d.ts +41 -3
  40. package/lib/types/components/LogoV2.d.ts.map +1 -1
  41. package/lib/types/components/LogoV2.js +148 -24
  42. package/lib/types/components/Markdown.d.ts +10 -3
  43. package/lib/types/components/Markdown.d.ts.map +1 -1
  44. package/lib/types/components/Markdown.js +47 -14
  45. package/lib/types/components/MathBlock.d.ts +13 -0
  46. package/lib/types/components/MathBlock.d.ts.map +1 -0
  47. package/lib/types/components/MathBlock.js +136 -0
  48. package/lib/types/components/MessageList.d.ts +10 -1
  49. package/lib/types/components/MessageList.d.ts.map +1 -1
  50. package/lib/types/components/MessageList.js +13 -4
  51. package/lib/types/components/MigratePicker.d.ts +30 -0
  52. package/lib/types/components/MigratePicker.d.ts.map +1 -0
  53. package/lib/types/components/MigratePicker.js +38 -0
  54. package/lib/types/components/PromptInput.d.ts +17 -0
  55. package/lib/types/components/PromptInput.d.ts.map +1 -1
  56. package/lib/types/components/PromptInput.js +48 -7
  57. package/lib/types/components/SplitDiffView.d.ts.map +1 -1
  58. package/lib/types/components/SplitDiffView.js +2 -1
  59. package/lib/types/components/StarPrompt.d.ts +53 -0
  60. package/lib/types/components/StarPrompt.d.ts.map +1 -0
  61. package/lib/types/components/StarPrompt.js +281 -0
  62. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
  63. package/lib/types/components/StreamingMarkdown.js +20 -3
  64. package/lib/types/components/TimelineRail.d.ts.map +1 -1
  65. package/lib/types/components/TimelineRail.js +9 -1
  66. package/lib/types/components/Whale.d.ts +17 -8
  67. package/lib/types/components/Whale.d.ts.map +1 -1
  68. package/lib/types/components/Whale.js +25 -15
  69. package/lib/types/components/WhaleGirl.d.ts +29 -0
  70. package/lib/types/components/WhaleGirl.d.ts.map +1 -0
  71. package/lib/types/components/WhaleGirl.js +32 -0
  72. package/lib/types/components/WorkingSpinner.d.ts +4 -1
  73. package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
  74. package/lib/types/components/WorkingSpinner.js +2 -2
  75. package/lib/types/components/bigfont.d.ts +47 -18
  76. package/lib/types/components/bigfont.d.ts.map +1 -1
  77. package/lib/types/components/bigfont.js +55 -40
  78. package/lib/types/components/design-system/ThemeProvider.d.ts +6 -0
  79. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
  80. package/lib/types/components/design-system/ThemeProvider.js +40 -1
  81. package/lib/types/components/maidPortrait.d.ts +44 -0
  82. package/lib/types/components/maidPortrait.d.ts.map +1 -0
  83. package/lib/types/components/maidPortrait.js +178 -0
  84. package/lib/types/components/mathPreview.d.ts +25 -0
  85. package/lib/types/components/mathPreview.d.ts.map +1 -0
  86. package/lib/types/components/mathPreview.js +48 -0
  87. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
  88. package/lib/types/components/messages/AssistantThinkingMessage.js +2 -1
  89. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
  90. package/lib/types/components/messages/AssistantToolUseMessage.js +3 -2
  91. package/lib/types/components/messages/TranscriptImages.d.ts.map +1 -1
  92. package/lib/types/components/messages/TranscriptImages.js +11 -1
  93. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +14 -2
  94. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
  95. package/lib/types/components/questions/AskUserQuestionPanel.js +80 -38
  96. package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
  97. package/lib/types/components/questions/PlanReviewPanel.js +3 -3
  98. package/lib/types/components/sessions/ForeignSessionRow.d.ts +34 -0
  99. package/lib/types/components/sessions/ForeignSessionRow.d.ts.map +1 -0
  100. package/lib/types/components/sessions/ForeignSessionRow.js +43 -0
  101. package/lib/types/components/sessions/SourceTabs.d.ts +52 -0
  102. package/lib/types/components/sessions/SourceTabs.d.ts.map +1 -0
  103. package/lib/types/components/sessions/SourceTabs.js +70 -0
  104. package/lib/types/components/splashEggs.d.ts +56 -0
  105. package/lib/types/components/splashEggs.d.ts.map +1 -0
  106. package/lib/types/components/splashEggs.js +67 -0
  107. package/lib/types/components/splashFonts.d.ts +119 -0
  108. package/lib/types/components/splashFonts.d.ts.map +1 -0
  109. package/lib/types/components/splashFonts.js +267 -0
  110. package/lib/types/components/splashLayout.d.ts +41 -0
  111. package/lib/types/components/splashLayout.d.ts.map +1 -0
  112. package/lib/types/components/splashLayout.js +40 -0
  113. package/lib/types/components/whaleGirlSprite.d.ts +17 -0
  114. package/lib/types/components/whaleGirlSprite.d.ts.map +1 -0
  115. package/lib/types/components/whaleGirlSprite.js +47 -0
  116. package/lib/types/deepseekPricing.d.ts +74 -0
  117. package/lib/types/deepseekPricing.d.ts.map +1 -1
  118. package/lib/types/deepseekPricing.js +110 -11
  119. package/lib/types/dsh-adapter/channel/action-readiness.d.ts +1 -1
  120. package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
  121. package/lib/types/dsh-adapter/channel/action-readiness.js +6 -1
  122. package/lib/types/dsh-adapter/channel/background-action.d.ts +1 -0
  123. package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
  124. package/lib/types/dsh-adapter/channel/background-action.js +1 -0
  125. package/lib/types/dsh-adapter/channel/binding-events.d.ts +8 -9
  126. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  127. package/lib/types/dsh-adapter/channel/binding-events.js +69 -21
  128. package/lib/types/dsh-adapter/channel/compaction.d.ts +2 -1
  129. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  130. package/lib/types/dsh-adapter/channel/compaction.js +35 -2
  131. package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
  132. package/lib/types/dsh-adapter/channel/local-actions.js +6 -1
  133. package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
  134. package/lib/types/dsh-adapter/channel/model-switch.js +5 -1
  135. package/lib/types/dsh-adapter/channel/paths.d.ts.map +1 -1
  136. package/lib/types/dsh-adapter/channel/paths.js +7 -1
  137. package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
  138. package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
  139. package/lib/types/dsh-adapter/channel/preferences.js +16 -0
  140. package/lib/types/dsh-adapter/channel/projection.d.ts +1 -2
  141. package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
  142. package/lib/types/dsh-adapter/channel/projection.js +127 -17
  143. package/lib/types/dsh-adapter/channel/question-record.d.ts +76 -0
  144. package/lib/types/dsh-adapter/channel/question-record.d.ts.map +1 -0
  145. package/lib/types/dsh-adapter/channel/question-record.js +107 -0
  146. package/lib/types/dsh-adapter/channel/session-lineage.d.ts +42 -0
  147. package/lib/types/dsh-adapter/channel/session-lineage.d.ts.map +1 -0
  148. package/lib/types/dsh-adapter/channel/session-lineage.js +51 -0
  149. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts +2 -0
  150. package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts.map +1 -1
  151. package/lib/types/dsh-adapter/channel/session-live-adoption.js +9 -3
  152. package/lib/types/dsh-adapter/channel/session-metadata.d.ts +2 -1
  153. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  154. package/lib/types/dsh-adapter/channel/session-metadata.js +39 -7
  155. package/lib/types/dsh-adapter/channel/session-reset.d.ts +1 -1
  156. package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/session-reset.js +7 -0
  158. package/lib/types/dsh-adapter/channel/session-resume.d.ts +1 -0
  159. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  160. package/lib/types/dsh-adapter/channel/session-resume.js +4 -2
  161. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  162. package/lib/types/dsh-adapter/channel/settings-host.js +8 -0
  163. package/lib/types/dsh-adapter/channel/state.d.ts +14 -1
  164. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  165. package/lib/types/dsh-adapter/channel/state.js +6 -1
  166. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts +30 -35
  167. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/subagent-projection.js +138 -4
  169. package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
  170. package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
  171. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  172. package/lib/types/dsh-adapter/channel.js +19 -4
  173. package/lib/types/dsh-adapter/compat/messages.d.ts +6 -0
  174. package/lib/types/dsh-adapter/compat/messages.d.ts.map +1 -1
  175. package/lib/types/dsh-adapter/compat/messages.js +9 -0
  176. package/lib/types/dsh-adapter/contract.d.ts +5 -5
  177. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  178. package/lib/types/dsh-adapter/contract.js +8 -6
  179. package/lib/types/dsh-adapter/index.d.ts +36 -1
  180. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  181. package/lib/types/dsh-adapter/index.js +22 -6
  182. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts +3 -0
  183. package/lib/types/dsh-adapter/migrate/adapters/claude-code.d.ts.map +1 -0
  184. package/lib/types/dsh-adapter/migrate/adapters/claude-code.js +131 -0
  185. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts +17 -0
  186. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.d.ts.map +1 -0
  187. package/lib/types/dsh-adapter/migrate/adapters/claude-code.parse.js +329 -0
  188. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts +3 -0
  189. package/lib/types/dsh-adapter/migrate/adapters/codex.d.ts.map +1 -0
  190. package/lib/types/dsh-adapter/migrate/adapters/codex.js +102 -0
  191. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts +16 -0
  192. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.d.ts.map +1 -0
  193. package/lib/types/dsh-adapter/migrate/adapters/codex.parse.js +289 -0
  194. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts +3 -0
  195. package/lib/types/dsh-adapter/migrate/adapters/grok-build.d.ts.map +1 -0
  196. package/lib/types/dsh-adapter/migrate/adapters/grok-build.js +117 -0
  197. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts +13 -0
  198. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.d.ts.map +1 -0
  199. package/lib/types/dsh-adapter/migrate/adapters/grok-build.parse.js +178 -0
  200. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts +3 -0
  201. package/lib/types/dsh-adapter/migrate/adapters/omp.d.ts.map +1 -0
  202. package/lib/types/dsh-adapter/migrate/adapters/omp.js +133 -0
  203. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts +60 -0
  204. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.d.ts.map +1 -0
  205. package/lib/types/dsh-adapter/migrate/adapters/scan-fs.js +178 -0
  206. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts +8 -0
  207. package/lib/types/dsh-adapter/migrate/adapters/scan.d.ts.map +1 -0
  208. package/lib/types/dsh-adapter/migrate/adapters/scan.js +40 -0
  209. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts +3 -0
  210. package/lib/types/dsh-adapter/migrate/adapters/zcode.d.ts.map +1 -0
  211. package/lib/types/dsh-adapter/migrate/adapters/zcode.js +93 -0
  212. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts +9 -0
  213. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.d.ts.map +1 -0
  214. package/lib/types/dsh-adapter/migrate/adapters/zcode.parse.js +89 -0
  215. package/lib/types/dsh-adapter/migrate/bin-path.d.ts +6 -0
  216. package/lib/types/dsh-adapter/migrate/bin-path.d.ts.map +1 -0
  217. package/lib/types/dsh-adapter/migrate/bin-path.js +30 -0
  218. package/lib/types/dsh-adapter/migrate/browse.d.ts +42 -0
  219. package/lib/types/dsh-adapter/migrate/browse.d.ts.map +1 -0
  220. package/lib/types/dsh-adapter/migrate/browse.js +90 -0
  221. package/lib/types/dsh-adapter/migrate/cli.d.ts +9 -0
  222. package/lib/types/dsh-adapter/migrate/cli.d.ts.map +1 -0
  223. package/lib/types/dsh-adapter/migrate/cli.js +106 -0
  224. package/lib/types/dsh-adapter/migrate/import-one.d.ts +89 -0
  225. package/lib/types/dsh-adapter/migrate/import-one.d.ts.map +1 -0
  226. package/lib/types/dsh-adapter/migrate/import-one.js +133 -0
  227. package/lib/types/dsh-adapter/migrate/index.d.ts +35 -0
  228. package/lib/types/dsh-adapter/migrate/index.d.ts.map +1 -0
  229. package/lib/types/dsh-adapter/migrate/index.js +107 -0
  230. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts +40 -0
  231. package/lib/types/dsh-adapter/migrate/parse/injection.d.ts.map +1 -0
  232. package/lib/types/dsh-adapter/migrate/parse/injection.js +127 -0
  233. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +28 -0
  234. package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -0
  235. package/lib/types/dsh-adapter/migrate/parse/jsonl.js +40 -0
  236. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts +28 -0
  237. package/lib/types/dsh-adapter/migrate/parse/role-turns.d.ts.map +1 -0
  238. package/lib/types/dsh-adapter/migrate/parse/role-turns.js +50 -0
  239. package/lib/types/dsh-adapter/migrate/parse/title.d.ts +18 -0
  240. package/lib/types/dsh-adapter/migrate/parse/title.d.ts.map +1 -0
  241. package/lib/types/dsh-adapter/migrate/parse/title.js +29 -0
  242. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts +62 -0
  243. package/lib/types/dsh-adapter/migrate/parse/tools.d.ts.map +1 -0
  244. package/lib/types/dsh-adapter/migrate/parse/tools.js +110 -0
  245. package/lib/types/dsh-adapter/migrate/picker.d.ts +64 -0
  246. package/lib/types/dsh-adapter/migrate/picker.d.ts.map +1 -0
  247. package/lib/types/dsh-adapter/migrate/picker.js +86 -0
  248. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts +40 -0
  249. package/lib/types/dsh-adapter/migrate/recent-agents.d.ts.map +1 -0
  250. package/lib/types/dsh-adapter/migrate/recent-agents.js +100 -0
  251. package/lib/types/dsh-adapter/migrate/sessionize.d.ts +39 -0
  252. package/lib/types/dsh-adapter/migrate/sessionize.d.ts.map +1 -0
  253. package/lib/types/dsh-adapter/migrate/sessionize.js +271 -0
  254. package/lib/types/dsh-adapter/migrate/types.d.ts +176 -0
  255. package/lib/types/dsh-adapter/migrate/types.d.ts.map +1 -0
  256. package/lib/types/dsh-adapter/migrate/types.js +11 -0
  257. package/lib/types/dsh-adapter/migrate/uuid.d.ts +7 -0
  258. package/lib/types/dsh-adapter/migrate/uuid.d.ts.map +1 -0
  259. package/lib/types/dsh-adapter/migrate/uuid.js +25 -0
  260. package/lib/types/dsh-adapter/plugin.d.ts +4 -2
  261. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  262. package/lib/types/dsh-adapter/plugin.js +143 -364
  263. package/lib/types/dsh-adapter/providerWizard.d.ts +17 -0
  264. package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
  265. package/lib/types/dsh-adapter/providerWizard.js +254 -66
  266. package/lib/types/dsh-adapter/questions.d.ts +22 -15
  267. package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
  268. package/lib/types/dsh-adapter/questions.js +47 -45
  269. package/lib/types/dsh-adapter/sessions/digest.d.ts +11 -6
  270. package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
  271. package/lib/types/dsh-adapter/sessions/digest.js +20 -13
  272. package/lib/types/dsh-adapter/sessions/frames.d.ts +3 -1
  273. package/lib/types/dsh-adapter/sessions/frames.d.ts.map +1 -1
  274. package/lib/types/dsh-adapter/sessions/frames.js +5 -4
  275. package/lib/types/dsh-adapter/sessions/list.d.ts +6 -1
  276. package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
  277. package/lib/types/dsh-adapter/sessions/list.js +188 -164
  278. package/lib/types/dsh-adapter/sessions/recovery.d.ts +16 -0
  279. package/lib/types/dsh-adapter/sessions/recovery.d.ts.map +1 -0
  280. package/lib/types/dsh-adapter/sessions/recovery.js +108 -0
  281. package/lib/types/dsh-adapter/sessions/snapshot.d.ts +7 -0
  282. package/lib/types/dsh-adapter/sessions/snapshot.d.ts.map +1 -0
  283. package/lib/types/dsh-adapter/sessions/snapshot.js +90 -0
  284. package/lib/types/dsh-adapter/sessions/store.d.ts +10 -4
  285. package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
  286. package/lib/types/dsh-adapter/sessions/store.js +62 -25
  287. package/lib/types/dsh-adapter/sideQuestion.d.ts +41 -2
  288. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  289. package/lib/types/dsh-adapter/sideQuestion.js +98 -2
  290. package/lib/types/dsh-adapter/subagents.d.ts +28 -3
  291. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  292. package/lib/types/dsh-adapter/subagents.js +77 -2
  293. package/lib/types/herdr.d.ts +2 -0
  294. package/lib/types/herdr.d.ts.map +1 -1
  295. package/lib/types/herdr.js +9 -3
  296. package/lib/types/i18n.d.ts +424 -42
  297. package/lib/types/i18n.d.ts.map +1 -1
  298. package/lib/types/i18n.js +145 -20
  299. package/lib/types/ink/components/App.d.ts +2 -2
  300. package/lib/types/ink/components/App.d.ts.map +1 -1
  301. package/lib/types/ink/components/App.js +5 -1
  302. package/lib/types/ink/components/Image.d.ts +14 -1
  303. package/lib/types/ink/components/Image.d.ts.map +1 -1
  304. package/lib/types/ink/components/Image.js +2 -2
  305. package/lib/types/ink/events/input-event.js +3 -3
  306. package/lib/types/ink/hooks/use-terminal-images.d.ts +12 -0
  307. package/lib/types/ink/hooks/use-terminal-images.d.ts.map +1 -1
  308. package/lib/types/ink/hooks/use-terminal-images.js +13 -0
  309. package/lib/types/ink/ink.d.ts +6 -0
  310. package/lib/types/ink/ink.d.ts.map +1 -1
  311. package/lib/types/ink/ink.js +16 -1
  312. package/lib/types/ink/kitty-graphics.d.ts +44 -3
  313. package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
  314. package/lib/types/ink/kitty-graphics.js +184 -23
  315. package/lib/types/ink/output.d.ts +24 -2
  316. package/lib/types/ink/output.d.ts.map +1 -1
  317. package/lib/types/ink/output.js +83 -5
  318. package/lib/types/ink/parse-keypress.d.ts +26 -1
  319. package/lib/types/ink/parse-keypress.d.ts.map +1 -1
  320. package/lib/types/ink/parse-keypress.js +156 -13
  321. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  322. package/lib/types/ink/render-node-to-output.js +8 -1
  323. package/lib/types/ink/screen.d.ts +24 -0
  324. package/lib/types/ink/screen.d.ts.map +1 -1
  325. package/lib/types/ink/screen.js +89 -0
  326. package/lib/types/ink/selection.d.ts +40 -18
  327. package/lib/types/ink/selection.d.ts.map +1 -1
  328. package/lib/types/ink/selection.js +142 -30
  329. package/lib/types/ink/sixel-codec.d.ts +12 -1
  330. package/lib/types/ink/sixel-codec.d.ts.map +1 -1
  331. package/lib/types/ink/sixel-codec.js +29 -5
  332. package/lib/types/ink/sixel-graphics.d.ts.map +1 -1
  333. package/lib/types/ink/sixel-graphics.js +5 -3
  334. package/lib/types/ink/styles.d.ts +9 -0
  335. package/lib/types/ink/styles.d.ts.map +1 -1
  336. package/lib/types/ink/terminal-image.d.ts +8 -0
  337. package/lib/types/ink/terminal-image.d.ts.map +1 -1
  338. package/lib/types/ink/terminal-querier.d.ts +7 -1
  339. package/lib/types/ink/terminal-querier.d.ts.map +1 -1
  340. package/lib/types/ink/terminal-querier.js +12 -2
  341. package/lib/types/ink/timeline-rail.d.ts +5 -0
  342. package/lib/types/ink/timeline-rail.d.ts.map +1 -1
  343. package/lib/types/math/inline-layout.d.ts +29 -0
  344. package/lib/types/math/inline-layout.d.ts.map +1 -0
  345. package/lib/types/math/inline-layout.js +106 -0
  346. package/lib/types/math/layout.d.ts +58 -0
  347. package/lib/types/math/layout.d.ts.map +1 -0
  348. package/lib/types/math/layout.js +59 -0
  349. package/lib/types/math/renderer.d.ts +64 -0
  350. package/lib/types/math/renderer.d.ts.map +1 -0
  351. package/lib/types/math/renderer.js +256 -0
  352. package/lib/types/screens/Chat.d.ts +14 -1
  353. package/lib/types/screens/Chat.d.ts.map +1 -1
  354. package/lib/types/screens/Chat.js +606 -53
  355. package/lib/types/screens/SessionSupervisor.d.ts +2 -1
  356. package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
  357. package/lib/types/screens/SessionSupervisor.js +156 -19
  358. package/lib/types/screens/Settings.d.ts.map +1 -1
  359. package/lib/types/screens/Settings.js +49 -11
  360. package/lib/types/screens/StatusLine.d.ts.map +1 -1
  361. package/lib/types/screens/StatusLine.js +45 -15
  362. package/lib/types/screens/chatOverlay.d.ts +5 -0
  363. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  364. package/lib/types/screens/chatOverlay.js +1 -0
  365. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts +47 -0
  366. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.d.ts.map +1 -0
  367. package/lib/types/screens/sessionSupervisor/ForeignSessionPanes.js +65 -0
  368. package/lib/types/screens/sessionSupervisor/model.d.ts +12 -0
  369. package/lib/types/screens/sessionSupervisor/model.d.ts.map +1 -1
  370. package/lib/types/screens/sessionSupervisor/model.js +26 -0
  371. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts +107 -0
  372. package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts.map +1 -0
  373. package/lib/types/screens/sessionSupervisor/useForeignSessions.js +312 -0
  374. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +4 -1
  375. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
  376. package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +97 -14
  377. package/lib/types/sessionHistory.d.ts +2 -2
  378. package/lib/types/sessionHistory.d.ts.map +1 -1
  379. package/lib/types/sessionHistory.js +31 -5
  380. package/lib/types/settings/definitions.d.ts +681 -0
  381. package/lib/types/settings/definitions.d.ts.map +1 -0
  382. package/lib/types/settings/definitions.js +511 -0
  383. package/lib/types/starAction.d.ts +44 -0
  384. package/lib/types/starAction.d.ts.map +1 -0
  385. package/lib/types/starAction.js +52 -0
  386. package/lib/types/terminal-utils/latex.d.ts +10 -0
  387. package/lib/types/terminal-utils/latex.d.ts.map +1 -0
  388. package/lib/types/terminal-utils/latex.js +1417 -0
  389. package/lib/types/terminal-utils/markdown.d.ts +3 -1
  390. package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
  391. package/lib/types/terminal-utils/markdown.js +26 -1
  392. package/lib/types/terminal-utils/math.d.ts +66 -0
  393. package/lib/types/terminal-utils/math.d.ts.map +1 -0
  394. package/lib/types/terminal-utils/math.js +337 -0
  395. package/lib/types/tips.d.ts.map +1 -1
  396. package/lib/types/tips.js +6 -0
  397. package/lib/types/tuiDisplayPrefs.d.ts +67 -0
  398. package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
  399. package/lib/types/tuiDisplayPrefs.js +59 -0
  400. package/lib/types/ui.d.ts +1 -1
  401. package/lib/types/ui.d.ts.map +1 -1
  402. package/lib/types/ui.js +1 -1
  403. package/lib/types/usageStats.d.ts +98 -0
  404. package/lib/types/usageStats.d.ts.map +1 -0
  405. package/lib/types/usageStats.js +169 -0
  406. package/lib/types/utils/bmp.d.ts +17 -0
  407. package/lib/types/utils/bmp.d.ts.map +1 -0
  408. package/lib/types/utils/bmp.js +154 -0
  409. package/lib/types/utils/clipboard.d.ts +14 -2
  410. package/lib/types/utils/clipboard.d.ts.map +1 -1
  411. package/lib/types/utils/clipboard.js +143 -8
  412. package/lib/types/utils/fold-long-lines.d.ts.map +1 -1
  413. package/lib/types/utils/fold-long-lines.js +2 -1
  414. package/lib/types/utils/keymap.d.ts +4 -1
  415. package/lib/types/utils/keymap.d.ts.map +1 -1
  416. package/lib/types/utils/keymap.js +8 -0
  417. package/lib/types/utils/modifiers.d.ts +4 -3
  418. package/lib/types/utils/modifiers.d.ts.map +1 -1
  419. package/lib/types/utils/modifiers.js +4 -3
  420. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/LICENSE +202 -0
  421. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/NOTICE +20 -0
  422. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/index.d.ts +16 -0
  423. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/bundled-packages.json +4 -0
  424. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs +20 -0
  425. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/lib/index.mjs.LEGAL.txt +35 -0
  426. package/node_modules/@dsh-tui-vendor/mathjax-tex-svg/package.json +29 -0
  427. package/package.json +111 -97
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.parse.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/adapters/codex.parse.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAA4C,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE7F,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AA4ED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAkKxF"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Codex rollout parsing (pure): one `rollout-*.jsonl` → one
3
+ * {@link MigrationSession}.
4
+ *
5
+ * Rows are `{ timestamp, type, payload }` envelopes. `session_meta` and
6
+ * `turn_context` carry metadata (cwd, the model in effect); `response_item`
7
+ * rows are the model-visible history (OpenAI Responses items); `event_msg`
8
+ * rows are UI housekeeping that repeats response items and is skipped.
9
+ *
10
+ * Codex writes its harness context as user-role blocks: `<environment_context>`,
11
+ * `<user_instructions>` and other `<…>` blocks, and the
12
+ * `# AGENTS.md instructions` block that opens most rollouts. Those blocks are
13
+ * dropped; a user message made only of them opens no turn and never titles
14
+ * the session.
15
+ *
16
+ * Tool traffic: `function_call` / `custom_tool_call` items are tool calls of
17
+ * the step in progress; their `*_output` items pair back by `call_id`. A
18
+ * step is one model call: an output ends it, and the next model-produced
19
+ * item opens the next one. `agent_message` items (a sub-agent's report to
20
+ * this thread) are inputs of the next model call.
21
+ *
22
+ * @module @deepseek-harness-tui/dsh-tui/migrate/adapters/codex.parse
23
+ */
24
+ import { isRecord, parseJsonl } from '../parse/jsonl.js';
25
+ import { isInjectedText, unwrapUserText } from '../parse/injection.js';
26
+ import { emptyStats } from '../parse/role-turns.js';
27
+ import { normalizeTitle } from '../parse/title.js';
28
+ import { CallIndex, IMAGE_PLACEHOLDER, closeToolPairs, newStep } from '../parse/tools.js';
29
+ function toMillis(iso) {
30
+ return typeof iso === 'string' ? Date.parse(iso) || 0 : 0;
31
+ }
32
+ /** Text of the blocks of one kind (`input_text` / `output_text`). */
33
+ function blocksText(content, want) {
34
+ if (!Array.isArray(content))
35
+ return '';
36
+ const parts = [];
37
+ for (const block of content) {
38
+ if (isRecord(block) && block.type === want && typeof block.text === 'string' && block.text !== '')
39
+ parts.push(block.text);
40
+ }
41
+ return parts.join('\n\n');
42
+ }
43
+ /**
44
+ * Codex-only frames around or beside the human's words: the text blocks that
45
+ * wrap an attached image, the aborted-turn marker, and shell-command echoes.
46
+ * Matched as prefixes like the shared table — a user text that merely starts
47
+ * with `<` (an HTML or XML question) is the human's and must stay.
48
+ */
49
+ const CODEX_FRAME_PREFIXES = ['<image name=', '</image>', '<turn_aborted>', '<user_shell_command>'];
50
+ function isCodexFrame(text) {
51
+ const head = text.trimStart();
52
+ return CODEX_FRAME_PREFIXES.some(prefix => head.startsWith(prefix));
53
+ }
54
+ /** The human part of a user message: harness blocks dropped, images kept as
55
+ * placeholders. Returns the text and how many blocks were dropped. */
56
+ function userPrompt(content) {
57
+ if (!Array.isArray(content))
58
+ return { text: '', dropped: 0 };
59
+ const parts = [];
60
+ let dropped = 0;
61
+ for (const block of content) {
62
+ if (!isRecord(block))
63
+ continue;
64
+ if (block.type === 'input_image') {
65
+ parts.push(IMAGE_PLACEHOLDER);
66
+ }
67
+ else if (block.type === 'input_text' && typeof block.text === 'string' && block.text.trim() !== '') {
68
+ if (isCodexFrame(block.text) || isInjectedText(block.text))
69
+ dropped += 1;
70
+ else
71
+ parts.push(block.text);
72
+ }
73
+ }
74
+ return { text: parts.join('\n\n').trim(), dropped };
75
+ }
76
+ /**
77
+ * Model-facing text of a tool output. Codex writes three shapes: a plain
78
+ * string, a JSON string `{"output": "...", "metadata": …}` (the inner output
79
+ * is what the model saw), and an array of `input_text` / `input_image`
80
+ * blocks (the most common shape in current rollouts).
81
+ */
82
+ function toolOutputText(output) {
83
+ if (Array.isArray(output)) {
84
+ const parts = [];
85
+ for (const block of output) {
86
+ if (!isRecord(block))
87
+ continue;
88
+ if (block.type === 'input_text' && typeof block.text === 'string')
89
+ parts.push(block.text);
90
+ else if (block.type === 'input_image')
91
+ parts.push(IMAGE_PLACEHOLDER);
92
+ }
93
+ return parts.join('\n');
94
+ }
95
+ if (isRecord(output))
96
+ return typeof output.output === 'string' ? output.output : JSON.stringify(output);
97
+ if (typeof output !== 'string')
98
+ return '';
99
+ if (output.startsWith('{')) {
100
+ try {
101
+ const parsed = JSON.parse(output);
102
+ if (isRecord(parsed) && typeof parsed.output === 'string')
103
+ return parsed.output;
104
+ }
105
+ catch {
106
+ // Plain text that happens to start with a brace.
107
+ }
108
+ }
109
+ return output;
110
+ }
111
+ /**
112
+ * Parse one Codex rollout.
113
+ * @returns The session, or undefined when it records no cwd or no prompt, or
114
+ * is a sub-agent thread (`thread_source: 'subagent'` / `source.subagent`):
115
+ * those are spawned by a main session and are not conversations of their
116
+ * own. Forks (`forked_from_id` without the sub-agent marker) are kept.
117
+ */
118
+ export function parseCodexRollout(input) {
119
+ const { records, badLines } = parseJsonl(input.raw);
120
+ const stats = { ...emptyStats(), badLines };
121
+ let turns = [];
122
+ let current;
123
+ let cwd;
124
+ let startedAt = 0;
125
+ let model;
126
+ const calls = new CallIndex();
127
+ /** The model call in progress; a tool output ends it (see modelStep). */
128
+ let step;
129
+ let sawOutput = false;
130
+ let unnamedCalls = 0;
131
+ let sawMeta = false;
132
+ /** Messages from sub-agents waiting for the next model call. */
133
+ let pendingInputs = [];
134
+ let subagent = false;
135
+ /** A compaction summary waiting for the turn that follows the boundary. */
136
+ let pendingCompaction;
137
+ const openTurn = (prompt) => {
138
+ // Sub-agent messages no model call consumed before a new prompt are stale.
139
+ if (prompt !== '') {
140
+ stats.filtered += pendingInputs.length;
141
+ pendingInputs = [];
142
+ }
143
+ current = pendingCompaction === undefined ? { prompt, steps: [] } : { prompt, compaction: pendingCompaction, steps: [] };
144
+ pendingCompaction = undefined;
145
+ turns.push(current);
146
+ step = undefined;
147
+ };
148
+ /**
149
+ * The step a model-produced item belongs to. One model call returns its
150
+ * reasoning, message and tool calls together, then the harness appends the
151
+ * tool outputs; so the first model item AFTER an output starts the next
152
+ * call.
153
+ */
154
+ const modelStep = () => {
155
+ if (current === undefined)
156
+ openTurn('');
157
+ if (step === undefined || sawOutput) {
158
+ step = newStep(model);
159
+ step.inputs = pendingInputs;
160
+ pendingInputs = [];
161
+ current.steps.push(step);
162
+ sawOutput = false;
163
+ }
164
+ return step;
165
+ };
166
+ const acceptItem = (payload) => {
167
+ switch (payload.type) {
168
+ case 'message': {
169
+ if (payload.role === 'user') {
170
+ const { text: prompt, dropped } = userPrompt(payload.content);
171
+ stats.filtered += dropped;
172
+ if (prompt === '')
173
+ return;
174
+ openTurn(prompt);
175
+ }
176
+ else if (payload.role === 'assistant') {
177
+ const text = blocksText(payload.content, 'output_text');
178
+ if (text !== '')
179
+ modelStep().blocks.push({ type: 'text', text });
180
+ }
181
+ return;
182
+ }
183
+ case 'agent_message': {
184
+ // A sub-agent's report delivered to this thread: model-visible input
185
+ // of the next model call, not a turn of its own.
186
+ const text = blocksText(payload.content, 'input_text');
187
+ if (text === '')
188
+ return;
189
+ pendingInputs.push(text);
190
+ stats.meta += 1;
191
+ sawOutput = true;
192
+ return;
193
+ }
194
+ case 'reasoning': {
195
+ // The readable part is the summary; `encrypted_content` is opaque
196
+ // provider state and is never copied.
197
+ const text = Array.isArray(payload.summary)
198
+ ? payload.summary.filter(isRecord).map(part => part.text).filter((part) => typeof part === 'string' && part.trim() !== '').join('\n\n')
199
+ : '';
200
+ if (text !== '')
201
+ modelStep().blocks.push({ type: 'reasoning', text });
202
+ return;
203
+ }
204
+ case 'function_call':
205
+ case 'custom_tool_call': {
206
+ const id = typeof payload.call_id === 'string' && payload.call_id !== '' ? payload.call_id : `codex-call-${++unnamedCalls}`;
207
+ const name = typeof payload.name === 'string' && payload.name !== '' ? payload.name : 'unknown';
208
+ // function_call arguments are the model's JSON text; a custom tool's
209
+ // input is free-form (a patch, a JS snippet), kept as one JSON field.
210
+ const args = payload.type === 'function_call'
211
+ ? (typeof payload.arguments === 'string' ? payload.arguments : JSON.stringify(payload.arguments ?? {}))
212
+ : JSON.stringify({ input: payload.input ?? '' });
213
+ const target = modelStep();
214
+ target.blocks.push({ type: 'tool-call', id, name, arguments: args });
215
+ calls.register(target);
216
+ return;
217
+ }
218
+ case 'function_call_output':
219
+ case 'custom_tool_call_output': {
220
+ if (typeof payload.call_id === 'string')
221
+ calls.attach(payload.call_id, toolOutputText(payload.output), false);
222
+ else
223
+ calls.orphans += 1;
224
+ sawOutput = true;
225
+ }
226
+ }
227
+ };
228
+ for (const record of records) {
229
+ const payload = record.payload;
230
+ if (!isRecord(payload))
231
+ continue;
232
+ const time = toMillis(record.timestamp);
233
+ if (record.type === 'session_meta') {
234
+ // Only the FIRST meta describes this rollout: a forked or spawned
235
+ // thread repeats its parent's meta after its own, with the inherited
236
+ // history.
237
+ if (!sawMeta) {
238
+ sawMeta = true;
239
+ if (typeof payload.cwd === 'string' && payload.cwd !== '')
240
+ cwd = payload.cwd;
241
+ startedAt ||= toMillis(payload.timestamp) || time;
242
+ subagent = payload.thread_source === 'subagent' || (isRecord(payload.source) && payload.source.subagent !== undefined);
243
+ }
244
+ continue;
245
+ }
246
+ // Codex records the active model per turn; it applies to the steps after it.
247
+ // Compaction boundary: Codex folded the window before it into a handoff
248
+ // summary and kept writing the same rollout. The summary becomes a
249
+ // native checkpoint in front of the next turn; a turn cut in half by the
250
+ // boundary continues as a prompt-less turn after it.
251
+ if (record.type === 'compacted') {
252
+ const summary = typeof payload.message === 'string' ? payload.message.trim() : '';
253
+ if (summary !== '') {
254
+ pendingCompaction = model === undefined ? { summary } : { summary, model };
255
+ current = undefined;
256
+ step = undefined;
257
+ }
258
+ continue;
259
+ }
260
+ // The only event_msg that carries meaning the response items lack: the
261
+ // turn was interrupted (the recorded reason is always a coarse
262
+ // 'interrupted').
263
+ if (record.type === 'event_msg' && payload.type === 'turn_aborted') {
264
+ if (current !== undefined)
265
+ current.aborted = true;
266
+ continue;
267
+ }
268
+ if (record.type === 'turn_context') {
269
+ if (typeof payload.model === 'string' && payload.model !== '')
270
+ model = payload.model;
271
+ continue;
272
+ }
273
+ if (record.type !== 'response_item')
274
+ continue;
275
+ startedAt ||= time;
276
+ acceptItem(payload);
277
+ }
278
+ stats.filtered += pendingInputs.length;
279
+ if (pendingCompaction !== undefined)
280
+ turns.push({ prompt: '', compaction: pendingCompaction, steps: [] });
281
+ turns = turns.filter(turn => turn.prompt !== '' || turn.steps.length > 0 || turn.compaction !== undefined);
282
+ stats.droppedToolResults = calls.orphans + closeToolPairs(turns);
283
+ if (subagent || cwd === undefined || !turns.some(turn => turn.prompt !== ''))
284
+ return undefined;
285
+ // Codex keeps no title of its own: the first real prompt is the fallback.
286
+ const firstPrompt = turns.find(turn => turn.prompt !== '')?.prompt;
287
+ const title = normalizeTitle(firstPrompt === undefined ? undefined : unwrapUserText(firstPrompt));
288
+ return { sourceId: input.sourceId, cwd, ...(title === '' ? {} : { title }), titleExplicit: false, startedAt, turns, stats };
289
+ }
@@ -0,0 +1,3 @@
1
+ import type { MigrationAdapter } from '../types.js';
2
+ export declare const grokBuildAdapter: MigrationAdapter;
3
+ //# sourceMappingURL=grok-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-build.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/adapters/grok-build.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAgD,gBAAgB,EAA+D,MAAM,aAAa,CAAA;AA+C9J,eAAO,MAAM,gBAAgB,EAAE,gBAkD9B,CAAA"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * grok-build adapter: `~/.grok/sessions/<encoded-cwd>/<uuid>/` — each session
3
+ * directory holds a `summary.json` and a `chat_history.jsonl`. Discovery and
4
+ * the `GROK_HOME` override live here; both files are parsed by the pure
5
+ * grok-build.parse.ts. A session directory is one browse entry: its
6
+ * fingerprint combines both files, and its summary comes from the whole
7
+ * summary.json plus the head of the history.
8
+ *
9
+ * @module @deepseek-harness-tui/dsh-tui/migrate/adapters/grok-build
10
+ */
11
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { parseGrokSession } from './grok-build.parse.js';
15
+ import { countEntries } from './scan.js';
16
+ import { fingerprintOf, loadText, runScan, walkFiles, withHead } from './scan-fs.js';
17
+ const HISTORY_FILE = 'chat_history.jsonl';
18
+ const SUMMARY_FILE = 'summary.json';
19
+ const WALK = { maxDepth: 2, match: name => name === HISTORY_FILE };
20
+ /** One change token for both files of a session directory. */
21
+ async function directoryFingerprint(dir) {
22
+ const history = await fingerprintOf(join(dir, HISTORY_FILE));
23
+ const summary = await fingerprintOf(join(dir, SUMMARY_FILE));
24
+ if (history === undefined || summary === undefined)
25
+ return undefined;
26
+ return { mtimeMs: Math.max(history.mtimeMs, summary.mtimeMs), size: history.size + summary.size };
27
+ }
28
+ async function summarize({ ref, fp }) {
29
+ const summaryJson = await loadText(join(ref, SUMMARY_FILE));
30
+ const history = await fingerprintOf(join(ref, HISTORY_FILE));
31
+ if (typeof summaryJson !== 'string' || history === undefined)
32
+ return null;
33
+ const session = await withHead(join(ref, HISTORY_FILE), history.size, chatHistory => parseGrokSession({ summaryJson, chatHistory }));
34
+ if (session === undefined)
35
+ return null;
36
+ return {
37
+ agentId: 'grok-build',
38
+ sessionKey: session.sourceId,
39
+ ref,
40
+ title: session.title ?? '',
41
+ cwd: session.cwd,
42
+ lastMessageAt: fp.mtimeMs,
43
+ createdAt: session.startedAt || fp.mtimeMs,
44
+ };
45
+ }
46
+ function readOne(dir) {
47
+ let summaryJson;
48
+ let chatHistory;
49
+ try {
50
+ summaryJson = readFileSync(join(dir, 'summary.json'), 'utf8');
51
+ chatHistory = readFileSync(join(dir, 'chat_history.jsonl'), 'utf8');
52
+ }
53
+ catch {
54
+ return undefined;
55
+ }
56
+ return parseGrokSession({ summaryJson, chatHistory });
57
+ }
58
+ export const grokBuildAdapter = {
59
+ id: 'grok-build',
60
+ label: 'Grok Build',
61
+ roots() {
62
+ const grokHome = process.env.GROK_HOME?.trim();
63
+ return [join(grokHome !== undefined && grokHome !== '' ? grokHome : join(homedir(), '.grok'), 'sessions')];
64
+ },
65
+ discover() {
66
+ const roots = this.roots();
67
+ const sessions = [];
68
+ const walk = (dir, depth) => {
69
+ if (depth > 2)
70
+ return;
71
+ let entries;
72
+ try {
73
+ entries = readdirSync(dir, { withFileTypes: true });
74
+ }
75
+ catch {
76
+ return;
77
+ }
78
+ for (const entry of entries) {
79
+ const path = join(dir, entry.name);
80
+ if (entry.isDirectory())
81
+ walk(path, depth + 1);
82
+ else if (entry.isFile() && entry.name === 'chat_history.jsonl') {
83
+ try {
84
+ if (statSync(path).size > 64 * 1024 * 1024)
85
+ continue;
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ const session = readOne(dir);
91
+ if (session !== undefined)
92
+ sessions.push(session);
93
+ }
94
+ }
95
+ };
96
+ for (const root of roots)
97
+ walk(root, 0);
98
+ return { roots, sessions };
99
+ },
100
+ count() {
101
+ return countEntries(this.roots(), { maxDepth: WALK.maxDepth, fileMatch: WALK.match });
102
+ },
103
+ walk: WALK,
104
+ async scan(options) {
105
+ const files = walkFiles(this.roots(), { ...WALK, signal: options?.signal });
106
+ return runScan(files, file => file.dir, directoryFingerprint, options, summarize);
107
+ },
108
+ async load(ref) {
109
+ const summaryJson = await loadText(join(ref, SUMMARY_FILE));
110
+ if (typeof summaryJson !== 'string')
111
+ return summaryJson;
112
+ const chatHistory = await loadText(join(ref, HISTORY_FILE));
113
+ if (typeof chatHistory !== 'string')
114
+ return chatHistory;
115
+ return parseGrokSession({ summaryJson, chatHistory }) ?? { skip: 'not-a-session' };
116
+ },
117
+ };
@@ -0,0 +1,13 @@
1
+ import type { MigrationSession } from '../types.js';
2
+ /** One session directory's two files, as text. */
3
+ export interface GrokSessionInput {
4
+ readonly summaryJson: string;
5
+ readonly chatHistory: string;
6
+ }
7
+ /**
8
+ * Parse one Grok Build session.
9
+ * @returns The session, or undefined when the summary lacks an id or cwd,
10
+ * or the history holds no prompt.
11
+ */
12
+ export declare function parseGrokSession(input: GrokSessionInput): MigrationSession | undefined;
13
+ //# sourceMappingURL=grok-build.parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-build.parse.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/adapters/grok-build.parse.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAgC,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAMjF,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AA2BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAwGtF"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Grok Build session parsing (pure): one session directory's `summary.json`
3
+ * + `chat_history.jsonl` → one {@link MigrationSession}.
4
+ *
5
+ * `summary.json` carries the metadata (`info.id`, `info.cwd`, titles, clock).
6
+ * `chat_history.jsonl` rows are tagged conversation items: `user` rows carry
7
+ * block-array content, `assistant` rows a plain string, and a `reasoning`
8
+ * row precedes the assistant row it explains. Rows carry no per-row
9
+ * timestamp. The legacy v0 shape (`{role, content}`) is accepted alongside.
10
+ *
11
+ * Tool traffic: an assistant row lists its calls in a top-level `tool_calls`
12
+ * array (`{ id, name, arguments }`); each result is a `tool_result` row
13
+ * naming `tool_call_id`, with optional `images` (replaced by placeholders).
14
+ * `backend_tool_call` rows are provider-side tools (web search) the model
15
+ * never called through the harness; they are counted, not imported.
16
+ *
17
+ * @module @deepseek-harness-tui/dsh-tui/migrate/adapters/grok-build.parse
18
+ */
19
+ import { isInjectedText, unwrapUserText } from '../parse/injection.js';
20
+ import { isRecord, parseJsonl } from '../parse/jsonl.js';
21
+ import { emptyStats } from '../parse/role-turns.js';
22
+ import { normalizeTitle } from '../parse/title.js';
23
+ import { CallIndex, IMAGE_PLACEHOLDER, closeToolPairs, newStep } from '../parse/tools.js';
24
+ /** How a compaction summary row opens (the other compaction_meta rows are
25
+ * the re-injected environment block). */
26
+ const COMPACTION_SUMMARY_LEAD = 'This session is being continued';
27
+ function toMillis(iso) {
28
+ return typeof iso === 'string' ? Date.parse(iso) || 0 : 0;
29
+ }
30
+ /** Text of string content, or of the text blocks of block-array content. */
31
+ function blocksText(content) {
32
+ if (typeof content === 'string')
33
+ return content;
34
+ if (!Array.isArray(content))
35
+ return '';
36
+ const parts = [];
37
+ for (const part of content) {
38
+ if (isRecord(part) && part.type === 'text' && typeof part.text === 'string' && part.text !== '')
39
+ parts.push(part.text);
40
+ }
41
+ return parts.join('\n\n');
42
+ }
43
+ /** The readable summary of a reasoning row (its encrypted state is never copied). */
44
+ function reasoningText(row) {
45
+ if (!Array.isArray(row.summary))
46
+ return '';
47
+ const parts = [];
48
+ for (const part of row.summary) {
49
+ if (isRecord(part) && typeof part.text === 'string' && part.text !== '')
50
+ parts.push(part.text);
51
+ }
52
+ return parts.join('\n\n');
53
+ }
54
+ /**
55
+ * Parse one Grok Build session.
56
+ * @returns The session, or undefined when the summary lacks an id or cwd,
57
+ * or the history holds no prompt.
58
+ */
59
+ export function parseGrokSession(input) {
60
+ let summaryDoc;
61
+ try {
62
+ summaryDoc = JSON.parse(input.summaryJson);
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ if (!isRecord(summaryDoc) || !isRecord(summaryDoc.info))
68
+ return undefined;
69
+ const { id, cwd } = summaryDoc.info;
70
+ if (typeof id !== 'string' || id === '' || typeof cwd !== 'string' || cwd === '')
71
+ return undefined;
72
+ const startedAt = toMillis(summaryDoc.created_at) || toMillis(summaryDoc.updated_at);
73
+ // Title authority: generated_title > session_summary (both the source's
74
+ // own, written to the log) > the first real prompt (fallback, not written).
75
+ const ownTitle = normalizeTitle([summaryDoc.generated_title, summaryDoc.session_summary]
76
+ .find((candidate) => typeof candidate === 'string' && candidate.trim() !== ''));
77
+ const { records, badLines } = parseJsonl(input.chatHistory);
78
+ const stats = { ...emptyStats(), badLines };
79
+ let turns = [];
80
+ let current;
81
+ let pendingReasoning = [];
82
+ /** A compaction summary waiting for the turn that follows the boundary. */
83
+ let pendingCompaction;
84
+ let lastModel;
85
+ const openTurn = (prompt) => {
86
+ const turn = pendingCompaction === undefined ? { prompt, steps: [] } : { prompt, compaction: pendingCompaction, steps: [] };
87
+ pendingCompaction = undefined;
88
+ turns.push(turn);
89
+ return turn;
90
+ };
91
+ const calls = new CallIndex();
92
+ for (const row of records) {
93
+ const kind = row.type === undefined ? row.role : row.type;
94
+ if (kind === 'user') {
95
+ // Tagged synthetic injections (system reminders, compaction meta, …)
96
+ // are not the human's words; the default `human` tag is omitted.
97
+ if (row.synthetic_reason !== undefined && row.synthetic_reason !== 'human') {
98
+ // A compaction leaves its summary as a synthetic row: the boundary
99
+ // becomes a native checkpoint in front of the next turn.
100
+ const text = blocksText(row.content).trim();
101
+ if (row.synthetic_reason === 'compaction_meta' && text.startsWith(COMPACTION_SUMMARY_LEAD)) {
102
+ pendingCompaction = lastModel === undefined ? { summary: text } : { summary: text, model: lastModel };
103
+ current = undefined;
104
+ }
105
+ else {
106
+ stats.filtered += 1;
107
+ }
108
+ continue;
109
+ }
110
+ const raw = blocksText(row.content);
111
+ // Untagged injection: the environment block (`<user_info>`) that opens
112
+ // every session and follows every compaction.
113
+ if (isInjectedText(raw)) {
114
+ stats.filtered += 1;
115
+ continue;
116
+ }
117
+ // The human words sit inside `<user_query>`, possibly behind an
118
+ // interrupt or "sent while you were working" notice.
119
+ const prompt = unwrapUserText(raw);
120
+ if (prompt === '')
121
+ continue;
122
+ // Speaking over a running turn cut that turn short.
123
+ if (row.prior_turn_interrupt !== undefined && current !== undefined)
124
+ current.aborted = true;
125
+ current = openTurn(prompt);
126
+ }
127
+ else if (kind === 'assistant') {
128
+ const text = blocksText(row.content);
129
+ const toolCalls = Array.isArray(row.tool_calls) ? row.tool_calls.filter(isRecord) : [];
130
+ if (text === '' && pendingReasoning.length === 0 && toolCalls.length === 0)
131
+ continue;
132
+ current ??= openTurn('');
133
+ if (typeof row.model_id === 'string' && row.model_id !== '')
134
+ lastModel = row.model_id;
135
+ const step = newStep(typeof row.model_id === 'string' && row.model_id !== '' ? row.model_id : undefined);
136
+ // A reasoning row is the pre-sibling of the assistant row it explains.
137
+ for (const reasoning of pendingReasoning)
138
+ step.blocks.push({ type: 'reasoning', text: reasoning });
139
+ pendingReasoning = [];
140
+ if (text !== '')
141
+ step.blocks.push({ type: 'text', text });
142
+ for (const call of toolCalls) {
143
+ if (typeof call.id !== 'string' || call.id === '')
144
+ continue;
145
+ const name = typeof call.name === 'string' && call.name !== '' ? call.name : 'unknown';
146
+ const args = typeof call.arguments === 'string' ? call.arguments : JSON.stringify(call.arguments ?? {});
147
+ step.blocks.push({ type: 'tool-call', id: call.id, name, arguments: args });
148
+ }
149
+ calls.register(step);
150
+ current.steps.push(step);
151
+ }
152
+ else if (kind === 'tool_result') {
153
+ if (typeof row.tool_call_id !== 'string') {
154
+ calls.orphans += 1;
155
+ continue;
156
+ }
157
+ const images = Array.isArray(row.images) ? row.images.length : 0;
158
+ const text = [blocksText(row.content), ...Array.from({ length: images }, () => IMAGE_PLACEHOLDER)].filter(part => part !== '').join('\n');
159
+ calls.attach(row.tool_call_id, text, row.is_error === true);
160
+ }
161
+ else if (kind === 'backend_tool_call') {
162
+ stats.filtered += 1;
163
+ }
164
+ else if (kind === 'reasoning') {
165
+ const text = reasoningText(row);
166
+ if (text !== '')
167
+ pendingReasoning.push(text);
168
+ }
169
+ }
170
+ if (pendingCompaction !== undefined)
171
+ turns.push({ prompt: '', compaction: pendingCompaction, steps: [] });
172
+ turns = turns.filter(turn => turn.prompt !== '' || turn.steps.length > 0 || turn.compaction !== undefined);
173
+ stats.droppedToolResults = calls.orphans + closeToolPairs(turns);
174
+ if (!turns.some(turn => turn.prompt !== ''))
175
+ return undefined;
176
+ const title = ownTitle !== '' ? ownTitle : normalizeTitle(turns.find(turn => turn.prompt !== '')?.prompt);
177
+ return { sourceId: id, cwd, ...(title === '' ? {} : { title }), titleExplicit: ownTitle !== '', startedAt, turns, stats };
178
+ }
@@ -0,0 +1,3 @@
1
+ import type { MigrationAdapter } from '../types.js';
2
+ export declare const ompAdapter: MigrationAdapter;
3
+ //# sourceMappingURL=omp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omp.d.ts","sourceRoot":"","sources":["../../../../../src/dsh-adapter/migrate/adapters/omp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAuD,MAAM,aAAa,CAAA;AAyExG,eAAO,MAAM,UAAU,EAAE,gBAmCxB,CAAA"}