aicodeman 1.34.0 → 1.40.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 (299) hide show
  1. package/README.md +11 -0
  2. package/README.zh-CN.md +8 -0
  3. package/dist/attachment-registry.d.ts +6 -0
  4. package/dist/attachment-registry.d.ts.map +1 -1
  5. package/dist/attachment-registry.js +9 -3
  6. package/dist/attachment-registry.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +2 -2
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config/cli-registry/patterns.d.ts +6 -0
  11. package/dist/config/cli-registry/patterns.d.ts.map +1 -1
  12. package/dist/config/cli-registry/patterns.js +13 -0
  13. package/dist/config/cli-registry/patterns.js.map +1 -1
  14. package/dist/config/cli-registry/schema.d.ts +13 -0
  15. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  16. package/dist/config/cli-registry/schema.js +60 -2
  17. package/dist/config/cli-registry/schema.js.map +1 -1
  18. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  19. package/dist/config/cli-registry/stock.js +175 -7
  20. package/dist/config/cli-registry/stock.js.map +1 -1
  21. package/dist/config/cli-registry/types.d.ts +93 -6
  22. package/dist/config/cli-registry/types.d.ts.map +1 -1
  23. package/dist/config/dependency-registry.d.ts +7 -0
  24. package/dist/config/dependency-registry.d.ts.map +1 -1
  25. package/dist/config/dependency-registry.js +15 -0
  26. package/dist/config/dependency-registry.js.map +1 -1
  27. package/dist/config/path-probe.d.ts +37 -0
  28. package/dist/config/path-probe.d.ts.map +1 -0
  29. package/dist/config/path-probe.js +43 -0
  30. package/dist/config/path-probe.js.map +1 -0
  31. package/dist/deepseek-route-config.d.ts +110 -0
  32. package/dist/deepseek-route-config.d.ts.map +1 -0
  33. package/dist/deepseek-route-config.js +477 -0
  34. package/dist/deepseek-route-config.js.map +1 -0
  35. package/dist/git-workspace-status.d.ts +246 -0
  36. package/dist/git-workspace-status.d.ts.map +1 -0
  37. package/dist/git-workspace-status.js +626 -0
  38. package/dist/git-workspace-status.js.map +1 -0
  39. package/dist/hooks-config.d.ts.map +1 -1
  40. package/dist/hooks-config.js +83 -13
  41. package/dist/hooks-config.js.map +1 -1
  42. package/dist/model-config-resolvers.d.ts +29 -0
  43. package/dist/model-config-resolvers.d.ts.map +1 -0
  44. package/dist/model-config-resolvers.js +34 -0
  45. package/dist/model-config-resolvers.js.map +1 -0
  46. package/dist/session-display-model.d.ts +110 -0
  47. package/dist/session-display-model.d.ts.map +1 -0
  48. package/dist/session-display-model.js +154 -0
  49. package/dist/session-display-model.js.map +1 -0
  50. package/dist/session.d.ts +145 -8
  51. package/dist/session.d.ts.map +1 -1
  52. package/dist/session.js +280 -35
  53. package/dist/session.js.map +1 -1
  54. package/dist/types/api.d.ts +7 -0
  55. package/dist/types/api.d.ts.map +1 -1
  56. package/dist/types/api.js.map +1 -1
  57. package/dist/types/session.d.ts +28 -1
  58. package/dist/types/session.d.ts.map +1 -1
  59. package/dist/types/session.js.map +1 -1
  60. package/dist/types/tools.d.ts +1 -1
  61. package/dist/types/tools.d.ts.map +1 -1
  62. package/dist/utils/bounded-path-probe.d.ts +99 -0
  63. package/dist/utils/bounded-path-probe.d.ts.map +1 -0
  64. package/dist/utils/bounded-path-probe.js +228 -0
  65. package/dist/utils/bounded-path-probe.js.map +1 -0
  66. package/dist/utils/cli-executable-resolver.d.ts +2 -0
  67. package/dist/utils/cli-executable-resolver.d.ts.map +1 -1
  68. package/dist/utils/cli-executable-resolver.js +2 -1
  69. package/dist/utils/cli-executable-resolver.js.map +1 -1
  70. package/dist/utils/deepseek-cli-resolver.d.ts +8 -0
  71. package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -1
  72. package/dist/utils/deepseek-cli-resolver.js +18 -2
  73. package/dist/utils/deepseek-cli-resolver.js.map +1 -1
  74. package/dist/utils/dependency-checker.d.ts +2 -0
  75. package/dist/utils/dependency-checker.d.ts.map +1 -1
  76. package/dist/utils/dependency-checker.js +37 -9
  77. package/dist/utils/dependency-checker.js.map +1 -1
  78. package/dist/utils/index.d.ts +2 -0
  79. package/dist/utils/index.d.ts.map +1 -1
  80. package/dist/utils/index.js +1 -0
  81. package/dist/utils/index.js.map +1 -1
  82. package/dist/web/case-path.d.ts +58 -0
  83. package/dist/web/case-path.d.ts.map +1 -0
  84. package/dist/web/case-path.js +182 -0
  85. package/dist/web/case-path.js.map +1 -0
  86. package/dist/web/launch-defaults.d.ts +22 -0
  87. package/dist/web/launch-defaults.d.ts.map +1 -0
  88. package/dist/web/launch-defaults.js +46 -0
  89. package/dist/web/launch-defaults.js.map +1 -0
  90. package/dist/web/public/admin-ui.js.gz +0 -0
  91. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  92. package/dist/web/public/app.abadc970.js +43 -0
  93. package/dist/web/public/app.abadc970.js.br +0 -0
  94. package/dist/web/public/app.abadc970.js.gz +0 -0
  95. package/dist/web/public/approvals-ui.js.gz +0 -0
  96. package/dist/web/public/{constants.d95fade9.js → constants.c0f8f9de.js} +1009 -127
  97. package/dist/web/public/constants.c0f8f9de.js.br +0 -0
  98. package/dist/web/public/constants.c0f8f9de.js.gz +0 -0
  99. package/dist/web/public/cron-ui.js.gz +0 -0
  100. package/dist/web/public/entrance-animations.js +1 -0
  101. package/dist/web/public/entrance-animations.js.br +0 -0
  102. package/dist/web/public/entrance-animations.js.gz +0 -0
  103. package/dist/web/public/git-status-ui.js +719 -0
  104. package/dist/web/public/git-status-ui.js.br +0 -0
  105. package/dist/web/public/git-status-ui.js.gz +0 -0
  106. package/dist/web/public/home-sessions.js +12 -9
  107. package/dist/web/public/home-sessions.js.br +0 -0
  108. package/dist/web/public/home-sessions.js.gz +0 -0
  109. package/dist/web/public/host-wake-ui.js.gz +0 -0
  110. package/dist/web/public/i18n.a31747a9.js +2 -0
  111. package/dist/web/public/i18n.a31747a9.js.br +0 -0
  112. package/dist/web/public/i18n.a31747a9.js.gz +0 -0
  113. package/dist/web/public/{image-input.a216cf9e.js → image-input.898a538b.js} +18 -8
  114. package/dist/web/public/image-input.898a538b.js.br +0 -0
  115. package/dist/web/public/image-input.898a538b.js.gz +0 -0
  116. package/dist/web/public/index.html +205 -42
  117. package/dist/web/public/index.html.br +0 -0
  118. package/dist/web/public/index.html.gz +0 -0
  119. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  120. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  121. package/dist/web/public/{mobile-handlers.23a85db1.js → mobile-handlers.0ef9c311.js} +20 -0
  122. package/dist/web/public/mobile-handlers.0ef9c311.js.br +0 -0
  123. package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
  124. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  125. package/dist/web/public/mobile-overview.js.gz +0 -0
  126. package/dist/web/public/mobile.111b187d.css +1 -0
  127. package/dist/web/public/mobile.111b187d.css.br +0 -0
  128. package/dist/web/public/mobile.111b187d.css.gz +0 -0
  129. package/dist/web/public/notification-manager.50bb87d8.js.gz +0 -0
  130. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  131. package/dist/web/public/{panels-ui.6a5898d9.js → panels-ui.4735dfc2.js} +4 -4
  132. package/dist/web/public/panels-ui.4735dfc2.js.br +0 -0
  133. package/dist/web/public/{panels-ui.6a5898d9.js.gz → panels-ui.4735dfc2.js.gz} +0 -0
  134. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  135. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  136. package/dist/web/public/readmymind-ui.js.gz +0 -0
  137. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  138. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  139. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  140. package/dist/web/public/session-lineage.js +229 -86
  141. package/dist/web/public/session-lineage.js.br +0 -0
  142. package/dist/web/public/session-lineage.js.gz +0 -0
  143. package/dist/web/public/session-ui.f731602c.js +100 -0
  144. package/dist/web/public/session-ui.f731602c.js.br +0 -0
  145. package/dist/web/public/session-ui.f731602c.js.gz +0 -0
  146. package/dist/web/public/settings-ui.a97ab16f.js +97 -0
  147. package/dist/web/public/settings-ui.a97ab16f.js.br +0 -0
  148. package/dist/web/public/settings-ui.a97ab16f.js.gz +0 -0
  149. package/dist/web/public/spreadsheet-preview-worker.js +290 -0
  150. package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
  151. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  152. package/dist/web/public/spreadsheet-preview.af82fa2f.js +555 -0
  153. package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
  154. package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
  155. package/dist/web/public/spreadsheet-xlsx-core.js +1006 -0
  156. package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
  157. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  158. package/dist/web/public/styles.8ee12666.css +1 -0
  159. package/dist/web/public/styles.8ee12666.css.br +0 -0
  160. package/dist/web/public/styles.8ee12666.css.gz +0 -0
  161. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  162. package/dist/web/public/sw.js +2 -2
  163. package/dist/web/public/sw.js.br +0 -0
  164. package/dist/web/public/sw.js.gz +0 -0
  165. package/dist/web/public/tab-layout-browser.065fcba4.js +1 -0
  166. package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
  167. package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
  168. package/dist/web/public/{tab-rail-resize.dcdc5772.js → tab-rail-resize.a5867793.js} +1 -1
  169. package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
  170. package/dist/web/public/tab-rail-resize.a5867793.js.gz +0 -0
  171. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js +1 -0
  172. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.br +0 -0
  173. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  174. package/dist/web/public/terminal-split.js +146 -649
  175. package/dist/web/public/terminal-split.js.br +0 -0
  176. package/dist/web/public/terminal-split.js.gz +0 -0
  177. package/dist/web/public/terminal-tile.js +1611 -0
  178. package/dist/web/public/terminal-tile.js.br +0 -0
  179. package/dist/web/public/terminal-tile.js.gz +0 -0
  180. package/dist/web/public/terminal-ui.5059b30e.js +2 -0
  181. package/dist/web/public/terminal-ui.5059b30e.js.br +0 -0
  182. package/dist/web/public/terminal-ui.5059b30e.js.gz +0 -0
  183. package/dist/web/public/tile-grid.js +2684 -0
  184. package/dist/web/public/tile-grid.js.br +0 -0
  185. package/dist/web/public/tile-grid.js.gz +0 -0
  186. package/dist/web/public/ultracode-panel.js.gz +0 -0
  187. package/dist/web/public/ultracode-windows.js.gz +0 -0
  188. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  189. package/dist/web/public/vendor/exceljs.min.js +44 -0
  190. package/dist/web/public/vendor/exceljs.min.js.br +0 -0
  191. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  192. package/dist/web/public/vendor/fflate.min.js +1 -0
  193. package/dist/web/public/vendor/fflate.min.js.br +0 -0
  194. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  195. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  196. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  197. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  198. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  199. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  200. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  201. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.gz +0 -0
  202. package/dist/web/public/vendor/xterm.css.gz +0 -0
  203. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  204. package/dist/web/public/{voice-input.c4b51eb6.js → voice-input.2342c37b.js} +64 -10
  205. package/dist/web/public/voice-input.2342c37b.js.br +0 -0
  206. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  207. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  208. package/dist/web/public/webview-tabs.js +9 -1
  209. package/dist/web/public/webview-tabs.js.br +0 -0
  210. package/dist/web/public/webview-tabs.js.gz +0 -0
  211. package/dist/web/routes/case-routes.d.ts.map +1 -1
  212. package/dist/web/routes/case-routes.js +136 -18
  213. package/dist/web/routes/case-routes.js.map +1 -1
  214. package/dist/web/routes/cli-registry-routes.d.ts.map +1 -1
  215. package/dist/web/routes/cli-registry-routes.js +3 -1
  216. package/dist/web/routes/cli-registry-routes.js.map +1 -1
  217. package/dist/web/routes/doctor-routes.d.ts +23 -0
  218. package/dist/web/routes/doctor-routes.d.ts.map +1 -0
  219. package/dist/web/routes/doctor-routes.js +83 -0
  220. package/dist/web/routes/doctor-routes.js.map +1 -0
  221. package/dist/web/routes/file-routes.d.ts +7 -0
  222. package/dist/web/routes/file-routes.d.ts.map +1 -1
  223. package/dist/web/routes/file-routes.js +34 -4
  224. package/dist/web/routes/file-routes.js.map +1 -1
  225. package/dist/web/routes/git-status-routes.d.ts +16 -0
  226. package/dist/web/routes/git-status-routes.d.ts.map +1 -0
  227. package/dist/web/routes/git-status-routes.js +98 -0
  228. package/dist/web/routes/git-status-routes.js.map +1 -0
  229. package/dist/web/routes/index.d.ts +2 -0
  230. package/dist/web/routes/index.d.ts.map +1 -1
  231. package/dist/web/routes/index.js +2 -0
  232. package/dist/web/routes/index.js.map +1 -1
  233. package/dist/web/routes/session-routes.d.ts +18 -0
  234. package/dist/web/routes/session-routes.d.ts.map +1 -1
  235. package/dist/web/routes/session-routes.js +106 -42
  236. package/dist/web/routes/session-routes.js.map +1 -1
  237. package/dist/web/routes/status-telemetry-routes.d.ts +3 -0
  238. package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
  239. package/dist/web/routes/status-telemetry-routes.js +12 -0
  240. package/dist/web/routes/status-telemetry-routes.js.map +1 -1
  241. package/dist/web/routes/system-routes.d.ts.map +1 -1
  242. package/dist/web/routes/system-routes.js +13 -0
  243. package/dist/web/routes/system-routes.js.map +1 -1
  244. package/dist/web/schemas.d.ts +28 -0
  245. package/dist/web/schemas.d.ts.map +1 -1
  246. package/dist/web/schemas.js +41 -0
  247. package/dist/web/schemas.js.map +1 -1
  248. package/dist/web/server.d.ts +5 -0
  249. package/dist/web/server.d.ts.map +1 -1
  250. package/dist/web/server.js +35 -12
  251. package/dist/web/server.js.map +1 -1
  252. package/dist/web/session-listener-wiring.d.ts +1 -0
  253. package/dist/web/session-listener-wiring.d.ts.map +1 -1
  254. package/dist/web/session-listener-wiring.js +11 -0
  255. package/dist/web/session-listener-wiring.js.map +1 -1
  256. package/package.json +3 -1
  257. package/scripts/postinstall.js +16 -0
  258. package/skills/codeman/reference/verbs.md +3 -0
  259. package/dist/web/public/app.cf0db8ce.js +0 -43
  260. package/dist/web/public/app.cf0db8ce.js.br +0 -0
  261. package/dist/web/public/app.cf0db8ce.js.gz +0 -0
  262. package/dist/web/public/constants.d95fade9.js.br +0 -0
  263. package/dist/web/public/constants.d95fade9.js.gz +0 -0
  264. package/dist/web/public/i18n.398b8331.js +0 -1
  265. package/dist/web/public/i18n.398b8331.js.br +0 -0
  266. package/dist/web/public/i18n.398b8331.js.gz +0 -0
  267. package/dist/web/public/image-input.a216cf9e.js.br +0 -0
  268. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  269. package/dist/web/public/mobile-handlers.23a85db1.js.br +0 -0
  270. package/dist/web/public/mobile-handlers.23a85db1.js.gz +0 -0
  271. package/dist/web/public/mobile.1aa4952d.css +0 -1
  272. package/dist/web/public/mobile.1aa4952d.css.br +0 -0
  273. package/dist/web/public/mobile.1aa4952d.css.gz +0 -0
  274. package/dist/web/public/panels-ui.6a5898d9.js.br +0 -0
  275. package/dist/web/public/session-ui.bf66c13b.js +0 -89
  276. package/dist/web/public/session-ui.bf66c13b.js.br +0 -0
  277. package/dist/web/public/session-ui.bf66c13b.js.gz +0 -0
  278. package/dist/web/public/settings-ui.331d3b1d.js +0 -97
  279. package/dist/web/public/settings-ui.331d3b1d.js.br +0 -0
  280. package/dist/web/public/settings-ui.331d3b1d.js.gz +0 -0
  281. package/dist/web/public/styles.8c485d26.css +0 -1
  282. package/dist/web/public/styles.8c485d26.css.br +0 -0
  283. package/dist/web/public/styles.8c485d26.css.gz +0 -0
  284. package/dist/web/public/tab-layout-browser.4e0ed50c.js +0 -1
  285. package/dist/web/public/tab-layout-browser.4e0ed50c.js.br +0 -0
  286. package/dist/web/public/tab-layout-browser.4e0ed50c.js.gz +0 -0
  287. package/dist/web/public/tab-rail-resize.dcdc5772.js.br +0 -0
  288. package/dist/web/public/tab-rail-resize.dcdc5772.js.gz +0 -0
  289. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js +0 -1
  290. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.br +0 -0
  291. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  292. package/dist/web/public/terminal-ui.a4535311.js +0 -2
  293. package/dist/web/public/terminal-ui.a4535311.js.br +0 -0
  294. package/dist/web/public/terminal-ui.a4535311.js.gz +0 -0
  295. package/dist/web/public/upload.html +0 -155
  296. package/dist/web/public/upload.html.br +0 -0
  297. package/dist/web/public/upload.html.gz +0 -0
  298. package/dist/web/public/voice-input.c4b51eb6.js.br +0 -0
  299. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
@@ -0,0 +1,477 @@
1
+ /**
2
+ * @fileoverview The model a DeepSeek Harness (`dsh`) session's TUI is configured to
3
+ * use, read from its route config, for a session header whose screen names no model
4
+ * yet (the status bar's model field switched off, or not drawn yet). See
5
+ * `SessionState.displayModel` (src/session-display-model.ts): the screen still wins
6
+ * whenever it names a model, since it is what the running TUI actually uses.
7
+ *
8
+ * ## How dsh-TUI resolves its route (dsh 0.1.1-rc.2, dsh-TUI 0.10.0-beta.1)
9
+ *
10
+ * A profile is a stack of loader patch layers over an empty root, in this order
11
+ * (`@deepseek-ai/dsh` profile-boot): every bundle's patch layer, the profile's own
12
+ * `$DSH_HOME/profiles/<profile>/cordis.patch.yml`, the home-level
13
+ * `$DSH_HOME/cordis.patch.yml` (it outranks the profile layer), then `--patch`
14
+ * overlays (Codeman passes none). A patch targets a row by `id`; one whose `name`
15
+ * does not match the row's is skipped; every other key REPLACES the row's field
16
+ * whole (`applyEntryPatches`), so the last layer carrying `config` for the `dsh-tui`
17
+ * row defines all of it.
18
+ *
19
+ * dsh-TUI then takes its model route from that config only when it names BOTH
20
+ * `provider` and `model` (`lib/types/modelRoute.js`, issue #67). Anything less is
21
+ * dropped whole and the TUI falls back to the persisted `/model` choice, then to its
22
+ * own default: neither is in the config, so neither is answered here. The bundle's
23
+ * own row pins `provider: deepseek-official` alone, by design, so only the two user
24
+ * layers can pin a route; the bundle layers are not read (they resolve through the dsh
25
+ * installation, outside the dsh home). `settings.yaml`'s `agent-default-model` is the
26
+ * HEADLESS default, not the TUI's, and is never read.
27
+ *
28
+ * ## Answer nothing rather than a guess
29
+ *
30
+ * Every doubt answers null: a profile that does not compose dsh-TUI, a half-pinned
31
+ * route, a layer that cannot be read (unreadable, a symlink out of the dsh home, too
32
+ * big, a mount that does not answer), and a file this reader does not fully
33
+ * understand. The YAML reader below is deliberately narrow (the repo carries no YAML
34
+ * dependency): a top-level block sequence of patch items, plain keys, single-line
35
+ * plain or quoted string scalars for the values it needs, and null for anything else
36
+ * that could change the answer (an anchor, alias or tag such as `!!js` on such a value,
37
+ * a merge key, a multi-line scalar, flow or block-scalar config, duplicate keys, a
38
+ * scalar YAML would type as a number, boolean or null, a second document, a nested
39
+ * row redefining dsh-TUI).
40
+ *
41
+ * ## Never block, never write, never leak
42
+ *
43
+ * Every path is probed with the bounded `probePathKind()` before it is touched, read
44
+ * asynchronously with a size cap, and must resolve (realpath) inside the dsh home.
45
+ * Nothing is written. Only the model id leaves this module: never the provider, a
46
+ * base URL, a key or any other config value.
47
+ *
48
+ * Tests: `test/deepseek-route-config.test.ts`.
49
+ *
50
+ * @module deepseek-route-config
51
+ */
52
+ import fs from 'node:fs/promises';
53
+ import { homedir } from 'node:os';
54
+ import { isAbsolute, join, resolve, sep } from 'node:path';
55
+ import { probePathKind } from './utils/bounded-path-probe.js';
56
+ import { deepSeekProfileFromManifest, isProfileDirName, resolveDefaultDeepSeekProfile, } from './utils/deepseek-cli-resolver.js';
57
+ /** The dsh-TUI bundle a profile must compose for its route to be read here. */
58
+ export const DSH_TUI_PACKAGE = '@deepseek-harness-tui/dsh-tui';
59
+ /** The loader row dsh-TUI's own config lives on. */
60
+ export const DSH_TUI_ROW_ID = 'dsh-tui';
61
+ /** Largest file read: a patch layer is a few dozen lines. */
62
+ export const MAX_ROUTE_FILE_BYTES = 64 * 1024;
63
+ /** A profile name as the launch accepts it (the `path-segment` token pattern). */
64
+ const PROFILE_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
65
+ /** How many profile directories the default-profile inventory looks at. */
66
+ const MAX_PROFILES = 64;
67
+ /** Thrown inside the parser for anything it does not fully understand. */
68
+ class Ambiguous extends Error {
69
+ }
70
+ /** A nested line naming the dsh-TUI row: a group's config can re-define the row through it. */
71
+ const ROW_ID_LINE = /^(?:-\s+)?id:\s*(['"]?)dsh-tui\1\s*$/;
72
+ const KEY_LINE = /^([A-Za-z_][\w-]*):(?:\s+(.*))?$/;
73
+ /**
74
+ * Strip a line's comment (`#` at line start or after whitespace, outside quotes) and
75
+ * trailing blanks. Throws on an unterminated quote: a multi-line flow scalar is
76
+ * beyond this reader.
77
+ */
78
+ function stripComment(line) {
79
+ let quote = null;
80
+ for (let i = 0; i < line.length; i++) {
81
+ const c = line[i];
82
+ if (quote === "'") {
83
+ if (c === "'") {
84
+ if (line[i + 1] === "'")
85
+ i++;
86
+ else
87
+ quote = null;
88
+ }
89
+ }
90
+ else if (quote === '"') {
91
+ if (c === '\\')
92
+ i++;
93
+ else if (c === '"')
94
+ quote = null;
95
+ }
96
+ else if (c === "'" || c === '"') {
97
+ // A quote opens a scalar only at its start; inside a plain scalar it is a character.
98
+ const prev = line.slice(0, i).trimEnd();
99
+ if (prev === '' || /[:\-[{,]$/.test(prev))
100
+ quote = c;
101
+ }
102
+ else if (c === '#' && (i === 0 || /\s/.test(line[i - 1]))) {
103
+ return line.slice(0, i).trimEnd();
104
+ }
105
+ }
106
+ if (quote)
107
+ throw new Ambiguous('unterminated quote');
108
+ return line.trimEnd();
109
+ }
110
+ /** Indentation of a line; a tab in it is refused (YAML forbids tabs there). */
111
+ function indentOf(line) {
112
+ const m = /^[ \t]*/.exec(line)[0];
113
+ if (m.includes('\t'))
114
+ throw new Ambiguous('tab indentation');
115
+ return m.length;
116
+ }
117
+ /**
118
+ * A single-line scalar as a string: plain, or single/double-quoted. Throws on anything
119
+ * that is not plainly a string (a tag, an anchor, an alias, a flow collection, a
120
+ * block scalar, or a plain scalar YAML would type as null, a boolean or a number).
121
+ */
122
+ function stringScalar(raw) {
123
+ const v = raw.trim();
124
+ if (v.startsWith("'")) {
125
+ const m = /^'((?:[^']|'')*)'$/.exec(v);
126
+ if (!m)
127
+ throw new Ambiguous('quoted scalar');
128
+ return m[1].replace(/''/g, "'");
129
+ }
130
+ if (v.startsWith('"')) {
131
+ const m = /^"((?:[^"\\]|\\["\\/])*)"$/.exec(v);
132
+ if (!m)
133
+ throw new Ambiguous('quoted scalar');
134
+ return m[1].replace(/\\(["\\/])/g, '$1');
135
+ }
136
+ if (v === '' || /^[!&*[\]{}|>%@`,?:-]/.test(v))
137
+ throw new Ambiguous('not a plain string');
138
+ if (/^(?:~|null|Null|NULL|true|True|TRUE|false|False|FALSE)$/.test(v))
139
+ throw new Ambiguous('typed scalar');
140
+ if (/^[-+]?(?:\.\d+|\d[\d_]*(?:\.\d*)?)(?:[eE][-+]?\d+)?$|^0[xob][0-9a-fA-F_]+$|^[-+]?\.(?:inf|Inf|INF)$|^\.(?:nan|NaN|NAN)$/.test(v)) {
141
+ throw new Ambiguous('numeric scalar');
142
+ }
143
+ if (/\s#|:\s/.test(v))
144
+ throw new Ambiguous('plain scalar with an indicator');
145
+ return v;
146
+ }
147
+ /** `true`/`false` as YAML spells them, or a throw. */
148
+ function boolScalar(raw) {
149
+ const v = raw.trim();
150
+ if (/^(?:true|True|TRUE)$/.test(v))
151
+ return true;
152
+ if (/^(?:false|False|FALSE)$/.test(v))
153
+ return false;
154
+ throw new Ambiguous('not a boolean');
155
+ }
156
+ /**
157
+ * The direct keys of a block mapping whose lines all sit at `indent` or deeper, each
158
+ * with its inline value and the lines nested under it. Throws on a line that is not a
159
+ * key at the mapping's indent, and on a duplicate key (js-yaml refuses those, so dsh
160
+ * would not boot).
161
+ */
162
+ function mappingKeys(lines, indent) {
163
+ const keys = new Map();
164
+ let current = null;
165
+ for (const line of lines) {
166
+ if (line.indent > indent) {
167
+ if (!current)
168
+ throw new Ambiguous('nested line with no key');
169
+ current.nested.push(line);
170
+ continue;
171
+ }
172
+ if (line.indent < indent)
173
+ throw new Ambiguous('dedent inside a mapping');
174
+ const m = KEY_LINE.exec(line.text);
175
+ if (!m)
176
+ throw new Ambiguous(`not a key: ${line.text.slice(0, 20)}`);
177
+ if (keys.has(m[1]))
178
+ throw new Ambiguous('duplicate key');
179
+ current = { inline: m[2] === undefined || m[2] === '' ? undefined : m[2], nested: [] };
180
+ keys.set(m[1], current);
181
+ }
182
+ return keys;
183
+ }
184
+ /**
185
+ * Whether an item this reader cannot follow is certainly about another row: a plain
186
+ * `id:` at the item's indent naming a row other than dsh-TUI, no `insert:` and no
187
+ * mention of the dsh-TUI row anywhere in it.
188
+ */
189
+ function isUnrelatedItem(item) {
190
+ const indent = item[0].indent;
191
+ const top = item.filter((l) => l.indent === indent);
192
+ if (top.some((l) => /^insert\s*:/.test(l.text)))
193
+ return false;
194
+ const ids = top.map((l) => KEY_LINE.exec(l.text)).filter((m) => m?.[1] === 'id');
195
+ if (ids.length !== 1 || ids[0][2] === undefined)
196
+ return false;
197
+ try {
198
+ return stringScalar(ids[0][2]) !== DSH_TUI_ROW_ID;
199
+ }
200
+ catch {
201
+ return false;
202
+ }
203
+ }
204
+ /** The `config` of a dsh-TUI patch: its provider and model, if it names them. */
205
+ function configOf(entry) {
206
+ if (entry.inline !== undefined) {
207
+ if (entry.nested.length)
208
+ throw new Ambiguous('config with both an inline value and nested lines');
209
+ const v = entry.inline.trim();
210
+ // An empty flow mapping or a null names no route; anything else inline (a tag, a
211
+ // non-empty flow mapping, a block scalar) is beyond this reader.
212
+ if (v === '{}' || /^(?:~|null|Null|NULL)$/.test(v))
213
+ return {};
214
+ throw new Ambiguous('inline config');
215
+ }
216
+ if (!entry.nested.length)
217
+ return {};
218
+ const keys = mappingKeys(entry.nested, entry.nested[0].indent);
219
+ const out = {};
220
+ for (const field of ['provider', 'model']) {
221
+ const value = keys.get(field);
222
+ if (!value)
223
+ continue;
224
+ if (value.nested.length || value.inline === undefined)
225
+ throw new Ambiguous(`${field} is not a single-line scalar`);
226
+ out[field] = stringScalar(value.inline);
227
+ }
228
+ return out;
229
+ }
230
+ /**
231
+ * What a cordis patch-list file (a top-level YAML array of loader patches) does to the
232
+ * dsh-TUI row, in order. An empty list when the file does not touch it. Null when the
233
+ * file is beyond this reader's subset, or when it could re-insert the row.
234
+ *
235
+ * @param text the file's content
236
+ */
237
+ export function parseDshTuiPatches(text) {
238
+ try {
239
+ const lines = [];
240
+ let sawContent = false;
241
+ for (const rawLine of text.replace(/^\uFEFF/, '').split(/\r?\n/)) {
242
+ const stripped = stripComment(rawLine);
243
+ if (stripped.trim() === '')
244
+ continue;
245
+ const indent = indentOf(stripped);
246
+ const body = stripped.slice(indent);
247
+ if (indent === 0 && body === '---') {
248
+ if (sawContent)
249
+ throw new Ambiguous('a second document');
250
+ continue;
251
+ }
252
+ sawContent = true;
253
+ lines.push({ indent, text: body });
254
+ }
255
+ if (lines.length === 0)
256
+ return [];
257
+ if (lines.length === 1 && lines[0].indent === 0 && lines[0].text === '[]')
258
+ return [];
259
+ // Split the top-level block sequence into items.
260
+ const items = [];
261
+ for (const line of lines) {
262
+ if (line.indent === 0) {
263
+ const m = /^-(?:(\s+)(.*))?$/.exec(line.text);
264
+ if (!m)
265
+ throw new Ambiguous('not a top-level sequence');
266
+ const item = [];
267
+ // `- key: value`: the key sits at its real column, which its siblings below share.
268
+ if (m[2] !== undefined && m[2] !== '')
269
+ item.push({ indent: 1 + m[1].length, text: m[2] });
270
+ items.push(item);
271
+ continue;
272
+ }
273
+ if (items.length === 0)
274
+ throw new Ambiguous('indented content before the first item');
275
+ items[items.length - 1].push(line);
276
+ }
277
+ const patches = [];
278
+ for (const item of items) {
279
+ if (item.length === 0)
280
+ throw new Ambiguous('empty item');
281
+ // The first key's column is the item's indent; every key shares it.
282
+ let keys;
283
+ try {
284
+ keys = mappingKeys(item, item[0].indent);
285
+ }
286
+ catch (err) {
287
+ // An item this reader cannot follow is harmless only when it provably is about
288
+ // another row: its own id names one, and no line in it names the dsh-TUI row.
289
+ if (!(err instanceof Ambiguous) || !isUnrelatedItem(item))
290
+ throw err;
291
+ if (item.slice(1).some((l) => ROW_ID_LINE.test(l.text)))
292
+ throw new Ambiguous('a nested dsh-tui row');
293
+ continue;
294
+ }
295
+ const id = keys.get('id');
296
+ if (keys.has('insert')) {
297
+ // An insert that could bring a second dsh-TUI row is beyond this reader.
298
+ const body = item.map((l) => l.text).join('\n');
299
+ if (body.includes(DSH_TUI_ROW_ID))
300
+ throw new Ambiguous('insert mentioning the dsh-tui row');
301
+ continue;
302
+ }
303
+ if (!id)
304
+ continue; // dsh warns and skips a non-insert patch without an id
305
+ if (id.nested.length || id.inline === undefined)
306
+ throw new Ambiguous('id is not a scalar');
307
+ if (stringScalar(id.inline) !== DSH_TUI_ROW_ID) {
308
+ // Another row; but a group row's config is a list of rows, and one of them could
309
+ // be a second dsh-TUI row (dsh indexes nested group entries by id too).
310
+ if (item.slice(1).some((l) => ROW_ID_LINE.test(l.text)))
311
+ throw new Ambiguous('a nested dsh-tui row');
312
+ continue;
313
+ }
314
+ const patch = {};
315
+ const name = keys.get('name');
316
+ if (name) {
317
+ if (name.nested.length || name.inline === undefined)
318
+ throw new Ambiguous('name is not a scalar');
319
+ patch.name = stringScalar(name.inline);
320
+ }
321
+ const disabled = keys.get('disabled');
322
+ if (disabled) {
323
+ if (disabled.nested.length || disabled.inline === undefined)
324
+ throw new Ambiguous('disabled is not a scalar');
325
+ patch.disabled = boolScalar(disabled.inline);
326
+ }
327
+ const config = keys.get('config');
328
+ if (config)
329
+ patch.config = configOf(config);
330
+ patches.push(patch);
331
+ }
332
+ return patches;
333
+ }
334
+ catch (err) {
335
+ if (err instanceof Ambiguous)
336
+ return null;
337
+ throw err;
338
+ }
339
+ }
340
+ /**
341
+ * The model dsh-TUI's route config pins, given what the user layers do to its row in
342
+ * application order (profile layer first, then the home layer). Null unless the last
343
+ * `config` that applies names both a provider and a model, and the row is not
344
+ * disabled. Pure.
345
+ *
346
+ * @param layers each layer's patches for the row, or null for a layer that could not be read
347
+ */
348
+ export function resolveDshTuiRouteModel(layers) {
349
+ let config;
350
+ let disabled = false;
351
+ for (const layer of layers) {
352
+ if (layer === null)
353
+ return null;
354
+ for (const patch of layer) {
355
+ if (patch.name !== undefined && patch.name !== DSH_TUI_PACKAGE)
356
+ continue;
357
+ if (patch.disabled !== undefined)
358
+ disabled = patch.disabled;
359
+ if (patch.config !== undefined)
360
+ config = patch.config;
361
+ }
362
+ }
363
+ if (disabled || !config?.provider || !config.model)
364
+ return null;
365
+ return config.model;
366
+ }
367
+ /**
368
+ * Read `path`, which must resolve inside `realHome`, bounded: probed first (a mount
369
+ * that does not answer is refused, never waited on), its real path checked against
370
+ * the dsh home (a symlink out of it is refused), size-capped.
371
+ */
372
+ async function readHomeFile(path, realHome) {
373
+ const kind = await probePathKind(path);
374
+ if (kind === 'absent')
375
+ return { state: 'absent' };
376
+ if (kind !== 'file')
377
+ return { state: 'refused' };
378
+ try {
379
+ const real = await fs.realpath(path);
380
+ if (!real.startsWith(realHome + sep))
381
+ return { state: 'refused' };
382
+ const stat = await fs.stat(real);
383
+ if (!stat.isFile() || stat.size > MAX_ROUTE_FILE_BYTES)
384
+ return { state: 'refused' };
385
+ return { state: 'read', text: await fs.readFile(real, 'utf8') };
386
+ }
387
+ catch {
388
+ return { state: 'refused' };
389
+ }
390
+ }
391
+ /**
392
+ * The dsh home a session runs against: its own `DSH_HOME` (already clamped for a
393
+ * non-granted owner), else the server's, else `~/.dsh`, as the `dsh` wrapper's
394
+ * `${DSH_HOME:-...}` resolves it. Null for a relative value, which names no place.
395
+ */
396
+ export function effectiveDshHome(env) {
397
+ const value = env('DSH_HOME')?.trim();
398
+ if (!value)
399
+ return join(homedir(), '.dsh');
400
+ return isAbsolute(value) ? resolve(value) : null;
401
+ }
402
+ /**
403
+ * The profiles under a dsh home, read with the same bounded rules as the route files.
404
+ * Used to name the profile a session boots when it named none, the way the launch's
405
+ * `launcherDefaultTarget` does (resolveDefaultDeepSeekProfile).
406
+ */
407
+ async function listProfilesBounded(home) {
408
+ const profilesDir = join(home, 'profiles');
409
+ if ((await probePathKind(home)) !== 'directory' || (await probePathKind(profilesDir)) !== 'directory')
410
+ return null;
411
+ let realHome;
412
+ let names;
413
+ try {
414
+ realHome = await fs.realpath(home);
415
+ names = (await fs.readdir(profilesDir, { withFileTypes: true }))
416
+ .filter((e) => e.isDirectory() && isProfileDirName(e.name) && PROFILE_NAME.test(e.name))
417
+ .map((e) => e.name)
418
+ .sort((a, b) => a.localeCompare(b))
419
+ .slice(0, MAX_PROFILES);
420
+ }
421
+ catch {
422
+ return null;
423
+ }
424
+ const profiles = [];
425
+ for (const name of names) {
426
+ const manifest = await readHomeFile(join(profilesDir, name, 'package.json'), realHome);
427
+ if (manifest.state !== 'read')
428
+ continue;
429
+ const profile = deepSeekProfileFromManifest(name, manifest.text);
430
+ if (profile)
431
+ profiles.push(profile);
432
+ }
433
+ return profiles;
434
+ }
435
+ /**
436
+ * The model the session's dsh-TUI route config pins, or null when it pins none or the
437
+ * answer is in any doubt. Read-only and bounded; see the module comment.
438
+ */
439
+ export async function readDeepSeekRouteModel(ctx) {
440
+ const { home } = ctx;
441
+ if (!home)
442
+ return null;
443
+ // An invalid name reads as unset at launch, so the default applies there too.
444
+ let profile = typeof ctx.profile === 'string' && PROFILE_NAME.test(ctx.profile) ? ctx.profile : null;
445
+ if (!profile) {
446
+ if (!ctx.serverHome)
447
+ return null;
448
+ const listed = await listProfilesBounded(ctx.serverHome);
449
+ profile = listed ? resolveDefaultDeepSeekProfile(listed) : null;
450
+ if (!profile)
451
+ return null;
452
+ }
453
+ if ((await probePathKind(home)) !== 'directory')
454
+ return null;
455
+ let realHome;
456
+ try {
457
+ realHome = await fs.realpath(home);
458
+ }
459
+ catch {
460
+ return null;
461
+ }
462
+ const profileDir = join(home, 'profiles', profile);
463
+ const manifest = await readHomeFile(join(profileDir, 'package.json'), realHome);
464
+ if (manifest.state !== 'read')
465
+ return null;
466
+ if (!deepSeekProfileFromManifest(profile, manifest.text)?.bundles.includes(DSH_TUI_PACKAGE))
467
+ return null;
468
+ const layers = [];
469
+ for (const file of [join(profileDir, 'cordis.patch.yml'), join(home, 'cordis.patch.yml')]) {
470
+ const read = await readHomeFile(file, realHome);
471
+ if (read.state === 'refused')
472
+ return null;
473
+ layers.push(read.state === 'absent' ? [] : parseDshTuiPatches(read.text));
474
+ }
475
+ return resolveDshTuiRouteModel(layers);
476
+ }
477
+ //# sourceMappingURL=deepseek-route-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek-route-config.js","sourceRoot":"","sources":["../src/deepseek-route-config.ts"],"names":[],"mappings":"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"}