dsh-cliworker-now 0.7.6 → 0.7.8

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 (181) hide show
  1. package/README.en.md +53 -11
  2. package/README.md +56 -11
  3. package/lib/account-models.mjs +49 -18
  4. package/lib/client.js +1221 -151
  5. package/lib/client.js.map +1 -1
  6. package/lib/grok-catalog.mjs +2 -2
  7. package/lib/hermes-native-entry.py +48 -13
  8. package/lib/hermes-nous-refresh.py +331 -0
  9. package/lib/index.js +9469 -6030
  10. package/lib/index.js.map +1 -1
  11. package/lib/native-launch.mjs +62 -7
  12. package/lib/native-spawn.mjs +32 -0
  13. package/lib/pi-installation.mjs +27 -3
  14. package/lib/pi-native-catalog.mjs +17 -7
  15. package/lib/pi-omp-bridge.mjs +2 -2
  16. package/lib/pi-omp-refresh.mjs +3 -3
  17. package/lib/private-launch.mjs +6 -2
  18. package/lib/terminal-bridge.mjs +2 -2
  19. package/lib/typert.host.js +265 -25
  20. package/lib/typert.remote-client.d.ts +8 -0
  21. package/lib/typert.remote-client.d.ts.map +1 -1
  22. package/lib/typert.remote-client.js +241 -25
  23. package/lib/types/client/account-query-queue.d.ts +16 -0
  24. package/lib/types/client/account-query-queue.js +61 -0
  25. package/lib/types/client/account-query-queue.js.map +1 -0
  26. package/lib/types/client/account-terminal.d.ts +6 -2
  27. package/lib/types/client/account-terminal.js +260 -31
  28. package/lib/types/client/account-terminal.js.map +1 -1
  29. package/lib/types/client/cli-executable-settings.d.ts +13 -0
  30. package/lib/types/client/cli-executable-settings.js +128 -0
  31. package/lib/types/client/cli-executable-settings.js.map +1 -0
  32. package/lib/types/client/management-styles.d.ts +1 -1
  33. package/lib/types/client/management-styles.js +4 -0
  34. package/lib/types/client/management-styles.js.map +1 -1
  35. package/lib/types/client/settings-dialog.js +196 -80
  36. package/lib/types/client/settings-dialog.js.map +1 -1
  37. package/lib/types/client/styles.d.ts +1 -1
  38. package/lib/types/client/styles.js +18 -16
  39. package/lib/types/client/styles.js.map +1 -1
  40. package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
  41. package/lib/types/client/zcode-login-link-provider.js +105 -0
  42. package/lib/types/client/zcode-login-link-provider.js.map +1 -0
  43. package/lib/types/client/zcode-login-link.d.ts +16 -0
  44. package/lib/types/client/zcode-login-link.js +194 -0
  45. package/lib/types/client/zcode-login-link.js.map +1 -0
  46. package/lib/types/host/account-models.d.mts +10 -2
  47. package/lib/types/host/account-models.mjs +49 -18
  48. package/lib/types/host/accounts.d.ts +3 -2
  49. package/lib/types/host/accounts.js +168 -29
  50. package/lib/types/host/accounts.js.map +1 -1
  51. package/lib/types/host/adapters.d.ts +3 -1
  52. package/lib/types/host/adapters.js +138 -11
  53. package/lib/types/host/adapters.js.map +1 -1
  54. package/lib/types/host/agy-background-environment.d.ts +2 -0
  55. package/lib/types/host/agy-background-environment.js +7 -0
  56. package/lib/types/host/agy-background-environment.js.map +1 -0
  57. package/lib/types/host/agy-models.d.ts +2 -1
  58. package/lib/types/host/agy-models.js +6 -6
  59. package/lib/types/host/agy-models.js.map +1 -1
  60. package/lib/types/host/agy-windows-account.d.ts +14 -0
  61. package/lib/types/host/agy-windows-account.js +104 -0
  62. package/lib/types/host/agy-windows-account.js.map +1 -0
  63. package/lib/types/host/authorized-catalog.js +13 -4
  64. package/lib/types/host/authorized-catalog.js.map +1 -1
  65. package/lib/types/host/claude-native-oauth.d.ts +17 -0
  66. package/lib/types/host/claude-native-oauth.js +274 -0
  67. package/lib/types/host/claude-native-oauth.js.map +1 -0
  68. package/lib/types/host/claude-own-route.d.ts +45 -0
  69. package/lib/types/host/claude-own-route.js +375 -0
  70. package/lib/types/host/claude-own-route.js.map +1 -0
  71. package/lib/types/host/cli-account-binding.d.ts +2 -1
  72. package/lib/types/host/cli-account-binding.js +64 -21
  73. package/lib/types/host/cli-account-binding.js.map +1 -1
  74. package/lib/types/host/cli-executable-paths.d.ts +30 -0
  75. package/lib/types/host/cli-executable-paths.js +272 -0
  76. package/lib/types/host/cli-executable-paths.js.map +1 -0
  77. package/lib/types/host/codex-models.d.ts +3 -1
  78. package/lib/types/host/codex-models.js +41 -4
  79. package/lib/types/host/codex-models.js.map +1 -1
  80. package/lib/types/host/extended-adapters.d.ts +3 -2
  81. package/lib/types/host/extended-adapters.js +9 -7
  82. package/lib/types/host/extended-adapters.js.map +1 -1
  83. package/lib/types/host/first-party-models.d.ts +5 -0
  84. package/lib/types/host/first-party-models.js +173 -50
  85. package/lib/types/host/first-party-models.js.map +1 -1
  86. package/lib/types/host/hermes-accounts.js +68 -9
  87. package/lib/types/host/hermes-accounts.js.map +1 -1
  88. package/lib/types/host/hermes-adapter.d.ts +3 -0
  89. package/lib/types/host/hermes-adapter.js +13 -4
  90. package/lib/types/host/hermes-adapter.js.map +1 -1
  91. package/lib/types/host/hermes-installation.js +54 -35
  92. package/lib/types/host/hermes-installation.js.map +1 -1
  93. package/lib/types/host/hermes-models.js +21 -2
  94. package/lib/types/host/hermes-models.js.map +1 -1
  95. package/lib/types/host/hermes-native-entry.py +48 -13
  96. package/lib/types/host/hermes-nous-refresh.py +331 -0
  97. package/lib/types/host/hermes-nous.d.ts +5 -1
  98. package/lib/types/host/hermes-nous.js +5 -5
  99. package/lib/types/host/hermes-nous.js.map +1 -1
  100. package/lib/types/host/hermes-renewal.d.ts +27 -0
  101. package/lib/types/host/hermes-renewal.js +292 -0
  102. package/lib/types/host/hermes-renewal.js.map +1 -0
  103. package/lib/types/host/hermes-windows-installation.d.ts +5 -0
  104. package/lib/types/host/hermes-windows-installation.js +91 -0
  105. package/lib/types/host/hermes-windows-installation.js.map +1 -0
  106. package/lib/types/host/index.d.ts +12 -0
  107. package/lib/types/host/index.js +138 -8
  108. package/lib/types/host/index.js.map +1 -1
  109. package/lib/types/host/kimi-accounts.d.ts +2 -0
  110. package/lib/types/host/kimi-accounts.js +4 -2
  111. package/lib/types/host/kimi-accounts.js.map +1 -1
  112. package/lib/types/host/kimi-oauth-models.d.ts +14 -0
  113. package/lib/types/host/kimi-oauth-models.js +246 -0
  114. package/lib/types/host/kimi-oauth-models.js.map +1 -0
  115. package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
  116. package/lib/types/host/mimo-metadata-cache.js +121 -0
  117. package/lib/types/host/mimo-metadata-cache.js.map +1 -0
  118. package/lib/types/host/native-capability-cache.d.ts +11 -0
  119. package/lib/types/host/native-capability-cache.js +94 -0
  120. package/lib/types/host/native-capability-cache.js.map +1 -0
  121. package/lib/types/host/native-launch.mjs +62 -7
  122. package/lib/types/host/native-process.d.ts +3 -1
  123. package/lib/types/host/native-process.js +30 -5
  124. package/lib/types/host/native-process.js.map +1 -1
  125. package/lib/types/host/native-spawn.mjs +32 -0
  126. package/lib/types/host/opencode-native.js +13 -0
  127. package/lib/types/host/opencode-native.js.map +1 -1
  128. package/lib/types/host/pi-installation.d.mts +1 -1
  129. package/lib/types/host/pi-installation.mjs +27 -3
  130. package/lib/types/host/pi-omp-adapter.js +17 -3
  131. package/lib/types/host/pi-omp-adapter.js.map +1 -1
  132. package/lib/types/host/pi-omp-native.js +5 -3
  133. package/lib/types/host/pi-omp-native.js.map +1 -1
  134. package/lib/types/host/pi-omp-refresh.mjs +3 -3
  135. package/lib/types/host/private-launch.mjs +23 -0
  136. package/lib/types/host/process.d.ts +3 -0
  137. package/lib/types/host/process.js +3 -1
  138. package/lib/types/host/process.js.map +1 -1
  139. package/lib/types/host/routing.js +25 -2
  140. package/lib/types/host/routing.js.map +1 -1
  141. package/lib/types/host/runtime.js +21 -5
  142. package/lib/types/host/runtime.js.map +1 -1
  143. package/lib/types/host/settings-catalog-cache.d.ts +28 -0
  144. package/lib/types/host/settings-catalog-cache.js +189 -0
  145. package/lib/types/host/settings-catalog-cache.js.map +1 -0
  146. package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
  147. package/lib/types/host/windows-account-launch.mjs +47 -0
  148. package/lib/types/host/windows-account-owner.ps1 +137 -0
  149. package/lib/types/host/windows-account-stdio.mjs +19 -0
  150. package/lib/types/host/windows-account-terminal.d.ts +17 -0
  151. package/lib/types/host/windows-account-terminal.js +208 -0
  152. package/lib/types/host/windows-account-terminal.js.map +1 -0
  153. package/lib/types/host/windows-agy-account.ps1 +81 -0
  154. package/lib/types/host/windows-cli-installation.d.ts +35 -0
  155. package/lib/types/host/windows-cli-installation.js +164 -0
  156. package/lib/types/host/windows-cli-installation.js.map +1 -0
  157. package/lib/types/host/windows-codex-launch.d.ts +9 -0
  158. package/lib/types/host/windows-codex-launch.js +216 -0
  159. package/lib/types/host/windows-codex-launch.js.map +1 -0
  160. package/lib/types/host/windows-desktop-cli-installation.d.ts +20 -0
  161. package/lib/types/host/windows-desktop-cli-installation.js +420 -0
  162. package/lib/types/host/windows-desktop-cli-installation.js.map +1 -0
  163. package/lib/types/host/windows-hidden-launch.mjs +51 -0
  164. package/lib/types/host/windows-hidden-process.d.ts +12 -0
  165. package/lib/types/host/windows-hidden-process.js +116 -0
  166. package/lib/types/host/windows-hidden-process.js.map +1 -0
  167. package/lib/types/host/zcode-adapter.js +5 -1
  168. package/lib/types/host/zcode-adapter.js.map +1 -1
  169. package/lib/types/host/zcode-grok-accounts.d.ts +3 -1
  170. package/lib/types/host/zcode-grok-accounts.js +60 -11
  171. package/lib/types/host/zcode-grok-accounts.js.map +1 -1
  172. package/lib/types/shared/accounts.d.ts +4 -0
  173. package/lib/types/shared/cli-settings.d.ts +8 -0
  174. package/lib/windows-account-bootstrap.ps1 +44 -0
  175. package/lib/windows-account-launch.mjs +47 -0
  176. package/lib/windows-account-owner.ps1 +137 -0
  177. package/lib/windows-account-stdio.mjs +19 -0
  178. package/lib/windows-agy-account.ps1 +81 -0
  179. package/lib/windows-hidden-launch.mjs +51 -0
  180. package/lib/zcode-resume.mjs +2 -2
  181. package/package.json +2 -2
@@ -0,0 +1,194 @@
1
+ const nativePrompt = 'Open this URL to sign in:';
2
+ const maxLineLength = 8_192;
3
+ // Fixed endpoints observed from the official CLI's provider-specific device
4
+ // flows. Preserve the server-returned URL; never construct or rewrite one.
5
+ const nativeEndpoints = {
6
+ zai: {
7
+ prefix: /^https:\/\/chat\.z\.ai(?::443)?\/api\/oauth\/authorize\?/,
8
+ origin: 'https://chat.z.ai',
9
+ path: '/api/oauth/authorize',
10
+ parameters: ['client_id', 'redirect_uri', 'state', 'response_type'],
11
+ },
12
+ bigmodel: {
13
+ prefix: /^https:\/\/bigmodel\.cn(?::443)?\/login\?/,
14
+ origin: 'https://bigmodel.cn',
15
+ path: '/login',
16
+ parameters: ['appId', 'redirect', 'state'],
17
+ },
18
+ };
19
+ /** Validate only the observed native authorization endpoint; return the original bytes. */
20
+ function nativeLoginUrl(line, provider) {
21
+ // Older callers retain their Z.AI-only contract. Unknown providers never
22
+ // broaden navigation to either region or a caller-supplied destination.
23
+ const selected = provider === undefined ? 'zai' : provider;
24
+ if (selected !== 'zai' && selected !== 'bigmodel')
25
+ return undefined;
26
+ const endpoint = nativeEndpoints[selected];
27
+ if (line.length > maxLineLength || !endpoint.prefix.test(line) || /[\s\p{C}<>"'\\#]/u.test(line))
28
+ return undefined;
29
+ try {
30
+ const url = new URL(line);
31
+ if (url.protocol !== 'https:' ||
32
+ url.origin !== endpoint.origin ||
33
+ url.pathname !== endpoint.path ||
34
+ url.username ||
35
+ url.password ||
36
+ url.hash ||
37
+ (url.port && url.port !== '443'))
38
+ return undefined;
39
+ for (const parameter of endpoint.parameters) {
40
+ const values = url.searchParams.getAll(parameter);
41
+ if (values.length !== 1 || !values[0]?.trim())
42
+ return undefined;
43
+ }
44
+ return line;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ /**
51
+ * The caller must enable this only for a ZCode login session and pass the selected
52
+ * provider so one region cannot open the other region's URL. URLs stay in memory.
53
+ * Accept a single complete line immediately after the fixed native --no-browser
54
+ * prompt. SGR/cursor visibility do not affect text. The observed ConPTY blank
55
+ * screen initialization is accepted only before any prompt/URL text; arbitrary
56
+ * cursor edits do not become trusted text. OSC payloads are never stored.
57
+ */
58
+ export function createZcodeLoginLinkParser(provider) {
59
+ let mode = 'text';
60
+ let line = '';
61
+ let invalidLine = false;
62
+ let carriageReturn = false;
63
+ let csiParameters = true;
64
+ let csiLength = 0;
65
+ let csiSequence = '';
66
+ let oscCommand = '';
67
+ let oscCommandComplete = false;
68
+ let oscInitialization = false;
69
+ let awaitingUrl = false;
70
+ let previousUrl;
71
+ const reset = () => {
72
+ mode = 'text';
73
+ line = '';
74
+ invalidLine = false;
75
+ carriageReturn = false;
76
+ csiParameters = true;
77
+ csiLength = 0;
78
+ csiSequence = '';
79
+ oscCommand = '';
80
+ oscCommandComplete = false;
81
+ oscInitialization = false;
82
+ awaitingUrl = false;
83
+ previousUrl = undefined;
84
+ };
85
+ const finishLine = () => {
86
+ const complete = invalidLine ? '' : line.trim();
87
+ line = '';
88
+ invalidLine = false;
89
+ carriageReturn = false;
90
+ if (complete === nativePrompt) {
91
+ awaitingUrl = true;
92
+ return undefined;
93
+ }
94
+ const candidate = awaitingUrl ? nativeLoginUrl(complete, provider) : undefined;
95
+ awaitingUrl = false;
96
+ if (!candidate || candidate === previousUrl)
97
+ return undefined;
98
+ previousUrl = candidate;
99
+ return candidate;
100
+ };
101
+ return {
102
+ reset,
103
+ write(chunk) {
104
+ let result;
105
+ for (const character of chunk) {
106
+ if (mode === 'osc' || mode === 'osc-escape') {
107
+ if (character === '\x07' || (mode === 'osc-escape' && character === '\\')) {
108
+ // Only startup OSC 0/2 title metadata is inert here. In particular,
109
+ // OSC 8 hyperlink targets never supply or decorate a login link.
110
+ if (!oscInitialization || !oscCommandComplete || !['0', '2'].includes(oscCommand))
111
+ invalidLine = true;
112
+ mode = 'text';
113
+ }
114
+ else {
115
+ if (!oscCommandComplete) {
116
+ if (character === ';')
117
+ oscCommandComplete = true;
118
+ else if (oscCommand.length < 2)
119
+ oscCommand += character;
120
+ else
121
+ oscInitialization = false;
122
+ }
123
+ mode = character === '\x1b' ? 'osc-escape' : 'osc';
124
+ }
125
+ continue;
126
+ }
127
+ if (mode === 'escape') {
128
+ if (character === '[') {
129
+ mode = 'csi';
130
+ csiParameters = true;
131
+ csiLength = 0;
132
+ csiSequence = '';
133
+ continue;
134
+ }
135
+ if (character === ']') {
136
+ oscInitialization = !line && !awaitingUrl && !invalidLine;
137
+ oscCommand = '';
138
+ oscCommandComplete = false;
139
+ mode = 'osc';
140
+ }
141
+ else {
142
+ invalidLine = true;
143
+ mode = 'text';
144
+ }
145
+ if (character !== '\n')
146
+ continue;
147
+ }
148
+ else if (mode === 'csi') {
149
+ csiLength++;
150
+ if (character >= '@' && character <= '~') {
151
+ const sequence = csiSequence + character;
152
+ const decoration = character === 'm' && csiParameters;
153
+ const visibility = /^\?25[hl]$/.test(sequence);
154
+ const initialization = !line && !awaitingUrl && !invalidLine && /^(?:2J|0?K|(?:1;1)?H)$/.test(sequence);
155
+ if (csiLength > 64 || (!decoration && !visibility && !initialization))
156
+ invalidLine = true;
157
+ mode = 'text';
158
+ continue;
159
+ }
160
+ csiParameters &&= /^[0-9;:]$/.test(character);
161
+ if (csiLength <= 64)
162
+ csiSequence += character;
163
+ if (character !== '\n')
164
+ continue;
165
+ invalidLine = true;
166
+ mode = 'text';
167
+ }
168
+ if (character === '\n') {
169
+ const found = finishLine();
170
+ if (found)
171
+ result = found;
172
+ continue;
173
+ }
174
+ if (carriageReturn)
175
+ invalidLine = true;
176
+ carriageReturn = character === '\r';
177
+ if (carriageReturn)
178
+ continue;
179
+ if (character === '\x1b') {
180
+ mode = 'escape';
181
+ continue;
182
+ }
183
+ if (/[\p{C}]/u.test(character))
184
+ invalidLine = true;
185
+ if (line.length + character.length > maxLineLength)
186
+ invalidLine = true;
187
+ if (!invalidLine)
188
+ line += character;
189
+ }
190
+ return result;
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=zcode-login-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zcode-login-link.js","sourceRoot":"","sources":["../../../src/client/zcode-login-link.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,23 @@
1
1
  export interface AccountModelScope {
2
2
  state: 'supported' | 'denied' | 'unknown'
3
3
  source: 'account-models' | 'configured-custom' | 'verified-route' | 'unknown'
4
- models: { id: string; name?: string; cost: 'free' | 'paid' | 'unknown' }[]
4
+ /** Safe metadata classification; absent when the server did not establish a specific cause. */
5
+ denialReason?: 'authentication' | 'quota'
6
+ /** Endpoint explicitly returned 404/405; never inferred from network or parse errors. */
7
+ catalogUnavailable?: boolean
8
+ /** Successful metadata response contained an explicitly empty raw model array. */
9
+ catalogEmpty?: boolean
10
+ models: { id: string; name?: string; cost: 'free' | 'paid' | 'unknown'; reasoningEfforts?: string[] }[]
5
11
  }
6
12
  export interface AccountModelInput {
7
13
  provider: string
8
14
  credential: { type: 'api' | 'oauth'; key?: string; access?: string; expires?: number; accountId?: string }
9
15
  baseUrl?: string
16
+ /** Installed Codex app-server version from its initialize handshake, never a guessed model version. */
17
+ codexClientVersion?: string
10
18
  apiType?: string
11
19
  /** Mirror a native route that explicitly sends both Anthropic auth headers. */
12
- anthropicAuth?: 'api-key-and-bearer'
20
+ anthropicAuth?: 'api-key-and-bearer' | 'bearer'
13
21
  customModelIds?: string[]
14
22
  verifiedModelIds?: string[]
15
23
  }
@@ -1,7 +1,12 @@
1
1
  // Read-only account metadata. Never refresh OAuth, submit prompts, or return
2
2
  // credentials, account IDs, headers, endpoint URLs, or raw exception messages.
3
3
  const unknown = () => ({ state: 'unknown', source: 'unknown', models: [] })
4
- const denied = () => ({ state: 'denied', source: 'unknown', models: [] })
4
+ const denied = (denialReason) => ({
5
+ state: 'denied',
6
+ source: 'unknown',
7
+ models: [],
8
+ ...(denialReason ? { denialReason } : {}),
9
+ })
5
10
  const validId = (id) => typeof id === 'string' && !!id && id.length <= 1024 && !/[\s\x00-\x1f]/.test(id)
6
11
  const object = (value) => value && typeof value === 'object' && !Array.isArray(value)
7
12
  const unavailable = (model) =>
@@ -13,6 +18,7 @@ const unavailable = (model) =>
13
18
  model.disabled === true ||
14
19
  model.upgrade_required === true ||
15
20
  model.visibility === 'hidden' ||
21
+ model.visibility === 'hide' ||
16
22
  model.visibility === 'none'
17
23
  const numericRate = (value) =>
18
24
  typeof value === 'number'
@@ -55,6 +61,7 @@ function normalize(payload, oauth, token) {
55
61
  if (!list) return undefined
56
62
  const result = new Map()
57
63
  for (const model of list) {
64
+ // Availability NUX is informational text, not an account denial.
58
65
  if (!object(model) || unavailable(model)) continue
59
66
  const id = model.slug ?? model.id
60
67
  if (
@@ -65,6 +72,14 @@ function normalize(payload, oauth, token) {
65
72
  )
66
73
  continue
67
74
  const name = model.display_name ?? model.name
75
+ const reasoningEfforts =
76
+ oauth && Array.isArray(model.supported_reasoning_levels)
77
+ ? [...new Set(model.supported_reasoning_levels.flatMap((level) =>
78
+ object(level) && typeof level.effort === 'string' && /^[a-z]+$/.test(level.effort)
79
+ ? [level.effort]
80
+ : [],
81
+ ))]
82
+ : []
68
83
  result.set(id, {
69
84
  id,
70
85
  ...(typeof name === 'string' &&
@@ -75,6 +90,7 @@ function normalize(payload, oauth, token) {
75
90
  ? { name }
76
91
  : {}),
77
92
  cost: costFor(model, oauth),
93
+ ...(reasoningEfforts.length ? { reasoningEfforts } : {}),
78
94
  })
79
95
  }
80
96
  return [...result.values()]
@@ -124,8 +140,17 @@ export async function probeAccountModels(input, options = {}) {
124
140
  if (typeof token !== 'string' || !token.trim() || token.trimStart().startsWith('!')) return unknown()
125
141
  // Near-expiry credentials cannot reliably finish the query. Do not renew them.
126
142
  if (oauth && (typeof credential.expires !== 'number' || credential.expires <= Date.now() + 30000))
127
- return denied()
143
+ return denied('authentication')
128
144
  const codex = oauth && ['openai', 'openai-codex'].includes(input.provider)
145
+ if (
146
+ input.codexClientVersion !== undefined &&
147
+ (typeof input.codexClientVersion !== 'string' || input.codexClientVersion.length > 64 ||
148
+ !/^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9.-]+)?$/.test(input.codexClientVersion))
149
+ )
150
+ return unknown()
151
+ // Other native client integrations retain their existing compatibility query.
152
+ // discoverCodexModels always requires and supplies its own handshake version.
153
+ const codexVersion = input.codexClientVersion ?? '0.144.1'
129
154
  // xAI/other subscription catalogs do not expose a verified per-account scope
130
155
  // contract here. Do not turn an OAuth login into their whole public catalog.
131
156
  if (oauth && !codex) return unknown()
@@ -142,8 +167,8 @@ export async function probeAccountModels(input, options = {}) {
142
167
  if (input.apiType === 'anthropic-messages' && !oauth) {
143
168
  // ZCode's native Anthropic factory sends both headers. Other callers keep
144
169
  // the ordinary x-api-key contract unless they explicitly mirror that route.
145
- if (input.anthropicAuth !== 'api-key-and-bearer') delete headers.Authorization
146
- headers['x-api-key'] = token
170
+ if (!['api-key-and-bearer', 'bearer'].includes(input.anthropicAuth)) delete headers.Authorization
171
+ if (input.anthropicAuth !== 'bearer') headers['x-api-key'] = token
147
172
  headers['anthropic-version'] = '2023-06-01'
148
173
  }
149
174
  if (codex) {
@@ -157,12 +182,12 @@ export async function probeAccountModels(input, options = {}) {
157
182
  }
158
183
  if (typeof accountId === 'string' && accountId) headers['chatgpt-account-id'] = accountId
159
184
  headers['OpenAI-Beta'] = 'responses=experimental'
160
- headers.originator = 'pi'
161
- headers.version = '0.144.1'
185
+ headers.originator = input.codexClientVersion ? 'cli_worker_models' : 'pi'
186
+ headers.version = codexVersion
162
187
  }
163
188
  const fetcher = options.fetch ?? globalThis.fetch
164
189
  const request = async (path) => {
165
- const target = `${base}${path}${codex && path !== '/wham/usage' ? '?client_version=0.144.1' : ''}`
190
+ const target = `${base}${path}${codex && path !== '/wham/usage' ? `?client_version=${encodeURIComponent(codexVersion)}` : ''}`
166
191
  const response = await fetcher(target, { method: 'GET', headers, signal, redirect: 'error' })
167
192
  if (!response.ok) {
168
193
  await response.body?.cancel()
@@ -179,7 +204,7 @@ export async function probeAccountModels(input, options = {}) {
179
204
  : '/models',
180
205
  ]) {
181
206
  modelResponse = await request(path)
182
- if (modelResponse.status === 401 || modelResponse.status === 403) return denied()
207
+ if (modelResponse.status === 401 || modelResponse.status === 403) return denied('authentication')
183
208
  if (modelResponse.status >= 200 && modelResponse.status < 300) break
184
209
  if (![404, 405].includes(modelResponse.status)) return unknown()
185
210
  }
@@ -191,7 +216,7 @@ export async function probeAccountModels(input, options = {}) {
191
216
  return ['invalid_api_key', 'authentication_failed', 'unauthorized', 'forbidden', 401, 403].includes(
192
217
  code,
193
218
  )
194
- ? denied()
219
+ ? denied('authentication')
195
220
  : unknown()
196
221
  }
197
222
  const models = normalize(envelope, oauth, token)
@@ -199,13 +224,11 @@ export async function probeAccountModels(input, options = {}) {
199
224
  if (codex) {
200
225
  const usage = await request('/wham/usage')
201
226
  const rate = usage.payload?.rate_limit
202
- if (
203
- usage.status === 401 ||
204
- usage.status === 403 ||
205
- rate?.allowed === false ||
206
- rate?.limit_reached === true
207
- )
208
- return denied()
227
+ if (usage.status === 401 || usage.status === 403) return denied('authentication')
228
+ // Only the authenticated usage response establishes exhausted quota.
229
+ // Keep an unclassified denial distinct from expiry/401/403 and network failure.
230
+ if (usage.status === 200 && rate?.limit_reached === true) return denied('quota')
231
+ if (rate?.allowed === false || rate?.limit_reached === true) return denied()
209
232
  // A catalog/menu is not evidence that the account has an executable quota.
210
233
  if (usage.status !== 200 || rate?.allowed !== true || rate?.limit_reached !== false) return unknown()
211
234
  const plan =
@@ -236,7 +259,12 @@ export async function probeAccountModels(input, options = {}) {
236
259
  ) {
237
260
  for (const model of models) if (model.cost === 'free') model.cost = 'unknown'
238
261
  }
239
- return { state: 'supported', source: 'account-models', models }
262
+ return {
263
+ state: 'supported',
264
+ source: 'account-models',
265
+ models,
266
+ ...(!codex && entries(envelope)?.length === 0 ? { catalogEmpty: true } : {}),
267
+ }
240
268
  }
241
269
  if (!oauth && [404, 405].includes(modelResponse?.status)) {
242
270
  // Declaring a custom model is not an account entitlement proof.
@@ -250,7 +278,10 @@ export async function probeAccountModels(input, options = {}) {
250
278
  models: verified.map((id) => ({ id, cost: 'unknown' })),
251
279
  }
252
280
  }
253
- return unknown()
281
+ return {
282
+ ...unknown(),
283
+ ...([404, 405].includes(modelResponse?.status) ? { catalogUnavailable: true } : {}),
284
+ }
254
285
  } catch {
255
286
  return unknown()
256
287
  } finally {
@@ -1,6 +1,6 @@
1
1
  import { type ProcessBackend, type RuntimeConfig } from './process.ts';
2
2
  import { type CliId } from '../shared/types.ts';
3
- import type { AccountAction, AccountFrame, AccountSource, AccountStatus } from '../shared/accounts.ts';
3
+ import type { AccountAction, AccountFrame, AccountSource, AccountStatus, ZCodeLoginProvider } from '../shared/accounts.ts';
4
4
  import { type AccountIdentitySource } from './account-identity.ts';
5
5
  /** User-only auth processes. Only allowlisted identity metadata leaves the Host. */
6
6
  export declare class AccountManager {
@@ -10,6 +10,7 @@ export declare class AccountManager {
10
10
  private readonly sessions;
11
11
  private readonly reserved;
12
12
  private readonly unsafeQueries;
13
+ private readonly unsafeTerminals;
13
14
  private readonly statusQueries;
14
15
  private readonly pending;
15
16
  private readonly parents;
@@ -21,7 +22,7 @@ export declare class AccountManager {
21
22
  status(cli: CliId, cwd: string, signal: AbortSignal): Promise<AccountStatus>;
22
23
  private readStatus;
23
24
  private hasCustomExecutable;
24
- start(parent: string, cli: CliId, action: AccountAction, cwd: string, signal: AbortSignal, source?: AccountSource): Promise<{
25
+ start(parent: string, cli: CliId, action: AccountAction, cwd: string, signal: AbortSignal, source?: AccountSource, provider?: ZCodeLoginProvider): Promise<{
25
26
  id: string;
26
27
  instruction: string;
27
28
  }>;