@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
@@ -35,15 +35,16 @@
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 { execFileSync } from 'node:child_process';
45
46
  import { randomBytes } from 'node:crypto';
46
- import { closeSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeSync, } from 'node:fs';
47
+ import { closeSync, fsyncSync, linkSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, writeSync, } from 'node:fs';
47
48
  import { homedir, platform, tmpdir } from 'node:os';
48
49
  import { dirname, join } from 'node:path';
49
50
  const FILE_MODE = 0o600;
@@ -66,6 +67,13 @@ export function credentialsPath(home = homedir()) {
66
67
  * the operator to try again.
67
68
  */
68
69
  export function readStoredSubscriptionCredential(home = homedir()) {
70
+ return readCredentialDocument(home)?.subscription ?? null;
71
+ }
72
+ /** The Namzu-owned ChatGPT/Codex subscription, if one was obtained here. */
73
+ export function readStoredCodexCredential(home = homedir()) {
74
+ return readCredentialDocument(home)?.codexSubscription ?? null;
75
+ }
76
+ function readCredentialDocument(home) {
69
77
  let raw;
70
78
  try {
71
79
  raw = readFileSync(credentialsPath(home), 'utf8');
@@ -82,10 +90,28 @@ export function readStoredSubscriptionCredential(home = homedir()) {
82
90
  }
83
91
  if (typeof parsed !== 'object' || parsed === null)
84
92
  return null;
85
- const sub = parsed.subscription;
86
- if (typeof sub !== 'object' || sub === null)
93
+ const root = parsed;
94
+ const subscription = parseCredential(root.subscription);
95
+ const codexBase = parseCredential(root.codexSubscription);
96
+ const codexRecord = typeof root.codexSubscription === 'object' && root.codexSubscription !== null
97
+ ? root.codexSubscription
98
+ : null;
99
+ const accountId = codexRecord?.accountId;
100
+ const codexSubscription = codexBase && typeof accountId === 'string' && accountId.length > 0
101
+ ? { ...codexBase, accountId }
102
+ : undefined;
103
+ if (!subscription && !codexSubscription)
87
104
  return null;
88
- const rec = sub;
105
+ return {
106
+ version: CREDENTIALS_FILE_VERSION,
107
+ ...(subscription ? { subscription } : {}),
108
+ ...(codexSubscription ? { codexSubscription } : {}),
109
+ };
110
+ }
111
+ function parseCredential(value) {
112
+ if (typeof value !== 'object' || value === null)
113
+ return null;
114
+ const rec = value;
89
115
  const accessToken = rec.accessToken;
90
116
  if (typeof accessToken !== 'string' || accessToken.length === 0)
91
117
  return null;
@@ -110,16 +136,67 @@ export function readStoredSubscriptionCredential(home = homedir()) {
110
136
  export function writeStoredSubscriptionCredential(cred, home = homedir()) {
111
137
  const path = credentialsPath(home);
112
138
  mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
139
+ return withCredentialStoreLock(path, () => {
140
+ const current = readCredentialDocument(home);
141
+ return writeCredentialDocumentUnlocked({ version: CREDENTIALS_FILE_VERSION, ...current, subscription: cred }, path);
142
+ });
143
+ }
144
+ export function writeStoredCodexCredential(cred, home = homedir()) {
145
+ const path = credentialsPath(home);
146
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
147
+ return withCredentialStoreLock(path, () => {
148
+ const current = readCredentialDocument(home);
149
+ return writeCredentialDocumentUnlocked({
150
+ version: CREDENTIALS_FILE_VERSION,
151
+ ...current,
152
+ codexSubscription: cred,
153
+ }, path);
154
+ });
155
+ }
156
+ export function replaceStoredCodexCredential(expected, replacement, home = homedir()) {
157
+ const path = credentialsPath(home);
158
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
159
+ return withCredentialStoreLock(path, () => {
160
+ const current = readStoredCodexCredential(home);
161
+ if (!sameCodexCredential(current, expected))
162
+ return { replaced: false, current };
163
+ const document = readCredentialDocument(home);
164
+ writeCredentialDocumentUnlocked({
165
+ version: CREDENTIALS_FILE_VERSION,
166
+ ...document,
167
+ codexSubscription: replacement,
168
+ }, path);
169
+ return { replaced: true, current: replacement };
170
+ });
171
+ }
172
+ /**
173
+ * Replace exactly the credential a refresh was derived from.
174
+ *
175
+ * Comparison and rename happen under the same store-owned cross-process lock.
176
+ * A changed record is returned to the caller and is never overwritten. This is
177
+ * the durable authority boundary a post-network plain reread cannot provide:
178
+ * without the lock, another writer can still rotate the credential between
179
+ * the comparison and the rename.
180
+ */
181
+ export function replaceStoredSubscriptionCredential(expected, replacement, home = homedir()) {
182
+ const path = credentialsPath(home);
183
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
184
+ return withCredentialStoreLock(path, () => {
185
+ const current = readStoredSubscriptionCredential(home);
186
+ if (!sameCredential(current, expected))
187
+ return { replaced: false, current };
188
+ const document = readCredentialDocument(home);
189
+ writeCredentialDocumentUnlocked({
190
+ version: CREDENTIALS_FILE_VERSION,
191
+ ...document,
192
+ subscription: replacement,
193
+ }, path);
194
+ return { replaced: true, current: replacement };
195
+ });
196
+ }
197
+ function writeCredentialDocumentUnlocked(document, path) {
113
198
  const tmp = `${path}.tmp.${process.pid}.${randomBytes(6).toString('hex')}`;
114
- const body = `${JSON.stringify({
115
- version: CREDENTIALS_FILE_VERSION,
116
- subscription: {
117
- accessToken: cred.accessToken,
118
- ...(cred.refreshToken ? { refreshToken: cred.refreshToken } : {}),
119
- ...(cred.expiresAt ? { expiresAt: cred.expiresAt } : {}),
120
- ...(cred.scopes ? { scopes: cred.scopes } : {}),
121
- },
122
- }, null, 2)}\n`;
199
+ const body = `${JSON.stringify(serializeDocument(document), null, 2)}\n`;
123
200
  let fd;
124
201
  try {
125
202
  // `wx` — refuse an existing path rather than truncate one, so a name
@@ -150,9 +227,150 @@ export function writeStoredSubscriptionCredential(cred, home = homedir()) {
150
227
  }
151
228
  return path;
152
229
  }
230
+ function serializeDocument(document) {
231
+ const credential = (value) => ({
232
+ accessToken: value.accessToken,
233
+ ...(value.refreshToken ? { refreshToken: value.refreshToken } : {}),
234
+ ...(value.expiresAt ? { expiresAt: value.expiresAt } : {}),
235
+ ...(value.scopes ? { scopes: value.scopes } : {}),
236
+ });
237
+ return {
238
+ version: CREDENTIALS_FILE_VERSION,
239
+ ...(document.subscription ? { subscription: credential(document.subscription) } : {}),
240
+ ...(document.codexSubscription
241
+ ? {
242
+ codexSubscription: {
243
+ ...credential(document.codexSubscription),
244
+ accountId: document.codexSubscription.accountId,
245
+ },
246
+ }
247
+ : {}),
248
+ };
249
+ }
153
250
  /** Remove the stored credential. Absence is success. */
154
251
  export function clearStoredSubscriptionCredential(home = homedir()) {
155
- rmSync(credentialsPath(home), { force: true });
252
+ const path = credentialsPath(home);
253
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
254
+ withCredentialStoreLock(path, () => {
255
+ const current = readCredentialDocument(home);
256
+ if (!current?.codexSubscription) {
257
+ rmSync(path, { force: true });
258
+ return;
259
+ }
260
+ writeCredentialDocumentUnlocked({
261
+ version: CREDENTIALS_FILE_VERSION,
262
+ codexSubscription: current.codexSubscription,
263
+ }, path);
264
+ });
265
+ }
266
+ /** Remove only the Namzu-owned Codex subscription; borrowed harness auth is untouched. */
267
+ export function clearStoredCodexCredential(home = homedir()) {
268
+ const path = credentialsPath(home);
269
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
270
+ withCredentialStoreLock(path, () => {
271
+ const current = readCredentialDocument(home);
272
+ if (!current?.subscription) {
273
+ rmSync(path, { force: true });
274
+ return;
275
+ }
276
+ writeCredentialDocumentUnlocked({ version: CREDENTIALS_FILE_VERSION, subscription: current.subscription }, path);
277
+ });
278
+ }
279
+ /** Remove every credential Namzu owns in one store mutation. */
280
+ export function clearAllStoredCredentials(home = homedir()) {
281
+ const path = credentialsPath(home);
282
+ mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });
283
+ withCredentialStoreLock(path, () => rmSync(path, { force: true }));
284
+ }
285
+ function sameCredential(left, right) {
286
+ if (!left)
287
+ return false;
288
+ if (left.accessToken !== right.accessToken ||
289
+ left.refreshToken !== right.refreshToken ||
290
+ left.expiresAt !== right.expiresAt) {
291
+ return false;
292
+ }
293
+ const leftScopes = left.scopes ?? [];
294
+ const rightScopes = right.scopes ?? [];
295
+ return (leftScopes.length === rightScopes.length &&
296
+ leftScopes.every((scope, index) => scope === rightScopes[index]));
297
+ }
298
+ function sameCodexCredential(left, right) {
299
+ return left?.accountId === right.accountId && sameCredential(left, right);
300
+ }
301
+ /**
302
+ * Run one synchronous store mutation with cross-process exclusion.
303
+ *
304
+ * The lock is held only across local read/rename work, never across a network
305
+ * request. A dead owner can leave a complete lock behind. It is deliberately
306
+ * not stolen automatically: pathname-based stale reclamation cannot prove it
307
+ * is unlinking the inode it inspected, so a delayed reclaimer can delete a new
308
+ * owner's lock and admit two writers. A present lock is a refusal until an
309
+ * operator proves no process owns the store and removes it.
310
+ */
311
+ function withCredentialStoreLock(path, operation) {
312
+ const lockPath = `${path}.lock`;
313
+ const token = `${process.pid}:${Date.now()}:${randomBytes(12).toString('hex')}`;
314
+ const published = publishLockAtomically(lockPath, token);
315
+ if (!published.acquired) {
316
+ throw new CredentialStoreError(`could not acquire the credential-store lock for ${path}: another owner or an unrecovered process lock is present (${published.error instanceof Error ? published.error.message : String(published.error)}). Refusing concurrent mutation; after proving no Namzu process is using this credential store, remove ${lockPath} and retry.`);
317
+ }
318
+ try {
319
+ return operation();
320
+ }
321
+ finally {
322
+ // Do not remove a successor's lock if an external actor replaced the file.
323
+ try {
324
+ if (readFileSync(lockPath, 'utf8') === token)
325
+ rmSync(lockPath, { force: true });
326
+ }
327
+ catch {
328
+ // The mutation already has its result. A missing/replaced lock is not
329
+ // evidence that the credential itself failed to publish.
330
+ }
331
+ }
332
+ }
333
+ /**
334
+ * Publish a complete owner record at the canonical name in one filesystem op.
335
+ *
336
+ * Creating the canonical file and then writing its token has a fatal crash
337
+ * window: an empty lock names no owner and can never be reclaimed safely. The
338
+ * candidate is completed and synced first; `linkSync` is the exclusive claim.
339
+ * A pre-link crash can leave candidate debris, but it never blocks the store.
340
+ */
341
+ function publishLockAtomically(lockPath, token) {
342
+ const candidatePath = `${lockPath}.candidate.${process.pid}.${randomBytes(12).toString('hex')}`;
343
+ let fd;
344
+ try {
345
+ fd = openSync(candidatePath, 'wx', FILE_MODE);
346
+ writeFileSync(fd, token, 'utf8');
347
+ fsyncSync(fd);
348
+ closeSync(fd);
349
+ fd = undefined;
350
+ }
351
+ catch (error) {
352
+ if (fd !== undefined)
353
+ closeSync(fd);
354
+ rmSync(candidatePath, { force: true });
355
+ throw new CredentialStoreError(`could not prepare the credential-store lock: ${error instanceof Error ? error.message : String(error)}`);
356
+ }
357
+ try {
358
+ linkSync(candidatePath, lockPath);
359
+ return { acquired: true };
360
+ }
361
+ catch (error) {
362
+ return { acquired: false, error };
363
+ }
364
+ finally {
365
+ try {
366
+ rmSync(candidatePath, { force: true });
367
+ }
368
+ catch {
369
+ // Candidate debris is non-canonical and cannot block another owner.
370
+ // Once the hard link succeeds, cleanup must not erase that acquisition
371
+ // result and skip the token-checked canonical release path.
372
+ }
373
+ }
156
374
  }
157
375
  /**
158
376
  * Make `path` readable and writable by its owner and by nobody else, and
@@ -1 +1 @@
1
- {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../../src/integrations/providers/credential-store.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,10 @@
1
1
  /**
2
2
  * Credential discoverer for LLM provider clients.
3
3
  *
4
- * For each entry in `PROVIDER_REGISTRY`, ask four questions in order:
5
- * 1. Is one of its env vars set in `process.env`?
6
- * 2. Is there a subscription credential in namzu's own store — the one the
7
- * login flow writes? (every platform, and only `anthropic` consumes it.)
8
- * 3. Is there an OAuth credential in the login Keychain? (macOS only, and
9
- * only `anthropic` consumes it.)
4
+ * For each entry in `PROVIDER_REGISTRY`, ask four questions:
5
+ * 1. Is there a usable session owned by an installed Claude or Codex harness?
6
+ * 2. Is there a subscription credential in namzu's own store?
7
+ * 3. Is one of its optional API-key env vars set in `process.env`?
10
8
  * 4. Is the probe URL (if any) reachable right now?
11
9
  *
12
10
  * The header used to say "three" and list two, and the one it omitted was the
@@ -19,14 +17,12 @@
19
17
  * hole.** `readAgentKeychainCredential` returns `null` on any other platform
20
18
  * before it looks at anything; it reads a credential belonging to a
21
19
  * co-installed tool, so it can only ever help someone who has that tool, on
22
- * that operating system. namzu's own store is asked first among the credential
23
- * sources and works everywhere, which is what makes signing in from inside
24
- * namzu useful on a machine that has neither.
20
+ * that operating system. namzu's own store works everywhere, which is what
21
+ * makes signing in from inside namzu useful on a machine that has neither.
25
22
  *
26
- * Order between the two matters when both answer. namzu's own store wins,
27
- * because it is the one namzu wrote and refreshes; preferring a borrowed
28
- * credential over the operator's own sign-in would make the login look
29
- * ineffective on precisely the machine where they bothered to run it.
23
+ * Order matters when both answer. A current device-harness session wins; a
24
+ * Namzu-owned sign-in is the fallback for a machine that has no usable harness
25
+ * session. API-key/env sources remain optional alternatives after both.
30
26
  *
31
27
  * The first positive answer per provider wins; subsequent sources are
32
28
  * recorded as "also available from" so the picker can show alternatives
@@ -72,6 +68,16 @@ export type DetectionSource = {
72
68
  readonly kind: 'keychain';
73
69
  readonly service: string;
74
70
  }
71
+ /** A read-only Claude Code OAuth envelope owned by the Claude CLI. */
72
+ | {
73
+ readonly kind: 'claude-file';
74
+ readonly path: string;
75
+ }
76
+ /** A read-only ChatGPT/Codex OAuth envelope owned by the Codex CLI. */
77
+ | {
78
+ readonly kind: 'codex-file';
79
+ readonly path: string;
80
+ }
75
81
  /**
76
82
  * namzu's own credential store — a subscription the operator signed in to
77
83
  * from inside namzu. Carries the path because "where did this come from"
@@ -115,6 +121,12 @@ export interface DetectedProvider {
115
121
  readonly expiresAt?: number;
116
122
  readonly origin?: CredentialOrigin;
117
123
  };
124
+ /** Account-routed OAuth metadata for the Codex Responses backend. */
125
+ readonly codex?: {
126
+ readonly accountId: string;
127
+ readonly expiresAt?: number;
128
+ readonly origin: 'codex-file' | 'stored';
129
+ };
118
130
  /** Other sources that also satisfy this provider — informational. */
119
131
  readonly alternatives: readonly DetectionSource[];
120
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAqB,KAAK,UAAU,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE9F,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzD;;;;GAIG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACpD;;;;;;;GAOG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAE/B,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAA;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;QAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;QAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAClC,CAAA;IACD,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,eAAe;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IAChC,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC7B;AAID,wBAAsB,iBAAiB,CACtC,IAAI,GAAE,eAAoB,GACxB,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAyGtC;AAmBD,yEAAyE;AACzE,wBAAgB,YAAY,CAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,EACjC,EAAE,EAAE,UAAU,GACZ,gBAAgB,GAAG,IAAI,CAEzB"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,10 @@
1
1
  /**
2
2
  * Credential discoverer for LLM provider clients.
3
3
  *
4
- * For each entry in `PROVIDER_REGISTRY`, ask four questions in order:
5
- * 1. Is one of its env vars set in `process.env`?
6
- * 2. Is there a subscription credential in namzu's own store — the one the
7
- * login flow writes? (every platform, and only `anthropic` consumes it.)
8
- * 3. Is there an OAuth credential in the login Keychain? (macOS only, and
9
- * only `anthropic` consumes it.)
4
+ * For each entry in `PROVIDER_REGISTRY`, ask four questions:
5
+ * 1. Is there a usable session owned by an installed Claude or Codex harness?
6
+ * 2. Is there a subscription credential in namzu's own store?
7
+ * 3. Is one of its optional API-key env vars set in `process.env`?
10
8
  * 4. Is the probe URL (if any) reachable right now?
11
9
  *
12
10
  * The header used to say "three" and list two, and the one it omitted was the
@@ -19,14 +17,12 @@
19
17
  * hole.** `readAgentKeychainCredential` returns `null` on any other platform
20
18
  * before it looks at anything; it reads a credential belonging to a
21
19
  * co-installed tool, so it can only ever help someone who has that tool, on
22
- * that operating system. namzu's own store is asked first among the credential
23
- * sources and works everywhere, which is what makes signing in from inside
24
- * namzu useful on a machine that has neither.
20
+ * that operating system. namzu's own store works everywhere, which is what
21
+ * makes signing in from inside namzu useful on a machine that has neither.
25
22
  *
26
- * Order between the two matters when both answer. namzu's own store wins,
27
- * because it is the one namzu wrote and refreshes; preferring a borrowed
28
- * credential over the operator's own sign-in would make the login look
29
- * ineffective on precisely the machine where they bothered to run it.
23
+ * Order matters when both answer. A current device-harness session wins; a
24
+ * Namzu-owned sign-in is the fallback for a machine that has no usable harness
25
+ * session. API-key/env sources remain optional alternatives after both.
30
26
  *
31
27
  * The first positive answer per provider wins; subsequent sources are
32
28
  * recorded as "also available from" so the picker can show alternatives
@@ -61,7 +57,8 @@
61
57
  * picker can render immediately and refine if discovery completes later.
62
58
  */
63
59
  import { EnvCredentialProvider } from '@namzu/sdk';
64
- import { credentialsPath, readStoredSubscriptionCredential } from './credential-store.js';
60
+ import { credentialsPath, readStoredCodexCredential, readStoredSubscriptionCredential, } from './credential-store.js';
61
+ import { claudeCredentialsPath, codexCredentialsPath, preferFresherCredential, readClaudeFileCredential, readCodexFileCredential, } from './harness-credentials.js';
65
62
  import { KEYCHAIN_SERVICE, readAgentKeychainCredential } from './keychain.js';
66
63
  import { PROVIDER_REGISTRY } from './registry.js';
67
64
  const DEFAULT_PROBE_TIMEOUT_MS = 500;
@@ -103,14 +100,96 @@ export async function discoverProviders(opts = {}) {
103
100
  const storedCredential = opts.skipStored
104
101
  ? null
105
102
  : readStoredSubscriptionCredential(...(opts.home === undefined ? [] : [opts.home]));
103
+ const storedCodexCredential = opts.skipStored
104
+ ? null
105
+ : readStoredCodexCredential(...(opts.home === undefined ? [] : [opts.home]));
106
106
  // macOS-only: the OAuth credential a co-installed tool keeps in the login
107
107
  // Keychain.
108
108
  const keychainCredential = opts.skipKeychain ? null : readAgentKeychainCredential();
109
+ const claudeFileCredential = readClaudeFileCredential(opts.home);
110
+ const codexFileCredential = readCodexFileCredential(opts.home, env);
111
+ const usableCodexFileCredential = codexFileCredential?.expiresAt === undefined ||
112
+ codexFileCredential.expiresAt - Date.now() > 60_000
113
+ ? codexFileCredential
114
+ : null;
109
115
  for (const id of Object.keys(PROVIDER_REGISTRY)) {
110
116
  const entry = PROVIDER_REGISTRY[id];
111
117
  const sources = [];
112
118
  let apiKey;
113
119
  let oauth;
120
+ let codex;
121
+ if (id === 'anthropic') {
122
+ const borrowed = preferFresherCredential(claudeFileCredential, keychainCredential);
123
+ const usableBorrowed = borrowed?.expiresAt === undefined || borrowed.expiresAt - Date.now() > 60_000
124
+ ? borrowed
125
+ : null;
126
+ const borrowedSource = usableBorrowed === claudeFileCredential && usableBorrowed
127
+ ? {
128
+ kind: 'claude-file',
129
+ path: claudeCredentialsPath(opts.home),
130
+ }
131
+ : usableBorrowed
132
+ ? { kind: 'keychain', service: KEYCHAIN_SERVICE }
133
+ : undefined;
134
+ if (usableBorrowed && borrowedSource) {
135
+ if (apiKey === undefined) {
136
+ apiKey = usableBorrowed.accessToken;
137
+ oauth = {
138
+ refreshToken: usableBorrowed.refreshToken,
139
+ expiresAt: usableBorrowed.expiresAt,
140
+ origin: borrowedSource.kind === 'claude-file' ? 'claude-file' : 'keychain',
141
+ };
142
+ }
143
+ sources.push(borrowedSource);
144
+ }
145
+ const otherBorrowedSource = usableBorrowed && usableBorrowed === claudeFileCredential && keychainCredential
146
+ ? { kind: 'keychain', service: KEYCHAIN_SERVICE }
147
+ : usableBorrowed && usableBorrowed === keychainCredential && claudeFileCredential
148
+ ? {
149
+ kind: 'claude-file',
150
+ path: claudeCredentialsPath(opts.home),
151
+ }
152
+ : undefined;
153
+ if (otherBorrowedSource)
154
+ sources.push(otherBorrowedSource);
155
+ if (storedCredential) {
156
+ if (apiKey === undefined) {
157
+ apiKey = storedCredential.accessToken;
158
+ oauth = {
159
+ refreshToken: storedCredential.refreshToken,
160
+ expiresAt: storedCredential.expiresAt,
161
+ origin: 'stored',
162
+ };
163
+ }
164
+ sources.push({
165
+ kind: 'stored',
166
+ path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
167
+ });
168
+ }
169
+ }
170
+ if (id === 'codex' && (storedCodexCredential || usableCodexFileCredential)) {
171
+ const credential = usableCodexFileCredential ?? storedCodexCredential;
172
+ if (!credential)
173
+ throw new Error('unreachable');
174
+ apiKey = credential.accessToken;
175
+ sources.push({
176
+ kind: usableCodexFileCredential ? 'codex-file' : 'stored',
177
+ path: usableCodexFileCredential
178
+ ? codexCredentialsPath(opts.home, env)
179
+ : credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
180
+ });
181
+ codex = {
182
+ accountId: credential.accountId,
183
+ expiresAt: credential.expiresAt,
184
+ origin: usableCodexFileCredential ? 'codex-file' : 'stored',
185
+ };
186
+ if (storedCodexCredential && usableCodexFileCredential) {
187
+ sources.push({
188
+ kind: 'stored',
189
+ path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
190
+ });
191
+ }
192
+ }
114
193
  for (const envName of entry.envVars) {
115
194
  // Through the SDK's seam rather than a direct `env[envName]`. The
116
195
  // read is identical; what changes is that a host embedding the SDK
@@ -124,35 +203,6 @@ export async function discoverProviders(opts = {}) {
124
203
  sources.push({ kind: 'env', envName });
125
204
  }
126
205
  }
127
- if (id === 'anthropic' && storedCredential) {
128
- if (apiKey === undefined)
129
- apiKey = storedCredential.accessToken;
130
- sources.push({
131
- kind: 'stored',
132
- path: credentialsPath(...(opts.home === undefined ? [] : [opts.home])),
133
- });
134
- // Only carry refresh metadata when this token is the one we'll
135
- // actually use (an env/secrets token has no refresh path).
136
- if (apiKey === storedCredential.accessToken) {
137
- oauth = {
138
- refreshToken: storedCredential.refreshToken,
139
- expiresAt: storedCredential.expiresAt,
140
- origin: 'stored',
141
- };
142
- }
143
- }
144
- if (id === 'anthropic' && keychainCredential) {
145
- if (apiKey === undefined)
146
- apiKey = keychainCredential.accessToken;
147
- sources.push({ kind: 'keychain', service: KEYCHAIN_SERVICE });
148
- if (apiKey === keychainCredential.accessToken) {
149
- oauth = {
150
- refreshToken: keychainCredential.refreshToken,
151
- expiresAt: keychainCredential.expiresAt,
152
- origin: 'keychain',
153
- };
154
- }
155
- }
156
206
  if (sources.length === 0 && entry.probeUrl && !opts.skipProbes) {
157
207
  const reachable = await probe(entry.probeUrl, opts);
158
208
  if (reachable) {
@@ -166,6 +216,7 @@ export async function discoverProviders(opts = {}) {
166
216
  apiKey,
167
217
  baseUrl: entry.defaultBaseUrl,
168
218
  ...(oauth ? { oauth } : {}),
219
+ ...(codex ? { codex } : {}),
169
220
  alternatives: sources.slice(1),
170
221
  });
171
222
  }
@@ -177,7 +228,10 @@ async function probe(url, opts) {
177
228
  const controller = new AbortController();
178
229
  const timer = setTimeout(() => controller.abort(), opts.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS);
179
230
  try {
180
- const res = await fetchFn(url, { method: 'GET', signal: controller.signal });
231
+ const res = await fetchFn(url, {
232
+ method: 'GET',
233
+ signal: controller.signal,
234
+ });
181
235
  return res.ok;
182
236
  }
183
237
  catch {