@namzu/cli 20.0.0 → 22.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 (224) hide show
  1. package/CHANGELOG.md +371 -0
  2. package/README.md +71 -10
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +24 -2
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/acp.d.ts.map +1 -1
  7. package/dist/commands/acp.js +6 -1
  8. package/dist/commands/acp.js.map +1 -1
  9. package/dist/commands/run-stream.d.ts.map +1 -1
  10. package/dist/commands/run-stream.js +9 -1
  11. package/dist/commands/run-stream.js.map +1 -1
  12. package/dist/commands/run.d.ts.map +1 -1
  13. package/dist/commands/run.js +15 -12
  14. package/dist/commands/run.js.map +1 -1
  15. package/dist/config/load.d.ts.map +1 -1
  16. package/dist/config/load.js +44 -2
  17. package/dist/config/load.js.map +1 -1
  18. package/dist/config/schema.d.ts +24 -13
  19. package/dist/config/schema.d.ts.map +1 -1
  20. package/dist/config/schema.js.map +1 -1
  21. package/dist/doctor/checks/chain.d.ts.map +1 -1
  22. package/dist/doctor/checks/chain.js +11 -5
  23. package/dist/doctor/checks/chain.js.map +1 -1
  24. package/dist/doctor/checks/credentials.d.ts.map +1 -1
  25. package/dist/doctor/checks/credentials.js +7 -1
  26. package/dist/doctor/checks/credentials.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/installation.d.ts +5 -0
  31. package/dist/installation.d.ts.map +1 -0
  32. package/dist/installation.js +48 -0
  33. package/dist/installation.js.map +1 -0
  34. package/dist/integrations/providers/access.d.ts +7 -0
  35. package/dist/integrations/providers/access.d.ts.map +1 -0
  36. package/dist/integrations/providers/access.js +17 -0
  37. package/dist/integrations/providers/access.js.map +1 -0
  38. package/dist/integrations/providers/current-credential.d.ts +4 -0
  39. package/dist/integrations/providers/current-credential.d.ts.map +1 -0
  40. package/dist/integrations/providers/current-credential.js +45 -0
  41. package/dist/integrations/providers/current-credential.js.map +1 -0
  42. package/dist/integrations/providers/discover.d.ts +28 -54
  43. package/dist/integrations/providers/discover.d.ts.map +1 -1
  44. package/dist/integrations/providers/discover.js +62 -58
  45. package/dist/integrations/providers/discover.js.map +1 -1
  46. package/dist/integrations/providers/gemini-credentials.d.ts +13 -0
  47. package/dist/integrations/providers/gemini-credentials.d.ts.map +1 -0
  48. package/dist/integrations/providers/gemini-credentials.js +148 -0
  49. package/dist/integrations/providers/gemini-credentials.js.map +1 -0
  50. package/dist/integrations/providers/harness-credentials.d.ts +14 -0
  51. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
  52. package/dist/integrations/providers/harness-credentials.js +46 -0
  53. package/dist/integrations/providers/harness-credentials.js.map +1 -1
  54. package/dist/integrations/providers/model-reasoning.d.ts +4 -0
  55. package/dist/integrations/providers/model-reasoning.d.ts.map +1 -0
  56. package/dist/integrations/providers/model-reasoning.js +46 -0
  57. package/dist/integrations/providers/model-reasoning.js.map +1 -0
  58. package/dist/integrations/providers/register.d.ts +1 -1
  59. package/dist/integrations/providers/register.d.ts.map +1 -1
  60. package/dist/integrations/providers/register.js +16 -1
  61. package/dist/integrations/providers/register.js.map +1 -1
  62. package/dist/integrations/providers/registry.d.ts +4 -4
  63. package/dist/integrations/providers/registry.d.ts.map +1 -1
  64. package/dist/integrations/providers/registry.js +33 -0
  65. package/dist/integrations/providers/registry.js.map +1 -1
  66. package/dist/integrations/providers/setup.d.ts +49 -0
  67. package/dist/integrations/providers/setup.d.ts.map +1 -0
  68. package/dist/integrations/providers/setup.js +105 -0
  69. package/dist/integrations/providers/setup.js.map +1 -0
  70. package/dist/integrations/sessions/context-inventory.d.ts +4 -0
  71. package/dist/integrations/sessions/context-inventory.d.ts.map +1 -0
  72. package/dist/integrations/sessions/context-inventory.js +44 -0
  73. package/dist/integrations/sessions/context-inventory.js.map +1 -0
  74. package/dist/integrations/sessions/conversation-search.d.ts +60 -0
  75. package/dist/integrations/sessions/conversation-search.d.ts.map +1 -0
  76. package/dist/integrations/sessions/conversation-search.js +461 -0
  77. package/dist/integrations/sessions/conversation-search.js.map +1 -0
  78. package/dist/integrations/sessions/store.d.ts +1 -0
  79. package/dist/integrations/sessions/store.d.ts.map +1 -1
  80. package/dist/integrations/sessions/store.js +17 -4
  81. package/dist/integrations/sessions/store.js.map +1 -1
  82. package/dist/integrations/sessions/task-context.d.ts +4 -0
  83. package/dist/integrations/sessions/task-context.d.ts.map +1 -0
  84. package/dist/integrations/sessions/task-context.js +73 -0
  85. package/dist/integrations/sessions/task-context.js.map +1 -0
  86. package/dist/integrations/subagents/activity.d.ts +3 -1
  87. package/dist/integrations/subagents/activity.d.ts.map +1 -1
  88. package/dist/integrations/subagents/activity.js +32 -5
  89. package/dist/integrations/subagents/activity.js.map +1 -1
  90. package/dist/integrations/subagents/history.d.ts +26 -0
  91. package/dist/integrations/subagents/history.d.ts.map +1 -0
  92. package/dist/integrations/subagents/history.js +76 -0
  93. package/dist/integrations/subagents/history.js.map +1 -0
  94. package/dist/integrations/subagents/model-effort.d.ts +4 -0
  95. package/dist/integrations/subagents/model-effort.d.ts.map +1 -0
  96. package/dist/integrations/subagents/model-effort.js +12 -0
  97. package/dist/integrations/subagents/model-effort.js.map +1 -0
  98. package/dist/integrations/subagents/runtime.d.ts +27 -7
  99. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  100. package/dist/integrations/subagents/runtime.js +305 -35
  101. package/dist/integrations/subagents/runtime.js.map +1 -1
  102. package/dist/integrations/web/search.d.ts +11 -0
  103. package/dist/integrations/web/search.d.ts.map +1 -0
  104. package/dist/integrations/web/search.js +73 -0
  105. package/dist/integrations/web/search.js.map +1 -0
  106. package/dist/memory/io.d.ts +12 -0
  107. package/dist/memory/io.d.ts.map +1 -0
  108. package/dist/memory/io.js +177 -0
  109. package/dist/memory/io.js.map +1 -0
  110. package/dist/memory/presentation.d.ts +4 -1
  111. package/dist/memory/presentation.d.ts.map +1 -1
  112. package/dist/memory/presentation.js +16 -2
  113. package/dist/memory/presentation.js.map +1 -1
  114. package/dist/memory/store.d.ts +17 -3
  115. package/dist/memory/store.d.ts.map +1 -1
  116. package/dist/memory/store.js +61 -35
  117. package/dist/memory/store.js.map +1 -1
  118. package/dist/output-schema.d.ts +4 -0
  119. package/dist/output-schema.d.ts.map +1 -0
  120. package/dist/output-schema.js +18 -0
  121. package/dist/output-schema.js.map +1 -0
  122. package/dist/tui/AgentExplorer.d.ts +13 -2
  123. package/dist/tui/AgentExplorer.d.ts.map +1 -1
  124. package/dist/tui/AgentExplorer.js +85 -23
  125. package/dist/tui/AgentExplorer.js.map +1 -1
  126. package/dist/tui/App.d.ts.map +1 -1
  127. package/dist/tui/App.js +694 -150
  128. package/dist/tui/App.js.map +1 -1
  129. package/dist/tui/BrandHeader.d.ts +1 -4
  130. package/dist/tui/BrandHeader.d.ts.map +1 -1
  131. package/dist/tui/BrandHeader.js +4 -8
  132. package/dist/tui/BrandHeader.js.map +1 -1
  133. package/dist/tui/Composer.d.ts +2 -1
  134. package/dist/tui/Composer.d.ts.map +1 -1
  135. package/dist/tui/Composer.js +26 -3
  136. package/dist/tui/Composer.js.map +1 -1
  137. package/dist/tui/PermissionOverlay.d.ts +5 -2
  138. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  139. package/dist/tui/PermissionOverlay.js +14 -6
  140. package/dist/tui/PermissionOverlay.js.map +1 -1
  141. package/dist/tui/Picker.d.ts +2 -1
  142. package/dist/tui/Picker.d.ts.map +1 -1
  143. package/dist/tui/Picker.js +104 -24
  144. package/dist/tui/Picker.js.map +1 -1
  145. package/dist/tui/ProviderSetup.d.ts +6 -0
  146. package/dist/tui/ProviderSetup.d.ts.map +1 -0
  147. package/dist/tui/ProviderSetup.js +125 -0
  148. package/dist/tui/ProviderSetup.js.map +1 -0
  149. package/dist/tui/ResumePicker.d.ts.map +1 -1
  150. package/dist/tui/ResumePicker.js +5 -3
  151. package/dist/tui/ResumePicker.js.map +1 -1
  152. package/dist/tui/StatusPanel.d.ts +5 -0
  153. package/dist/tui/StatusPanel.d.ts.map +1 -0
  154. package/dist/tui/StatusPanel.js +11 -0
  155. package/dist/tui/StatusPanel.js.map +1 -0
  156. package/dist/tui/TextPrompt.d.ts +3 -1
  157. package/dist/tui/TextPrompt.d.ts.map +1 -1
  158. package/dist/tui/TextPrompt.js +55 -9
  159. package/dist/tui/TextPrompt.js.map +1 -1
  160. package/dist/tui/ToolOutputViewer.d.ts +11 -0
  161. package/dist/tui/ToolOutputViewer.d.ts.map +1 -0
  162. package/dist/tui/ToolOutputViewer.js +39 -0
  163. package/dist/tui/ToolOutputViewer.js.map +1 -0
  164. package/dist/tui/Transcript.d.ts.map +1 -1
  165. package/dist/tui/Transcript.js +10 -4
  166. package/dist/tui/Transcript.js.map +1 -1
  167. package/dist/tui/agent.d.ts +24 -3
  168. package/dist/tui/agent.d.ts.map +1 -1
  169. package/dist/tui/agent.js +362 -97
  170. package/dist/tui/agent.js.map +1 -1
  171. package/dist/tui/live-window.d.ts.map +1 -1
  172. package/dist/tui/live-window.js +5 -1
  173. package/dist/tui/live-window.js.map +1 -1
  174. package/dist/tui/logo.d.ts +4 -4
  175. package/dist/tui/logo.d.ts.map +1 -1
  176. package/dist/tui/logo.js +4 -4
  177. package/dist/tui/logo.js.map +1 -1
  178. package/dist/tui/model-catalogue-view.d.ts +3 -0
  179. package/dist/tui/model-catalogue-view.d.ts.map +1 -0
  180. package/dist/tui/model-catalogue-view.js +50 -0
  181. package/dist/tui/model-catalogue-view.js.map +1 -0
  182. package/dist/tui/model-choices.d.ts +3 -1
  183. package/dist/tui/model-choices.d.ts.map +1 -1
  184. package/dist/tui/model-choices.js +12 -1
  185. package/dist/tui/model-choices.js.map +1 -1
  186. package/dist/tui/model-search.d.ts +4 -0
  187. package/dist/tui/model-search.d.ts.map +1 -0
  188. package/dist/tui/model-search.js +11 -0
  189. package/dist/tui/model-search.js.map +1 -0
  190. package/dist/tui/model-selection-intent.d.ts +8 -0
  191. package/dist/tui/model-selection-intent.d.ts.map +1 -0
  192. package/dist/tui/model-selection-intent.js +96 -0
  193. package/dist/tui/model-selection-intent.js.map +1 -0
  194. package/dist/tui/model-switch-tool.d.ts +7 -0
  195. package/dist/tui/model-switch-tool.d.ts.map +1 -0
  196. package/dist/tui/model-switch-tool.js +74 -0
  197. package/dist/tui/model-switch-tool.js.map +1 -0
  198. package/dist/tui/model-switch.d.ts +35 -0
  199. package/dist/tui/model-switch.d.ts.map +1 -0
  200. package/dist/tui/model-switch.js +106 -0
  201. package/dist/tui/model-switch.js.map +1 -0
  202. package/dist/tui/permission-review.d.ts +2 -0
  203. package/dist/tui/permission-review.d.ts.map +1 -1
  204. package/dist/tui/permission-review.js +82 -15
  205. package/dist/tui/permission-review.js.map +1 -1
  206. package/dist/tui/run-interruption.d.ts +7 -0
  207. package/dist/tui/run-interruption.d.ts.map +1 -1
  208. package/dist/tui/run-interruption.js +41 -0
  209. package/dist/tui/run-interruption.js.map +1 -1
  210. package/dist/tui/slashCommands.d.ts +7 -0
  211. package/dist/tui/slashCommands.d.ts.map +1 -1
  212. package/dist/tui/slashCommands.js +77 -2
  213. package/dist/tui/slashCommands.js.map +1 -1
  214. package/dist/tui/status-card.d.ts +3 -0
  215. package/dist/tui/status-card.d.ts.map +1 -0
  216. package/dist/tui/status-card.js +30 -0
  217. package/dist/tui/status-card.js.map +1 -0
  218. package/dist/tui/status-panel-layout.d.ts +11 -0
  219. package/dist/tui/status-panel-layout.d.ts.map +1 -0
  220. package/dist/tui/status-panel-layout.js +42 -0
  221. package/dist/tui/status-panel-layout.js.map +1 -0
  222. package/dist/tui/types.d.ts +7 -1
  223. package/dist/tui/types.d.ts.map +1 -1
  224. package/package.json +9 -7
@@ -1,66 +1,30 @@
1
1
  /**
2
- * Credential discoverer for LLM provider clients.
2
+ * Discover usable credential sources, reachable local servers, and public Zen.
3
3
  *
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`?
8
- * 4. Is the probe URL (if any) reachable right now?
4
+ * Claude/Codex device sessions precede Namzu-owned sign-ins and their optional
5
+ * API environment alternatives. Gemini prefers explicit API keys, then reuses its
6
+ * installed CLI Google session. Zen/Go use direct API environment variables,
7
+ * then exact API entries in OpenCode's owner store. Anonymous Zen is available
8
+ * without a credential or local installation and is ordered last.
9
9
  *
10
- * The header used to say "three" and list two, and the one it omitted was the
11
- * Keychain — the question that reads a secret off the machine, so the one a
12
- * reader most needs to see. A count that disagrees with its own list is the
13
- * tell that the list stopped being maintained; in a file about credentials that
14
- * is worth more than a typo.
15
- *
16
- * **The Keychain path is macOS-only, and question 2 is why that is no longer a
17
- * hole.** `readAgentKeychainCredential` returns `null` on any other platform
18
- * before it looks at anything; it reads a credential belonging to a
19
- * co-installed tool, so it can only ever help someone who has that tool, on
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.
22
- *
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.
26
- *
27
- * The first positive answer per provider wins; subsequent sources are
28
- * recorded as "also available from" so the picker can show alternatives
29
- * (e.g. anthropic via env, also reachable as a local server).
30
- *
31
- * ## Membership means "usable right now", and two consumers depend on that
32
- *
33
- * A provider appears in the returned list only when a source actually answered.
34
- * That is not merely a description of the loop — it is the contract the readers
35
- * are built on, and it is why this function does NOT return a local provider
36
- * whose server is down:
37
- *
38
- * - the `providers.chain` doctor check reads presence itself as the verdict
39
- * for a provider that needs no key (`requiresApiKey ? apiKey : Boolean(det)`),
40
- * so an unreachable entry would make it print `reachable` for a dead server;
41
- * - the session's chain builder applies no credential test to a local
42
- * provider, so an unreachable entry would be built into the chain and fail
43
- * on the day it was supposed to rescue a run.
44
- *
45
- * `DetectionSource` has no way to say "found, not usable" either — every
46
- * variant asserts a working source.
47
- *
48
- * A dead branch here used to propose the opposite: list a local provider whose
49
- * probe failed, so the picker could show `(not running)` and the operator would
50
- * know they could start the server. It was removed rather than built, because
51
- * the operator-facing half of that idea already exists somewhere better — the
52
- * picker's empty state names both local servers and their ports and says to
53
- * start one — while the machine-facing half would have made the two readers
54
- * above lie. See cogitave/namzu#258.
55
- *
56
- * Discovery is non-throwing. Network probes have short timeouts. The
57
- * picker can render immediately and refine if discovery completes later.
10
+ * A public source promises only access to the documented free model catalogue;
11
+ * it does not assert network reachability. Local servers still require a
12
+ * successful bounded probe. Discovery never writes borrowed credentials.
58
13
  */
59
14
  import type { CredentialOrigin } from './oauth.js';
60
15
  import { type ProviderId, type ProviderRegistryEntry } from './registry.js';
61
16
  export type DetectionSource = {
62
17
  readonly kind: 'env';
63
18
  readonly envName: string;
19
+ }
20
+ /** Public free-model access; does not assert connectivity or an account credential. */
21
+ | {
22
+ readonly kind: 'public';
23
+ }
24
+ /** A read-only API key owned by OpenCode, kept on its original billing route. */
25
+ | {
26
+ readonly kind: 'opencode-file';
27
+ readonly path: string;
64
28
  } | {
65
29
  readonly kind: 'probe';
66
30
  readonly url: string;
@@ -78,6 +42,11 @@ export type DetectionSource = {
78
42
  readonly kind: 'codex-file';
79
43
  readonly path: string;
80
44
  }
45
+ /** A Google account session owned by Gemini CLI. */
46
+ | {
47
+ readonly kind: 'gemini-file';
48
+ readonly path: string;
49
+ }
81
50
  /**
82
51
  * namzu's own credential store — a subscription the operator signed in to
83
52
  * from inside namzu. Carries the path because "where did this come from"
@@ -129,6 +98,11 @@ export interface DetectedProvider {
129
98
  readonly expiresAt?: number;
130
99
  readonly origin: 'codex-file' | 'stored';
131
100
  };
101
+ /** Exact owner file and optional Google Cloud billing project, never a Namzu project ID. */
102
+ readonly gemini?: {
103
+ readonly sourcePath: string;
104
+ readonly projectId?: string;
105
+ };
132
106
  /** Other sources that also satisfy this provider — informational. */
133
107
  readonly alternatives: readonly DetectionSource[];
134
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
@@ -1,64 +1,21 @@
1
1
  /**
2
- * Credential discoverer for LLM provider clients.
2
+ * Discover usable credential sources, reachable local servers, and public Zen.
3
3
  *
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`?
8
- * 4. Is the probe URL (if any) reachable right now?
4
+ * Claude/Codex device sessions precede Namzu-owned sign-ins and their optional
5
+ * API environment alternatives. Gemini prefers explicit API keys, then reuses its
6
+ * installed CLI Google session. Zen/Go use direct API environment variables,
7
+ * then exact API entries in OpenCode's owner store. Anonymous Zen is available
8
+ * without a credential or local installation and is ordered last.
9
9
  *
10
- * The header used to say "three" and list two, and the one it omitted was the
11
- * Keychain — the question that reads a secret off the machine, so the one a
12
- * reader most needs to see. A count that disagrees with its own list is the
13
- * tell that the list stopped being maintained; in a file about credentials that
14
- * is worth more than a typo.
15
- *
16
- * **The Keychain path is macOS-only, and question 2 is why that is no longer a
17
- * hole.** `readAgentKeychainCredential` returns `null` on any other platform
18
- * before it looks at anything; it reads a credential belonging to a
19
- * co-installed tool, so it can only ever help someone who has that tool, on
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.
22
- *
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.
26
- *
27
- * The first positive answer per provider wins; subsequent sources are
28
- * recorded as "also available from" so the picker can show alternatives
29
- * (e.g. anthropic via env, also reachable as a local server).
30
- *
31
- * ## Membership means "usable right now", and two consumers depend on that
32
- *
33
- * A provider appears in the returned list only when a source actually answered.
34
- * That is not merely a description of the loop — it is the contract the readers
35
- * are built on, and it is why this function does NOT return a local provider
36
- * whose server is down:
37
- *
38
- * - the `providers.chain` doctor check reads presence itself as the verdict
39
- * for a provider that needs no key (`requiresApiKey ? apiKey : Boolean(det)`),
40
- * so an unreachable entry would make it print `reachable` for a dead server;
41
- * - the session's chain builder applies no credential test to a local
42
- * provider, so an unreachable entry would be built into the chain and fail
43
- * on the day it was supposed to rescue a run.
44
- *
45
- * `DetectionSource` has no way to say "found, not usable" either — every
46
- * variant asserts a working source.
47
- *
48
- * A dead branch here used to propose the opposite: list a local provider whose
49
- * probe failed, so the picker could show `(not running)` and the operator would
50
- * know they could start the server. It was removed rather than built, because
51
- * the operator-facing half of that idea already exists somewhere better — the
52
- * picker's empty state names both local servers and their ports and says to
53
- * start one — while the machine-facing half would have made the two readers
54
- * above lie. See cogitave/namzu#258.
55
- *
56
- * Discovery is non-throwing. Network probes have short timeouts. The
57
- * picker can render immediately and refine if discovery completes later.
10
+ * A public source promises only access to the documented free model catalogue;
11
+ * it does not assert network reachability. Local servers still require a
12
+ * successful bounded probe. Discovery never writes borrowed credentials.
58
13
  */
59
14
  import { EnvCredentialProvider } from '@namzu/sdk';
15
+ import { hasApiCredential } from './access.js';
60
16
  import { credentialsPath, readStoredCodexCredential, readStoredSubscriptionCredential, } from './credential-store.js';
61
- import { preferFresherCredential, readClaudeFileCredentialCandidates, readCodexFileCredentialCandidates, } from './harness-credentials.js';
17
+ import { readGeminiFileCredentialCandidates } from './gemini-credentials.js';
18
+ import { preferFresherCredential, readClaudeFileCredentialCandidates, readCodexFileCredentialCandidates, readOpenCodeApiCredentialCandidates, } from './harness-credentials.js';
62
19
  import { KEYCHAIN_SERVICE, readAgentKeychainCredential } from './keychain.js';
63
20
  import { PROVIDER_REGISTRY } from './registry.js';
64
21
  /**
@@ -76,6 +33,8 @@ import { PROVIDER_REGISTRY } from './registry.js';
76
33
  */
77
34
  export function signedInSubscriptionProviders(detected) {
78
35
  return detected.filter((provider) => {
36
+ if (provider.entry.id === 'google')
37
+ return provider.source.kind === 'gemini-file';
79
38
  if (provider.entry.subscriptionLogin === undefined)
80
39
  return false;
81
40
  return [provider.source, ...provider.alternatives].some((source) => source.kind === 'claude-file' ||
@@ -95,6 +54,7 @@ export async function discoverProviders(opts = {}) {
95
54
  // The vocabulary agreement is asserted instead, where it can fail loudly.
96
55
  const credentials = new EnvCredentialProvider({ env, anyKey: true });
97
56
  const detected = [];
57
+ const geminiCredentials = readGeminiFileCredentialCandidates(opts.home, env, opts.windowsHome);
98
58
  // Read both credential sources once, up front, so the loop body stays
99
59
  // uniform. Only anthropic consumes either.
100
60
  //
@@ -131,6 +91,7 @@ export async function discoverProviders(opts = {}) {
131
91
  // Keychain.
132
92
  const keychainCredential = opts.skipKeychain ? null : readAgentKeychainCredential();
133
93
  const claudeFileCredentials = readClaudeFileCredentialCandidates(opts.home, env, opts.windowsHome);
94
+ const openCodeCredentials = readOpenCodeApiCredentialCandidates(opts.home, env, opts.windowsHome);
134
95
  const codexFileCredentials = readCodexFileCredentialCandidates(opts.home, env, opts.windowsHome).filter((candidate) => candidate.credential.expiresAt === undefined ||
135
96
  candidate.credential.expiresAt - Date.now() > 60_000);
136
97
  const usableCodexFileCredential = codexFileCredentials.reduce((current, candidate) => {
@@ -145,8 +106,10 @@ export async function discoverProviders(opts = {}) {
145
106
  const entry = PROVIDER_REGISTRY[id];
146
107
  const sources = [];
147
108
  let apiKey;
109
+ let anonymousSelected = false;
148
110
  let oauth;
149
111
  let codex;
112
+ let gemini;
150
113
  if (id === 'anthropic') {
151
114
  const borrowedCandidates = [
152
115
  ...claudeFileCredentials.map(({ credential, path }) => ({
@@ -157,7 +120,10 @@ export async function discoverProviders(opts = {}) {
157
120
  ? [
158
121
  {
159
122
  credential: keychainCredential,
160
- source: { kind: 'keychain', service: KEYCHAIN_SERVICE },
123
+ source: {
124
+ kind: 'keychain',
125
+ service: KEYCHAIN_SERVICE,
126
+ },
161
127
  },
162
128
  ]
163
129
  : []),
@@ -239,12 +205,45 @@ export async function discoverProviders(opts = {}) {
239
205
  // provider, and that the "is this a credential" vocabulary is the
240
206
  // one the host-bash scrub uses rather than a third table beside it.
241
207
  const resolved = await credentials.resolve(envName);
242
- if (resolved) {
208
+ if (anonymousSelected)
209
+ continue;
210
+ if ((id === 'zen' || id === 'zen-go') && resolved?.value.trim() === 'public') {
211
+ if (sources.length === 0) {
212
+ anonymousSelected = true;
213
+ sources.push({ kind: 'env', envName });
214
+ }
215
+ continue;
216
+ }
217
+ if (resolved && hasApiCredential(entry, resolved.value)) {
243
218
  if (apiKey === undefined)
244
219
  apiKey = resolved.value;
245
220
  sources.push({ kind: 'env', envName });
246
221
  }
247
222
  }
223
+ if (id === 'google') {
224
+ const borrowed = geminiCredentials[0];
225
+ if (borrowed && apiKey === undefined) {
226
+ apiKey = borrowed.credential.accessToken;
227
+ sources.push({ kind: 'gemini-file', path: borrowed.path });
228
+ const projectId = env.GOOGLE_CLOUD_PROJECT?.trim() || env.GOOGLE_CLOUD_PROJECT_ID?.trim();
229
+ gemini = { sourcePath: borrowed.path, ...(projectId ? { projectId } : {}) };
230
+ }
231
+ }
232
+ if (id === 'zen' || id === 'zen-go') {
233
+ for (const candidate of openCodeCredentials) {
234
+ if (anonymousSelected)
235
+ break;
236
+ if (candidate.provider !== id)
237
+ continue;
238
+ if (apiKey === undefined)
239
+ apiKey = candidate.apiKey;
240
+ sources.push(candidate.source);
241
+ }
242
+ if (id === 'zen' && sources.length === 0)
243
+ sources.push({ kind: 'public' });
244
+ }
245
+ if (id === 'zen-go' && anonymousSelected)
246
+ continue;
248
247
  if (sources.length === 0 && entry.probeUrl && !opts.skipProbes) {
249
248
  const reachable = await probe(entry.probeUrl, opts);
250
249
  if (reachable) {
@@ -259,11 +258,16 @@ export async function discoverProviders(opts = {}) {
259
258
  baseUrl: entry.defaultBaseUrl,
260
259
  ...(oauth ? { oauth } : {}),
261
260
  ...(codex ? { codex } : {}),
261
+ ...(gemini ? { gemini } : {}),
262
262
  alternatives: sources.slice(1),
263
263
  });
264
264
  }
265
265
  }
266
- return detected;
266
+ // A public fallback should not displace an existing account or local server
267
+ // when a headless caller has no saved provider preference. An explicit
268
+ // public environment marker retains env provenance but is still anonymous.
269
+ const anonymous = (provider) => provider.entry.id === 'zen' && !hasApiCredential(provider.entry, provider.apiKey);
270
+ return detected.sort((left, right) => Number(anonymous(left)) - Number(anonymous(right)));
267
271
  }
268
272
  async function probe(url, opts) {
269
273
  const fetchFn = opts.fetch ?? globalThis.fetch;
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/integrations/providers/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface GeminiCredential {
2
+ readonly accessToken: string;
3
+ readonly refreshToken?: string;
4
+ readonly expiresAt?: number;
5
+ }
6
+ export declare function readGeminiCredentialFile(path: string): GeminiCredential | null;
7
+ export declare function readGeminiFileCredentialCandidates(home: string | undefined, env?: NodeJS.ProcessEnv, windowsHome?: string | null | undefined): readonly {
8
+ readonly path: string;
9
+ readonly credential: GeminiCredential;
10
+ }[];
11
+ /** Refresh in memory only. Re-read the owner's file before every request so logout is respected. */
12
+ export declare function createGeminiAccessTokenResolver(path: string, fetchFn?: typeof fetch, env?: NodeJS.ProcessEnv): (signal?: AbortSignal) => Promise<string>;
13
+ //# sourceMappingURL=gemini-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-credentials.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/gemini-credentials.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqC9E;AAED,wBAAgB,kCAAkC,CACjD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAA2D,GACtF,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,EAAE,CAkB7E;AAED,oGAAoG;AACpG,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,OAAO,KAAwB,EACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CA+E3C"}
@@ -0,0 +1,148 @@
1
+ /** Read-only reuse of the Google account session owned by Gemini CLI. */
2
+ import { constants, closeSync, fstatSync, openSync, readSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { wslWindowsHome } from './harness-credentials.js';
6
+ const REFRESH_URL = 'https://oauth2.googleapis.com/token';
7
+ const MAX_BYTES = 1024 * 1024;
8
+ export function readGeminiCredentialFile(path) {
9
+ let fd;
10
+ try {
11
+ fd = openSync(path, constants.O_RDONLY | constants.O_NONBLOCK);
12
+ const stat = fstatSync(fd);
13
+ if (!stat.isFile() || stat.size > MAX_BYTES)
14
+ return null;
15
+ const buffer = Buffer.alloc(MAX_BYTES + 1);
16
+ let size = 0;
17
+ while (size < buffer.length) {
18
+ const count = readSync(fd, buffer, size, buffer.length - size, null);
19
+ if (count === 0)
20
+ break;
21
+ size += count;
22
+ }
23
+ if (size > MAX_BYTES)
24
+ return null;
25
+ const value = JSON.parse(buffer.subarray(0, size).toString('utf8'));
26
+ if (!value || typeof value !== 'object' || Array.isArray(value))
27
+ return null;
28
+ const record = value;
29
+ if (typeof record.access_token !== 'string' || !record.access_token.trim())
30
+ return null;
31
+ if (record.expiry_date !== undefined &&
32
+ (typeof record.expiry_date !== 'number' ||
33
+ !Number.isFinite(record.expiry_date) ||
34
+ record.expiry_date <= 0))
35
+ return null;
36
+ return {
37
+ accessToken: record.access_token,
38
+ ...(typeof record.refresh_token === 'string' && record.refresh_token.trim()
39
+ ? { refreshToken: record.refresh_token }
40
+ : {}),
41
+ ...(typeof record.expiry_date === 'number' ? { expiresAt: record.expiry_date } : {}),
42
+ };
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ finally {
48
+ if (fd !== undefined)
49
+ closeSync(fd);
50
+ }
51
+ }
52
+ export function readGeminiFileCredentialCandidates(home, env = process.env, windowsHome = home === undefined ? wslWindowsHome(env) : null) {
53
+ // Gemini CLI's Storage appends .gemini to its overridden home. An explicit
54
+ // owner location must not fall through to a different signed-in account.
55
+ const paths = env.GEMINI_CLI_HOME
56
+ ? [join(env.GEMINI_CLI_HOME, '.gemini', 'oauth_creds.json')]
57
+ : [
58
+ join(home ?? homedir(), '.gemini', 'oauth_creds.json'),
59
+ ...(windowsHome ? [join(windowsHome, '.gemini', 'oauth_creds.json')] : []),
60
+ ];
61
+ return [...new Set(paths)].flatMap((path) => {
62
+ const credential = readGeminiCredentialFile(path);
63
+ return credential &&
64
+ (credential.expiresAt === undefined ||
65
+ credential.expiresAt > Date.now() + 60_000 ||
66
+ credential.refreshToken)
67
+ ? [{ path, credential }]
68
+ : [];
69
+ });
70
+ }
71
+ /** Refresh in memory only. Re-read the owner's file before every request so logout is respected. */
72
+ export function createGeminiAccessTokenResolver(path, fetchFn = globalThis.fetch, env = process.env) {
73
+ let source;
74
+ let cached;
75
+ let pending;
76
+ return async (signal) => {
77
+ signal?.throwIfAborted();
78
+ const owner = readGeminiCredentialFile(path);
79
+ if (!owner)
80
+ throw new Error('Gemini CLI sign-in is no longer available. Sign in with Gemini CLI again.');
81
+ const fingerprint = JSON.stringify(owner);
82
+ if (source !== fingerprint) {
83
+ source = fingerprint;
84
+ cached = owner;
85
+ pending = undefined;
86
+ }
87
+ const current = cached ?? owner;
88
+ if (current.expiresAt === undefined || current.expiresAt > Date.now() + 60_000)
89
+ return current.accessToken;
90
+ if (!current.refreshToken)
91
+ throw new Error('Gemini CLI sign-in has expired. Sign in with Gemini CLI again.');
92
+ const clientId = env.GOOGLE_OAUTH_CLIENT_ID?.trim();
93
+ const clientSecret = env.GOOGLE_OAUTH_CLIENT_SECRET?.trim();
94
+ if (!clientId || !clientSecret)
95
+ throw new Error('Gemini CLI sign-in has expired. Refresh it in Gemini CLI, or configure the matching GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET.');
96
+ if (!pending) {
97
+ const refresh = current.refreshToken;
98
+ const operation = (async () => {
99
+ const response = await fetchFn(REFRESH_URL, {
100
+ method: 'POST',
101
+ redirect: 'error',
102
+ signal: AbortSignal.timeout(15_000),
103
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
104
+ body: new URLSearchParams({
105
+ client_id: clientId,
106
+ client_secret: clientSecret,
107
+ refresh_token: refresh,
108
+ grant_type: 'refresh_token',
109
+ }),
110
+ });
111
+ if (!response.ok)
112
+ throw new Error(`Gemini CLI sign-in could not be refreshed (HTTP ${response.status}). Sign in with Gemini CLI again.`);
113
+ const value = (await response.json());
114
+ if (typeof value.access_token !== 'string' ||
115
+ !value.access_token ||
116
+ typeof value.expires_in !== 'number' ||
117
+ !Number.isFinite(value.expires_in) ||
118
+ value.expires_in <= 0)
119
+ throw new Error('Google returned an invalid sign-in refresh response.');
120
+ // Do not let a late refresh replace a newer owner session.
121
+ if (source === fingerprint)
122
+ cached = {
123
+ accessToken: value.access_token,
124
+ refreshToken: typeof value.refresh_token === 'string' ? value.refresh_token : refresh,
125
+ expiresAt: Date.now() + value.expires_in * 1000,
126
+ };
127
+ return value.access_token;
128
+ })();
129
+ pending = operation;
130
+ void operation
131
+ .finally(() => {
132
+ if (pending === operation)
133
+ pending = undefined;
134
+ })
135
+ .catch(() => { });
136
+ }
137
+ if (!signal)
138
+ return pending;
139
+ signal.throwIfAborted();
140
+ // A cancelled waiter must not cancel a refresh needed by sibling requests.
141
+ return new Promise((resolve, reject) => {
142
+ const abort = () => reject(signal.reason);
143
+ signal.addEventListener('abort', abort, { once: true });
144
+ pending?.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
145
+ });
146
+ };
147
+ }
148
+ //# sourceMappingURL=gemini-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-credentials.js","sourceRoot":"","sources":["../../../src/integrations/providers/gemini-credentials.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,MAAM,WAAW,GAAG,qCAAqC,CAAA;AACzD,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAA;AAQ7B,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACpD,IAAI,EAAsB,CAAA;IAC1B,IAAI,CAAC;QACJ,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;QAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS;YAAE,OAAO,IAAI,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAC1C,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,OAAO,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,CAAA;YACpE,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAK;YACtB,IAAI,IAAI,KAAK,CAAA;QACd,CAAC;QACD,IAAI,IAAI,GAAG,SAAS;YAAE,OAAO,IAAI,CAAA;QACjC,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAC5E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5E,MAAM,MAAM,GAAG,KAAgC,CAAA;QAC/C,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAA;QACvF,IACC,MAAM,CAAC,WAAW,KAAK,SAAS;YAChC,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;gBACtC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;gBACpC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;YAEzB,OAAO,IAAI,CAAA;QACZ,OAAO;YACN,WAAW,EAAE,MAAM,CAAC,YAAY;YAChC,GAAG,CAAC,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;gBAC1E,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;YAAS,CAAC;QACV,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kCAAkC,CACjD,IAAwB,EACxB,MAAyB,OAAO,CAAC,GAAG,EACpC,cAAyC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;IAExF,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe;QAChC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC5D,CAAC,CAAC;YACA,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC;YACtD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAA;IACH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QACjD,OAAO,UAAU;YAChB,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS;gBAClC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;gBAC1C,UAAU,CAAC,YAAY,CAAC;YACzB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACxB,CAAC,CAAC,EAAE,CAAA;IACN,CAAC,CAAC,CAAA;AACH,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,+BAA+B,CAC9C,IAAY,EACZ,UAAwB,UAAU,CAAC,KAAK,EACxC,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,MAA0B,CAAA;IAC9B,IAAI,MAAoC,CAAA;IACxC,IAAI,OAAoC,CAAA;IACxC,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACvB,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,KAAK;YACT,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;QAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACzC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC5B,MAAM,GAAG,WAAW,CAAA;YACpB,MAAM,GAAG,KAAK,CAAA;YACd,OAAO,GAAG,SAAS,CAAA;QACpB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,CAAA;QAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;YAC7E,OAAO,OAAO,CAAC,WAAW,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,YAAY;YACxB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;QAClF,MAAM,QAAQ,GAAG,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAA;QACnD,MAAM,YAAY,GAAG,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAA;QAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY;YAC7B,MAAM,IAAI,KAAK,CACd,4IAA4I,CAC5I,CAAA;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAA;YACpC,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE;oBAC3C,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;oBACnC,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;oBAChE,IAAI,EAAE,IAAI,eAAe,CAAC;wBACzB,SAAS,EAAE,QAAQ;wBACnB,aAAa,EAAE,YAAY;wBAC3B,aAAa,EAAE,OAAO;wBACtB,UAAU,EAAE,eAAe;qBAC3B,CAAC;iBACF,CAAC,CAAA;gBACF,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACf,MAAM,IAAI,KAAK,CACd,mDAAmD,QAAQ,CAAC,MAAM,mCAAmC,CACrG,CAAA;gBACF,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAA;gBAChE,IACC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,KAAK,CAAC,YAAY;oBACnB,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;oBACpC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;oBAClC,KAAK,CAAC,UAAU,IAAI,CAAC;oBAErB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;gBACxE,2DAA2D;gBAC3D,IAAI,MAAM,KAAK,WAAW;oBACzB,MAAM,GAAG;wBACR,WAAW,EAAE,KAAK,CAAC,YAAY;wBAC/B,YAAY,EAAE,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO;wBACrF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI;qBAC/C,CAAA;gBACF,OAAO,KAAK,CAAC,YAAY,CAAA;YAC1B,CAAC,CAAC,EAAE,CAAA;YACJ,OAAO,GAAG,SAAS,CAAA;YACnB,KAAK,SAAS;iBACZ,OAAO,CAAC,GAAG,EAAE;gBACb,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,GAAG,SAAS,CAAA;YAC/C,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAA;QAC3B,MAAM,CAAC,cAAc,EAAE,CAAA;QACvB,2EAA2E;QAC3E,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACzC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QACzF,CAAC,CAAC,CAAA;IACH,CAAC,CAAA;AACF,CAAC"}
@@ -34,6 +34,20 @@ export declare function wslWindowsHome(env?: NodeJS.ProcessEnv, run?: typeof exe
34
34
  */
35
35
  export declare function readClaudeFileCredentialCandidates(home: string | undefined, env?: NodeJS.ProcessEnv, windowsHome?: string | null | undefined): readonly HarnessCredentialCandidate<AgentOAuthCredential>[];
36
36
  export declare function codexCredentialsPath(home?: string, env?: NodeJS.ProcessEnv): string;
37
+ export interface OpenCodeApiCredentialCandidate {
38
+ readonly provider: 'zen' | 'zen-go';
39
+ readonly apiKey: string;
40
+ readonly source: {
41
+ readonly kind: 'opencode-file';
42
+ readonly path: string;
43
+ } | {
44
+ readonly kind: 'env';
45
+ readonly envName: 'OPENCODE_AUTH_CONTENT';
46
+ };
47
+ }
48
+ export declare function opencodeCredentialsPath(home?: string, env?: NodeJS.ProcessEnv): string;
49
+ /** Read only OpenCode-owned API entries; OAuth and provider aliases are not credentials here. */
50
+ export declare function readOpenCodeApiCredentialCandidates(home: string | undefined, env?: NodeJS.ProcessEnv, windowsHome?: string | null | undefined): readonly OpenCodeApiCredentialCandidate[];
37
51
  export declare function readClaudeFileCredential(home?: string): AgentOAuthCredential | null;
38
52
  /** Read a Claude-owned credential from the exact path discovery admitted. */
39
53
  export declare function readClaudeCredentialFile(path: string): AgentOAuthCredential | null;
@@ -1 +1 @@
1
- {"version":3,"file":"harness-credentials.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/harness-credentials.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAejD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAIzD,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,0BAA0B,CAAC,CAAC,SAAS,oBAAoB;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAC7C;AAED,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEtE;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,OAAO,YAA2B,EACvC,OAAO,SAAoC,GACzC,MAAM,GAAG,IAAI,CAqBf;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CACjD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAA2D,GACtF,SAAS,0BAA0B,CAAC,oBAAoB,CAAC,EAAE,CAU7D;AAED,wBAAgB,oBAAoB,CACnC,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CAQR;AA6BD,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,MAAkB,GAAG,oBAAoB,GAAG,IAAI,CAE9F;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAWlF;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,oBAAoB,GAC/B,6BAA6B,CAiD/B;AAOD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B,GAAG,oBAAoB,GAAG,IAAI,CAW9B;AAoBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,oBAAoB,GAAG,IAAI,CAE7B;AAED,oFAAoF;AACpF,wBAAgB,iCAAiC,CAChD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAA2D,GACtF,SAAS,0BAA0B,CAAC,oBAAoB,CAAC,EAAE,CAa7D;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAkBjF;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,oBAAoB,EACrE,IAAI,EAAE,CAAC,GAAG,IAAI,EACd,KAAK,EAAE,CAAC,GAAG,IAAI,EACf,GAAG,SAAa,GACd,CAAC,GAAG,IAAI,CASV"}
1
+ {"version":3,"file":"harness-credentials.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/harness-credentials.ts"],"names":[],"mappings":"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"}
@@ -77,6 +77,52 @@ export function codexCredentialsPath(home = homedir(), env = process.env) {
77
77
  : join(home, '.codex');
78
78
  return join(root, 'auth.json');
79
79
  }
80
+ export function opencodeCredentialsPath(home = homedir(), env = process.env) {
81
+ const configured = env.XDG_DATA_HOME?.trim();
82
+ const root = configured && isAbsolute(configured) ? configured : join(home, '.local', 'share');
83
+ return join(root, 'opencode', 'auth.json');
84
+ }
85
+ /** Read only OpenCode-owned API entries; OAuth and provider aliases are not credentials here. */
86
+ export function readOpenCodeApiCredentialCandidates(home, env = process.env, windowsHome = home === undefined ? wslWindowsHome(env) : null) {
87
+ const parse = (value, source) => {
88
+ const root = record(value);
89
+ return ['opencode', 'opencode-go'].flatMap((id) => {
90
+ const entry = record(root?.[id]);
91
+ const apiKey = typeof entry?.key === 'string' ? entry.key.trim() : undefined;
92
+ return entry?.type === 'api' && apiKey && apiKey !== 'public'
93
+ ? [
94
+ {
95
+ provider: id === 'opencode' ? 'zen' : 'zen-go',
96
+ apiKey,
97
+ source,
98
+ },
99
+ ]
100
+ : [];
101
+ });
102
+ };
103
+ // OpenCode treats this as the complete store. Even an invalid override must
104
+ // not silently revive an older account from disk.
105
+ if (env.OPENCODE_AUTH_CONTENT !== undefined) {
106
+ try {
107
+ if (Buffer.byteLength(env.OPENCODE_AUTH_CONTENT, 'utf8') > MAX_CREDENTIAL_FILE_BYTES)
108
+ return [];
109
+ return parse(JSON.parse(env.OPENCODE_AUTH_CONTENT), {
110
+ kind: 'env',
111
+ envName: 'OPENCODE_AUTH_CONTENT',
112
+ });
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ const paths = env.XDG_DATA_HOME?.trim() && isAbsolute(env.XDG_DATA_HOME.trim())
119
+ ? [opencodeCredentialsPath(home, env)]
120
+ : [
121
+ opencodeCredentialsPath(home, env),
122
+ ...(windowsHome ? [opencodeCredentialsPath(windowsHome, {})] : []),
123
+ ];
124
+ return [...new Set(paths)].flatMap((path) => parse(readCredentialJson(path), { kind: 'opencode-file', path }));
125
+ }
80
126
  function readCredentialJson(path) {
81
127
  try {
82
128
  const stat = statSync(path);