dsh-cliworker-now 0.0.0-stage → 0.7.7

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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +364 -0
  3. package/README.md +368 -2
  4. package/cordis.patch.yml +3 -0
  5. package/lib/account-models.mjs +262 -0
  6. package/lib/client.js +22139 -0
  7. package/lib/client.js.map +1 -0
  8. package/lib/grok-catalog.mjs +145 -0
  9. package/lib/hermes-native-entry.py +96 -0
  10. package/lib/hermes-nous-refresh.py +331 -0
  11. package/lib/index.js +14544 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/native-launch.mjs +234 -0
  14. package/lib/native-spawn.mjs +32 -0
  15. package/lib/own-account-lease.mjs +105 -0
  16. package/lib/pi-installation.mjs +87 -0
  17. package/lib/pi-login.mjs +80 -0
  18. package/lib/pi-native-catalog.mjs +417 -0
  19. package/lib/pi-omp-bridge.mjs +602 -0
  20. package/lib/pi-omp-environment.mjs +15 -0
  21. package/lib/pi-omp-refresh.mjs +324 -0
  22. package/lib/private-launch.mjs +23 -0
  23. package/lib/terminal-bridge.mjs +18 -0
  24. package/lib/typert.host.d.ts +3 -0
  25. package/lib/typert.host.js +1430 -0
  26. package/lib/typert.remote-client.d.ts +72 -0
  27. package/lib/typert.remote-client.d.ts.map +1 -0
  28. package/lib/typert.remote-client.js +1256 -0
  29. package/lib/types/client/account-query-queue.d.ts +16 -0
  30. package/lib/types/client/account-query-queue.js +61 -0
  31. package/lib/types/client/account-query-queue.js.map +1 -0
  32. package/lib/types/client/account-terminal-css.d.ts +1 -0
  33. package/lib/types/client/account-terminal-css.js +3 -0
  34. package/lib/types/client/account-terminal-css.js.map +1 -0
  35. package/lib/types/client/account-terminal.d.ts +17 -0
  36. package/lib/types/client/account-terminal.js +525 -0
  37. package/lib/types/client/account-terminal.js.map +1 -0
  38. package/lib/types/client/assets/antigravity.png +0 -0
  39. package/lib/types/client/assets/claude-code.png +0 -0
  40. package/lib/types/client/assets/cliworker-now-logo.png +0 -0
  41. package/lib/types/client/assets/codex.png +0 -0
  42. package/lib/types/client/assets/grok.png +0 -0
  43. package/lib/types/client/assets/hermes.png +0 -0
  44. package/lib/types/client/assets/kimi-dark.png +0 -0
  45. package/lib/types/client/assets/kimi-light.png +0 -0
  46. package/lib/types/client/assets/mimo-code.png +0 -0
  47. package/lib/types/client/assets/omp.png +0 -0
  48. package/lib/types/client/assets/opencode.png +0 -0
  49. package/lib/types/client/assets/pi.png +0 -0
  50. package/lib/types/client/assets/zcode.png +0 -0
  51. package/lib/types/client/composer-keymap.d.ts +18 -0
  52. package/lib/types/client/composer-keymap.js +49 -0
  53. package/lib/types/client/composer-keymap.js.map +1 -0
  54. package/lib/types/client/conversation-timeline.d.ts +6 -0
  55. package/lib/types/client/conversation-timeline.js +65 -0
  56. package/lib/types/client/conversation-timeline.js.map +1 -0
  57. package/lib/types/client/copy-text.d.ts +5 -0
  58. package/lib/types/client/copy-text.js +45 -0
  59. package/lib/types/client/copy-text.js.map +1 -0
  60. package/lib/types/client/icons.d.ts +21 -0
  61. package/lib/types/client/icons.js +68 -0
  62. package/lib/types/client/icons.js.map +1 -0
  63. package/lib/types/client/index.d.ts +3 -0
  64. package/lib/types/client/index.js +124 -0
  65. package/lib/types/client/index.js.map +1 -0
  66. package/lib/types/client/management-styles.d.ts +1 -0
  67. package/lib/types/client/management-styles.js +17 -0
  68. package/lib/types/client/management-styles.js.map +1 -0
  69. package/lib/types/client/name-copy.d.ts +5 -0
  70. package/lib/types/client/name-copy.js +107 -0
  71. package/lib/types/client/name-copy.js.map +1 -0
  72. package/lib/types/client/native-job-overlay.d.ts +11 -0
  73. package/lib/types/client/native-job-overlay.js +129 -0
  74. package/lib/types/client/native-job-overlay.js.map +1 -0
  75. package/lib/types/client/operation-error.d.ts +2 -0
  76. package/lib/types/client/operation-error.js +12 -0
  77. package/lib/types/client/operation-error.js.map +1 -0
  78. package/lib/types/client/panel.d.ts +8 -0
  79. package/lib/types/client/panel.js +310 -0
  80. package/lib/types/client/panel.js.map +1 -0
  81. package/lib/types/client/rename-copy-styles.d.ts +1 -0
  82. package/lib/types/client/rename-copy-styles.js +21 -0
  83. package/lib/types/client/rename-copy-styles.js.map +1 -0
  84. package/lib/types/client/rename-worker.d.ts +9 -0
  85. package/lib/types/client/rename-worker.js +53 -0
  86. package/lib/types/client/rename-worker.js.map +1 -0
  87. package/lib/types/client/role-presets.d.ts +6 -0
  88. package/lib/types/client/role-presets.js +111 -0
  89. package/lib/types/client/role-presets.js.map +1 -0
  90. package/lib/types/client/settings-dialog.d.ts +13 -0
  91. package/lib/types/client/settings-dialog.js +442 -0
  92. package/lib/types/client/settings-dialog.js.map +1 -0
  93. package/lib/types/client/stat-popover.d.ts +10 -0
  94. package/lib/types/client/stat-popover.js +32 -0
  95. package/lib/types/client/stat-popover.js.map +1 -0
  96. package/lib/types/client/styles.d.ts +9 -0
  97. package/lib/types/client/styles.js +221 -0
  98. package/lib/types/client/styles.js.map +1 -0
  99. package/lib/types/client/telemetry.d.ts +11 -0
  100. package/lib/types/client/telemetry.js +24 -0
  101. package/lib/types/client/telemetry.js.map +1 -0
  102. package/lib/types/client/worker-card.d.ts +10 -0
  103. package/lib/types/client/worker-card.js +75 -0
  104. package/lib/types/client/worker-card.js.map +1 -0
  105. package/lib/types/client/worker-model-menu.d.ts +9 -0
  106. package/lib/types/client/worker-model-menu.js +136 -0
  107. package/lib/types/client/worker-model-menu.js.map +1 -0
  108. package/lib/types/client/workers.d.ts +21 -0
  109. package/lib/types/client/workers.js +59 -0
  110. package/lib/types/client/workers.js.map +1 -0
  111. package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
  112. package/lib/types/client/zcode-login-link-provider.js +105 -0
  113. package/lib/types/client/zcode-login-link-provider.js.map +1 -0
  114. package/lib/types/client/zcode-login-link.d.ts +16 -0
  115. package/lib/types/client/zcode-login-link.js +194 -0
  116. package/lib/types/client/zcode-login-link.js.map +1 -0
  117. package/lib/types/host/account-identity.d.ts +16 -0
  118. package/lib/types/host/account-identity.js +126 -0
  119. package/lib/types/host/account-identity.js.map +1 -0
  120. package/lib/types/host/account-login.d.ts +10 -0
  121. package/lib/types/host/account-login.js +126 -0
  122. package/lib/types/host/account-login.js.map +1 -0
  123. package/lib/types/host/account-models.d.mts +21 -0
  124. package/lib/types/host/account-models.mjs +262 -0
  125. package/lib/types/host/accounts.d.ts +42 -0
  126. package/lib/types/host/accounts.js +945 -0
  127. package/lib/types/host/accounts.js.map +1 -0
  128. package/lib/types/host/adapters.d.ts +24 -0
  129. package/lib/types/host/adapters.js +380 -0
  130. package/lib/types/host/adapters.js.map +1 -0
  131. package/lib/types/host/agy-context.d.ts +8 -0
  132. package/lib/types/host/agy-context.js +122 -0
  133. package/lib/types/host/agy-context.js.map +1 -0
  134. package/lib/types/host/agy-models.d.ts +5 -0
  135. package/lib/types/host/agy-models.js +37 -0
  136. package/lib/types/host/agy-models.js.map +1 -0
  137. package/lib/types/host/agy-windows-account.d.ts +14 -0
  138. package/lib/types/host/agy-windows-account.js +104 -0
  139. package/lib/types/host/agy-windows-account.js.map +1 -0
  140. package/lib/types/host/authorized-catalog.d.ts +14 -0
  141. package/lib/types/host/authorized-catalog.js +35 -0
  142. package/lib/types/host/authorized-catalog.js.map +1 -0
  143. package/lib/types/host/bridge-protocol.d.ts +15 -0
  144. package/lib/types/host/bridge-protocol.js +80 -0
  145. package/lib/types/host/bridge-protocol.js.map +1 -0
  146. package/lib/types/host/claude-native-oauth.d.ts +17 -0
  147. package/lib/types/host/claude-native-oauth.js +272 -0
  148. package/lib/types/host/claude-native-oauth.js.map +1 -0
  149. package/lib/types/host/claude-own-route.d.ts +33 -0
  150. package/lib/types/host/claude-own-route.js +250 -0
  151. package/lib/types/host/claude-own-route.js.map +1 -0
  152. package/lib/types/host/cli-account-binding.d.ts +33 -0
  153. package/lib/types/host/cli-account-binding.js +540 -0
  154. package/lib/types/host/cli-account-binding.js.map +1 -0
  155. package/lib/types/host/cli-protocol.d.ts +27 -0
  156. package/lib/types/host/cli-protocol.js +212 -0
  157. package/lib/types/host/cli-protocol.js.map +1 -0
  158. package/lib/types/host/codex-account.d.ts +8 -0
  159. package/lib/types/host/codex-account.js +143 -0
  160. package/lib/types/host/codex-account.js.map +1 -0
  161. package/lib/types/host/codex-models.d.ts +6 -0
  162. package/lib/types/host/codex-models.js +169 -0
  163. package/lib/types/host/codex-models.js.map +1 -0
  164. package/lib/types/host/extended-adapters.d.ts +44 -0
  165. package/lib/types/host/extended-adapters.js +207 -0
  166. package/lib/types/host/extended-adapters.js.map +1 -0
  167. package/lib/types/host/first-party-account-context.d.ts +26 -0
  168. package/lib/types/host/first-party-account-context.js +55 -0
  169. package/lib/types/host/first-party-account-context.js.map +1 -0
  170. package/lib/types/host/first-party-models.d.ts +29 -0
  171. package/lib/types/host/first-party-models.js +459 -0
  172. package/lib/types/host/first-party-models.js.map +1 -0
  173. package/lib/types/host/grok-adapter.d.ts +44 -0
  174. package/lib/types/host/grok-adapter.js +293 -0
  175. package/lib/types/host/grok-adapter.js.map +1 -0
  176. package/lib/types/host/grok-models.d.ts +47 -0
  177. package/lib/types/host/grok-models.js +320 -0
  178. package/lib/types/host/grok-models.js.map +1 -0
  179. package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
  180. package/lib/types/host/harness-opencode-accounts.js +80 -0
  181. package/lib/types/host/harness-opencode-accounts.js.map +1 -0
  182. package/lib/types/host/hermes-account-context.d.ts +8 -0
  183. package/lib/types/host/hermes-account-context.js +99 -0
  184. package/lib/types/host/hermes-account-context.js.map +1 -0
  185. package/lib/types/host/hermes-accounts.d.ts +19 -0
  186. package/lib/types/host/hermes-accounts.js +356 -0
  187. package/lib/types/host/hermes-accounts.js.map +1 -0
  188. package/lib/types/host/hermes-adapter.d.ts +93 -0
  189. package/lib/types/host/hermes-adapter.js +455 -0
  190. package/lib/types/host/hermes-adapter.js.map +1 -0
  191. package/lib/types/host/hermes-env.d.ts +4 -0
  192. package/lib/types/host/hermes-env.js +22 -0
  193. package/lib/types/host/hermes-env.js.map +1 -0
  194. package/lib/types/host/hermes-installation.d.ts +10 -0
  195. package/lib/types/host/hermes-installation.js +181 -0
  196. package/lib/types/host/hermes-installation.js.map +1 -0
  197. package/lib/types/host/hermes-models.d.ts +26 -0
  198. package/lib/types/host/hermes-models.js +328 -0
  199. package/lib/types/host/hermes-models.js.map +1 -0
  200. package/lib/types/host/hermes-native-entry.py +96 -0
  201. package/lib/types/host/hermes-nous-refresh.py +331 -0
  202. package/lib/types/host/hermes-nous.d.ts +53 -0
  203. package/lib/types/host/hermes-nous.js +343 -0
  204. package/lib/types/host/hermes-nous.js.map +1 -0
  205. package/lib/types/host/hermes-renewal.d.ts +27 -0
  206. package/lib/types/host/hermes-renewal.js +292 -0
  207. package/lib/types/host/hermes-renewal.js.map +1 -0
  208. package/lib/types/host/hermes-suppression.d.ts +7 -0
  209. package/lib/types/host/hermes-suppression.js +69 -0
  210. package/lib/types/host/hermes-suppression.js.map +1 -0
  211. package/lib/types/host/hermes-windows-installation.d.ts +5 -0
  212. package/lib/types/host/hermes-windows-installation.js +91 -0
  213. package/lib/types/host/hermes-windows-installation.js.map +1 -0
  214. package/lib/types/host/index.d.ts +140 -0
  215. package/lib/types/host/index.js +947 -0
  216. package/lib/types/host/index.js.map +1 -0
  217. package/lib/types/host/kimi-accounts.d.ts +17 -0
  218. package/lib/types/host/kimi-accounts.js +220 -0
  219. package/lib/types/host/kimi-accounts.js.map +1 -0
  220. package/lib/types/host/kimi-oauth-models.d.ts +14 -0
  221. package/lib/types/host/kimi-oauth-models.js +246 -0
  222. package/lib/types/host/kimi-oauth-models.js.map +1 -0
  223. package/lib/types/host/managed-agent.d.ts +4 -0
  224. package/lib/types/host/managed-agent.js +127 -0
  225. package/lib/types/host/managed-agent.js.map +1 -0
  226. package/lib/types/host/mimo-configuration.d.ts +22 -0
  227. package/lib/types/host/mimo-configuration.js +258 -0
  228. package/lib/types/host/mimo-configuration.js.map +1 -0
  229. package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
  230. package/lib/types/host/mimo-metadata-cache.js +121 -0
  231. package/lib/types/host/mimo-metadata-cache.js.map +1 -0
  232. package/lib/types/host/native-capability-cache.d.ts +11 -0
  233. package/lib/types/host/native-capability-cache.js +94 -0
  234. package/lib/types/host/native-capability-cache.js.map +1 -0
  235. package/lib/types/host/native-launch.d.mts +2 -0
  236. package/lib/types/host/native-launch.mjs +234 -0
  237. package/lib/types/host/native-process.d.ts +5 -0
  238. package/lib/types/host/native-process.js +41 -0
  239. package/lib/types/host/native-process.js.map +1 -0
  240. package/lib/types/host/native-spawn.mjs +32 -0
  241. package/lib/types/host/opencode-adapter.d.ts +94 -0
  242. package/lib/types/host/opencode-adapter.js +507 -0
  243. package/lib/types/host/opencode-adapter.js.map +1 -0
  244. package/lib/types/host/opencode-native.d.ts +27 -0
  245. package/lib/types/host/opencode-native.js +403 -0
  246. package/lib/types/host/opencode-native.js.map +1 -0
  247. package/lib/types/host/own-account-lease.d.mts +5 -0
  248. package/lib/types/host/own-account-lease.mjs +105 -0
  249. package/lib/types/host/pi-installation.d.mts +7 -0
  250. package/lib/types/host/pi-installation.mjs +87 -0
  251. package/lib/types/host/pi-omp-accounts.d.ts +28 -0
  252. package/lib/types/host/pi-omp-accounts.js +175 -0
  253. package/lib/types/host/pi-omp-accounts.js.map +1 -0
  254. package/lib/types/host/pi-omp-adapter.d.ts +32 -0
  255. package/lib/types/host/pi-omp-adapter.js +190 -0
  256. package/lib/types/host/pi-omp-adapter.js.map +1 -0
  257. package/lib/types/host/pi-omp-environment.d.mts +1 -0
  258. package/lib/types/host/pi-omp-environment.mjs +15 -0
  259. package/lib/types/host/pi-omp-identity.d.ts +2 -0
  260. package/lib/types/host/pi-omp-identity.js +142 -0
  261. package/lib/types/host/pi-omp-identity.js.map +1 -0
  262. package/lib/types/host/pi-omp-logout.d.ts +3 -0
  263. package/lib/types/host/pi-omp-logout.js +152 -0
  264. package/lib/types/host/pi-omp-logout.js.map +1 -0
  265. package/lib/types/host/pi-omp-native.d.ts +71 -0
  266. package/lib/types/host/pi-omp-native.js +753 -0
  267. package/lib/types/host/pi-omp-native.js.map +1 -0
  268. package/lib/types/host/pi-omp-refresh.d.mts +7 -0
  269. package/lib/types/host/pi-omp-refresh.mjs +324 -0
  270. package/lib/types/host/private-launch.mjs +23 -0
  271. package/lib/types/host/process.d.ts +43 -0
  272. package/lib/types/host/process.js +134 -0
  273. package/lib/types/host/process.js.map +1 -0
  274. package/lib/types/host/protocol.d.ts +23 -0
  275. package/lib/types/host/protocol.js +112 -0
  276. package/lib/types/host/protocol.js.map +1 -0
  277. package/lib/types/host/roles.d.ts +34 -0
  278. package/lib/types/host/roles.js +80 -0
  279. package/lib/types/host/roles.js.map +1 -0
  280. package/lib/types/host/routing.d.ts +31 -0
  281. package/lib/types/host/routing.js +248 -0
  282. package/lib/types/host/routing.js.map +1 -0
  283. package/lib/types/host/runtime.d.ts +60 -0
  284. package/lib/types/host/runtime.js +598 -0
  285. package/lib/types/host/runtime.js.map +1 -0
  286. package/lib/types/host/storage.d.ts +48 -0
  287. package/lib/types/host/storage.js +449 -0
  288. package/lib/types/host/storage.js.map +1 -0
  289. package/lib/types/host/telemetry.d.ts +17 -0
  290. package/lib/types/host/telemetry.js +158 -0
  291. package/lib/types/host/telemetry.js.map +1 -0
  292. package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
  293. package/lib/types/host/windows-account-launch.mjs +47 -0
  294. package/lib/types/host/windows-account-owner.ps1 +137 -0
  295. package/lib/types/host/windows-account-stdio.mjs +19 -0
  296. package/lib/types/host/windows-account-terminal.d.ts +17 -0
  297. package/lib/types/host/windows-account-terminal.js +208 -0
  298. package/lib/types/host/windows-account-terminal.js.map +1 -0
  299. package/lib/types/host/windows-agy-account.ps1 +81 -0
  300. package/lib/types/host/windows-cli-installation.d.ts +31 -0
  301. package/lib/types/host/windows-cli-installation.js +157 -0
  302. package/lib/types/host/windows-cli-installation.js.map +1 -0
  303. package/lib/types/host/windows-hidden-launch.mjs +49 -0
  304. package/lib/types/host/windows-hidden-process.d.ts +12 -0
  305. package/lib/types/host/windows-hidden-process.js +116 -0
  306. package/lib/types/host/windows-hidden-process.js.map +1 -0
  307. package/lib/types/host/zcode-account-models.d.ts +16 -0
  308. package/lib/types/host/zcode-account-models.js +114 -0
  309. package/lib/types/host/zcode-account-models.js.map +1 -0
  310. package/lib/types/host/zcode-adapter.d.ts +93 -0
  311. package/lib/types/host/zcode-adapter.js +808 -0
  312. package/lib/types/host/zcode-adapter.js.map +1 -0
  313. package/lib/types/host/zcode-grok-accounts.d.ts +30 -0
  314. package/lib/types/host/zcode-grok-accounts.js +408 -0
  315. package/lib/types/host/zcode-grok-accounts.js.map +1 -0
  316. package/lib/types/shared/accounts.d.ts +47 -0
  317. package/lib/types/shared/accounts.js +2 -0
  318. package/lib/types/shared/accounts.js.map +1 -0
  319. package/lib/types/shared/builtin-presets.d.ts +2 -0
  320. package/lib/types/shared/builtin-presets.js +231 -0
  321. package/lib/types/shared/builtin-presets.js.map +1 -0
  322. package/lib/types/shared/cli-settings.d.ts +5 -0
  323. package/lib/types/shared/cli-settings.js +2 -0
  324. package/lib/types/shared/cli-settings.js.map +1 -0
  325. package/lib/types/shared/model-presentation.d.ts +10 -0
  326. package/lib/types/shared/model-presentation.js +95 -0
  327. package/lib/types/shared/model-presentation.js.map +1 -0
  328. package/lib/types/shared/models.d.ts +7 -0
  329. package/lib/types/shared/models.js +35 -0
  330. package/lib/types/shared/models.js.map +1 -0
  331. package/lib/types/shared/telemetry.d.ts +18 -0
  332. package/lib/types/shared/telemetry.js +16 -0
  333. package/lib/types/shared/telemetry.js.map +1 -0
  334. package/lib/types/shared/types.d.ts +127 -0
  335. package/lib/types/shared/types.js +147 -0
  336. package/lib/types/shared/types.js.map +1 -0
  337. package/lib/windows-account-bootstrap.ps1 +44 -0
  338. package/lib/windows-account-launch.mjs +47 -0
  339. package/lib/windows-account-owner.ps1 +137 -0
  340. package/lib/windows-account-stdio.mjs +19 -0
  341. package/lib/windows-agy-account.ps1 +81 -0
  342. package/lib/windows-hidden-launch.mjs +49 -0
  343. package/lib/zcode-resume.mjs +423 -0
  344. package/package.json +109 -4
@@ -0,0 +1,292 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { validateHermesHomeDirectory } from "./hermes-adapter.js";
6
+ import { hermesAccountEnvironment } from "./hermes-account-context.js";
7
+ import { assertHermesOwnAccounts, hermesPoolEntryUnavailable, readHermesAccountMaterial, } from "./hermes-models.js";
8
+ import { hermesNativeCommand } from "./hermes-installation.js";
9
+ import { HermesNousError, hermesNousMinimumTtl, selectHermesNousSource, } from "./hermes-nous.js";
10
+ import { projectHermesUnsuppressedAuth, hermesUnsuppressedEnvironment } from "./hermes-suppression.js";
11
+ import { ProcessCleanupUnconfirmedError } from "./process.js";
12
+ const messages = {
13
+ relogin: 'Hermes 登录已失效,请重新登录',
14
+ unavailable: 'Hermes 登录暂时无法续期,请稍后刷新',
15
+ changed: 'Hermes 账号来源已变化,请刷新后重试',
16
+ unsupported: '当前 Hermes 安装不支持安全续期,请更新原生 CLI 后重试',
17
+ busy: 'Hermes 账号终端正在运行,请关闭后刷新',
18
+ };
19
+ export class HermesRenewalError extends HermesNousError {
20
+ state;
21
+ constructor(state) {
22
+ super(messages[state]);
23
+ this.state = state;
24
+ }
25
+ }
26
+ const homes = new Map();
27
+ function homeKey(home) {
28
+ const canonical = validateHermesHomeDirectory(home);
29
+ return { home: canonical, key: process.platform === 'win32' ? canonical.toLowerCase() : canonical };
30
+ }
31
+ function retire(key, state) {
32
+ if (!state.flight && !state.reserved && !state.poisoned && homes.get(key) === state)
33
+ homes.delete(key);
34
+ }
35
+ function available(state) {
36
+ if (state.poisoned)
37
+ throw new ProcessCleanupUnconfirmedError();
38
+ if (state.reserved)
39
+ throw new HermesRenewalError('busy');
40
+ }
41
+ /** No bearer, refresh token or email enters the command line or public result. */
42
+ export function hermesNousPrincipalDigest(source) {
43
+ const p = source.principal;
44
+ return createHash('sha256')
45
+ .update(JSON.stringify([
46
+ 'hermes-nous-v1',
47
+ p.subject,
48
+ p.organization,
49
+ p.issuer,
50
+ p.clientId ?? '',
51
+ source.route.portal,
52
+ source.route.inference,
53
+ ]))
54
+ .digest('hex');
55
+ }
56
+ async function snapshot(home, signal) {
57
+ try {
58
+ await lstat(join(home, 'config.yaml'));
59
+ }
60
+ catch (error) {
61
+ if (error.code === 'ENOENT')
62
+ return;
63
+ throw error;
64
+ }
65
+ const selected = await readHermesAccountMaterial(home, signal);
66
+ if (selected.config.model?.provider !== 'nous' || selected.auth.active_provider !== 'nous')
67
+ return;
68
+ const raw = await assertHermesOwnAccounts(home, signal);
69
+ if (raw.config.model?.provider !== 'nous' || raw.auth.active_provider !== 'nous')
70
+ return;
71
+ const material = {
72
+ ...raw,
73
+ auth: projectHermesUnsuppressedAuth(raw.auth),
74
+ env: hermesUnsuppressedEnvironment(raw.auth, raw.env, 'nous'),
75
+ };
76
+ // Suppressed/deleted credentials never become a renewal source.
77
+ if (!material.auth.providers?.nous)
78
+ return;
79
+ const source = selectHermesNousSource(material, { allowExpired: true });
80
+ const ttl = hermesNousMinimumTtl(material.env);
81
+ const state = material.auth.providers.nous;
82
+ return {
83
+ material,
84
+ source,
85
+ ttl,
86
+ state,
87
+ digest: hermesNousPrincipalDigest(source),
88
+ identity: JSON.stringify([
89
+ hermesNousPrincipalDigest(source),
90
+ state.client_id || 'hermes-cli',
91
+ source.route,
92
+ ]),
93
+ };
94
+ }
95
+ async function capture(input, home, digest, ttl, signal) {
96
+ if (!input.backend)
97
+ throw new HermesRenewalError('unsupported');
98
+ const executable = input.executable ?? (await input.resolveExecutable?.(signal));
99
+ if (!executable)
100
+ throw new HermesRenewalError('unsupported');
101
+ const argv = await hermesNativeCommand(executable, ['--cliworker-nous-refresh', digest], signal);
102
+ // Unknown standalone launchers must not receive our private protocol as a CLI command.
103
+ if (argv[2] !== fileURLToPath(new URL('./hermes-native-entry.py', import.meta.url)))
104
+ throw new HermesRenewalError('unsupported');
105
+ signal.throwIfAborted();
106
+ // Once rotation starts, cancellation waits for the bounded native transaction to
107
+ // persist its new refresh token. Killing it on UI cancellation could spend the
108
+ // old single-use grant without saving the replacement (especially Windows Job).
109
+ const deadline = AbortSignal.timeout(8000);
110
+ const child = input.backend.spawn({
111
+ argv: [process.execPath, fileURLToPath(new URL('./private-launch.mjs', import.meta.url)), ...argv],
112
+ cwd: home,
113
+ env: {
114
+ ...hermesAccountEnvironment(home),
115
+ HERMES_SHARED_AUTH_DIR: join(home, 'shared'),
116
+ HERMES_NOUS_MIN_KEY_TTL_SECONDS: String(ttl),
117
+ PYTHONDONTWRITEBYTECODE: '1',
118
+ ELECTRON_RUN_AS_NODE: '1',
119
+ },
120
+ stdio: { stdin: 'ignore', stdout: 'pipe', stderr: 'pipe' },
121
+ graceMs: input.graceMs ?? 5000,
122
+ signal: deadline,
123
+ });
124
+ void child.done.catch(() => undefined);
125
+ let output = '', bytes = 0;
126
+ const read = async (stream, keep) => {
127
+ if (stream)
128
+ for await (const chunk of stream) {
129
+ bytes += Buffer.byteLength(chunk);
130
+ if (bytes > 8192)
131
+ throw new HermesRenewalError('unavailable');
132
+ if (keep)
133
+ output += String(chunk);
134
+ if (output.length > 512)
135
+ throw new HermesRenewalError('unavailable');
136
+ }
137
+ };
138
+ const readers = [read(child.stdout, true), read(child.stderr, false)];
139
+ try {
140
+ await Promise.all(readers);
141
+ const result = await child.done;
142
+ if (deadline.aborted || result.exitCode !== 0)
143
+ throw new HermesRenewalError('unavailable');
144
+ let receipt;
145
+ try {
146
+ receipt = JSON.parse(output);
147
+ }
148
+ catch {
149
+ throw new HermesRenewalError('unavailable');
150
+ }
151
+ if (!receipt ||
152
+ receipt.version !== 1 ||
153
+ Object.keys(receipt).sort().join(',') !== 'state,version' ||
154
+ !['ready', 'relogin', 'unavailable', 'changed', 'unsupported'].includes(receipt.state))
155
+ throw new HermesRenewalError('unavailable');
156
+ if (receipt.state !== 'ready')
157
+ throw new HermesRenewalError(receipt.state);
158
+ }
159
+ finally {
160
+ output = '';
161
+ let exited = false;
162
+ try {
163
+ child.terminate();
164
+ exited = await child.waitForExit();
165
+ }
166
+ catch {
167
+ /* fail closed below */
168
+ }
169
+ if (!exited)
170
+ throw new ProcessCleanupUnconfirmedError();
171
+ await Promise.allSettled([...readers, child.done]);
172
+ }
173
+ }
174
+ async function renew(input, home, signal) {
175
+ signal.throwIfAborted();
176
+ const before = await snapshot(home, signal);
177
+ if (!before || before.source.expires > Date.now() + before.ttl * 1000)
178
+ return;
179
+ if (typeof before.state.refresh_token !== 'string' ||
180
+ !before.state.refresh_token.trim() ||
181
+ before.state.refresh_token.length > 32768 ||
182
+ /[\x00-\x20\x7f]/.test(before.state.refresh_token))
183
+ throw new HermesRenewalError('relogin');
184
+ if (before.material.auth.credential_pool.nous.some((row) => hermesPoolEntryUnavailable(row, before.material.config.model?.default)))
185
+ throw new HermesRenewalError('unavailable');
186
+ await capture(input, home, before.digest, before.ttl, signal);
187
+ // Always reread even if all subscribers left while the native transaction ran.
188
+ const after = await snapshot(home, new AbortController().signal);
189
+ if (!after || after.identity !== before.identity)
190
+ throw new HermesRenewalError('changed');
191
+ if (after.source.expires <= Date.now() + after.ttl * 1000)
192
+ throw new HermesRenewalError('unavailable');
193
+ }
194
+ function abortable(operation, signal) {
195
+ signal.throwIfAborted();
196
+ return new Promise((resolve, reject) => {
197
+ const abort = () => reject(signal.reason);
198
+ signal.addEventListener('abort', abort, { once: true });
199
+ operation
200
+ .then(resolve, reject)
201
+ .finally(() => signal.removeEventListener('abort', abort))
202
+ .catch(() => { });
203
+ });
204
+ }
205
+ /** Share only an in-flight renewal, never a completed authorization decision. */
206
+ export async function ensureHermesNousFresh(input) {
207
+ input.signal.throwIfAborted();
208
+ const { home, key } = homeKey(input.home);
209
+ const state = homes.get(key) ?? {};
210
+ homes.set(key, state);
211
+ available(state);
212
+ let flight = state.flight;
213
+ if (flight?.readers.size && [...flight.readers].every((reader) => reader.signal.aborted))
214
+ flight.controller.abort();
215
+ if (flight?.controller.signal.aborted) {
216
+ await abortable(flight.operation.catch(() => { }), input.signal);
217
+ return ensureHermesNousFresh(input);
218
+ }
219
+ if (!flight) {
220
+ const controller = new AbortController();
221
+ flight = { controller, operation: Promise.resolve(), readers: new Set(), settled: false };
222
+ state.flight = flight;
223
+ const current = flight;
224
+ current.operation = Promise.resolve()
225
+ .then(() => renew(input, home, controller.signal))
226
+ .catch((error) => {
227
+ if (error instanceof ProcessCleanupUnconfirmedError)
228
+ state.poisoned = true;
229
+ if (error instanceof HermesNousError || error instanceof ProcessCleanupUnconfirmedError)
230
+ throw error;
231
+ controller.signal.throwIfAborted();
232
+ throw new HermesRenewalError('unavailable');
233
+ })
234
+ .finally(() => {
235
+ current.settled = true;
236
+ if (state.flight === current)
237
+ state.flight = undefined;
238
+ retire(key, state);
239
+ });
240
+ void current.operation.catch(() => { });
241
+ }
242
+ const reader = { signal: input.signal };
243
+ flight.readers.add(reader);
244
+ try {
245
+ await abortable(flight.operation, input.signal);
246
+ input.signal.throwIfAborted();
247
+ available(state);
248
+ }
249
+ finally {
250
+ flight.readers.delete(reader);
251
+ if (!flight.readers.size && !flight.settled) {
252
+ flight.controller.abort();
253
+ await flight.operation.catch((error) => {
254
+ if (error instanceof ProcessCleanupUnconfirmedError)
255
+ throw error;
256
+ });
257
+ }
258
+ }
259
+ }
260
+ /** Hold until the account terminal's entire managed range has exited. */
261
+ export async function reserveHermesAccount(home, signal) {
262
+ signal.throwIfAborted();
263
+ const { key } = homeKey(home);
264
+ const state = homes.get(key) ?? {};
265
+ homes.set(key, state);
266
+ available(state);
267
+ const owner = Symbol();
268
+ state.reserved = owner;
269
+ const release = () => {
270
+ if (state.reserved === owner)
271
+ state.reserved = undefined;
272
+ retire(key, state);
273
+ };
274
+ try {
275
+ if (state.flight) {
276
+ state.flight.controller.abort();
277
+ await state.flight.operation.catch((error) => {
278
+ if (error instanceof ProcessCleanupUnconfirmedError)
279
+ throw error;
280
+ });
281
+ }
282
+ signal.throwIfAborted();
283
+ if (state.poisoned)
284
+ throw new ProcessCleanupUnconfirmedError();
285
+ return release;
286
+ }
287
+ catch (error) {
288
+ release();
289
+ throw error;
290
+ }
291
+ }
292
+ //# sourceMappingURL=hermes-renewal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-renewal.js","sourceRoot":"","sources":["../../../src/host/hermes-renewal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Native auth.py is_source_suppressed accepts provider-scoped lists and legacy
2
+ * dict keys. Removal retains config values; match the exact native source only. */
3
+ export declare function hermesSourceSuppressed(auth: unknown, provider: string, source: string): boolean;
4
+ /** Safe in-memory view only. Never rewrites native auth, config or environment. */
5
+ export declare function projectHermesUnsuppressedAuth(auth: unknown): Record<string, any>;
6
+ /** Only the selected provider's env:<NAME> record controls that provider's key. */
7
+ export declare function hermesUnsuppressedEnvironment(auth: unknown, env: Record<string, string>, provider: string): Record<string, string>;
@@ -0,0 +1,69 @@
1
+ const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
2
+ const invalid = () => new Error('Hermes 账号退出记录无法确认,请检查原生账号设置');
3
+ /** Native auth.py is_source_suppressed accepts provider-scoped lists and legacy
4
+ * dict keys. Removal retains config values; match the exact native source only. */
5
+ export function hermesSourceSuppressed(auth, provider, source) {
6
+ if (!record(auth))
7
+ throw invalid();
8
+ const suppressed = auth.suppressed_sources;
9
+ if (suppressed === undefined)
10
+ return false;
11
+ if (!record(suppressed))
12
+ throw invalid();
13
+ const sources = suppressed[provider];
14
+ if (sources === undefined)
15
+ return false;
16
+ if (Array.isArray(sources)) {
17
+ if (sources.some((item) => typeof item !== 'string'))
18
+ throw invalid();
19
+ return sources.includes(source);
20
+ }
21
+ if (record(sources))
22
+ return Object.hasOwn(sources, source);
23
+ throw invalid();
24
+ }
25
+ /** Safe in-memory view only. Never rewrites native auth, config or environment. */
26
+ export function projectHermesUnsuppressedAuth(auth) {
27
+ if (!record(auth))
28
+ throw invalid();
29
+ if (auth.suppressed_sources !== undefined) {
30
+ if (!record(auth.suppressed_sources))
31
+ throw invalid();
32
+ for (const provider of Object.keys(auth.suppressed_sources))
33
+ hermesSourceSuppressed(auth, provider, '');
34
+ }
35
+ const providers = { ...(record(auth.providers) ? auth.providers : {}) };
36
+ // Exact seed keys in native credential_pool._seed_from_singletons.
37
+ for (const [provider, source] of [
38
+ ['nous', 'device_code'],
39
+ ['openai-codex', 'device_code'],
40
+ ['xai-oauth', 'device_code'],
41
+ ['minimax-oauth', 'oauth'],
42
+ ])
43
+ if (hermesSourceSuppressed(auth, provider, source))
44
+ delete providers[provider];
45
+ const pool = auth.credential_pool;
46
+ if (pool !== undefined && !record(pool))
47
+ throw invalid();
48
+ return {
49
+ ...auth,
50
+ providers,
51
+ ...(pool === undefined
52
+ ? {}
53
+ : {
54
+ credential_pool: Object.fromEntries(Object.entries(pool).map(([provider, entries]) => {
55
+ if (!Array.isArray(entries))
56
+ throw invalid();
57
+ return [
58
+ provider,
59
+ entries.filter((entry) => !record(entry) || !hermesSourceSuppressed(auth, provider, entry.source ?? 'manual')),
60
+ ];
61
+ })),
62
+ }),
63
+ };
64
+ }
65
+ /** Only the selected provider's env:<NAME> record controls that provider's key. */
66
+ export function hermesUnsuppressedEnvironment(auth, env, provider) {
67
+ return Object.fromEntries(Object.entries(env).filter(([name]) => !hermesSourceSuppressed(auth, provider, `env:${name}`)));
68
+ }
69
+ //# sourceMappingURL=hermes-suppression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-suppression.js","sourceRoot":"","sources":["../../../src/host/hermes-suppression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Read only the single stored __main__.py member emitted by distlib. No ZIP
2
+ * extraction, Python evaluation, installer invocation, or account lookup. */
3
+ export declare function hermesDistlibSource(bytes: Buffer): string | undefined;
4
+ export declare function hermesLauncherCheckout(source: string): string | undefined;
5
+ export declare function windowsHermesCheckout(executable: string, command: string[], signal?: AbortSignal): Promise<string | undefined>;
@@ -0,0 +1,91 @@
1
+ import { constants } from 'node:fs';
2
+ import { open, realpath } from 'node:fs/promises';
3
+ import { basename, isAbsolute } from 'node:path';
4
+ /** Read only the single stored __main__.py member emitted by distlib. No ZIP
5
+ * extraction, Python evaluation, installer invocation, or account lookup. */
6
+ export function hermesDistlibSource(bytes) {
7
+ if (bytes.length < 128 || bytes.toString('ascii', 0, 2) !== 'MZ')
8
+ return;
9
+ const end = bytes.length - 22;
10
+ if (bytes.readUInt32LE(end) !== 0x06054b50)
11
+ return;
12
+ if (bytes.readUInt16LE(end + 4) !== 0 ||
13
+ bytes.readUInt16LE(end + 6) !== 0 ||
14
+ bytes.readUInt16LE(end + 8) !== 1 ||
15
+ bytes.readUInt16LE(end + 10) !== 1 ||
16
+ bytes.readUInt16LE(end + 20) !== 0)
17
+ throw new Error('Unsupported Hermes launcher archive');
18
+ const centralSize = bytes.readUInt32LE(end + 12);
19
+ const central = end - centralSize;
20
+ if (central < 64 || centralSize < 46 || bytes.readUInt32LE(central) !== 0x02014b50)
21
+ throw new Error('Invalid Hermes launcher directory');
22
+ const nameSize = bytes.readUInt16LE(central + 28);
23
+ const size = bytes.readUInt32LE(central + 24);
24
+ const local = central - bytes.readUInt32LE(end + 16) + bytes.readUInt32LE(central + 42);
25
+ if (centralSize !== 46 + nameSize ||
26
+ bytes.subarray(central + 46, end).toString('utf8') !== '__main__.py' ||
27
+ bytes.readUInt16LE(central + 8) !== 0 ||
28
+ bytes.readUInt16LE(central + 10) !== 0 ||
29
+ bytes.readUInt32LE(central + 20) !== size ||
30
+ size > 128 * 1024 ||
31
+ local < 64 ||
32
+ local + 30 > central ||
33
+ bytes.readUInt32LE(local) !== 0x04034b50 ||
34
+ bytes.readUInt16LE(local + 6) !== 0 ||
35
+ bytes.readUInt16LE(local + 8) !== 0 ||
36
+ bytes.readUInt32LE(local + 18) !== size ||
37
+ bytes.readUInt32LE(local + 22) !== size ||
38
+ bytes.readUInt16LE(local + 26) !== nameSize ||
39
+ bytes.readUInt16LE(local + 28) !== 0 ||
40
+ local + 30 + nameSize + size !== central ||
41
+ bytes.subarray(local + 30, local + 30 + nameSize).toString('utf8') !== '__main__.py')
42
+ throw new Error('Invalid Hermes launcher member');
43
+ return bytes.subarray(local + 30 + nameSize, central).toString('utf8');
44
+ }
45
+ export function hermesLauncherCheckout(source) {
46
+ if (!source.startsWith('import os, re, sys\n') ||
47
+ !source.includes('sys._hermes_pin_default_home = True\n') ||
48
+ !source.includes('import hermes_bootstrap') ||
49
+ !source.includes('from hermes_cli.main import main'))
50
+ return;
51
+ // Python's repr(path) uses only literal escaped backslashes/quotes here.
52
+ // Do not evaluate the launcher, interpolate its statements, or accept expressions.
53
+ const roots = [
54
+ ...source.matchAll(/^sys\.path\.insert\(0, ('(?:[^'\\\r\n]|\\[\\'])+'|"(?:[^"\\\r\n]|\\[\\"])+")\)\r?$/gm),
55
+ ];
56
+ if (roots.length !== 1)
57
+ throw new Error('Ambiguous Hermes checkout');
58
+ const path = roots[0][1].slice(1, -1).replace(/\\([\\'"])/g, '$1');
59
+ if (!isAbsolute(path) || path.includes('\0'))
60
+ throw new Error('Invalid Hermes checkout');
61
+ return path;
62
+ }
63
+ export async function windowsHermesCheckout(executable, command, signal) {
64
+ let source;
65
+ if (basename(executable).toLowerCase() === 'hermes.exe') {
66
+ const file = await open(executable, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
67
+ try {
68
+ const info = await file.stat();
69
+ if (!info.isFile() || info.nlink !== 1 || info.size > 1024 * 1024)
70
+ throw new Error('Unsafe Hermes launcher');
71
+ source = hermesDistlibSource(await file.readFile());
72
+ }
73
+ finally {
74
+ await file.close();
75
+ }
76
+ }
77
+ else if (command[1] === '-I' && command[2] === '-c') {
78
+ const encoded = /^import base64; exec\(base64\.b64decode\('([A-Za-z0-9+/]+={0,2})'\)\)$/.exec(command[3] ?? '');
79
+ if (encoded)
80
+ source = Buffer.from(encoded[1], 'base64').toString('utf8');
81
+ }
82
+ signal?.throwIfAborted();
83
+ if (source === undefined)
84
+ return;
85
+ const checkout = hermesLauncherCheckout(source);
86
+ if (!checkout)
87
+ return;
88
+ // Canonical spelling is part of the native install_key hash.
89
+ return realpath(checkout);
90
+ }
91
+ //# sourceMappingURL=hermes-windows-installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-windows-installation.js","sourceRoot":"","sources":["../../../src/host/hermes-windows-installation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import { Context } from '@deepseek-ai/cordis';
2
+ import z from '@deepseek-ai/schemastery';
3
+ import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
4
+ export type { Preference, Worker, WorkerSnapshot, ModelChoice, TimelineItem, TaskMode, Effort, WorkerStatus, RolePreset, RoleSnapshot, } from '../shared/types.ts';
5
+ /** Deployment settings; all values are resolved by the plugin schema. */
6
+ export interface Config {
7
+ /** CLI binary or absolute path (default agy). */
8
+ executable?: string;
9
+ /** Codex CLI executable. */
10
+ codexExecutable?: string;
11
+ /** Claude Code executable. */
12
+ claudeExecutable?: string;
13
+ /** Kimi Code executable. */
14
+ kimiExecutable?: string;
15
+ /** Official Xiaomi MiMo Code executable. */
16
+ mimoExecutable?: string;
17
+ zcodeExecutable?: string;
18
+ grokExecutable?: string;
19
+ ompExecutable?: string;
20
+ piExecutable?: string;
21
+ hermesExecutable?: string;
22
+ hermesHome?: string;
23
+ opencodeExecutable?: string;
24
+ zcodeAuthDirectory?: string;
25
+ zcodeBuiltinConfig?: string;
26
+ /** @deprecated Accepted for old deployments only; never read or forwarded. */
27
+ zaiCredentialRef?: string;
28
+ /** Optional private state directory; defaults to DSH_HOME/cliworker-now. */
29
+ stateDirectory?: string;
30
+ /** Maximum concurrent processes (default 2). */
31
+ maxConcurrent?: number;
32
+ /** Maximum turn duration in milliseconds (default 1800000). */
33
+ timeoutMs?: number;
34
+ /** Process termination grace in milliseconds (default 5000). */
35
+ graceMs?: number;
36
+ /** Maximum NDJSON line bytes (default 1048576). */
37
+ maxLineBytes?: number;
38
+ /** Maximum output bytes per run (default 16777216). */
39
+ maxRunBytes?: number;
40
+ /** Maximum logical timeline rows in one live view (default 1000). */
41
+ maxTimelineItems?: number;
42
+ }
43
+ declare module '@deepseek-ai/cordis' {
44
+ interface Context {
45
+ /** CLI worker lifecycle and browser API. */ cliworker: CliWorkerService;
46
+ }
47
+ }
48
+ declare module '@deepseek-ai/dsh-jobs' {
49
+ interface JobKindMap {
50
+ cliworker: 'cliworker';
51
+ }
52
+ }
53
+ declare module '@deepseek-ai/dsh-typert-protocol' {
54
+ interface RemoteErrorDetailsMap {
55
+ /** CLI worker operation could not proceed. */ 'cliworker/unavailable': {
56
+ reason: string;
57
+ };
58
+ }
59
+ }
60
+ /** Host owner of CLI conversations, model tools and Remote streams. */
61
+ export declare class CliWorkerService extends TypertRemoteService {
62
+ static inject: string[];
63
+ static Config: z<Config>;
64
+ private runtime;
65
+ private accounts;
66
+ private accountParents;
67
+ private options;
68
+ private backend;
69
+ private pending;
70
+ private dispatchWaits;
71
+ private selectionBindings;
72
+ private selectionProjects;
73
+ private displayedBindings;
74
+ private disposed;
75
+ /** @param ctx - Harness services. @param config - Validated deployment options. */
76
+ constructor(ctx: Context, config: Config);
77
+ private parent;
78
+ private project;
79
+ private assertExecution;
80
+ private queryCatalog;
81
+ private querySelection;
82
+ /** Serialize only this conversation's selection; a cancelled waiter never owns the question. */
83
+ private chooseDispatch;
84
+ private launch;
85
+ private registerTools;
86
+ /** @param parentSessionId - Owning Harness session. @param workerId - Selected worker or empty string. @param signal - Stream lifetime. @returns JSON snapshots, initially and after changes. */
87
+ watch(parentSessionId: string, workerId: string, signal: AbortSignal): AsyncIterable<string>;
88
+ /** @param parentSessionId - Owning parent session. @param workerId - Worker identity. @param anchor - Stable logical row ID, excluded from the result. @param direction - before or after. @returns JSON historical page, at most 200 rows. */
89
+ history(parentSessionId: string, workerId: string, anchor: string, direction: string): Promise<string>;
90
+ /** @param parentSessionId - Owning Harness session. @param signal - Query lifetime. @returns Profile-wide CLI enablement JSON. */
91
+ cliSettings(parentSessionId: string, signal: AbortSignal): Promise<string>;
92
+ /** @param parentSessionId - Active parent. @param signal - Query lifetime. @returns JSON role preset library. */
93
+ rolePresets(parentSessionId: string, signal: AbortSignal): Promise<string>;
94
+ /** @param parentSessionId - Active parent. @param requestJSON - Preset fields, optional existing id. @param signal - Mutation lifetime. @returns Saved preset JSON. */
95
+ saveRolePreset(parentSessionId: string, requestJSON: string, signal: AbortSignal): Promise<string>;
96
+ /** @param parentSessionId - Active parent. @param presetId - Preset to delete. @param signal - Mutation lifetime. @returns Completion. */
97
+ deleteRolePreset(parentSessionId: string, presetId: string, signal: AbortSignal): Promise<void>;
98
+ /** @param parentSessionId - Owning parent. @param workerId - Worker identity. @param name - Unique readable name. @param signal - Mutation lifetime. @returns Completion. */
99
+ renameWorker(parentSessionId: string, workerId: string, name: string, signal: AbortSignal): Promise<void>;
100
+ /** @param parentSessionId - Owning parent. @param workerId - Worker identity. @param title - Single-line chat title, at most 160 characters. @param signal - Mutation lifetime. @returns Completion. */
101
+ renameWorkerTitle(parentSessionId: string, workerId: string, title: string, signal: AbortSignal): Promise<void>;
102
+ /** @param parentSessionId - Owning parent. @param workerId - Idle Worker to hide. @param signal - Mutation lifetime. @returns Completion without deleting native data. */
103
+ deleteWorker(parentSessionId: string, workerId: string, signal: AbortSignal): Promise<void>;
104
+ /** @param parentSessionId - Owning parent. @param workerId - Deleted Worker identity. @param signal - Mutation lifetime. @returns Completion with the original ID and history. */
105
+ restoreWorker(parentSessionId: string, workerId: string, signal: AbortSignal): Promise<void>;
106
+ /** @param parentSessionId - Owning session. @param cli - Selected CLI. @param enabled - Allow new CLI operations. @param signal - Mutation admission lifetime. @returns Updated profile-wide CLI enablement JSON. */
107
+ setCliEnabled(parentSessionId: string, cli: string, enabled: boolean, signal: AbortSignal): Promise<string>;
108
+ /** @param parentSessionId - Owning session. @param cli - Selected CLI. @param signal - Query lifetime. @returns Safe account status JSON. */
109
+ accountStatus(parentSessionId: string, cli: string, signal: AbortSignal): Promise<string>;
110
+ /** @param parentSessionId - Owning session. @param cli - Selected CLI. @param action - Explicit human action. @param signal - Startup lifetime. @returns Managed account terminal identity and instruction JSON. */
111
+ accountStart(parentSessionId: string, cli: string, action: string, signal: AbortSignal): Promise<string>;
112
+ /** @param source - One current CLI-native source, never a filesystem path. */
113
+ accountStartForSource(parentSessionId: string, cli: string, action: string, source: string, signal: AbortSignal): Promise<string>;
114
+ /** @param provider - Explicit ZCode native login provider, never a URL or logout source. */
115
+ accountStartForProvider(parentSessionId: string, cli: string, action: string, provider: string, signal: AbortSignal): Promise<string>;
116
+ private startAccount;
117
+ /** @param parentSessionId - Owning session. @param accountId - Account terminal identity. @param signal - Stream lifetime. @returns Ephemeral terminal frame JSON. */
118
+ accountWatch(parentSessionId: string, accountId: string, signal: AbortSignal): AsyncIterable<string>;
119
+ /** @param parentSessionId - Owning session. @param accountId - Account terminal identity. @param data - Human keyboard input. @returns Input accepted. */
120
+ accountWrite(parentSessionId: string, accountId: string, data: string): Promise<boolean>;
121
+ /** @param parentSessionId - Owning session. @param accountId - Account terminal identity. @param cols - Visible columns. @param rows - Visible rows. @returns Resize accepted. */
122
+ accountResize(parentSessionId: string, accountId: string, cols: number, rows: number): Promise<boolean>;
123
+ /** @param parentSessionId - Owning session. @param accountId - Account terminal identity. @returns Process cleanup completed. */
124
+ accountStop(parentSessionId: string, accountId: string): Promise<boolean>;
125
+ /** @param parentSessionId - Parent session identity. @param signal - Caller lifetime. @returns JSON model catalog and project preference. */
126
+ catalog(parentSessionId: string, signal: AbortSignal): Promise<string>;
127
+ /** @param parentSessionId - Parent session identity. @param cli - Selected CLI. @param signal - Caller lifetime. @returns CLI catalog and saved project preference. */
128
+ catalogForCli(parentSessionId: string, cli: string, signal: AbortSignal): Promise<string>;
129
+ /** @param parentSessionId - Parent session identity. @param selection - JSON model and effort. @param signal - Caller lifetime. @returns Saved JSON preference. */
130
+ configure(parentSessionId: string, selection: string, signal: AbortSignal): Promise<string>;
131
+ /** @param parentSessionId - Owning session. @param workerId - Idle worker. @param selection - JSON preference. @param signal - Caller lifetime. @returns Saved worker configuration. */
132
+ configureWorker(parentSessionId: string, workerId: string, selection: string, signal: AbortSignal): Promise<string>;
133
+ /** @param parentSessionId - Parent session identity. @param workerId - Worker to continue. @param prompt - New task. @param signal - Admission lifetime. @returns Published background receipt. */
134
+ followup(parentSessionId: string, workerId: string, prompt: string, signal: AbortSignal): Promise<string>;
135
+ /** @param parentSessionId - Owning parent. @param workerId - Idle legacy history without an account binding. @param prompt - Explicit new-dialog task. @param signal - Admission lifetime. @returns JSON background receipt for a fresh Worker. */
136
+ restartWorker(parentSessionId: string, workerId: string, prompt: string, signal: AbortSignal): Promise<string>;
137
+ /** @param parentSessionId - Owning Harness session. @param workerId - Worker to stop. @returns Final worker state after cleanup. */
138
+ stop(parentSessionId: string, workerId: string): Promise<string>;
139
+ }
140
+ export default CliWorkerService;