@namzu/cli 12.1.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +35 -2
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -60
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/acp.d.ts +24 -8
  6. package/dist/commands/acp.d.ts.map +1 -1
  7. package/dist/commands/acp.js +221 -80
  8. package/dist/commands/acp.js.map +1 -1
  9. package/dist/commands/drain.d.ts.map +1 -1
  10. package/dist/commands/drain.js +45 -9
  11. package/dist/commands/drain.js.map +1 -1
  12. package/dist/commands/login.d.ts +2 -0
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +79 -21
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/prior-messages.d.ts +11 -0
  17. package/dist/commands/prior-messages.d.ts.map +1 -0
  18. package/dist/commands/prior-messages.js +280 -0
  19. package/dist/commands/prior-messages.js.map +1 -0
  20. package/dist/commands/resume.d.ts.map +1 -1
  21. package/dist/commands/resume.js +21 -19
  22. package/dist/commands/resume.js.map +1 -1
  23. package/dist/commands/run-stream.d.ts +5 -3
  24. package/dist/commands/run-stream.d.ts.map +1 -1
  25. package/dist/commands/run-stream.js +66 -62
  26. package/dist/commands/run-stream.js.map +1 -1
  27. package/dist/commands/run.d.ts.map +1 -1
  28. package/dist/commands/run.js +50 -37
  29. package/dist/commands/run.js.map +1 -1
  30. package/dist/config/debug.d.ts +55 -0
  31. package/dist/config/debug.d.ts.map +1 -0
  32. package/dist/config/debug.js +126 -0
  33. package/dist/config/debug.js.map +1 -0
  34. package/dist/config/load.d.ts +88 -4
  35. package/dist/config/load.d.ts.map +1 -1
  36. package/dist/config/load.js +386 -56
  37. package/dist/config/load.js.map +1 -1
  38. package/dist/config/schema.d.ts +87 -5
  39. package/dist/config/schema.d.ts.map +1 -1
  40. package/dist/config/schema.js +5 -5
  41. package/dist/config/schema.js.map +1 -1
  42. package/dist/config/trusted-project-context.d.ts +11 -0
  43. package/dist/config/trusted-project-context.d.ts.map +1 -0
  44. package/dist/config/trusted-project-context.js +28 -0
  45. package/dist/config/trusted-project-context.js.map +1 -0
  46. package/dist/context/project-path.d.ts +3 -0
  47. package/dist/context/project-path.d.ts.map +1 -0
  48. package/dist/context/project-path.js +16 -0
  49. package/dist/context/project-path.js.map +1 -0
  50. package/dist/context/project-tracker.d.ts +30 -0
  51. package/dist/context/project-tracker.d.ts.map +1 -0
  52. package/dist/context/project-tracker.js +217 -0
  53. package/dist/context/project-tracker.js.map +1 -0
  54. package/dist/context/sandbox.d.ts +29 -9
  55. package/dist/context/sandbox.d.ts.map +1 -1
  56. package/dist/context/sandbox.js +8 -0
  57. package/dist/context/sandbox.js.map +1 -1
  58. package/dist/doctor/checks/credentials.d.ts.map +1 -1
  59. package/dist/doctor/checks/credentials.js +7 -1
  60. package/dist/doctor/checks/credentials.js.map +1 -1
  61. package/dist/exit-codes.d.ts +5 -4
  62. package/dist/exit-codes.d.ts.map +1 -1
  63. package/dist/exit-codes.js +5 -4
  64. package/dist/exit-codes.js.map +1 -1
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/integrations/clipboard/text.d.ts +43 -0
  70. package/dist/integrations/clipboard/text.d.ts.map +1 -0
  71. package/dist/integrations/clipboard/text.js +43 -0
  72. package/dist/integrations/clipboard/text.js.map +1 -0
  73. package/dist/integrations/mcp/servers.d.ts +9 -0
  74. package/dist/integrations/mcp/servers.d.ts.map +1 -1
  75. package/dist/integrations/mcp/servers.js +11 -4
  76. package/dist/integrations/mcp/servers.js.map +1 -1
  77. package/dist/integrations/notifications/terminal.d.ts +32 -0
  78. package/dist/integrations/notifications/terminal.d.ts.map +1 -0
  79. package/dist/integrations/notifications/terminal.js +46 -0
  80. package/dist/integrations/notifications/terminal.js.map +1 -0
  81. package/dist/integrations/plugins/runtime.d.ts +17 -0
  82. package/dist/integrations/plugins/runtime.d.ts.map +1 -0
  83. package/dist/integrations/plugins/runtime.js +100 -0
  84. package/dist/integrations/plugins/runtime.js.map +1 -0
  85. package/dist/integrations/providers/codex-device-login.d.ts +27 -0
  86. package/dist/integrations/providers/codex-device-login.d.ts.map +1 -0
  87. package/dist/integrations/providers/codex-device-login.js +195 -0
  88. package/dist/integrations/providers/codex-device-login.js.map +1 -0
  89. package/dist/integrations/providers/codex-oauth.d.ts +10 -0
  90. package/dist/integrations/providers/codex-oauth.d.ts.map +1 -0
  91. package/dist/integrations/providers/codex-oauth.js +95 -0
  92. package/dist/integrations/providers/codex-oauth.js.map +1 -0
  93. package/dist/integrations/providers/credential-store.d.ts +40 -4
  94. package/dist/integrations/providers/credential-store.d.ts.map +1 -1
  95. package/dist/integrations/providers/credential-store.js +236 -18
  96. package/dist/integrations/providers/credential-store.js.map +1 -1
  97. package/dist/integrations/providers/discover.d.ts +25 -13
  98. package/dist/integrations/providers/discover.d.ts.map +1 -1
  99. package/dist/integrations/providers/discover.js +98 -44
  100. package/dist/integrations/providers/discover.js.map +1 -1
  101. package/dist/integrations/providers/harness-credentials.d.ts +36 -0
  102. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -0
  103. package/dist/integrations/providers/harness-credentials.js +146 -0
  104. package/dist/integrations/providers/harness-credentials.js.map +1 -0
  105. package/dist/integrations/providers/identity.d.ts +8 -15
  106. package/dist/integrations/providers/identity.d.ts.map +1 -1
  107. package/dist/integrations/providers/identity.js +8 -15
  108. package/dist/integrations/providers/identity.js.map +1 -1
  109. package/dist/integrations/providers/index.d.ts +7 -4
  110. package/dist/integrations/providers/index.d.ts.map +1 -1
  111. package/dist/integrations/providers/index.js +6 -3
  112. package/dist/integrations/providers/index.js.map +1 -1
  113. package/dist/integrations/providers/keychain.d.ts +0 -13
  114. package/dist/integrations/providers/keychain.d.ts.map +1 -1
  115. package/dist/integrations/providers/keychain.js +0 -76
  116. package/dist/integrations/providers/keychain.js.map +1 -1
  117. package/dist/integrations/providers/oauth.d.ts +46 -17
  118. package/dist/integrations/providers/oauth.d.ts.map +1 -1
  119. package/dist/integrations/providers/oauth.js +175 -45
  120. package/dist/integrations/providers/oauth.js.map +1 -1
  121. package/dist/integrations/providers/register.d.ts.map +1 -1
  122. package/dist/integrations/providers/register.js +9 -1
  123. package/dist/integrations/providers/register.js.map +1 -1
  124. package/dist/integrations/providers/registry.d.ts +8 -1
  125. package/dist/integrations/providers/registry.d.ts.map +1 -1
  126. package/dist/integrations/providers/registry.js +29 -0
  127. package/dist/integrations/providers/registry.js.map +1 -1
  128. package/dist/integrations/providers/subscription-login.d.ts +2 -0
  129. package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
  130. package/dist/integrations/providers/subscription-login.js +117 -14
  131. package/dist/integrations/providers/subscription-login.js.map +1 -1
  132. package/dist/integrations/sessions/store.d.ts +111 -1
  133. package/dist/integrations/sessions/store.d.ts.map +1 -1
  134. package/dist/integrations/sessions/store.js +400 -7
  135. package/dist/integrations/sessions/store.js.map +1 -1
  136. package/dist/integrations/sessions/transcript-export.d.ts +25 -0
  137. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -0
  138. package/dist/integrations/sessions/transcript-export.js +441 -0
  139. package/dist/integrations/sessions/transcript-export.js.map +1 -0
  140. package/dist/integrations/sessions/turn-evidence.d.ts +138 -0
  141. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -0
  142. package/dist/integrations/sessions/turn-evidence.js +506 -0
  143. package/dist/integrations/sessions/turn-evidence.js.map +1 -0
  144. package/dist/integrations/subagents/runtime.d.ts +7 -12
  145. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  146. package/dist/integrations/subagents/runtime.js +19 -10
  147. package/dist/integrations/subagents/runtime.js.map +1 -1
  148. package/dist/integrations/trust/store.d.ts.map +1 -1
  149. package/dist/integrations/trust/store.js +27 -13
  150. package/dist/integrations/trust/store.js.map +1 -1
  151. package/dist/permissions/canonical-project.d.ts +9 -0
  152. package/dist/permissions/canonical-project.d.ts.map +1 -0
  153. package/dist/permissions/canonical-project.js +13 -0
  154. package/dist/permissions/canonical-project.js.map +1 -0
  155. package/dist/permissions/checks.d.ts +65 -0
  156. package/dist/permissions/checks.d.ts.map +1 -0
  157. package/dist/permissions/checks.js +122 -0
  158. package/dist/permissions/checks.js.map +1 -0
  159. package/dist/permissions/headless-trust.d.ts +9 -5
  160. package/dist/permissions/headless-trust.d.ts.map +1 -1
  161. package/dist/permissions/headless-trust.js +18 -4
  162. package/dist/permissions/headless-trust.js.map +1 -1
  163. package/dist/permissions/rules.d.ts +16 -7
  164. package/dist/permissions/rules.d.ts.map +1 -1
  165. package/dist/permissions/rules.js +78 -13
  166. package/dist/permissions/rules.js.map +1 -1
  167. package/dist/tui/App.d.ts +5 -2
  168. package/dist/tui/App.d.ts.map +1 -1
  169. package/dist/tui/App.js +1621 -196
  170. package/dist/tui/App.js.map +1 -1
  171. package/dist/tui/Composer.d.ts +14 -3
  172. package/dist/tui/Composer.d.ts.map +1 -1
  173. package/dist/tui/Composer.js +53 -15
  174. package/dist/tui/Composer.js.map +1 -1
  175. package/dist/tui/EditPromptPicker.d.ts +8 -0
  176. package/dist/tui/EditPromptPicker.d.ts.map +1 -0
  177. package/dist/tui/EditPromptPicker.js +18 -0
  178. package/dist/tui/EditPromptPicker.js.map +1 -0
  179. package/dist/tui/LiveActivity.d.ts.map +1 -1
  180. package/dist/tui/LiveActivity.js +2 -1
  181. package/dist/tui/LiveActivity.js.map +1 -1
  182. package/dist/tui/Markdown.d.ts.map +1 -1
  183. package/dist/tui/Markdown.js +2 -1
  184. package/dist/tui/Markdown.js.map +1 -1
  185. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  186. package/dist/tui/PermissionOverlay.js +7 -1
  187. package/dist/tui/PermissionOverlay.js.map +1 -1
  188. package/dist/tui/Picker.d.ts +8 -6
  189. package/dist/tui/Picker.d.ts.map +1 -1
  190. package/dist/tui/Picker.js +145 -18
  191. package/dist/tui/Picker.js.map +1 -1
  192. package/dist/tui/ResumePicker.d.ts.map +1 -1
  193. package/dist/tui/ResumePicker.js +1 -1
  194. package/dist/tui/ResumePicker.js.map +1 -1
  195. package/dist/tui/Transcript.d.ts +4 -2
  196. package/dist/tui/Transcript.d.ts.map +1 -1
  197. package/dist/tui/Transcript.js +31 -5
  198. package/dist/tui/Transcript.js.map +1 -1
  199. package/dist/tui/agent.d.ts +123 -19
  200. package/dist/tui/agent.d.ts.map +1 -1
  201. package/dist/tui/agent.js +757 -144
  202. package/dist/tui/agent.js.map +1 -1
  203. package/dist/tui/compact-transcript.d.ts +24 -0
  204. package/dist/tui/compact-transcript.d.ts.map +1 -0
  205. package/dist/tui/compact-transcript.js +46 -0
  206. package/dist/tui/compact-transcript.js.map +1 -0
  207. package/dist/tui/conversation-history.d.ts +33 -0
  208. package/dist/tui/conversation-history.d.ts.map +1 -0
  209. package/dist/tui/conversation-history.js +42 -0
  210. package/dist/tui/conversation-history.js.map +1 -0
  211. package/dist/tui/edit-prompts.d.ts +23 -0
  212. package/dist/tui/edit-prompts.d.ts.map +1 -0
  213. package/dist/tui/edit-prompts.js +35 -0
  214. package/dist/tui/edit-prompts.js.map +1 -0
  215. package/dist/tui/live-window.d.ts +3 -1
  216. package/dist/tui/live-window.d.ts.map +1 -1
  217. package/dist/tui/live-window.js +20 -8
  218. package/dist/tui/live-window.js.map +1 -1
  219. package/dist/tui/login-prompt.d.ts +5 -0
  220. package/dist/tui/login-prompt.d.ts.map +1 -1
  221. package/dist/tui/login-prompt.js +14 -0
  222. package/dist/tui/login-prompt.js.map +1 -1
  223. package/dist/tui/slashCommands.d.ts +178 -9
  224. package/dist/tui/slashCommands.d.ts.map +1 -1
  225. package/dist/tui/slashCommands.js +340 -16
  226. package/dist/tui/slashCommands.js.map +1 -1
  227. package/dist/tui/terminal-display.d.ts +12 -0
  228. package/dist/tui/terminal-display.d.ts.map +1 -0
  229. package/dist/tui/terminal-display.js +65 -0
  230. package/dist/tui/terminal-display.js.map +1 -0
  231. package/dist/tui/types.d.ts +14 -2
  232. package/dist/tui/types.d.ts.map +1 -1
  233. package/dist/tui/workspace-diff.d.ts +40 -0
  234. package/dist/tui/workspace-diff.d.ts.map +1 -0
  235. package/dist/tui/workspace-diff.js +101 -0
  236. package/dist/tui/workspace-diff.js.map +1 -0
  237. package/package.json +8 -8
@@ -0,0 +1,195 @@
1
+ /** Namzu-owned ChatGPT/Codex device authorization for machines without Codex installed. */
2
+ import { writeStoredCodexCredential } from './credential-store.js';
3
+ import { codexCredentialFromTokens } from './harness-credentials.js';
4
+ export const CODEX_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
5
+ export const CODEX_AUTH_ORIGIN = 'https://auth.openai.com';
6
+ function asRecord(value) {
7
+ return typeof value === 'object' && value !== null ? value : null;
8
+ }
9
+ async function withSignal(operation, signal) {
10
+ signal.throwIfAborted();
11
+ let rejectAbort = () => { };
12
+ const aborted = new Promise((_resolve, reject) => {
13
+ rejectAbort = reject;
14
+ });
15
+ const onAbort = () => rejectAbort(signal.reason);
16
+ signal.addEventListener('abort', onAbort, { once: true });
17
+ try {
18
+ return await Promise.race([operation, aborted]);
19
+ }
20
+ finally {
21
+ signal.removeEventListener('abort', onAbort);
22
+ }
23
+ }
24
+ async function parseJson(response, signal) {
25
+ const value = asRecord(await withSignal(response.json(), signal));
26
+ if (!value)
27
+ throw new Error('The sign-in service returned an invalid response.');
28
+ return value;
29
+ }
30
+ async function requestUserCode(fetchFn, origin, signal) {
31
+ const response = await withSignal(fetchFn(`${origin}/api/accounts/deviceauth/usercode`, {
32
+ method: 'POST',
33
+ headers: {
34
+ 'content-type': 'application/json',
35
+ accept: 'application/json',
36
+ },
37
+ body: JSON.stringify({ client_id: CODEX_OAUTH_CLIENT_ID }),
38
+ signal,
39
+ }), signal);
40
+ if (!response.ok) {
41
+ throw new Error(`The Codex device sign-in service refused the request (HTTP ${response.status}).`);
42
+ }
43
+ const body = await parseJson(response, signal);
44
+ const deviceAuthId = body.device_auth_id;
45
+ const userCode = body.user_code ?? body.usercode;
46
+ const seconds = Number(body.interval);
47
+ if (typeof deviceAuthId !== 'string' ||
48
+ deviceAuthId.length === 0 ||
49
+ typeof userCode !== 'string' ||
50
+ userCode.length === 0 ||
51
+ !Number.isFinite(seconds) ||
52
+ seconds < 0) {
53
+ throw new Error('The Codex device sign-in service returned an incomplete response.');
54
+ }
55
+ return { deviceAuthId, userCode, intervalMs: Math.max(10, seconds * 1_000) };
56
+ }
57
+ async function delay(ms, signal) {
58
+ let timer;
59
+ try {
60
+ await withSignal(new Promise((resolve) => {
61
+ timer = setTimeout(resolve, ms);
62
+ }), signal);
63
+ }
64
+ finally {
65
+ if (timer !== undefined)
66
+ clearTimeout(timer);
67
+ }
68
+ }
69
+ async function complete(code, options, signal) {
70
+ const fetchFn = options.fetch ?? globalThis.fetch;
71
+ const origin = (options.authOrigin ?? CODEX_AUTH_ORIGIN).replace(/\/$/, '');
72
+ const deadlineAt = Date.now() + (options.pollTimeoutMs ?? 15 * 60_000);
73
+ let authorization = null;
74
+ while (Date.now() < deadlineAt) {
75
+ signal.throwIfAborted();
76
+ const response = await withSignal(fetchFn(`${origin}/api/accounts/deviceauth/token`, {
77
+ method: 'POST',
78
+ headers: {
79
+ 'content-type': 'application/json',
80
+ accept: 'application/json',
81
+ },
82
+ body: JSON.stringify({
83
+ device_auth_id: code.deviceAuthId,
84
+ user_code: code.userCode,
85
+ }),
86
+ signal,
87
+ }), signal);
88
+ if (response.ok) {
89
+ authorization = await parseJson(response, signal);
90
+ break;
91
+ }
92
+ if (response.status !== 403 && response.status !== 404) {
93
+ return {
94
+ ok: false,
95
+ reason: `The Codex device sign-in was refused (HTTP ${response.status}). Nothing was stored.`,
96
+ };
97
+ }
98
+ await delay(code.intervalMs, signal);
99
+ }
100
+ if (!authorization) {
101
+ return {
102
+ ok: false,
103
+ reason: 'The Codex device code expired. Nothing was stored.',
104
+ };
105
+ }
106
+ const authorizationCode = authorization.authorization_code;
107
+ const verifier = authorization.code_verifier;
108
+ if (typeof authorizationCode !== 'string' ||
109
+ authorizationCode.length === 0 ||
110
+ typeof verifier !== 'string' ||
111
+ verifier.length === 0) {
112
+ return {
113
+ ok: false,
114
+ reason: 'The Codex device sign-in returned no exchange code. Nothing was stored.',
115
+ };
116
+ }
117
+ const redirectUri = `${origin}/deviceauth/callback`;
118
+ const form = new URLSearchParams({
119
+ grant_type: 'authorization_code',
120
+ code: authorizationCode,
121
+ redirect_uri: redirectUri,
122
+ client_id: CODEX_OAUTH_CLIENT_ID,
123
+ code_verifier: verifier,
124
+ });
125
+ const exchanged = await withSignal(fetchFn(`${origin}/oauth/token`, {
126
+ method: 'POST',
127
+ headers: {
128
+ 'content-type': 'application/x-www-form-urlencoded',
129
+ accept: 'application/json',
130
+ },
131
+ body: form.toString(),
132
+ signal,
133
+ }), signal);
134
+ if (!exchanged.ok) {
135
+ return {
136
+ ok: false,
137
+ reason: `The Codex token exchange was refused (HTTP ${exchanged.status}). Nothing was stored.`,
138
+ };
139
+ }
140
+ const tokens = await parseJson(exchanged, signal);
141
+ const accessToken = tokens.access_token;
142
+ const refreshToken = tokens.refresh_token;
143
+ const credential = typeof accessToken === 'string'
144
+ ? codexCredentialFromTokens({
145
+ accessToken,
146
+ ...(typeof refreshToken === 'string' ? { refreshToken } : {}),
147
+ })
148
+ : null;
149
+ if (!credential) {
150
+ return {
151
+ ok: false,
152
+ reason: 'The Codex token exchange did not identify an account. Nothing was stored.',
153
+ };
154
+ }
155
+ signal.throwIfAborted();
156
+ try {
157
+ const storedAt = writeStoredCodexCredential(credential, options.home);
158
+ return { ok: true, credential, storedAt };
159
+ }
160
+ catch (error) {
161
+ return {
162
+ ok: false,
163
+ reason: `Signed in to Codex, but the credential could not be stored privately: ${error instanceof Error ? error.message : String(error)}`,
164
+ };
165
+ }
166
+ }
167
+ export async function beginCodexDeviceLogin(options = {}) {
168
+ options.signal?.throwIfAborted();
169
+ const owner = new AbortController();
170
+ const signal = options.signal ? AbortSignal.any([options.signal, owner.signal]) : owner.signal;
171
+ const origin = (options.authOrigin ?? CODEX_AUTH_ORIGIN).replace(/\/$/, '');
172
+ const userCode = await requestUserCode(options.fetch ?? globalThis.fetch, origin, signal);
173
+ let completion;
174
+ return {
175
+ url: `${origin}/codex/device`,
176
+ userCode: userCode.userCode,
177
+ waitForCompletion: () => {
178
+ completion ??= complete(userCode, options, signal).catch((error) => {
179
+ if (signal.aborted) {
180
+ return {
181
+ ok: false,
182
+ reason: 'The Codex sign-in was cancelled. Nothing was stored.',
183
+ };
184
+ }
185
+ return {
186
+ ok: false,
187
+ reason: `Could not complete Codex sign-in: ${error instanceof Error ? error.message : String(error)}`,
188
+ };
189
+ });
190
+ return completion;
191
+ },
192
+ cancel: () => owner.abort(new Error('The Codex sign-in attempt was cancelled.')),
193
+ };
194
+ }
195
+ //# sourceMappingURL=codex-device-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-device-login.js","sourceRoot":"","sources":["../../../src/integrations/providers/codex-device-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Refresh for a Codex credential owned by Namzu's credential store. */
2
+ import { type StoredCodexCredential } from './credential-store.js';
3
+ export interface StoredCodexRefreshOptions {
4
+ readonly home?: string;
5
+ readonly fetch?: typeof fetch;
6
+ readonly authOrigin?: string;
7
+ readonly now?: number;
8
+ }
9
+ export declare function ensureFreshStoredCodexCredential(signal?: AbortSignal, options?: StoredCodexRefreshOptions): Promise<StoredCodexCredential>;
10
+ //# sourceMappingURL=codex-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/codex-oauth.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAGxE,OAAO,EACN,KAAK,qBAAqB,EAG1B,MAAM,uBAAuB,CAAA;AAM9B,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACrB;AAqBD,wBAAsB,gCAAgC,CACrD,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,yBAA8B,GACrC,OAAO,CAAC,qBAAqB,CAAC,CAoFhC"}
@@ -0,0 +1,95 @@
1
+ /** Refresh for a Codex credential owned by Namzu's credential store. */
2
+ import { CODEX_AUTH_ORIGIN, CODEX_OAUTH_CLIENT_ID } from './codex-device-login.js';
3
+ import { readStoredCodexCredential, replaceStoredCodexCredential, } from './credential-store.js';
4
+ import { codexCredentialFromTokens } from './harness-credentials.js';
5
+ import { CredentialPublicationError, CredentialWithdrawnError } from './oauth.js';
6
+ const REFRESH_WINDOW_MS = 5 * 60_000;
7
+ function asRecord(value) {
8
+ return typeof value === 'object' && value !== null ? value : null;
9
+ }
10
+ async function withSignal(operation, signal) {
11
+ signal.throwIfAborted();
12
+ let rejectAbort = () => { };
13
+ const aborted = new Promise((_resolve, reject) => {
14
+ rejectAbort = reject;
15
+ });
16
+ const onAbort = () => rejectAbort(signal.reason);
17
+ signal.addEventListener('abort', onAbort, { once: true });
18
+ try {
19
+ return await Promise.race([operation, aborted]);
20
+ }
21
+ finally {
22
+ signal.removeEventListener('abort', onAbort);
23
+ }
24
+ }
25
+ export async function ensureFreshStoredCodexCredential(signal, options = {}) {
26
+ signal?.throwIfAborted();
27
+ const current = readStoredCodexCredential(options.home);
28
+ if (!current) {
29
+ throw new CredentialWithdrawnError('The Codex subscription Namzu stored was removed. Sign in again or choose another provider.');
30
+ }
31
+ if (current.expiresAt === undefined ||
32
+ current.expiresAt - (options.now ?? Date.now()) > REFRESH_WINDOW_MS) {
33
+ return current;
34
+ }
35
+ if (!current.refreshToken) {
36
+ throw new CredentialWithdrawnError('The Codex subscription expired without a refresh grant. Sign in again.');
37
+ }
38
+ const deadline = AbortSignal.timeout(30_000);
39
+ const requestSignal = signal ? AbortSignal.any([signal, deadline]) : deadline;
40
+ let response;
41
+ try {
42
+ response = await withSignal((options.fetch ?? globalThis.fetch)(`${(options.authOrigin ?? CODEX_AUTH_ORIGIN).replace(/\/$/, '')}/oauth/token`, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'content-type': 'application/json',
46
+ accept: 'application/json',
47
+ },
48
+ body: JSON.stringify({
49
+ client_id: CODEX_OAUTH_CLIENT_ID,
50
+ grant_type: 'refresh_token',
51
+ refresh_token: current.refreshToken,
52
+ }),
53
+ signal: requestSignal,
54
+ }), requestSignal);
55
+ }
56
+ catch (error) {
57
+ if (signal?.aborted)
58
+ throw signal.reason;
59
+ throw new CredentialPublicationError({ cause: error });
60
+ }
61
+ if (!response.ok) {
62
+ throw new CredentialWithdrawnError(`The Codex subscription could not be refreshed (HTTP ${response.status}). Sign in again.`);
63
+ }
64
+ const body = asRecord(await withSignal(response.json(), requestSignal));
65
+ if (!body) {
66
+ throw new CredentialWithdrawnError('The Codex refresh service returned an invalid credential. Sign in again.');
67
+ }
68
+ const accessToken = body.access_token;
69
+ const refreshToken = body.refresh_token;
70
+ const refreshed = typeof accessToken === 'string'
71
+ ? codexCredentialFromTokens({
72
+ accessToken,
73
+ refreshToken: typeof refreshToken === 'string' ? refreshToken : current.refreshToken,
74
+ accountId: current.accountId,
75
+ })
76
+ : null;
77
+ if (!refreshed || refreshed.accountId !== current.accountId) {
78
+ throw new CredentialWithdrawnError('The refreshed Codex credential did not belong to the signed-in account. Sign in again.');
79
+ }
80
+ signal?.throwIfAborted();
81
+ let result;
82
+ try {
83
+ result = replaceStoredCodexCredential(current, refreshed, options.home);
84
+ }
85
+ catch (error) {
86
+ throw new CredentialPublicationError({ cause: error });
87
+ }
88
+ if (!result.replaced) {
89
+ if (!result.current)
90
+ throw new CredentialWithdrawnError();
91
+ return result.current;
92
+ }
93
+ return refreshed;
94
+ }
95
+ //# sourceMappingURL=codex-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/codex-oauth.ts"],"names":[],"mappings":"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"}
@@ -35,11 +35,12 @@
35
35
  * ## What is in the file
36
36
  *
37
37
  * { "version": 1,
38
- * "subscription": { "accessToken", "refreshToken", "expiresAt", "scopes" } }
38
+ * "subscription": { "accessToken", "refreshToken", "expiresAt", "scopes" },
39
+ * "codexSubscription": { "accessToken", "refreshToken", "expiresAt", "accountId" } }
39
40
  *
40
- * `subscription` is the credential a person's plan grants, obtained by the
41
- * login flow in `subscription-login.ts` and refreshed in place by `oauth.ts`.
42
- * Nothing else writes here.
41
+ * Each sibling is owned by Namzu's corresponding login flow and conditionally
42
+ * refreshed in place. Credentials borrowed from Claude or Codex remain in
43
+ * their owners' files/keychain and are never copied here.
43
44
  */
44
45
  import type { AgentOAuthCredential } from './keychain.js';
45
46
  export declare const CREDENTIALS_FILE_VERSION: 1;
@@ -47,6 +48,23 @@ export declare const CREDENTIALS_FILE_VERSION: 1;
47
48
  export declare class CredentialStoreError extends Error {
48
49
  readonly name = "CredentialStoreError";
49
50
  }
51
+ export type ConditionalCredentialWrite = {
52
+ readonly replaced: true;
53
+ readonly current: AgentOAuthCredential;
54
+ } | {
55
+ readonly replaced: false;
56
+ readonly current: AgentOAuthCredential | null;
57
+ };
58
+ export interface StoredCodexCredential extends AgentOAuthCredential {
59
+ readonly accountId: string;
60
+ }
61
+ export type ConditionalCodexCredentialWrite = {
62
+ readonly replaced: true;
63
+ readonly current: StoredCodexCredential;
64
+ } | {
65
+ readonly replaced: false;
66
+ readonly current: StoredCodexCredential | null;
67
+ };
50
68
  export declare function credentialsPath(home?: string): string;
51
69
  /**
52
70
  * The stored subscription credential, or `null` when there is none.
@@ -58,6 +76,8 @@ export declare function credentialsPath(home?: string): string;
58
76
  * the operator to try again.
59
77
  */
60
78
  export declare function readStoredSubscriptionCredential(home?: string): AgentOAuthCredential | null;
79
+ /** The Namzu-owned ChatGPT/Codex subscription, if one was obtained here. */
80
+ export declare function readStoredCodexCredential(home?: string): StoredCodexCredential | null;
61
81
  /**
62
82
  * Write the credential, privately, or throw having written nothing that lasts.
63
83
  *
@@ -68,8 +88,24 @@ export declare function readStoredSubscriptionCredential(home?: string): AgentOA
68
88
  * removes.
69
89
  */
70
90
  export declare function writeStoredSubscriptionCredential(cred: AgentOAuthCredential, home?: string): string;
91
+ export declare function writeStoredCodexCredential(cred: StoredCodexCredential, home?: string): string;
92
+ export declare function replaceStoredCodexCredential(expected: StoredCodexCredential, replacement: StoredCodexCredential, home?: string): ConditionalCodexCredentialWrite;
93
+ /**
94
+ * Replace exactly the credential a refresh was derived from.
95
+ *
96
+ * Comparison and rename happen under the same store-owned cross-process lock.
97
+ * A changed record is returned to the caller and is never overwritten. This is
98
+ * the durable authority boundary a post-network plain reread cannot provide:
99
+ * without the lock, another writer can still rotate the credential between
100
+ * the comparison and the rename.
101
+ */
102
+ export declare function replaceStoredSubscriptionCredential(expected: AgentOAuthCredential, replacement: AgentOAuthCredential, home?: string): ConditionalCredentialWrite;
71
103
  /** Remove the stored credential. Absence is success. */
72
104
  export declare function clearStoredSubscriptionCredential(home?: string): void;
105
+ /** Remove only the Namzu-owned Codex subscription; borrowed harness auth is untouched. */
106
+ export declare function clearStoredCodexCredential(home?: string): void;
107
+ /** Remove every credential Namzu owns in one store mutation. */
108
+ export declare function clearAllStoredCredentials(home?: string): void;
73
109
  /**
74
110
  * Make `path` readable and writable by its owner and by nobody else, and
75
111
  * PROVE it. Throws `CredentialStoreError` when the proof cannot be produced.
@@ -1 +1 @@
1
- {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAiBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAKzD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,wFAAwF;AACxF,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,0BAAyB;CAC/C;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC/C,IAAI,GAAE,MAAkB,GACtB,oBAAoB,GAAG,IAAI,CA2B7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAChD,IAAI,EAAE,oBAAoB,EAC1B,IAAI,GAAE,MAAkB,GACtB,MAAM,CAiDR;AAED,wDAAwD;AACxD,wBAAgB,iCAAiC,CAAC,IAAI,GAAE,MAAkB,GAAG,IAAI,CAEhF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpE;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBvD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAc9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAoCjF"}
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAoBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAKzD,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,wFAAwF;AACxF,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,0BAAyB;CAC/C;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAAE,CAAA;AAE9E,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,MAAM,+BAA+B,GACxC;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GACpE;IACA,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAC7C,CAAA;AAQJ,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC/C,IAAI,GAAE,MAAkB,GACtB,oBAAoB,GAAG,IAAI,CAE7B;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,MAAkB,GAAG,qBAAqB,GAAG,IAAI,CAEhG;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAChD,IAAI,EAAE,oBAAoB,EAC1B,IAAI,GAAE,MAAkB,GACtB,MAAM,CAUR;AAED,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,qBAAqB,EAC3B,IAAI,GAAE,MAAkB,GACtB,MAAM,CAcR;AAED,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,qBAAqB,EAC/B,WAAW,EAAE,qBAAqB,EAClC,IAAI,GAAE,MAAkB,GACtB,+BAA+B,CAiBjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAClD,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,oBAAoB,EACjC,IAAI,GAAE,MAAkB,GACtB,0BAA0B,CAiB5B;AA4DD,wDAAwD;AACxD,wBAAgB,iCAAiC,CAAC,IAAI,GAAE,MAAkB,GAAG,IAAI,CAiBhF;AAED,0FAA0F;AAC1F,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,MAAkB,GAAG,IAAI,CAczE;AAED,gEAAgE;AAChE,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,MAAkB,GAAG,IAAI,CAIxE;AAsGD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpE;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBvD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAc9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAoCjF"}