@deepseek-harness-tui/dsh-tui 0.15.0 → 0.16.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 (301) hide show
  1. package/README.md +92 -5
  2. package/guide/dsh-tui-guide/codex-backend.en.md +13 -3
  3. package/guide/dsh-tui-guide/codex-backend.md +9 -2
  4. package/guide/dsh-tui-guide/configuration.en.md +39 -2
  5. package/guide/dsh-tui-guide/configuration.md +34 -2
  6. package/guide/dsh-tui-guide/getting-started.en.md +15 -0
  7. package/guide/dsh-tui-guide/getting-started.md +15 -0
  8. package/guide/dsh-tui-guide/interaction.en.md +8 -1
  9. package/guide/dsh-tui-guide/interaction.md +8 -1
  10. package/guide/dsh-tui-guide/plugins.en.md +66 -5
  11. package/guide/dsh-tui-guide/plugins.md +37 -3
  12. package/guide/dsh-tui-guide/user-guide.en.md +3 -2
  13. package/guide/dsh-tui-guide/user-guide.md +3 -2
  14. package/lib/settings.json +1 -1
  15. package/lib/types/adapter/channel/projection.d.ts.map +1 -1
  16. package/lib/types/adapter/channel/projection.js +1 -0
  17. package/lib/types/adapter/channel/ui-policy.d.ts +1 -1
  18. package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
  19. package/lib/types/adapter/channel/ui-policy.js +1 -0
  20. package/lib/types/adapter/ports/channel-catalog.d.ts +5 -1
  21. package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
  22. package/lib/types/adapter/ports/channel-settings.d.ts +5 -3
  23. package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
  24. package/lib/types/adapter/ports/channel-ui.d.ts +7 -1
  25. package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
  26. package/lib/types/adapter/ports/channel-view.d.ts +47 -0
  27. package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
  28. package/lib/types/adapter/ports/channel.d.ts +2 -0
  29. package/lib/types/adapter/ports/channel.d.ts.map +1 -1
  30. package/lib/types/agent/events.d.ts +3 -2
  31. package/lib/types/agent/events.d.ts.map +1 -1
  32. package/lib/types/backends/codex/contract.d.ts +3 -0
  33. package/lib/types/backends/codex/contract.d.ts.map +1 -1
  34. package/lib/types/backends/codex/contract.js +3 -0
  35. package/lib/types/backends/codex/session/async-questions.d.ts +17 -0
  36. package/lib/types/backends/codex/session/async-questions.d.ts.map +1 -0
  37. package/lib/types/backends/codex/session/async-questions.js +89 -0
  38. package/lib/types/backends/codex/session/session.d.ts.map +1 -1
  39. package/lib/types/backends/codex/session/session.js +35 -9
  40. package/lib/types/backends/codex/text.d.ts +3 -3
  41. package/lib/types/backends/codex/text.js +1 -1
  42. package/lib/types/backends/codex/translate/items.d.ts.map +1 -1
  43. package/lib/types/backends/codex/translate/items.js +3 -1
  44. package/lib/types/backends/codex/translate/question-reply.d.ts +11 -0
  45. package/lib/types/backends/codex/translate/question-reply.d.ts.map +1 -0
  46. package/lib/types/backends/codex/translate/question-reply.js +53 -0
  47. package/lib/types/channel/projection.d.ts.map +1 -1
  48. package/lib/types/channel/projection.js +10 -0
  49. package/lib/types/commands.d.ts +10 -0
  50. package/lib/types/commands.d.ts.map +1 -1
  51. package/lib/types/commands.js +11 -2
  52. package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
  53. package/lib/types/components/CommandSuggestions.js +4 -1
  54. package/lib/types/components/LogoV2.d.ts +4 -1
  55. package/lib/types/components/LogoV2.d.ts.map +1 -1
  56. package/lib/types/components/LogoV2.js +5 -3
  57. package/lib/types/components/MessageList.d.ts.map +1 -1
  58. package/lib/types/components/MessageList.js +95 -14
  59. package/lib/types/components/PermissionsPicker.d.ts +10 -1
  60. package/lib/types/components/PermissionsPicker.d.ts.map +1 -1
  61. package/lib/types/components/PermissionsPicker.js +24 -16
  62. package/lib/types/components/PluginInstallPane.d.ts +21 -0
  63. package/lib/types/components/PluginInstallPane.d.ts.map +1 -0
  64. package/lib/types/components/PluginInstallPane.js +84 -0
  65. package/lib/types/components/PluginManagePane.d.ts +21 -0
  66. package/lib/types/components/PluginManagePane.d.ts.map +1 -0
  67. package/lib/types/components/PluginManagePane.js +69 -0
  68. package/lib/types/components/PromptInput.d.ts.map +1 -1
  69. package/lib/types/components/PromptInput.js +7 -3
  70. package/lib/types/components/SubagentCard.d.ts +13 -1
  71. package/lib/types/components/SubagentCard.d.ts.map +1 -1
  72. package/lib/types/components/SubagentCard.js +27 -12
  73. package/lib/types/components/SubagentDashboard.d.ts +8 -1
  74. package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
  75. package/lib/types/components/SubagentDashboard.js +58 -16
  76. package/lib/types/components/launchpadLayout.d.ts +14 -1
  77. package/lib/types/components/launchpadLayout.d.ts.map +1 -1
  78. package/lib/types/components/launchpadLayout.js +36 -17
  79. package/lib/types/components/messages/TeamMessageBubble.d.ts +20 -0
  80. package/lib/types/components/messages/TeamMessageBubble.d.ts.map +1 -0
  81. package/lib/types/components/messages/TeamMessageBubble.js +15 -0
  82. package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -1
  83. package/lib/types/components/sidePanel/PanelHost.js +5 -1
  84. package/lib/types/components/sidePanel/PanelStore.d.ts +8 -0
  85. package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
  86. package/lib/types/components/sidePanel/PanelStore.js +11 -0
  87. package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
  88. package/lib/types/components/sidePanel/SidePanelColumn.js +13 -1
  89. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +7 -0
  90. package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -1
  91. package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +4 -0
  92. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +3 -0
  93. package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -1
  94. package/lib/types/components/sidePanel/btw/BtwComposer.js +20 -8
  95. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +2 -1
  96. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -1
  97. package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +104 -13
  98. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +6 -2
  99. package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -1
  100. package/lib/types/components/sidePanel/btw/BtwThreadScene.js +61 -15
  101. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +14 -4
  102. package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -1
  103. package/lib/types/components/sidePanel/btw/BtwThreadView.js +90 -5
  104. package/lib/types/components/sidePanel/btw/threads.d.ts +18 -0
  105. package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -1
  106. package/lib/types/components/sidePanel/btw/threads.js +51 -0
  107. package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
  108. package/lib/types/components/sidePanel/builtinPanels.js +5 -1
  109. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +5 -1
  110. package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -1
  111. package/lib/types/components/sidePanel/companion/SplashMascot.js +19 -4
  112. package/lib/types/components/sidePanel/companion/skins.d.ts +8 -0
  113. package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
  114. package/lib/types/components/sidePanel/companion/skins.js +57 -12
  115. package/lib/types/components/sidePanel/types.d.ts +6 -0
  116. package/lib/types/components/sidePanel/types.d.ts.map +1 -1
  117. package/lib/types/components/splashArtRows.d.ts +29 -0
  118. package/lib/types/components/splashArtRows.d.ts.map +1 -0
  119. package/lib/types/components/splashArtRows.js +31 -0
  120. package/lib/types/components/teamRoster.d.ts +70 -0
  121. package/lib/types/components/teamRoster.d.ts.map +1 -0
  122. package/lib/types/components/teamRoster.js +78 -0
  123. package/lib/types/dsh-adapter/admission-loader.d.ts +82 -0
  124. package/lib/types/dsh-adapter/admission-loader.d.ts.map +1 -1
  125. package/lib/types/dsh-adapter/admission-loader.js +73 -28
  126. package/lib/types/dsh-adapter/agent-view.d.ts.map +1 -1
  127. package/lib/types/dsh-adapter/agent-view.js +3 -1
  128. package/lib/types/dsh-adapter/approvals.d.ts +7 -0
  129. package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
  130. package/lib/types/dsh-adapter/approvals.js +45 -1
  131. package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -1
  132. package/lib/types/dsh-adapter/backend/translate.js +68 -8
  133. package/lib/types/dsh-adapter/backend-assembly.d.ts +31 -0
  134. package/lib/types/dsh-adapter/backend-assembly.d.ts.map +1 -0
  135. package/lib/types/dsh-adapter/backend-assembly.js +225 -0
  136. package/lib/types/dsh-adapter/backend-contribution.d.ts +36 -0
  137. package/lib/types/dsh-adapter/backend-contribution.d.ts.map +1 -1
  138. package/lib/types/dsh-adapter/backend-contribution.js +41 -0
  139. package/lib/types/dsh-adapter/backend-registry.d.ts.map +1 -1
  140. package/lib/types/dsh-adapter/backend-registry.js +22 -3
  141. package/lib/types/dsh-adapter/backends.d.ts.map +1 -1
  142. package/lib/types/dsh-adapter/backends.js +4 -5
  143. package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
  144. package/lib/types/dsh-adapter/bundled-presets.js +60 -3
  145. package/lib/types/dsh-adapter/channel/binding-events.d.ts +1 -0
  146. package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
  147. package/lib/types/dsh-adapter/channel/binding-events.js +1 -0
  148. package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
  149. package/lib/types/dsh-adapter/channel/command-completions.js +64 -7
  150. package/lib/types/dsh-adapter/channel/compaction.d.ts +7 -2
  151. package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
  152. package/lib/types/dsh-adapter/channel/compaction.js +100 -26
  153. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +3 -0
  154. package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -1
  155. package/lib/types/dsh-adapter/channel/core/binding-feed.js +2 -1
  156. package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -1
  157. package/lib/types/dsh-adapter/channel/core/compose.js +12 -0
  158. package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -1
  159. package/lib/types/dsh-adapter/channel/extensions.js +68 -8
  160. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +6 -0
  161. package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
  162. package/lib/types/dsh-adapter/channel/mode-permission-actions.js +104 -12
  163. package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
  164. package/lib/types/dsh-adapter/channel/model-actions.js +8 -1
  165. package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
  166. package/lib/types/dsh-adapter/channel/permissions.js +4 -1
  167. package/lib/types/dsh-adapter/channel/projection-helpers.d.ts.map +1 -1
  168. package/lib/types/dsh-adapter/channel/projection-helpers.js +2 -0
  169. package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
  170. package/lib/types/dsh-adapter/channel/session-metadata.js +4 -3
  171. package/lib/types/dsh-adapter/channel/session-reset.js +2 -2
  172. package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
  173. package/lib/types/dsh-adapter/channel/session-resume.js +7 -0
  174. package/lib/types/dsh-adapter/channel/settings-host.d.ts +3 -0
  175. package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
  176. package/lib/types/dsh-adapter/channel/settings-host.js +135 -5
  177. package/lib/types/dsh-adapter/channel/state.d.ts +6 -0
  178. package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
  179. package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
  180. package/lib/types/dsh-adapter/channel/subagent-projection.js +18 -6
  181. package/lib/types/dsh-adapter/channel/transcript.d.ts +7 -0
  182. package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
  183. package/lib/types/dsh-adapter/channel/transcript.js +19 -2
  184. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts +55 -0
  185. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.d.ts.map +1 -0
  186. package/lib/types/dsh-adapter/compat/agent-team-0.2.0.js +96 -0
  187. package/lib/types/dsh-adapter/contract.d.ts +4 -4
  188. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  189. package/lib/types/dsh-adapter/contract.js +5 -5
  190. package/lib/types/dsh-adapter/effect-ledger.d.ts +7 -0
  191. package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -1
  192. package/lib/types/dsh-adapter/effect-ledger.js +8 -1
  193. package/lib/types/dsh-adapter/entry-slot.d.ts +3 -1
  194. package/lib/types/dsh-adapter/entry-slot.d.ts.map +1 -1
  195. package/lib/types/dsh-adapter/entry-slot.js +2 -2
  196. package/lib/types/dsh-adapter/fresh-agent.d.ts.map +1 -1
  197. package/lib/types/dsh-adapter/fresh-agent.js +6 -1
  198. package/lib/types/dsh-adapter/host-access.d.ts.map +1 -1
  199. package/lib/types/dsh-adapter/host-access.js +95 -0
  200. package/lib/types/dsh-adapter/host-contract.d.ts +1 -1
  201. package/lib/types/dsh-adapter/host-contract.d.ts.map +1 -1
  202. package/lib/types/dsh-adapter/host-contract.js +3 -2
  203. package/lib/types/dsh-adapter/host-dsh.d.ts +8 -2
  204. package/lib/types/dsh-adapter/host-dsh.d.ts.map +1 -1
  205. package/lib/types/dsh-adapter/host-dsh.js +45 -30
  206. package/lib/types/dsh-adapter/host-entry.js +35 -10
  207. package/lib/types/dsh-adapter/index.d.ts +9 -10
  208. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  209. package/lib/types/dsh-adapter/index.js +8 -6
  210. package/lib/types/dsh-adapter/invariant.d.ts +7 -2
  211. package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
  212. package/lib/types/dsh-adapter/invariant.js +6 -3
  213. package/lib/types/dsh-adapter/migrate/index.js +2 -2
  214. package/lib/types/dsh-adapter/panels.d.ts.map +1 -1
  215. package/lib/types/dsh-adapter/panels.js +6 -0
  216. package/lib/types/dsh-adapter/plugin-declaration.d.ts +99 -1
  217. package/lib/types/dsh-adapter/plugin-declaration.d.ts.map +1 -1
  218. package/lib/types/dsh-adapter/plugin-declaration.js +132 -2
  219. package/lib/types/dsh-adapter/plugin-feed.d.ts +94 -0
  220. package/lib/types/dsh-adapter/plugin-feed.d.ts.map +1 -0
  221. package/lib/types/dsh-adapter/plugin-feed.js +135 -0
  222. package/lib/types/dsh-adapter/plugin-guard.d.ts +115 -0
  223. package/lib/types/dsh-adapter/plugin-guard.d.ts.map +1 -0
  224. package/lib/types/dsh-adapter/plugin-guard.js +108 -0
  225. package/lib/types/dsh-adapter/plugin-install.d.ts +160 -0
  226. package/lib/types/dsh-adapter/plugin-install.d.ts.map +1 -0
  227. package/lib/types/dsh-adapter/plugin-install.js +545 -0
  228. package/lib/types/dsh-adapter/plugin-manage.d.ts +178 -0
  229. package/lib/types/dsh-adapter/plugin-manage.d.ts.map +1 -0
  230. package/lib/types/dsh-adapter/plugin-manage.js +468 -0
  231. package/lib/types/dsh-adapter/plugin-manager.d.ts +78 -2
  232. package/lib/types/dsh-adapter/plugin-manager.d.ts.map +1 -1
  233. package/lib/types/dsh-adapter/plugin-manager.js +32 -0
  234. package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
  235. package/lib/types/dsh-adapter/plugin.js +49 -2
  236. package/lib/types/dsh-adapter/plugins-info.d.ts +87 -1
  237. package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -1
  238. package/lib/types/dsh-adapter/plugins-info.js +131 -26
  239. package/lib/types/dsh-adapter/process-exit.d.ts +1 -1
  240. package/lib/types/dsh-adapter/process-exit.d.ts.map +1 -1
  241. package/lib/types/dsh-adapter/process-exit.js +1 -1
  242. package/lib/types/dsh-adapter/session-projection-store.d.ts +66 -0
  243. package/lib/types/dsh-adapter/session-projection-store.d.ts.map +1 -0
  244. package/lib/types/dsh-adapter/session-projection-store.js +149 -0
  245. package/lib/types/dsh-adapter/settingsEditor.js +2 -2
  246. package/lib/types/dsh-adapter/sideQuestion.d.ts +21 -0
  247. package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
  248. package/lib/types/dsh-adapter/sideQuestion.js +53 -0
  249. package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
  250. package/lib/types/dsh-adapter/subagents.js +2 -1
  251. package/lib/types/dsh-adapter/team-mode.d.ts +74 -0
  252. package/lib/types/dsh-adapter/team-mode.d.ts.map +1 -0
  253. package/lib/types/dsh-adapter/team-mode.js +188 -0
  254. package/lib/types/dsh-adapter/team-roster.d.ts +67 -0
  255. package/lib/types/dsh-adapter/team-roster.d.ts.map +1 -0
  256. package/lib/types/dsh-adapter/team-roster.js +136 -0
  257. package/lib/types/dsh-adapter/team-tools.d.ts +58 -0
  258. package/lib/types/dsh-adapter/team-tools.d.ts.map +1 -0
  259. package/lib/types/dsh-adapter/team-tools.js +208 -0
  260. package/lib/types/dsh-adapter/types.d.ts +1 -1
  261. package/lib/types/dsh-adapter/types.d.ts.map +1 -1
  262. package/lib/types/i18n.d.ts +607 -16
  263. package/lib/types/i18n.d.ts.map +1 -1
  264. package/lib/types/i18n.js +295 -9
  265. package/lib/types/ink/components/ScrollBox.d.ts +9 -0
  266. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
  267. package/lib/types/ink/components/ScrollBox.js +23 -0
  268. package/lib/types/ink/dom.d.ts.map +1 -1
  269. package/lib/types/kernelPrefs.d.ts +1 -1
  270. package/lib/types/kernelPrefs.d.ts.map +1 -1
  271. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
  272. package/lib/types/native-ts/yoga-layout/index.js +8 -1
  273. package/lib/types/permissionPresetLabels.d.ts +25 -0
  274. package/lib/types/permissionPresetLabels.d.ts.map +1 -0
  275. package/lib/types/permissionPresetLabels.js +33 -0
  276. package/lib/types/preset-patch.d.ts +22 -0
  277. package/lib/types/preset-patch.d.ts.map +1 -0
  278. package/lib/types/preset-patch.js +14 -0
  279. package/lib/types/screens/Chat.d.ts +33 -1
  280. package/lib/types/screens/Chat.d.ts.map +1 -1
  281. package/lib/types/screens/Chat.js +301 -9
  282. package/lib/types/screens/Launchpad.d.ts +7 -1
  283. package/lib/types/screens/Launchpad.d.ts.map +1 -1
  284. package/lib/types/screens/Launchpad.js +19 -4
  285. package/lib/types/screens/Settings.d.ts.map +1 -1
  286. package/lib/types/screens/Settings.js +1 -0
  287. package/lib/types/screens/chat/usePluginWriteFlow.d.ts +68 -0
  288. package/lib/types/screens/chat/usePluginWriteFlow.d.ts.map +1 -0
  289. package/lib/types/screens/chat/usePluginWriteFlow.js +92 -0
  290. package/lib/types/screens/chatOverlay.d.ts +19 -1
  291. package/lib/types/screens/chatOverlay.d.ts.map +1 -1
  292. package/lib/types/sessionModes.d.ts +5 -3
  293. package/lib/types/sessionModes.d.ts.map +1 -1
  294. package/lib/types/sessionModes.js +9 -3
  295. package/lib/types/tips.js +2 -2
  296. package/lib/types/utils/paths.d.ts +11 -0
  297. package/lib/types/utils/paths.d.ts.map +1 -1
  298. package/lib/types/utils/paths.js +13 -0
  299. package/package.json +126 -120
  300. package/tui-profile/feed/README.md +63 -0
  301. package/tui-profile/feed/first-party.json +10 -0
@@ -3,6 +3,14 @@ import { markChannelReadDirty } from '../../adapter/channel/read-view.js';
3
3
  import { agentMessageFailureOf, agentMessageTextOf, agentRelaySourceOf, foldAgentMessage } from '../../agent/messages.js';
4
4
  import { SubagentActivityStore } from '../subagents.js';
5
5
  import { isSubagentToolName } from './projection-helpers.js';
6
+ import { teamMailboxAsRelay } from '../compat/agent-team-0.2.0.js';
7
+ import { teamMessageOf } from '../team-tools.js';
8
+ /** A relay's body as the agent-message feed shows it: a team message without
9
+ * its `Team message from <name>:` framing block (the sender is `from`). */
10
+ function relayTextOf(source, content) {
11
+ const team = Array.isArray(content) ? teamMessageOf(source, content) : undefined;
12
+ return team?.text ?? agentMessageTextOf(content);
13
+ }
6
14
  /**
7
15
  * Bound the retained description text. Evicting an older term does not cancel
8
16
  * its pending spawn: a separate count keeps those unmatched starts from
@@ -253,18 +261,20 @@ function createSessionSubagentProjection(getState, deps) {
253
261
  * provable from the log alone; a plain user/message (no relay source)
254
262
  * never becomes one. */
255
263
  const noteChildRelay = (childId, event) => {
256
- const data = event.data;
257
- if (data === undefined || typeof data.id !== 'string' || data.id === '')
264
+ const raw = event.data;
265
+ if (raw === undefined || typeof raw.id !== 'string' || raw.id === '')
258
266
  return;
267
+ // compat(dsh 0.2.0, log): a 0.2.0 mailbox delivery reads as the relay it became.
268
+ const data = teamMailboxAsRelay(raw);
259
269
  const relay = agentRelaySourceOf(data.source);
260
270
  if (relay === undefined)
261
271
  return;
262
272
  foldAgentMessage(agentMessages, {
263
- messageId: data.id,
273
+ messageId: raw.id,
264
274
  from: relay.senderSessionId,
265
275
  to: childId,
266
276
  via: 'agent-relay',
267
- text: agentMessageTextOf(data.content),
277
+ text: relayTextOf(data.source, data.content),
268
278
  state: 'queued',
269
279
  ...(typeof event.seq === 'number' ? { sourceRef: `seq:${event.seq}` } : {}),
270
280
  observedAt: eventTime(event) ?? Date.now(),
@@ -401,14 +411,16 @@ function createSessionSubagentProjection(getState, deps) {
401
411
  // names the sending session. Plain user text, injected context and
402
412
  // settlement notices are not relays; they stay invisible here, just as
403
413
  // the translator keeps them out of bubbles.
404
- const relay = agentRelaySourceOf(data.source);
414
+ // compat(dsh 0.2.0, log): a 0.2.0 mailbox delivery reads as the relay it became.
415
+ const delivered = teamMailboxAsRelay(data);
416
+ const relay = agentRelaySourceOf(delivered.source);
405
417
  if (relay !== undefined && typeof data.id === 'string' && data.id !== '') {
406
418
  foldAgentMessage(agentMessages, {
407
419
  messageId: data.id,
408
420
  from: relay.senderSessionId,
409
421
  ...(parentSessionId === undefined ? {} : { to: parentSessionId, parentSessionId }),
410
422
  via: 'agent-relay',
411
- text: agentMessageTextOf(data.content),
423
+ text: relayTextOf(delivered.source, delivered.content),
412
424
  state: 'queued',
413
425
  ...(typeof ev.seq === 'number' ? { sourceRef: `seq:${ev.seq}` } : {}),
414
426
  observedAt: eventTime(event) ?? Date.now(),
@@ -44,6 +44,13 @@ export declare const GOAL_RESULT_BADGE: Record<string, string>;
44
44
  */
45
45
  export declare function harnessToolResultView(name: string, data: SessionEvent<'tool/result'>['data']): ToolResultView | undefined;
46
46
  export declare function toolErrorText(event: SessionEvent<'tool/result'>): string;
47
+ /** One structured tool failure (`tool/result.error`) as display text: its
48
+ * `name: code` identity plus the result detail. An auto-review denial reads
49
+ * as a localized "denied, not executed" plus the reviewer's `reason`, never
50
+ * its English detail (that only restates the denial); other failures' `reason`
51
+ * repeats their detail and stays out. Shared by the transcript and the
52
+ * subagent cards. */
53
+ export declare function toolFailureText(failure: unknown, detail: string): string;
47
54
  /** Restore a folded tool row's result text from its tool/result event. */
48
55
  export declare function restoreToolResult(row: ChatRow, event: SessionEvent<'tool/result'>): void;
49
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAI7H,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAE1F;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;AACzD;qCACqC;AACrC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GACrC,MAAM,CA4CR;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA8C5G;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA+B3E;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAEzE;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GACxC,cAAc,GAAG,SAAS,CA4C5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAMxE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,CAUxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CA2BnF"}
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/channel/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAI7H,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAE1F;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;AACzD;qCACqC;AACrC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GACrC,MAAM,CA4CR;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA8C5G;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA+B3E;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAEzE;AAED,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpD,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GACxC,cAAc,GAAG,SAAS,CA4C5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAIxE;AAED;;;;;sBAKsB;AACtB,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,CAUxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CA2BnF"}
@@ -1,4 +1,5 @@
1
1
  import { toolResultPayload } from '../compat/messages.js';
2
+ import { t } from '../../i18n.js';
2
3
  import { markChannelReadDirty } from '../../adapter/channel/read-view.js';
3
4
  import { ARGS_PREVIEW_LIMIT, LOCAL_OUTPUT_LIMIT, MAX_ROWS, preview, RESULT_PREVIEW_LIMIT } from '../../channel/transcript.js';
4
5
  // Limits and the preview helper are backend-neutral (src/channel/transcript.ts);
@@ -240,8 +241,24 @@ export function toolErrorText(event) {
240
241
  const failure = event.data.error;
241
242
  if (failure === undefined)
242
243
  return toolResultPayload(event.data.message).isError ? toolResultText(event) : '';
243
- const identity = `${failure.name}: ${failure.code}`;
244
- const detail = toolResultText(event);
244
+ return toolFailureText(failure, toolResultText(event));
245
+ }
246
+ /** One structured tool failure (`tool/result.error`) as display text: its
247
+ * `name: code` identity plus the result detail. An auto-review denial reads
248
+ * as a localized "denied, not executed" plus the reviewer's `reason`, never
249
+ * its English detail (that only restates the denial); other failures' `reason`
250
+ * repeats their detail and stays out. Shared by the transcript and the
251
+ * subagent cards. */
252
+ export function toolFailureText(failure, detail) {
253
+ const record = failure !== null && typeof failure === 'object' ? failure : {};
254
+ if (record.code === 'AUTO_REVIEW_DENIED') {
255
+ const identity = t('tool-error-auto-review-denied');
256
+ const reason = typeof record.reason === 'string' ? record.reason.trim() : '';
257
+ return reason !== '' ? `${identity} — ${reason}` : identity;
258
+ }
259
+ const identity = typeof record.name === 'string' && typeof record.code === 'string'
260
+ ? `${record.name}: ${record.code}`
261
+ : String(failure);
245
262
  return detail === '' || detail === identity ? identity : `${identity} — ${detail}`;
246
263
  }
247
264
  /** Restore a folded tool row's result text from its tool/result event. */
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Agent Teams 0.2.0 durable shapes, read as their 0.2.1 equivalents.
3
+ *
4
+ * The readers that meet these shapes call in here first, so the rest of the
5
+ * adapter knows only the 0.2.1 forms (docs/agent-teams-design.md「兼容(0.2.0)」):
6
+ * the translator and the subagent projection for mailbox deliveries, the
7
+ * translator and agent-view for a teammate's first prompt. Session previews
8
+ * (sessions/digest.ts) and the recap read no teammate session today: the
9
+ * listings previews serve skip `origin: subagent`, and the recap reads only
10
+ * the bound session. Route them here when a teammate session opens there.
11
+ * The shapes are log compatibility, not host compatibility: a 0.2.1 host
12
+ * still resumes sessions recorded under 0.2.0, so dropping the 0.2.0 host
13
+ * line alone does not retire this module. It retires when reading
14
+ * 0.2.0-era team logs is given up; then delete this file and its callers
15
+ * (`grep -rn "compat(dsh 0.2.0"`).
16
+ *
17
+ * @module
18
+ */
19
+ /**
20
+ * A team message delivered by the 0.2.0 mailbox, as the relay it became:
21
+ * source `{ kind: 'agent-message', form: 'relay', senderSessionId }`, first
22
+ * block `Team message from <name>:`. The 0.2.0 framing block
23
+ * (`Team message <id> from <name>:`) is replaced only when it matches this
24
+ * message's identity exactly; otherwise it stays as content, as it did.
25
+ * @param data - the message's source and content (other fields are kept).
26
+ * @returns `data`, or a copy in the 0.2.1 form.
27
+ */
28
+ export declare function teamMailboxAsRelay<T extends {
29
+ readonly source?: unknown;
30
+ readonly content?: unknown;
31
+ }>(data: T): T;
32
+ /**
33
+ * A teammate's first prompt without the leading `<system-reminder>` identity
34
+ * block (0.2.1 carries it as a system-prompt context). Matched against the
35
+ * whole 0.2.0 template, on a human-sourced message with more blocks after it;
36
+ * callers apply it to the first prompt they read (a translator: the first
37
+ * since its replay or reset). A reader that starts mid-log — a subagent
38
+ * transcript page, the live translator after `history()` replayed on its own
39
+ * instance — counts its first prompt as one, so only that prompt, pasted as
40
+ * the exact template plus more blocks, could lose the block.
41
+ * @param data - the message's source and content (other fields are kept).
42
+ * @returns `data`, or a copy without the block.
43
+ */
44
+ export declare function withoutTeammateReminder<T extends {
45
+ readonly source?: unknown;
46
+ readonly content?: unknown;
47
+ }>(data: T): T;
48
+ /**
49
+ * The 0.2.0 `send_message` result: the mailbox status of the queued message
50
+ * (0.2.1 answers `{ sent: true }`).
51
+ * @param value - the parsed tool result.
52
+ * @returns `accepted` / `queued`, or `undefined` for anything else.
53
+ */
54
+ export declare function legacySendMessageStatus(value: Readonly<Record<string, unknown>>): string | undefined;
55
+ //# sourceMappingURL=agent-team-0.2.0.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-team-0.2.0.d.ts","sourceRoot":"","sources":["../../../../src/dsh-adapter/compat/agent-team-0.2.0.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAYlH;AAqBD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAKvH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAEpG"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Agent Teams 0.2.0 durable shapes, read as their 0.2.1 equivalents.
3
+ *
4
+ * The readers that meet these shapes call in here first, so the rest of the
5
+ * adapter knows only the 0.2.1 forms (docs/agent-teams-design.md「兼容(0.2.0)」):
6
+ * the translator and the subagent projection for mailbox deliveries, the
7
+ * translator and agent-view for a teammate's first prompt. Session previews
8
+ * (sessions/digest.ts) and the recap read no teammate session today: the
9
+ * listings previews serve skip `origin: subagent`, and the recap reads only
10
+ * the bound session. Route them here when a teammate session opens there.
11
+ * The shapes are log compatibility, not host compatibility: a 0.2.1 host
12
+ * still resumes sessions recorded under 0.2.0, so dropping the 0.2.0 host
13
+ * line alone does not retire this module. It retires when reading
14
+ * 0.2.0-era team logs is given up; then delete this file and its callers
15
+ * (`grep -rn "compat(dsh 0.2.0"`).
16
+ *
17
+ * @module
18
+ */
19
+ function mailboxSourceOf(source) {
20
+ const shape = source;
21
+ return shape?.kind === 'team-message' && typeof shape.senderId === 'string' && typeof shape.senderName === 'string'
22
+ ? shape
23
+ : undefined;
24
+ }
25
+ /**
26
+ * A team message delivered by the 0.2.0 mailbox, as the relay it became:
27
+ * source `{ kind: 'agent-message', form: 'relay', senderSessionId }`, first
28
+ * block `Team message from <name>:`. The 0.2.0 framing block
29
+ * (`Team message <id> from <name>:`) is replaced only when it matches this
30
+ * message's identity exactly; otherwise it stays as content, as it did.
31
+ * @param data - the message's source and content (other fields are kept).
32
+ * @returns `data`, or a copy in the 0.2.1 form.
33
+ */
34
+ export function teamMailboxAsRelay(data) {
35
+ const { source, content } = data;
36
+ const mailbox = mailboxSourceOf(source);
37
+ if (mailbox === undefined || !Array.isArray(content))
38
+ return data;
39
+ const first = content[0];
40
+ const legacyFraming = `Team message ${String(mailbox.messageId)} from ${mailbox.senderName}:`;
41
+ const body = first?.type === 'text' && first.text === legacyFraming ? content.slice(1) : content;
42
+ return {
43
+ ...data,
44
+ source: { kind: 'agent-message', form: 'relay', senderSessionId: mailbox.senderId },
45
+ content: [{ type: 'text', text: `Team message from ${mailbox.senderName}:` }, ...body],
46
+ };
47
+ }
48
+ /** The identity block 0.2.0 `spawn_teammate` put before a teammate's first prompt, around the name. */
49
+ const REMINDER_HEAD = '<system-reminder>\nYou are teammate "';
50
+ const REMINDER_TAIL = `".
51
+ Your Team Lead is named "lead".
52
+ Use list_agents({}) to find your teammates and their names.
53
+ To message your Team Lead, use send_message({ target: "lead", message: "..." }).
54
+ To message another teammate, use send_message({ target: "<teammate name>", message: "..." }).
55
+ </system-reminder>
56
+
57
+ `;
58
+ function isTeammateReminder(block) {
59
+ const { type, text } = (block ?? {});
60
+ if (type !== 'text' || typeof text !== 'string')
61
+ return false;
62
+ if (text.length < REMINDER_HEAD.length + REMINDER_TAIL.length)
63
+ return false;
64
+ if (!text.startsWith(REMINDER_HEAD) || !text.endsWith(REMINDER_TAIL))
65
+ return false;
66
+ return !text.slice(REMINDER_HEAD.length, text.length - REMINDER_TAIL.length).includes('\n');
67
+ }
68
+ /**
69
+ * A teammate's first prompt without the leading `<system-reminder>` identity
70
+ * block (0.2.1 carries it as a system-prompt context). Matched against the
71
+ * whole 0.2.0 template, on a human-sourced message with more blocks after it;
72
+ * callers apply it to the first prompt they read (a translator: the first
73
+ * since its replay or reset). A reader that starts mid-log — a subagent
74
+ * transcript page, the live translator after `history()` replayed on its own
75
+ * instance — counts its first prompt as one, so only that prompt, pasted as
76
+ * the exact template plus more blocks, could lose the block.
77
+ * @param data - the message's source and content (other fields are kept).
78
+ * @returns `data`, or a copy without the block.
79
+ */
80
+ export function withoutTeammateReminder(data) {
81
+ const { source, content } = data;
82
+ if (source?.kind !== 'user')
83
+ return data;
84
+ if (!Array.isArray(content) || content.length < 2 || !isTeammateReminder(content[0]))
85
+ return data;
86
+ return { ...data, content: content.slice(1) };
87
+ }
88
+ /**
89
+ * The 0.2.0 `send_message` result: the mailbox status of the queued message
90
+ * (0.2.1 answers `{ sent: true }`).
91
+ * @param value - the parsed tool result.
92
+ * @returns `accepted` / `queued`, or `undefined` for anything else.
93
+ */
94
+ export function legacySendMessageStatus(value) {
95
+ return value.status === 'accepted' || value.status === 'queued' ? value.status : undefined;
96
+ }
@@ -1,9 +1,9 @@
1
1
  /** Primary validated upstream line (newest). */
2
- export declare const UPSTREAM_VALIDATED_VERSION = "0.2.0-rc.2";
2
+ export declare const UPSTREAM_VALIDATED_VERSION = "0.2.1-rc.2";
3
3
  /**
4
4
  * Explicitly supported upstream prerelease lines, oldest first.
5
5
  *
6
- * 0.2.0-rc.2 = primary continuous-CI line; 0.2.0-rc.1 and
6
+ * 0.2.1-rc.2 = primary continuous-CI line; 0.2.0-rc.2/rc.1 and
7
7
  * 0.1.7-rc.2/rc.1 = previous
8
8
  * family (mapped compatibility); 0.1.5-rc.1/alpha.2/alpha.1 = mapped
9
9
  * compatibility lines (source-checked when the primary line moves);
@@ -17,14 +17,14 @@ export declare const UPSTREAM_VALIDATED_VERSION = "0.2.0-rc.2";
17
17
  * The peer range in package.json is deliberately wider than this list: an
18
18
  * install on an older or newer line is allowed but reports drift at boot.
19
19
  */
20
- export declare const UPSTREAM_VALIDATED_VERSIONS: readonly ["0.1.0-rc.6", "0.1.0-rc.7", "0.1.0-rc.8", "0.1.1-rc.1", "0.1.1-rc.2", "0.1.2-alpha.3", "0.1.2-alpha.4", "0.1.2-alpha.5", "0.1.2-rc.1", "0.1.3-alpha.2", "0.1.5-alpha.1", "0.1.5-alpha.2", "0.1.5-rc.1", "0.1.7-rc.1", "0.1.7-rc.2", "0.2.0-rc.1", "0.2.0-rc.2"];
20
+ export declare const UPSTREAM_VALIDATED_VERSIONS: readonly ["0.1.0-rc.6", "0.1.0-rc.7", "0.1.0-rc.8", "0.1.1-rc.1", "0.1.1-rc.2", "0.1.2-alpha.3", "0.1.2-alpha.4", "0.1.2-alpha.5", "0.1.2-rc.1", "0.1.3-alpha.2", "0.1.5-alpha.1", "0.1.5-alpha.2", "0.1.5-rc.1", "0.1.7-rc.1", "0.1.7-rc.2", "0.2.0-rc.1", "0.2.0-rc.2", "0.2.1-rc.2"];
21
21
  /**
22
22
  * Framework packages version on their own lines; the contract validates
23
23
  * their MAJOR (breaking surface), not the harness prerelease number.
24
24
  */
25
25
  export declare const UPSTREAM_FRAMEWORK_MAJORS: Record<string, number>;
26
26
  /** Official packages the adapter consumes at runtime or as types. */
27
- export declare const UPSTREAM_BLESSED_PACKAGES: readonly ["@deepseek-ai/cordis", "@deepseek-ai/schemastery", "@deepseek-ai/dsh-invariants", "@deepseek-ai/dsh-agent", "@deepseek-ai/dsh-agent-instructions", "@deepseek-ai/dsh-agent-preset-registry", "@deepseek-ai/dsh-atomic-write", "@deepseek-ai/dsh-ptc-runtime-node", "@deepseek-ai/dsh-commands", "@deepseek-ai/dsh-cordis-host-runner", "@deepseek-ai/dsh-deepseek-account", "@deepseek-ai/dsh-host-webserver", "@deepseek-ai/dsh-llm", "@deepseek-ai/dsh-llm-pi-ai", "@deepseek-ai/dsh-persona", "@deepseek-ai/dsh-scope", "@deepseek-ai/dsh-session", "@deepseek-ai/dsh-settings", "@deepseek-ai/dsh-skill", "@deepseek-ai/dsh-storage", "@deepseek-ai/dsh-storage-domain", "@deepseek-ai/dsh-storage-json", "@deepseek-ai/dsh-workspace", "@deepseek-ai/dsh-web-app", "@deepseek-ai/dsh-system-prompt", "@deepseek-ai/dsh-terminal", "@deepseek-ai/dsh-terminal-bash", "@deepseek-ai/dsh-tool-ask-user", "@deepseek-ai/dsh-tool-bash-persistent", "@deepseek-ai/dsh-tool-cordis", "@deepseek-ai/dsh-tool-subagent", "@deepseek-ai/dsh-user-approval", "@deepseek-ai/dsh-user-questions", "@deepseek-ai/dsh-app-boot", "@deepseek-ai/dsh-cmdline", "@deepseek-ai/dsh-home-paths", "@deepseek-ai/dsh-http-proxy", "@deepseek-ai/dsh-launch-environment", "@deepseek-ai/dsh-plugin-manager"];
27
+ export declare const UPSTREAM_BLESSED_PACKAGES: readonly ["@deepseek-ai/cordis", "@deepseek-ai/schemastery", "@deepseek-ai/dsh-agent", "@deepseek-ai/dsh-agent-instructions", "@deepseek-ai/dsh-agent-preset-registry", "@deepseek-ai/dsh-atomic-write", "@deepseek-ai/dsh-ptc-runtime-node", "@deepseek-ai/dsh-commands", "@deepseek-ai/dsh-cordis-host-runner", "@deepseek-ai/dsh-deepseek-account", "@deepseek-ai/dsh-host-webserver", "@deepseek-ai/dsh-llm", "@deepseek-ai/dsh-llm-pi-ai", "@deepseek-ai/dsh-persona", "@deepseek-ai/dsh-scope", "@deepseek-ai/dsh-session", "@deepseek-ai/dsh-settings", "@deepseek-ai/dsh-skill", "@deepseek-ai/dsh-storage", "@deepseek-ai/dsh-storage-domain", "@deepseek-ai/dsh-storage-json", "@deepseek-ai/dsh-workspace", "@deepseek-ai/dsh-web-app", "@deepseek-ai/dsh-system-prompt", "@deepseek-ai/dsh-terminal", "@deepseek-ai/dsh-terminal-bash", "@deepseek-ai/dsh-tool-ask-user", "@deepseek-ai/dsh-tool-bash-persistent", "@deepseek-ai/dsh-tool-cordis", "@deepseek-ai/dsh-tool-subagent", "@deepseek-ai/dsh-user-approval", "@deepseek-ai/dsh-user-questions", "@deepseek-ai/dsh-app-boot", "@deepseek-ai/dsh-cmdline", "@deepseek-ai/dsh-home-paths", "@deepseek-ai/dsh-http-proxy", "@deepseek-ai/dsh-launch-environment", "@deepseek-ai/dsh-plugin-manager"];
28
28
  export interface UpstreamDriftEntry {
29
29
  package: string;
30
30
  installed: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/contract.ts"],"names":[],"mappings":"AAmBA,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,eAAe,CAAA;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,2BAA2B,2QAkB9B,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG5D,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,uuCAwC5B,CAAA;AAEV,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB;AAoBD,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;AAE/D,4FAA4F;AAC5F,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAA;AAEvG,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,SAAS,CAKlG;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAQxF;AAkBD,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,QAA6D,CAAA;AAYlG,wBAAgB,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAqB9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAE9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAQ3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKnF;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,kBAAkB,EAAE,CAuBtB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEtE,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,iBAAiB,CAAA;IACvB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,oBAAoB,GAAG,SAAS,CA0BlC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/contract.ts"],"names":[],"mappings":"AAmBA,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,eAAe,CAAA;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,2BAA2B,yRAmB9B,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG5D,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,yBAAyB,wsCAuC5B,CAAA;AAEV,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB;AAoBD,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;AAE/D,4FAA4F;AAC5F,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,CAAC,CAAA;AAEvG,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,SAAS,CAKlG;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAQxF;AAkBD,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,QAA6D,CAAA;AAYlG,wBAAgB,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAqB9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAE9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAQ3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKnF;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,MAAM,EAAE,CAQV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,kBAAkB,EAAE,CAuBtB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEtE,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,iBAAiB,CAAA;IACvB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,iBAAiB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAA+B,GAC5F,oBAAoB,GAAG,SAAS,CA0BlC"}
@@ -2,8 +2,8 @@
2
2
  * Upstream compatibility contract.
3
3
  *
4
4
  * The TUI is validated against a set of upstream prerelease lines — the
5
- * current primary (0.2.0-rc.2) plus older lines kept in backward
6
- * compatibility across the 0.1.7, 0.1.5, 0.1.3, 0.1.2, 0.1.1 and 0.1.0
5
+ * current primary (0.2.1-rc.2) plus older lines kept in backward
6
+ * compatibility across the 0.2.0, 0.1.7, 0.1.5, 0.1.3, 0.1.2, 0.1.1 and 0.1.0
7
7
  * release families.
8
8
  * Every official package this adapter touches is blessed here; anything
9
9
  * else must go through upstream channels or the adapter, never the UI.
@@ -17,11 +17,11 @@ import { readFileSync } from 'node:fs';
17
17
  import { fileURLToPath } from 'node:url';
18
18
  import { ADAPTER_TYPE_PACKAGES, HOST_TYPE_PACKAGES } from './host-contract.js';
19
19
  /** Primary validated upstream line (newest). */
20
- export const UPSTREAM_VALIDATED_VERSION = '0.2.0-rc.2';
20
+ export const UPSTREAM_VALIDATED_VERSION = '0.2.1-rc.2';
21
21
  /**
22
22
  * Explicitly supported upstream prerelease lines, oldest first.
23
23
  *
24
- * 0.2.0-rc.2 = primary continuous-CI line; 0.2.0-rc.1 and
24
+ * 0.2.1-rc.2 = primary continuous-CI line; 0.2.0-rc.2/rc.1 and
25
25
  * 0.1.7-rc.2/rc.1 = previous
26
26
  * family (mapped compatibility); 0.1.5-rc.1/alpha.2/alpha.1 = mapped
27
27
  * compatibility lines (source-checked when the primary line moves);
@@ -53,6 +53,7 @@ export const UPSTREAM_VALIDATED_VERSIONS = [
53
53
  '0.1.7-rc.2',
54
54
  '0.2.0-rc.1',
55
55
  '0.2.0-rc.2',
56
+ '0.2.1-rc.2',
56
57
  ];
57
58
  /**
58
59
  * Framework packages version on their own lines; the contract validates
@@ -66,7 +67,6 @@ export const UPSTREAM_FRAMEWORK_MAJORS = {
66
67
  export const UPSTREAM_BLESSED_PACKAGES = [
67
68
  '@deepseek-ai/cordis',
68
69
  '@deepseek-ai/schemastery',
69
- '@deepseek-ai/dsh-invariants',
70
70
  '@deepseek-ai/dsh-agent',
71
71
  '@deepseek-ai/dsh-agent-instructions',
72
72
  '@deepseek-ai/dsh-agent-preset-registry',
@@ -35,6 +35,13 @@
35
35
  * never message content, storage values, or grant-file contents.
36
36
  */
37
37
  import { Context, Service } from '@deepseek-ai/cordis';
38
+ /**
39
+ * The ledger's file name under a data directory. The name and the default
40
+ * location are separate so that a check reading "what is left under this data
41
+ * root" can point at another root and still find the ledger — the grants file and
42
+ * the storage directory already follow one (C-5).
43
+ */
44
+ export declare const EFFECT_LEDGER_NAME = "effect-ledger.jsonl";
38
45
  /** Default ledger file (JSONL, one record per line). */
39
46
  export declare const EFFECT_LEDGER_FILE: string;
40
47
  /** Resource kinds recorded by the host's wired emitters. */
@@ -1 +1 @@
1
- {"version":3,"file":"effect-ledger.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/effect-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAIH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AActD,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAwC,CAAA;AAEvE,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,6HAUxB,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAA;AAC1F,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE3D,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,CAAA;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACtC,MAAM,EAAE,YAAY,CAAA;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,eAAe,EAAE,sBAAsB,CAAA;KACxC;CACF;AAWD,kEAAkE;AAClE,qBAAa,sBAAuB,SAAQ,OAAO;gBAE/C,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAO;IAsChG;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;IAWpD,2DAA2D;IAC3D,OAAO,CAAC,kBAAkB;IAwD1B;gFAC4E;IAC5E,OAAO,CAAC,kBAAkB;IAqB1B;;yCAEqC;IACrC,OAAO,CAAC,UAAU;IAOlB,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,YAAY;CAarB;AA+CD,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"effect-ledger.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/effect-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAIH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AActD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,wBAAwB,CAAA;AAEvD,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAqC,CAAA;AAEpE,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,6HAUxB,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAA;AAC1F,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE3D,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,CAAA;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACtC,MAAM,EAAE,YAAY,CAAA;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,eAAe,EAAE,sBAAsB,CAAA;KACxC;CACF;AAWD,kEAAkE;AAClE,qBAAa,sBAAuB,SAAQ,OAAO;gBAE/C,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAO;IAsChG;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;IAWpD,2DAA2D;IAC3D,OAAO,CAAC,kBAAkB;IAwD1B;gFAC4E;IAC5E,OAAO,CAAC,kBAAkB;IAqB1B;;yCAEqC;IACrC,OAAO,CAAC,UAAU;IAOlB,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,YAAY;CAarB;AA+CD,eAAe,sBAAsB,CAAA"}
@@ -44,8 +44,15 @@ import { adapterRuntimeFor } from '../adapter/kernel/runtime-context.js';
44
44
  import { componentIdentityOf } from './component-identity.js';
45
45
  import { compositionRoot, concreteService } from './host-access.js';
46
46
  import { createKernelLedger } from '../adapter/kernel/ledger.js';
47
+ /**
48
+ * The ledger's file name under a data directory. The name and the default
49
+ * location are separate so that a check reading "what is left under this data
50
+ * root" can point at another root and still find the ledger — the grants file and
51
+ * the storage directory already follow one (C-5).
52
+ */
53
+ export const EFFECT_LEDGER_NAME = 'effect-ledger.jsonl';
47
54
  /** Default ledger file (JSONL, one record per line). */
48
- export const EFFECT_LEDGER_FILE = join(DATA_DIR, 'effect-ledger.jsonl');
55
+ export const EFFECT_LEDGER_FILE = join(DATA_DIR, EFFECT_LEDGER_NAME);
49
56
  /** Resource kinds recorded by the host's wired emitters. */
50
57
  export const LEDGER_RESOURCE_KINDS = [
51
58
  'command',
@@ -10,6 +10,8 @@
10
10
  export interface EntrySlot {
11
11
  /** The DSH kernel: the screen waits for the row's `attachDsh`. */
12
12
  readonly dsh: boolean;
13
+ /** The host's DSH runtime version: this package's own resolution may name another copy. */
14
+ readonly kernelVersion?: string;
13
15
  /** Set by the row as soon as it applies, so the entry can tell whether a
14
16
  * `dsh-tui` row exists once the composition settled. */
15
17
  rowSeen: boolean;
@@ -28,7 +30,7 @@ export interface EntrySlot {
28
30
  firstFrameFlushed?: () => Promise<void>;
29
31
  }
30
32
  /** The entry's slot, published for the `dsh-tui` row on the DSH kernel. */
31
- export declare function createEntrySlot(dsh: boolean): EntrySlot;
33
+ export declare function createEntrySlot(dsh: boolean, kernelVersion?: string): EntrySlot;
32
34
  /** The published slot, if this process's entry mounted the screen. */
33
35
  export declare function peekEntrySlot(): EntrySlot | undefined;
34
36
  /** Take the DSH-side hook once: a second row (or a recompose) finds none. */
@@ -1 +1 @@
1
- {"version":3,"file":"entry-slot.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/entry-slot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB;6DACyD;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB;0DACsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzF;0EACsE;IACtE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D;;4DAEwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B;wDACoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAMD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAIvD;AAED,sEAAsE;AACtE,wBAAgB,aAAa,IAAI,SAAS,GAAG,SAAS,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,SAAS,CAAC,WAAW,CAAC,CAKxD"}
1
+ {"version":3,"file":"entry-slot.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/entry-slot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,2FAA2F;IAC3F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B;6DACyD;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB;0DACsD;IACtD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzF;0EACsE;IACtE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1D;;4DAEwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B;wDACoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAMD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAI/E;AAED,sEAAsE;AACtE,wBAAgB,aAAa,IAAI,SAAS,GAAG,SAAS,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,SAAS,CAAC,WAAW,CAAC,CAKxD"}
@@ -8,8 +8,8 @@
8
8
  */
9
9
  const ENTRY_SLOT_KEY = Symbol.for('@deepseek-harness-tui/dsh-tui:host-entry');
10
10
  /** The entry's slot, published for the `dsh-tui` row on the DSH kernel. */
11
- export function createEntrySlot(dsh) {
12
- const slot = { dsh, rowSeen: false };
11
+ export function createEntrySlot(dsh, kernelVersion) {
12
+ const slot = { dsh, rowSeen: false, kernelVersion };
13
13
  if (dsh)
14
14
  globalThis[ENTRY_SLOT_KEY] = slot;
15
15
  return slot;
@@ -1 +1 @@
1
- {"version":3,"file":"fresh-agent.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/fresh-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAc,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACzF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAiB,MAAM,0BAA0B,CAAA;AAkBpF,KAAK,YAAY,GAAG;IAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,CAAA;AAyCjF,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAkF,CAAA;AAKxI,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAItD;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAWlE;AAID,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAE5E;AAuFD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsB5H"}
1
+ {"version":3,"file":"fresh-agent.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/fresh-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAc,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACzF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAiB,MAAM,0BAA0B,CAAA;AAkBpF,KAAK,YAAY,GAAG;IAAE,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,CAAA;AAyCjF,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAkF,CAAA;AAKxI,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAItD;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAWlE;AAID,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAE5E;AA4FD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsB5H"}
@@ -78,6 +78,11 @@ function deferInitialPolicy(ctx, session, writer, source) {
78
78
  if (session.seq !== 0)
79
79
  return;
80
80
  const providerFiber = concreteService(source.ctx.fiber);
81
+ // 0.2.1 publishes the service from a child; its named parent owns live
82
+ // routing so it can outlive consumer unloads. Older providers route on the
83
+ // service fiber itself. Never suppress the root's unrelated observers.
84
+ const parentFiber = concreteService(providerFiber.parent.fiber);
85
+ const routingFiber = parentFiber.name === source.name ? parentFiber : providerFiber;
81
86
  const descriptor = Object.getOwnPropertyDescriptor(session, Context.filter);
82
87
  const originalFilter = session[Context.filter];
83
88
  const flush = writer.flush;
@@ -92,7 +97,7 @@ function deferInitialPolicy(ctx, session, writer, source) {
92
97
  unstoredSessions.delete(session);
93
98
  };
94
99
  const filter = (listener) => (originalFilter?.call(session, listener) ?? true) &&
95
- (!deferred || concreteService(listener.fiber) !== providerFiber);
100
+ (!deferred || concreteService(listener.fiber) !== routingFiber);
96
101
  let stopEvents;
97
102
  let stopFlush;
98
103
  const release = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"host-access.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/host-access.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,qBAAqB,CAAA;AAkLpD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI,CAGlE;AAWD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE1D;AAkID;;uEAEuE;AACvE,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9D;AA8FD,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAe/D;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,OAAO,EACvB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,GAC9C,OAAO,CA2BT;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMhE;AAED;+EAC+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAInE;AAED;;;6EAG6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAIrD;AAiHD;;;4EAG4E;AAC5E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAO3E;AAED;;;iEAGiE;AACjE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAehH;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBlG"}
1
+ {"version":3,"file":"host-access.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/host-access.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,qBAAqB,CAAA;AAkLpD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI,CAGlE;AAWD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE1D;AAkID;;uEAEuE;AACvE,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9D;AAwLD,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAe/D;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,OAAO,EACvB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,GAC9C,OAAO,CA2BT;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMhE;AAED;+EAC+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAInE;AAED;;;6EAG6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAIrD;AAiHD;;;4EAG4E;AAC5E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAO3E;AAED;;;iEAGiE;AACjE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAehH;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAmBlG"}
@@ -408,6 +408,101 @@ function guardRootCapabilities(root) {
408
408
  catch {
409
409
  // Fall through when a minimal embedder omits reflection internals.
410
410
  }
411
+ admitRootProjectionRegistrations(root);
412
+ }
413
+ const projectionRegistryRoots = new WeakSet();
414
+ const guardedProjectionRegistries = new WeakSet();
415
+ /**
416
+ * `sessionProjections.register` hangs its disposer on the receiver's context
417
+ * (the registry's documented ownership: the calling fiber). DSH's agent-team
418
+ * service reaches it through `ctx.root`, which lands that effect on the root
419
+ * fiber and the guard above refuses it. Admit that one call with host
420
+ * capability, so the registration sits where it would without the guard and
421
+ * the caller's disposer releases it in the caller's own order; the plugin's
422
+ * unload releases one it leaves behind ({@link releaseAfterUnload}). The
423
+ * root stays closed to everything else.
424
+ */
425
+ function admitRootProjectionRegistrations(root) {
426
+ if (projectionRegistryRoots.has(root))
427
+ return;
428
+ projectionRegistryRoots.add(root);
429
+ const wrap = () => withHostRootCapability(() => {
430
+ let registry;
431
+ try {
432
+ const service = root.sessionProjections;
433
+ if (typeof service !== 'object' || service === null)
434
+ return;
435
+ registry = concreteService(service);
436
+ }
437
+ catch {
438
+ return;
439
+ }
440
+ if (guardedProjectionRegistries.has(registry))
441
+ return;
442
+ const original = Reflect.get(registry, 'register');
443
+ if (typeof original !== 'function')
444
+ return;
445
+ guardedProjectionRegistries.add(registry);
446
+ // Configurable: Cordis's traceable proxy rebinds methods, which a frozen
447
+ // property would forbid. Replacing it only restores the refused path.
448
+ Object.defineProperty(registry, 'register', {
449
+ configurable: true,
450
+ writable: false,
451
+ value: function (...args) {
452
+ // Through `ctx.root` the receiver is a root-derived context on the
453
+ // root fiber: that is the effect the guard would refuse.
454
+ if (callContextOf(this)?.fiber !== rootFibers.get(root) || !currentActivationIsPlugin(root)) {
455
+ return Reflect.apply(original, this, args);
456
+ }
457
+ const token = activationStorage.getStore();
458
+ assertLiveContext(token.context, 'sessionProjections.register');
459
+ // On the root fiber, as without the guard: the caller orders the
460
+ // disposer itself (DSH's TeamService unregisters after its async
461
+ // runtime teardown, which still reads the key). On the caller's fiber
462
+ // it would be a sibling effect, and Cordis unloads siblings at once.
463
+ const dispose = withHostRootCapability(() => Reflect.apply(original, this, args));
464
+ return releaseAfterUnload(root, token.fiber, dispose);
465
+ },
466
+ });
467
+ });
468
+ wrap();
469
+ try {
470
+ // The registry may mount after the guard (the profile composes later).
471
+ withHostRootCapability(() => root.on('internal/service', ((name) => {
472
+ if (name === 'sessionProjections')
473
+ wrap();
474
+ }), { global: true }));
475
+ }
476
+ catch {
477
+ // A minimal embedder without the event helper keeps the plain guard.
478
+ }
479
+ }
480
+ /**
481
+ * A root registration a plugin made through {@link admitRootProjectionRegistrations}
482
+ * still dies with that plugin: if the plugin never disposes it, it goes once
483
+ * the plugin's fiber has finished unloading (every effect settled, async
484
+ * teardown included), whether the fiber reloads or not.
485
+ * @returns the disposer handed to the plugin; calling it also drops the watch.
486
+ */
487
+ function releaseAfterUnload(root, fiber, dispose) {
488
+ let unwatch;
489
+ const release = () => {
490
+ unwatch?.();
491
+ unwatch = undefined;
492
+ dispose();
493
+ };
494
+ try {
495
+ unwatch = withHostRootCapability(() => root.on('internal/status', (changed, oldState) => {
496
+ // Cordis uses 5 for UNLOADING (see rememberFiber). The event carries
497
+ // either the activation's fiber or the wrapper normalized to it.
498
+ if (oldState === 5 && (changed === fiber || rememberFiber(changed, root) === fiber))
499
+ release();
500
+ }, { global: true }));
501
+ }
502
+ catch {
503
+ // Without the event helper only the plugin's own disposer releases it.
504
+ }
505
+ return release;
411
506
  }
412
507
  function guardFiberMethod(target, method, root, capability) {
413
508
  const descriptor = Reflect.getOwnPropertyDescriptor(target, method);
@@ -7,7 +7,7 @@
7
7
  /** The host CLI package whose installation the entry loads. */
8
8
  export declare const HOST_PACKAGE = "@deepseek-ai/dsh";
9
9
  /** The host line the reproduced pieces were checked against (host-replica.snapshot.json). */
10
- export declare const HOST_REPLICA_VERSION = "0.2.0-rc.2";
10
+ export declare const HOST_REPLICA_VERSION = "0.2.1-rc.2";
11
11
  /** Where the entry resolves a host module from. */
12
12
  export type HostModuleVia =
13
13
  /** The host package's own `createRequire` (its nested node_modules). */
@@ -1 +1 @@
1
- {"version":3,"file":"host-contract.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/host-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,YAAY,qBAAqB,CAAA;AAE9C,6FAA6F;AAC7F,eAAO,MAAM,oBAAoB,eAAe,CAAA;AAEhD,mDAAmD;AACnD,MAAM,MAAM,aAAa;AACvB,wEAAwE;AACtE,MAAM;AACR,wFAAwF;GACtF,UAAU,CAAA;AAEd,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,kFAAkF;AAClF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeqB,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,yKAMrB,CAAA;AAEV;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,8CAExB,CAAA;AAEV,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;IACnC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAS/C,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,eAAe,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAUpF,CAAA"}
1
+ {"version":3,"file":"host-contract.d.ts","sourceRoot":"","sources":["../../../src/dsh-adapter/host-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,YAAY,qBAAqB,CAAA;AAE9C,6FAA6F;AAC7F,eAAO,MAAM,oBAAoB,eAAe,CAAA;AAEhD,mDAAmD;AACnD,MAAM,MAAM,aAAa;AACvB,wEAAwE;AACtE,MAAM;AACR,wFAAwF;GACtF,UAAU,CAAA;AAEd,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,kFAAkF;AAClF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeqB,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,yKAMrB,CAAA;AAEV;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,8CAExB,CAAA;AAEV,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;IACnC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAS/C,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,eAAe,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAWpF,CAAA"}