dsh-cliworker-now 0.0.0-stage → 0.7.6

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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +344 -0
  3. package/README.md +346 -2
  4. package/cordis.patch.yml +3 -0
  5. package/lib/account-models.mjs +259 -0
  6. package/lib/client.js +21542 -0
  7. package/lib/client.js.map +1 -0
  8. package/lib/grok-catalog.mjs +145 -0
  9. package/lib/hermes-native-entry.py +61 -0
  10. package/lib/index.js +12409 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/native-launch.mjs +179 -0
  13. package/lib/own-account-lease.mjs +105 -0
  14. package/lib/pi-installation.mjs +63 -0
  15. package/lib/pi-login.mjs +80 -0
  16. package/lib/pi-native-catalog.mjs +417 -0
  17. package/lib/pi-omp-bridge.mjs +602 -0
  18. package/lib/pi-omp-environment.mjs +15 -0
  19. package/lib/pi-omp-refresh.mjs +324 -0
  20. package/lib/private-launch.mjs +19 -0
  21. package/lib/terminal-bridge.mjs +18 -0
  22. package/lib/typert.host.d.ts +3 -0
  23. package/lib/typert.host.js +1358 -0
  24. package/lib/typert.remote-client.d.ts +70 -0
  25. package/lib/typert.remote-client.d.ts.map +1 -0
  26. package/lib/typert.remote-client.js +1190 -0
  27. package/lib/types/client/account-terminal-css.d.ts +1 -0
  28. package/lib/types/client/account-terminal-css.js +3 -0
  29. package/lib/types/client/account-terminal-css.js.map +1 -0
  30. package/lib/types/client/account-terminal.d.ts +13 -0
  31. package/lib/types/client/account-terminal.js +296 -0
  32. package/lib/types/client/account-terminal.js.map +1 -0
  33. package/lib/types/client/assets/antigravity.png +0 -0
  34. package/lib/types/client/assets/claude-code.png +0 -0
  35. package/lib/types/client/assets/cliworker-now-logo.png +0 -0
  36. package/lib/types/client/assets/codex.png +0 -0
  37. package/lib/types/client/assets/grok.png +0 -0
  38. package/lib/types/client/assets/hermes.png +0 -0
  39. package/lib/types/client/assets/kimi-dark.png +0 -0
  40. package/lib/types/client/assets/kimi-light.png +0 -0
  41. package/lib/types/client/assets/mimo-code.png +0 -0
  42. package/lib/types/client/assets/omp.png +0 -0
  43. package/lib/types/client/assets/opencode.png +0 -0
  44. package/lib/types/client/assets/pi.png +0 -0
  45. package/lib/types/client/assets/zcode.png +0 -0
  46. package/lib/types/client/composer-keymap.d.ts +18 -0
  47. package/lib/types/client/composer-keymap.js +49 -0
  48. package/lib/types/client/composer-keymap.js.map +1 -0
  49. package/lib/types/client/conversation-timeline.d.ts +6 -0
  50. package/lib/types/client/conversation-timeline.js +65 -0
  51. package/lib/types/client/conversation-timeline.js.map +1 -0
  52. package/lib/types/client/copy-text.d.ts +5 -0
  53. package/lib/types/client/copy-text.js +45 -0
  54. package/lib/types/client/copy-text.js.map +1 -0
  55. package/lib/types/client/icons.d.ts +21 -0
  56. package/lib/types/client/icons.js +68 -0
  57. package/lib/types/client/icons.js.map +1 -0
  58. package/lib/types/client/index.d.ts +3 -0
  59. package/lib/types/client/index.js +124 -0
  60. package/lib/types/client/index.js.map +1 -0
  61. package/lib/types/client/management-styles.d.ts +1 -0
  62. package/lib/types/client/management-styles.js +17 -0
  63. package/lib/types/client/management-styles.js.map +1 -0
  64. package/lib/types/client/name-copy.d.ts +5 -0
  65. package/lib/types/client/name-copy.js +107 -0
  66. package/lib/types/client/name-copy.js.map +1 -0
  67. package/lib/types/client/native-job-overlay.d.ts +11 -0
  68. package/lib/types/client/native-job-overlay.js +129 -0
  69. package/lib/types/client/native-job-overlay.js.map +1 -0
  70. package/lib/types/client/operation-error.d.ts +2 -0
  71. package/lib/types/client/operation-error.js +12 -0
  72. package/lib/types/client/operation-error.js.map +1 -0
  73. package/lib/types/client/panel.d.ts +8 -0
  74. package/lib/types/client/panel.js +310 -0
  75. package/lib/types/client/panel.js.map +1 -0
  76. package/lib/types/client/rename-copy-styles.d.ts +1 -0
  77. package/lib/types/client/rename-copy-styles.js +21 -0
  78. package/lib/types/client/rename-copy-styles.js.map +1 -0
  79. package/lib/types/client/rename-worker.d.ts +9 -0
  80. package/lib/types/client/rename-worker.js +53 -0
  81. package/lib/types/client/rename-worker.js.map +1 -0
  82. package/lib/types/client/role-presets.d.ts +6 -0
  83. package/lib/types/client/role-presets.js +111 -0
  84. package/lib/types/client/role-presets.js.map +1 -0
  85. package/lib/types/client/settings-dialog.d.ts +13 -0
  86. package/lib/types/client/settings-dialog.js +415 -0
  87. package/lib/types/client/settings-dialog.js.map +1 -0
  88. package/lib/types/client/stat-popover.d.ts +10 -0
  89. package/lib/types/client/stat-popover.js +32 -0
  90. package/lib/types/client/stat-popover.js.map +1 -0
  91. package/lib/types/client/styles.d.ts +9 -0
  92. package/lib/types/client/styles.js +221 -0
  93. package/lib/types/client/styles.js.map +1 -0
  94. package/lib/types/client/telemetry.d.ts +11 -0
  95. package/lib/types/client/telemetry.js +24 -0
  96. package/lib/types/client/telemetry.js.map +1 -0
  97. package/lib/types/client/worker-card.d.ts +10 -0
  98. package/lib/types/client/worker-card.js +75 -0
  99. package/lib/types/client/worker-card.js.map +1 -0
  100. package/lib/types/client/worker-model-menu.d.ts +9 -0
  101. package/lib/types/client/worker-model-menu.js +136 -0
  102. package/lib/types/client/worker-model-menu.js.map +1 -0
  103. package/lib/types/client/workers.d.ts +21 -0
  104. package/lib/types/client/workers.js +59 -0
  105. package/lib/types/client/workers.js.map +1 -0
  106. package/lib/types/host/account-identity.d.ts +16 -0
  107. package/lib/types/host/account-identity.js +126 -0
  108. package/lib/types/host/account-identity.js.map +1 -0
  109. package/lib/types/host/account-login.d.ts +10 -0
  110. package/lib/types/host/account-login.js +126 -0
  111. package/lib/types/host/account-login.js.map +1 -0
  112. package/lib/types/host/account-models.d.mts +19 -0
  113. package/lib/types/host/account-models.mjs +259 -0
  114. package/lib/types/host/accounts.d.ts +41 -0
  115. package/lib/types/host/accounts.js +838 -0
  116. package/lib/types/host/accounts.js.map +1 -0
  117. package/lib/types/host/adapters.d.ts +24 -0
  118. package/lib/types/host/adapters.js +331 -0
  119. package/lib/types/host/adapters.js.map +1 -0
  120. package/lib/types/host/agy-context.d.ts +8 -0
  121. package/lib/types/host/agy-context.js +122 -0
  122. package/lib/types/host/agy-context.js.map +1 -0
  123. package/lib/types/host/agy-models.d.ts +4 -0
  124. package/lib/types/host/agy-models.js +37 -0
  125. package/lib/types/host/agy-models.js.map +1 -0
  126. package/lib/types/host/authorized-catalog.d.ts +14 -0
  127. package/lib/types/host/authorized-catalog.js +26 -0
  128. package/lib/types/host/authorized-catalog.js.map +1 -0
  129. package/lib/types/host/bridge-protocol.d.ts +15 -0
  130. package/lib/types/host/bridge-protocol.js +80 -0
  131. package/lib/types/host/bridge-protocol.js.map +1 -0
  132. package/lib/types/host/cli-account-binding.d.ts +32 -0
  133. package/lib/types/host/cli-account-binding.js +502 -0
  134. package/lib/types/host/cli-account-binding.js.map +1 -0
  135. package/lib/types/host/cli-protocol.d.ts +27 -0
  136. package/lib/types/host/cli-protocol.js +212 -0
  137. package/lib/types/host/cli-protocol.js.map +1 -0
  138. package/lib/types/host/codex-account.d.ts +8 -0
  139. package/lib/types/host/codex-account.js +143 -0
  140. package/lib/types/host/codex-account.js.map +1 -0
  141. package/lib/types/host/codex-models.d.ts +6 -0
  142. package/lib/types/host/codex-models.js +165 -0
  143. package/lib/types/host/codex-models.js.map +1 -0
  144. package/lib/types/host/extended-adapters.d.ts +43 -0
  145. package/lib/types/host/extended-adapters.js +205 -0
  146. package/lib/types/host/extended-adapters.js.map +1 -0
  147. package/lib/types/host/first-party-account-context.d.ts +26 -0
  148. package/lib/types/host/first-party-account-context.js +55 -0
  149. package/lib/types/host/first-party-account-context.js.map +1 -0
  150. package/lib/types/host/first-party-models.d.ts +28 -0
  151. package/lib/types/host/first-party-models.js +370 -0
  152. package/lib/types/host/first-party-models.js.map +1 -0
  153. package/lib/types/host/grok-adapter.d.ts +44 -0
  154. package/lib/types/host/grok-adapter.js +293 -0
  155. package/lib/types/host/grok-adapter.js.map +1 -0
  156. package/lib/types/host/grok-models.d.ts +47 -0
  157. package/lib/types/host/grok-models.js +320 -0
  158. package/lib/types/host/grok-models.js.map +1 -0
  159. package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
  160. package/lib/types/host/harness-opencode-accounts.js +80 -0
  161. package/lib/types/host/harness-opencode-accounts.js.map +1 -0
  162. package/lib/types/host/hermes-account-context.d.ts +8 -0
  163. package/lib/types/host/hermes-account-context.js +99 -0
  164. package/lib/types/host/hermes-account-context.js.map +1 -0
  165. package/lib/types/host/hermes-accounts.d.ts +19 -0
  166. package/lib/types/host/hermes-accounts.js +342 -0
  167. package/lib/types/host/hermes-accounts.js.map +1 -0
  168. package/lib/types/host/hermes-adapter.d.ts +90 -0
  169. package/lib/types/host/hermes-adapter.js +446 -0
  170. package/lib/types/host/hermes-adapter.js.map +1 -0
  171. package/lib/types/host/hermes-env.d.ts +4 -0
  172. package/lib/types/host/hermes-env.js +22 -0
  173. package/lib/types/host/hermes-env.js.map +1 -0
  174. package/lib/types/host/hermes-installation.d.ts +10 -0
  175. package/lib/types/host/hermes-installation.js +162 -0
  176. package/lib/types/host/hermes-installation.js.map +1 -0
  177. package/lib/types/host/hermes-models.d.ts +26 -0
  178. package/lib/types/host/hermes-models.js +328 -0
  179. package/lib/types/host/hermes-models.js.map +1 -0
  180. package/lib/types/host/hermes-native-entry.py +61 -0
  181. package/lib/types/host/hermes-nous.d.ts +49 -0
  182. package/lib/types/host/hermes-nous.js +343 -0
  183. package/lib/types/host/hermes-nous.js.map +1 -0
  184. package/lib/types/host/hermes-suppression.d.ts +7 -0
  185. package/lib/types/host/hermes-suppression.js +69 -0
  186. package/lib/types/host/hermes-suppression.js.map +1 -0
  187. package/lib/types/host/index.d.ts +138 -0
  188. package/lib/types/host/index.js +932 -0
  189. package/lib/types/host/index.js.map +1 -0
  190. package/lib/types/host/kimi-accounts.d.ts +15 -0
  191. package/lib/types/host/kimi-accounts.js +218 -0
  192. package/lib/types/host/kimi-accounts.js.map +1 -0
  193. package/lib/types/host/managed-agent.d.ts +4 -0
  194. package/lib/types/host/managed-agent.js +127 -0
  195. package/lib/types/host/managed-agent.js.map +1 -0
  196. package/lib/types/host/mimo-configuration.d.ts +22 -0
  197. package/lib/types/host/mimo-configuration.js +258 -0
  198. package/lib/types/host/mimo-configuration.js.map +1 -0
  199. package/lib/types/host/native-launch.d.mts +2 -0
  200. package/lib/types/host/native-launch.mjs +179 -0
  201. package/lib/types/host/native-process.d.ts +3 -0
  202. package/lib/types/host/native-process.js +26 -0
  203. package/lib/types/host/native-process.js.map +1 -0
  204. package/lib/types/host/opencode-adapter.d.ts +94 -0
  205. package/lib/types/host/opencode-adapter.js +507 -0
  206. package/lib/types/host/opencode-adapter.js.map +1 -0
  207. package/lib/types/host/opencode-native.d.ts +27 -0
  208. package/lib/types/host/opencode-native.js +403 -0
  209. package/lib/types/host/opencode-native.js.map +1 -0
  210. package/lib/types/host/own-account-lease.d.mts +5 -0
  211. package/lib/types/host/own-account-lease.mjs +105 -0
  212. package/lib/types/host/pi-installation.d.mts +7 -0
  213. package/lib/types/host/pi-installation.mjs +63 -0
  214. package/lib/types/host/pi-omp-accounts.d.ts +28 -0
  215. package/lib/types/host/pi-omp-accounts.js +175 -0
  216. package/lib/types/host/pi-omp-accounts.js.map +1 -0
  217. package/lib/types/host/pi-omp-adapter.d.ts +32 -0
  218. package/lib/types/host/pi-omp-adapter.js +176 -0
  219. package/lib/types/host/pi-omp-adapter.js.map +1 -0
  220. package/lib/types/host/pi-omp-environment.d.mts +1 -0
  221. package/lib/types/host/pi-omp-environment.mjs +15 -0
  222. package/lib/types/host/pi-omp-identity.d.ts +2 -0
  223. package/lib/types/host/pi-omp-identity.js +142 -0
  224. package/lib/types/host/pi-omp-identity.js.map +1 -0
  225. package/lib/types/host/pi-omp-logout.d.ts +3 -0
  226. package/lib/types/host/pi-omp-logout.js +152 -0
  227. package/lib/types/host/pi-omp-logout.js.map +1 -0
  228. package/lib/types/host/pi-omp-native.d.ts +71 -0
  229. package/lib/types/host/pi-omp-native.js +753 -0
  230. package/lib/types/host/pi-omp-native.js.map +1 -0
  231. package/lib/types/host/pi-omp-refresh.d.mts +7 -0
  232. package/lib/types/host/pi-omp-refresh.mjs +324 -0
  233. package/lib/types/host/process.d.ts +43 -0
  234. package/lib/types/host/process.js +134 -0
  235. package/lib/types/host/process.js.map +1 -0
  236. package/lib/types/host/protocol.d.ts +23 -0
  237. package/lib/types/host/protocol.js +112 -0
  238. package/lib/types/host/protocol.js.map +1 -0
  239. package/lib/types/host/roles.d.ts +34 -0
  240. package/lib/types/host/roles.js +80 -0
  241. package/lib/types/host/roles.js.map +1 -0
  242. package/lib/types/host/routing.d.ts +31 -0
  243. package/lib/types/host/routing.js +225 -0
  244. package/lib/types/host/routing.js.map +1 -0
  245. package/lib/types/host/runtime.d.ts +60 -0
  246. package/lib/types/host/runtime.js +586 -0
  247. package/lib/types/host/runtime.js.map +1 -0
  248. package/lib/types/host/storage.d.ts +48 -0
  249. package/lib/types/host/storage.js +449 -0
  250. package/lib/types/host/storage.js.map +1 -0
  251. package/lib/types/host/telemetry.d.ts +17 -0
  252. package/lib/types/host/telemetry.js +158 -0
  253. package/lib/types/host/telemetry.js.map +1 -0
  254. package/lib/types/host/zcode-account-models.d.ts +16 -0
  255. package/lib/types/host/zcode-account-models.js +114 -0
  256. package/lib/types/host/zcode-account-models.js.map +1 -0
  257. package/lib/types/host/zcode-adapter.d.ts +93 -0
  258. package/lib/types/host/zcode-adapter.js +804 -0
  259. package/lib/types/host/zcode-adapter.js.map +1 -0
  260. package/lib/types/host/zcode-grok-accounts.d.ts +28 -0
  261. package/lib/types/host/zcode-grok-accounts.js +359 -0
  262. package/lib/types/host/zcode-grok-accounts.js.map +1 -0
  263. package/lib/types/shared/accounts.d.ts +43 -0
  264. package/lib/types/shared/accounts.js +2 -0
  265. package/lib/types/shared/accounts.js.map +1 -0
  266. package/lib/types/shared/builtin-presets.d.ts +2 -0
  267. package/lib/types/shared/builtin-presets.js +231 -0
  268. package/lib/types/shared/builtin-presets.js.map +1 -0
  269. package/lib/types/shared/cli-settings.d.ts +5 -0
  270. package/lib/types/shared/cli-settings.js +2 -0
  271. package/lib/types/shared/cli-settings.js.map +1 -0
  272. package/lib/types/shared/model-presentation.d.ts +10 -0
  273. package/lib/types/shared/model-presentation.js +95 -0
  274. package/lib/types/shared/model-presentation.js.map +1 -0
  275. package/lib/types/shared/models.d.ts +7 -0
  276. package/lib/types/shared/models.js +35 -0
  277. package/lib/types/shared/models.js.map +1 -0
  278. package/lib/types/shared/telemetry.d.ts +18 -0
  279. package/lib/types/shared/telemetry.js +16 -0
  280. package/lib/types/shared/telemetry.js.map +1 -0
  281. package/lib/types/shared/types.d.ts +127 -0
  282. package/lib/types/shared/types.js +147 -0
  283. package/lib/types/shared/types.js.map +1 -0
  284. package/lib/zcode-resume.mjs +423 -0
  285. package/package.json +109 -4
@@ -0,0 +1,162 @@
1
+ import { constants } from 'node:fs';
2
+ import { access, open, realpath } from 'node:fs/promises';
3
+ import { createHash } from 'node:crypto';
4
+ import { dirname, join, sep } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { nativeLaunchArgv } from './native-launch.mjs';
7
+ export class HermesExecutableError extends Error {
8
+ }
9
+ export function hermesCommandInstallationHome(argv) {
10
+ return argv[2] === fileURLToPath(new URL('./hermes-native-entry.py', import.meta.url)) && argv[4]
11
+ ? dirname(dirname(dirname(argv[4])))
12
+ : undefined;
13
+ }
14
+ /** Reuse the current official checkout's committed dependency environment, not a
15
+ * directory selected by recency/hash guessing. A clean account home must not run
16
+ * the installer's borrowed-home sync. Older/self-contained entries retain their
17
+ * native launcher contract. The child rechecks this selection under its native lock. */
18
+ export async function hermesNativeCommand(executable, args, signal) {
19
+ // The official Windows distlib exe selects the recorded store Python itself.
20
+ // Its fixed fallback cmd is decoded as data, never interpreted by cmd.exe.
21
+ // Keep bootstrap and update/lease behavior owned by the installed CLI.
22
+ if (process.platform === 'win32') {
23
+ signal?.throwIfAborted();
24
+ const command = nativeLaunchArgv([executable, ...args]);
25
+ await access(command[0], constants.R_OK);
26
+ return command;
27
+ }
28
+ let current = executable;
29
+ const read = async (path, limit) => {
30
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
31
+ try {
32
+ const info = await file.stat();
33
+ if (!info.isFile() || info.nlink !== 1 || info.size > limit)
34
+ throw new Error('Unsafe Hermes installation record');
35
+ const result = await file.readFile('utf8');
36
+ if (Buffer.byteLength(result) > limit)
37
+ throw new Error('Oversized Hermes installation record');
38
+ signal?.throwIfAborted();
39
+ return result;
40
+ }
41
+ finally {
42
+ await file.close();
43
+ }
44
+ };
45
+ for (let depth = 0; depth < 4; depth++) {
46
+ signal?.throwIfAborted();
47
+ let path, source;
48
+ try {
49
+ path = await realpath(current);
50
+ source = await read(path, 128 * 1024);
51
+ }
52
+ catch (error) {
53
+ signal?.throwIfAborted();
54
+ if (error.code === 'ENOENT')
55
+ return [executable, ...args];
56
+ throw new HermesExecutableError('启动入口不可用,请修复安装');
57
+ }
58
+ const shim = /^#![^\r\n]*\b(?:sh|bash|zsh)\s*\r?\n\s*exec\s+(?:"(\/[^"\r\n$`]+)"|(\/[^\s$`"'\\;|&<>]+))\s+"\$@"\s*$/.exec(source);
59
+ if (shim) {
60
+ current = shim[1] ?? shim[2];
61
+ continue;
62
+ }
63
+ if (!path.endsWith(`${sep}.hermes${sep}bin${sep}hermes`) || !source.includes('hermes_bootstrap'))
64
+ return [executable, ...args];
65
+ const checkout = dirname(dirname(dirname(path)));
66
+ if (!source.includes(checkout))
67
+ throw new HermesExecutableError('Hermes 安装入口与源码不匹配');
68
+ const owner = dirname(checkout), key = createHash('sha256').update(checkout).digest('hex').slice(0, 16);
69
+ const install = join(owner, 'installs', key), facts = join(install, 'facts.json');
70
+ try {
71
+ const data = JSON.parse(await read(facts, 4 * 1024 * 1024));
72
+ const environment = data?.packages?.venv?.environment;
73
+ if (typeof environment !== 'string' ||
74
+ !environment.startsWith(join(install, 'environments') + sep) ||
75
+ (await realpath(environment)) !== environment)
76
+ throw new Error('Invalid Hermes dependency selection');
77
+ await read(join(environment, 'pyvenv.cfg'), 64 * 1024);
78
+ await access(join(environment, 'bin/python'), constants.X_OK);
79
+ for (const file of ['hermes_bootstrap.py', 'hermes_cli/main.py', 'pm/environments.py'])
80
+ await access(join(checkout, file), constants.R_OK);
81
+ return [
82
+ join(environment, 'bin/python'),
83
+ '-I',
84
+ fileURLToPath(new URL('./hermes-native-entry.py', import.meta.url)),
85
+ checkout,
86
+ facts,
87
+ environment,
88
+ ...args,
89
+ ];
90
+ }
91
+ catch {
92
+ signal?.throwIfAborted();
93
+ throw new HermesExecutableError('Hermes 当前安装依赖不可用,请在原生终端修复安装');
94
+ }
95
+ }
96
+ throw new HermesExecutableError('启动脚本异常,请修复安装');
97
+ }
98
+ /** Inspect the installed fixed exec shim without invoking its installer or auth UI. */
99
+ export async function verifyHermesExecutable(executable, signal) {
100
+ signal.throwIfAborted();
101
+ if (process.platform === 'win32') {
102
+ try {
103
+ const command = nativeLaunchArgv([executable]);
104
+ await access(command[0], constants.R_OK);
105
+ if (!(await open(command[0], 'r').then(async (file) => {
106
+ try {
107
+ return (await file.stat()).isFile();
108
+ }
109
+ finally {
110
+ await file.close();
111
+ }
112
+ })))
113
+ throw new Error('Invalid Hermes entry');
114
+ signal.throwIfAborted();
115
+ return;
116
+ }
117
+ catch {
118
+ signal.throwIfAborted();
119
+ throw new HermesExecutableError('启动入口不可用,请修复安装');
120
+ }
121
+ }
122
+ let current = executable;
123
+ for (let depth = 0; depth < 4; depth++) {
124
+ let file;
125
+ try {
126
+ await access(current, constants.X_OK);
127
+ // Official per-user launchers may themselves be symbolic links.
128
+ file = await open(await realpath(current), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
129
+ const info = await file.stat();
130
+ if (!info.isFile())
131
+ throw new Error('Invalid Hermes entry');
132
+ if (info.size > 16 * 1024)
133
+ return;
134
+ const bytes = Buffer.alloc(16 * 1024 + 1);
135
+ let source;
136
+ try {
137
+ const { bytesRead } = await file.read(bytes, 0, bytes.length, 0);
138
+ const after = await file.stat();
139
+ if (bytesRead !== info.size || after.size !== info.size || after.mtimeMs !== info.mtimeMs)
140
+ throw new Error('Hermes entry changed during inspection');
141
+ source = bytes.subarray(0, bytesRead).toString('utf8');
142
+ }
143
+ finally {
144
+ bytes.fill(0);
145
+ }
146
+ signal.throwIfAborted();
147
+ const shim = /^#![^\r\n]*\b(?:sh|bash|zsh)\s*\r?\n\s*exec\s+(?:"(\/[^"\r\n$`]+)"|(\/[^\s$`"'\\;|&<>]+))\s+"\$@"\s*$/.exec(source);
148
+ if (!shim)
149
+ return;
150
+ current = shim[1] ?? shim[2];
151
+ }
152
+ catch {
153
+ signal.throwIfAborted();
154
+ throw new HermesExecutableError('启动入口不可用,请修复安装');
155
+ }
156
+ finally {
157
+ await file?.close();
158
+ }
159
+ }
160
+ throw new HermesExecutableError('启动脚本异常,请修复安装');
161
+ }
162
+ //# sourceMappingURL=hermes-installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-installation.js","sourceRoot":"","sources":["../../../src/host/hermes-installation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type AccountModelScope } from './account-models.mjs';
2
+ /** Native PooledCredential fields; a successful catalog cannot erase a native
3
+ * dead account, active exhaustion window or model-specific entitlement bench. */
4
+ export declare function hermesPoolEntryUnavailable(entry: Record<string, any>, model?: string): boolean;
5
+ /** Internal source material; callers must never publish or log the returned values. */
6
+ export declare function readHermesAccountMaterial(home: string, signal?: AbortSignal): Promise<{
7
+ config: Record<string, any>;
8
+ auth: Record<string, any>;
9
+ env: Record<string, string>;
10
+ sourceIds: string[];
11
+ }>;
12
+ /** Native own stores only; never accept a broad manual:* prefix. */
13
+ export declare function assertHermesOwnAccounts(home: string, signal?: AbortSignal): Promise<{
14
+ config: Record<string, any>;
15
+ auth: Record<string, any>;
16
+ env: Record<string, string>;
17
+ sourceIds: string[];
18
+ }>;
19
+ /** Current selected-provider account scope. Unknown provider/auth schemas fail closed.
20
+ * Route precedence follows Hermes runtime_provider_backends / credential_pool;
21
+ * only the canonical OpenRouter route and native Codex OAuth store are supported
22
+ * without an explicit endpoint. Ambiguous mirrors/custom pools are not guessed. */
23
+ export declare function hermesAccountModels(home: string, provider: string, options?: {
24
+ signal?: AbortSignal;
25
+ fetch?: typeof fetch;
26
+ }): Promise<AccountModelScope>;
@@ -0,0 +1,328 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, open } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { parse } from 'yaml';
5
+ import { parseHermesOwnEnvironment } from "./hermes-env.js";
6
+ import { hermesUnsuppressedEnvironment, projectHermesUnsuppressedAuth } from "./hermes-suppression.js";
7
+ import { beginHermesNousCapabilities, fetchHermesNousModels, forgetHermesNousCapabilities, HermesNousError, selectHermesNousSource, } from "./hermes-nous.js";
8
+ import { probeAccountModels } from './account-models.mjs';
9
+ const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
10
+ const literal = (value) => typeof value === 'string' &&
11
+ !!value.trim() &&
12
+ !/[\x00-\x1f]/.test(value) &&
13
+ !/^(?:op:\/\/|!|\$|<|your[_ -]|placeholder|changeme)/i.test(value.trim());
14
+ const unknown = () => ({ state: 'unknown', source: 'unknown', models: [] });
15
+ /** Native PooledCredential fields; a successful catalog cannot erase a native
16
+ * dead account, active exhaustion window or model-specific entitlement bench. */
17
+ export function hermesPoolEntryUnavailable(entry, model) {
18
+ if (entry.disabled === true || entry.status === 'exhausted' || entry.last_status === 'dead')
19
+ return true;
20
+ if (entry.last_status === 'exhausted') {
21
+ const until = Number(entry.last_error_reset_at);
22
+ if (!Number.isFinite(until) || until <= 0 || until > Date.now() / 1000)
23
+ return true;
24
+ }
25
+ const cooldowns = object(entry.model_cooldowns) ? entry.model_cooldowns : {};
26
+ const values = model ? [cooldowns[model]] : Object.values(cooldowns);
27
+ return values.some((until) => typeof until === 'number' && until > Date.now() / 1000);
28
+ }
29
+ /** Private source reads only. Do not execute secret commands, expand arbitrary env,
30
+ * refresh OAuth, print native config, or import Hermes' side-effectful runtime. */
31
+ async function read(path, signal) {
32
+ signal?.throwIfAborted();
33
+ let handle;
34
+ try {
35
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
36
+ const info = await handle.stat();
37
+ if (!info.isFile() || info.nlink !== 1 || info.size > 1024 * 1024)
38
+ throw new Error('Unsafe metadata');
39
+ const buffer = Buffer.alloc(info.size + 1);
40
+ try {
41
+ let length = 0;
42
+ while (length < buffer.length) {
43
+ signal?.throwIfAborted();
44
+ const { bytesRead } = await handle.read(buffer, length, buffer.length - length, length);
45
+ if (!bytesRead)
46
+ break;
47
+ length += bytesRead;
48
+ }
49
+ if (length > info.size)
50
+ throw new Error('Metadata changed');
51
+ return buffer.subarray(0, length).toString('utf8');
52
+ }
53
+ finally {
54
+ buffer.fill(0);
55
+ }
56
+ }
57
+ catch (error) {
58
+ if (error.code === 'ENOENT')
59
+ return;
60
+ signal?.throwIfAborted();
61
+ throw new Error('Hermes 账号配置无法安全读取,请在原生登录设置中检查');
62
+ }
63
+ finally {
64
+ await handle?.close();
65
+ }
66
+ }
67
+ function dotenv(text) {
68
+ return parseHermesOwnEnvironment(text);
69
+ }
70
+ /** Internal source material; callers must never publish or log the returned values. */
71
+ export async function readHermesAccountMaterial(home, signal) {
72
+ const config = parse((await read(join(home, 'config.yaml'), signal)) ?? '');
73
+ const auth = JSON.parse((await read(join(home, 'auth.json'), signal)) ?? '{}');
74
+ const env = dotenv((await read(join(home, '.env'), signal)) ?? '');
75
+ if (!object(config) || !object(auth))
76
+ throw new Error('Hermes 账号配置无效');
77
+ return { config, auth, env, sourceIds: [home] };
78
+ }
79
+ /** Exact native source/provider pairs from auth_commands and credential_pool.
80
+ * In particular manual:qwen_cli is still a foreign login, not a Hermes OAuth flow. */
81
+ function ownPoolSource(provider, entry, material) {
82
+ const source = entry.source;
83
+ if ((!source || source === 'manual' || source === 'config') && entry.auth_type === 'api_key')
84
+ return true;
85
+ if (typeof source !== 'string')
86
+ return false;
87
+ if (source.startsWith('env:'))
88
+ return literal(material.env[source.slice(4)]);
89
+ const ownOAuth = {
90
+ anthropic: ['manual:hermes_pkce', 'hermes_pkce'],
91
+ 'openai-codex': ['manual:device_code', 'manual:loopback_pkce', 'device_code'],
92
+ 'xai-oauth': ['manual:device_code', 'device_code'],
93
+ 'minimax-oauth': ['manual:minimax_oauth', 'oauth'],
94
+ nous: ['manual:device_code', 'device_code'],
95
+ };
96
+ if (entry.auth_type === 'oauth' && ownOAuth[provider]?.includes(source))
97
+ return true;
98
+ return provider === 'openrouter' && entry.auth_type === 'api_key' && source === 'manual:openrouter_pkce';
99
+ }
100
+ /** Native own stores only; never accept a broad manual:* prefix. */
101
+ export async function assertHermesOwnAccounts(home, signal) {
102
+ const material = await readHermesAccountMaterial(home, signal);
103
+ try {
104
+ await lstat(join(home, '.cliworker-managed'));
105
+ throw new Error('Hermes 插件账号不能使用额外的托管配置');
106
+ }
107
+ catch (error) {
108
+ if (error.code !== 'ENOENT')
109
+ throw error;
110
+ }
111
+ try {
112
+ await lstat(join(home, '.op.env'));
113
+ throw new Error('Hermes 请使用自身 .env,暂不支持外部密码库配置');
114
+ }
115
+ catch (error) {
116
+ if (error.code !== 'ENOENT')
117
+ throw error;
118
+ }
119
+ if (Object.values(material.env).some((value) => /^(?:op:\/\/|!|\$\{|__BITWARDEN_MANAGED__)/.test(value)))
120
+ throw new Error('Hermes 请使用自身 API 配置,暂不支持外部密码库引用');
121
+ if (material.config.auth?.adopt_external_logins !== false)
122
+ throw new Error('请先关闭 Hermes 的 auth.adopt_external_logins');
123
+ if (material.config.model?.openai_runtime === 'codex_app_server' ||
124
+ material.config.model?.api_mode === 'codex_app_server')
125
+ throw new Error('Hermes 当前使用外部 Codex 登录,请改用自身账号');
126
+ // Native dotenv has override=True. Selector assignments would invalidate the
127
+ // account source selected by the Host, even when no API-key value is inherited.
128
+ for (const [provider, entries] of Object.entries(material.auth.credential_pool ?? {})) {
129
+ if (!Array.isArray(entries))
130
+ throw new Error('Hermes 账号来源无法确认');
131
+ for (const entry of entries) {
132
+ if (!object(entry))
133
+ throw new Error('Hermes 账号来源无法确认');
134
+ if (!ownPoolSource(provider, entry, material))
135
+ throw new Error('Hermes 含外部账号来源,请使用自身登录');
136
+ }
137
+ }
138
+ return material;
139
+ }
140
+ /** Current selected-provider account scope. Unknown provider/auth schemas fail closed.
141
+ * Route precedence follows Hermes runtime_provider_backends / credential_pool;
142
+ * only the canonical OpenRouter route and native Codex OAuth store are supported
143
+ * without an explicit endpoint. Ambiguous mirrors/custom pools are not guessed. */
144
+ export async function hermesAccountModels(home, provider, options = {}) {
145
+ try {
146
+ const currentMaterial = async () => {
147
+ const raw = await assertHermesOwnAccounts(home, options.signal);
148
+ return {
149
+ ...raw,
150
+ auth: projectHermesUnsuppressedAuth(raw.auth),
151
+ env: hermesUnsuppressedEnvironment(raw.auth, raw.env, provider),
152
+ };
153
+ };
154
+ const material = await currentMaterial();
155
+ const { config, auth, env } = material;
156
+ if (!object(config) || !object(config.model) || config.model.provider !== provider)
157
+ return unknown();
158
+ if (config.providers?.[provider]?.enabled === false)
159
+ return unknown();
160
+ const cfg = config.model;
161
+ if (!object(auth))
162
+ return unknown();
163
+ // Extra headers, command secrets, endpoint overrides and unknown pool routes
164
+ // cannot be reconstructed faithfully from a public model catalog.
165
+ if (cfg.extra_headers && Object.keys(cfg.extra_headers).length)
166
+ return unknown();
167
+ const inputs = [];
168
+ if (provider === 'nous') {
169
+ const source = selectHermesNousSource(material);
170
+ const generation = beginHermesNousCapabilities(home, source);
171
+ try {
172
+ const result = await fetchHermesNousModels(home, source, options, generation);
173
+ options.signal?.throwIfAborted();
174
+ const current = selectHermesNousSource(await currentMaterial());
175
+ // A query never authorizes a credential that appeared while it was in flight.
176
+ // Stable task bindings intentionally ignore ordinary token rotation separately.
177
+ if (current.agentKey !== source.agentKey ||
178
+ JSON.stringify(current.principal) !== JSON.stringify(source.principal) ||
179
+ JSON.stringify(current.route) !== JSON.stringify(source.route) ||
180
+ JSON.stringify(current.modelCooldowns) !== JSON.stringify(source.modelCooldowns))
181
+ throw new HermesNousError('Nous 账号已变化,请重新刷新模型');
182
+ return result;
183
+ }
184
+ catch (error) {
185
+ forgetHermesNousCapabilities(home, source, generation);
186
+ throw error;
187
+ }
188
+ }
189
+ else if (provider === 'openai-codex') {
190
+ // This transport authenticates via a separate Codex app-server session;
191
+ // Hermes' OAuth store cannot prove that other account's model scope.
192
+ if (cfg.openai_runtime === 'codex_app_server' || cfg.api_mode === 'codex_app_server')
193
+ return unknown();
194
+ if (env.HERMES_CODEX_BASE_URL &&
195
+ env.HERMES_CODEX_BASE_URL.replace(/\/+$/, '') !== 'https://chatgpt.com/backend-api')
196
+ return unknown();
197
+ if (cfg.base_url && cfg.base_url.replace(/\/+$/, '') !== 'https://chatgpt.com/backend-api')
198
+ return unknown();
199
+ const state = auth.providers?.[provider], tokens = state?.tokens;
200
+ if (state?.auth_mode !== 'chatgpt' || !literal(tokens?.access_token))
201
+ return unknown();
202
+ // Native load_pool seeds this exact singleton as device_code. Additional
203
+ // accounts require their own proven scope, so do not authorize them via it.
204
+ const pool = auth.credential_pool?.[provider] ?? [];
205
+ if (!Array.isArray(pool) ||
206
+ pool.some((entry) => !object(entry) ||
207
+ entry.source !== 'device_code' ||
208
+ entry.auth_type !== 'oauth' ||
209
+ hermesPoolEntryUnavailable(entry, cfg.default) ||
210
+ entry.access_token !== tokens.access_token ||
211
+ (entry.base_url && entry.base_url.replace(/\/+$/, '') !== 'https://chatgpt.com/backend-api')))
212
+ return unknown();
213
+ let expiry = typeof tokens.expires_at === 'number' ? tokens.expires_at : Date.parse(tokens.expires_at);
214
+ if (!Number.isFinite(expiry)) {
215
+ // Hermes' native Codex store uses the access JWT exp claim.
216
+ try {
217
+ expiry = JSON.parse(Buffer.from(tokens.access_token.split('.')[1] ?? '', 'base64url').toString()).exp;
218
+ }
219
+ catch {
220
+ return unknown();
221
+ }
222
+ }
223
+ inputs.push({
224
+ provider,
225
+ credential: {
226
+ type: 'oauth',
227
+ access: tokens.access_token,
228
+ expires: expiry < 1e12 ? expiry * 1000 : expiry,
229
+ accountId: tokens.account_id,
230
+ },
231
+ });
232
+ }
233
+ else if (provider === 'openrouter') {
234
+ const canonical = 'https://openrouter.ai/api/v1';
235
+ if ([cfg.base_url, env.OPENROUTER_BASE_URL, env.CUSTOM_BASE_URL].some((url) => url && (typeof url !== 'string' || url.replace(/\/+$/, '') !== canonical)) ||
236
+ env.OPENAI_BASE_URL)
237
+ return unknown();
238
+ const pool = auth.credential_pool?.openrouter;
239
+ const keys = new Set();
240
+ const envNames = new Set(['OPENROUTER_API_KEY']);
241
+ for (const name of Object.keys(env))
242
+ if (/^OPENROUTER_API_KEY_\d+$/.test(name))
243
+ envNames.add(name);
244
+ if (Array.isArray(pool) && pool.length) {
245
+ if (pool.length > 8)
246
+ return unknown();
247
+ // Native pool selection may rotate. Every potential credential must support
248
+ // the choice. Do not expose exhausted/expired/unknown entries via another key.
249
+ for (const entry of pool) {
250
+ if (!object(entry) ||
251
+ entry.auth_type !== 'api_key' ||
252
+ hermesPoolEntryUnavailable(entry, cfg.default) ||
253
+ (entry.base_url && entry.base_url.replace(/\/+$/, '') !== canonical))
254
+ return unknown();
255
+ if (typeof entry.source === 'string' && entry.source.startsWith('env:')) {
256
+ const name = entry.source.slice(4);
257
+ if (!/^[A-Z][A-Z0-9_]*$/.test(name) || !literal(env[name]))
258
+ return unknown();
259
+ envNames.add(name);
260
+ continue;
261
+ }
262
+ if (!ownPoolSource(provider, entry, { config, auth, env, sourceIds: [home] }))
263
+ return unknown();
264
+ const key = entry.runtime_api_key || entry.access_token;
265
+ if (!literal(key))
266
+ return unknown();
267
+ keys.add(key);
268
+ }
269
+ }
270
+ // Native pool loader seeds numbered environment keys and rehydrates env:
271
+ // rows on each load. A saved token cannot override its current env source.
272
+ for (const name of envNames)
273
+ if (env[name]) {
274
+ if (!literal(env[name]) || env[name].includes('${'))
275
+ return unknown();
276
+ keys.add(env[name]);
277
+ }
278
+ if (!keys.size || keys.size > 8)
279
+ return unknown();
280
+ for (const key of keys)
281
+ inputs.push({ provider, baseUrl: canonical, credential: { type: 'api', key } });
282
+ }
283
+ else {
284
+ // Do not fabricate endpoint/key mappings for arbitrary provider plugins.
285
+ return unknown();
286
+ }
287
+ const scopes = [];
288
+ const deadline = AbortSignal.timeout(15000);
289
+ const probeOptions = {
290
+ ...options,
291
+ signal: options.signal ? AbortSignal.any([options.signal, deadline]) : deadline,
292
+ };
293
+ for (const input of inputs) {
294
+ options.signal?.throwIfAborted();
295
+ const scope = await probeAccountModels(input, probeOptions);
296
+ options.signal?.throwIfAborted();
297
+ if (scope.state !== 'supported')
298
+ return scope;
299
+ scopes.push(scope);
300
+ }
301
+ if (!scopes.length)
302
+ return unknown();
303
+ return {
304
+ state: 'supported',
305
+ source: 'account-models',
306
+ models: scopes[0].models.flatMap((model) => {
307
+ const matches = scopes.map((scope) => scope.models.find((candidate) => candidate.id === model.id));
308
+ // Native setup selected this model; public/account catalogs may also contain
309
+ // embeddings or other endpoints that Hermes chat cannot execute.
310
+ if (model.id !== cfg.default || matches.some((match) => !match))
311
+ return [];
312
+ const cost = matches.every((match) => match.cost === 'free')
313
+ ? 'free'
314
+ : matches.every((match) => match.cost === 'paid')
315
+ ? 'paid'
316
+ : 'unknown';
317
+ return [{ ...model, cost }];
318
+ }),
319
+ };
320
+ }
321
+ catch (error) {
322
+ options.signal?.throwIfAborted();
323
+ if (error instanceof HermesNousError)
324
+ throw error;
325
+ return unknown();
326
+ }
327
+ }
328
+ //# sourceMappingURL=hermes-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-models.js","sourceRoot":"","sources":["../../../src/host/hermes-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ """Use a verified current native venv with a separate account home, without installing.
2
+
3
+ The official launcher, checkout-derived install key and committed facts are checked by
4
+ Host. Recheck facts under the same install lock, then use Hermes' own generation lease.
5
+ No account/config content is copied, imported from another home, or printed here.
6
+ """
7
+ import fcntl
8
+ import json
9
+ import os
10
+ from pathlib import Path
11
+ import stat
12
+ import sys
13
+
14
+ checkout, facts, environment = map(Path, sys.argv[1:4])
15
+ arguments = sys.argv[4:]
16
+ if any(path.resolve() != path for path in (checkout, facts, environment)):
17
+ raise SystemExit("Hermes installation changed; reopen login settings")
18
+
19
+ def selected():
20
+ fd = os.open(facts, os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK)
21
+ with os.fdopen(fd) as stream:
22
+ info = os.fstat(stream.fileno())
23
+ if not stat.S_ISREG(info.st_mode) or info.st_nlink != 1 or info.st_size > 4 * 1024 * 1024:
24
+ raise RuntimeError("Invalid Hermes installation record")
25
+ return json.load(stream).get("packages", {}).get("venv", {}).get("environment") == str(environment)
26
+
27
+ release = None
28
+ try:
29
+ with open(facts.parent / ".install.lock", "a+b") as lock:
30
+ fcntl.flock(lock.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
31
+ if not selected():
32
+ raise RuntimeError("Hermes installation changed; reopen login settings")
33
+ sys.path.insert(0, str(checkout))
34
+ from hermes_cli.runtime_state import lease_generation
35
+ release = lease_generation(environment)
36
+ os.environ["HERMES_DISABLE_LAZY_INSTALLS"] = "1"
37
+ os.environ.pop("PYTHONHOME", None)
38
+ os.environ.pop("PYTHONPATH", None)
39
+ os.environ.pop("VIRTUAL_ENV", None)
40
+ sys.argv = [str(checkout / "hermes_cli/main.py"), *arguments]
41
+ # The native API exposes these boundaries, but main/run_agent pass the
42
+ # checkout's .env as a fallback. Pin its own home and disable that fallback
43
+ # and secret-manager hydration before either module imports the function.
44
+ # No parser or provider/login flow is replaced.
45
+ account_home = Path(os.environ["HERMES_HOME"])
46
+ if (account_home / ".cliworker-managed").exists() or (account_home / ".op.env").exists():
47
+ raise RuntimeError("Hermes plugin login cannot use additional account configuration layers")
48
+ from hermes_cli import env_loader
49
+ native_dotenv = env_loader.load_hermes_dotenv
50
+ def own_dotenv(**_options):
51
+ if (account_home / ".cliworker-managed").exists():
52
+ raise RuntimeError("Hermes plugin login cannot use an additional managed configuration")
53
+ if (account_home / ".op.env").exists():
54
+ raise RuntimeError("Hermes plugin login supports its own .env; external secret stores are unavailable")
55
+ return native_dotenv(hermes_home=account_home, project_env=None, load_external_secrets=False)
56
+ env_loader.load_hermes_dotenv = own_dotenv
57
+ from hermes_cli.main import main
58
+ raise SystemExit(main())
59
+ finally:
60
+ if release is not None:
61
+ release()