@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.
- package/CHANGELOG.md +371 -0
- package/README.md +71 -10
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +24 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +6 -1
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +9 -1
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +15 -12
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +44 -2
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +24 -13
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/doctor/checks/chain.d.ts.map +1 -1
- package/dist/doctor/checks/chain.js +11 -5
- package/dist/doctor/checks/chain.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +7 -1
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installation.d.ts +5 -0
- package/dist/installation.d.ts.map +1 -0
- package/dist/installation.js +48 -0
- package/dist/installation.js.map +1 -0
- package/dist/integrations/providers/access.d.ts +7 -0
- package/dist/integrations/providers/access.d.ts.map +1 -0
- package/dist/integrations/providers/access.js +17 -0
- package/dist/integrations/providers/access.js.map +1 -0
- package/dist/integrations/providers/current-credential.d.ts +4 -0
- package/dist/integrations/providers/current-credential.d.ts.map +1 -0
- package/dist/integrations/providers/current-credential.js +45 -0
- package/dist/integrations/providers/current-credential.js.map +1 -0
- package/dist/integrations/providers/discover.d.ts +28 -54
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +62 -58
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/gemini-credentials.d.ts +13 -0
- package/dist/integrations/providers/gemini-credentials.d.ts.map +1 -0
- package/dist/integrations/providers/gemini-credentials.js +148 -0
- package/dist/integrations/providers/gemini-credentials.js.map +1 -0
- package/dist/integrations/providers/harness-credentials.d.ts +14 -0
- package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
- package/dist/integrations/providers/harness-credentials.js +46 -0
- package/dist/integrations/providers/harness-credentials.js.map +1 -1
- package/dist/integrations/providers/model-reasoning.d.ts +4 -0
- package/dist/integrations/providers/model-reasoning.d.ts.map +1 -0
- package/dist/integrations/providers/model-reasoning.js +46 -0
- package/dist/integrations/providers/model-reasoning.js.map +1 -0
- package/dist/integrations/providers/register.d.ts +1 -1
- package/dist/integrations/providers/register.d.ts.map +1 -1
- package/dist/integrations/providers/register.js +16 -1
- package/dist/integrations/providers/register.js.map +1 -1
- package/dist/integrations/providers/registry.d.ts +4 -4
- package/dist/integrations/providers/registry.d.ts.map +1 -1
- package/dist/integrations/providers/registry.js +33 -0
- package/dist/integrations/providers/registry.js.map +1 -1
- package/dist/integrations/providers/setup.d.ts +49 -0
- package/dist/integrations/providers/setup.d.ts.map +1 -0
- package/dist/integrations/providers/setup.js +105 -0
- package/dist/integrations/providers/setup.js.map +1 -0
- package/dist/integrations/sessions/context-inventory.d.ts +4 -0
- package/dist/integrations/sessions/context-inventory.d.ts.map +1 -0
- package/dist/integrations/sessions/context-inventory.js +44 -0
- package/dist/integrations/sessions/context-inventory.js.map +1 -0
- package/dist/integrations/sessions/conversation-search.d.ts +60 -0
- package/dist/integrations/sessions/conversation-search.d.ts.map +1 -0
- package/dist/integrations/sessions/conversation-search.js +461 -0
- package/dist/integrations/sessions/conversation-search.js.map +1 -0
- package/dist/integrations/sessions/store.d.ts +1 -0
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +17 -4
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/sessions/task-context.d.ts +4 -0
- package/dist/integrations/sessions/task-context.d.ts.map +1 -0
- package/dist/integrations/sessions/task-context.js +73 -0
- package/dist/integrations/sessions/task-context.js.map +1 -0
- package/dist/integrations/subagents/activity.d.ts +3 -1
- package/dist/integrations/subagents/activity.d.ts.map +1 -1
- package/dist/integrations/subagents/activity.js +32 -5
- package/dist/integrations/subagents/activity.js.map +1 -1
- package/dist/integrations/subagents/history.d.ts +26 -0
- package/dist/integrations/subagents/history.d.ts.map +1 -0
- package/dist/integrations/subagents/history.js +76 -0
- package/dist/integrations/subagents/history.js.map +1 -0
- package/dist/integrations/subagents/model-effort.d.ts +4 -0
- package/dist/integrations/subagents/model-effort.d.ts.map +1 -0
- package/dist/integrations/subagents/model-effort.js +12 -0
- package/dist/integrations/subagents/model-effort.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +27 -7
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +305 -35
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/web/search.d.ts +11 -0
- package/dist/integrations/web/search.d.ts.map +1 -0
- package/dist/integrations/web/search.js +73 -0
- package/dist/integrations/web/search.js.map +1 -0
- package/dist/memory/io.d.ts +12 -0
- package/dist/memory/io.d.ts.map +1 -0
- package/dist/memory/io.js +177 -0
- package/dist/memory/io.js.map +1 -0
- package/dist/memory/presentation.d.ts +4 -1
- package/dist/memory/presentation.d.ts.map +1 -1
- package/dist/memory/presentation.js +16 -2
- package/dist/memory/presentation.js.map +1 -1
- package/dist/memory/store.d.ts +17 -3
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +61 -35
- package/dist/memory/store.js.map +1 -1
- package/dist/output-schema.d.ts +4 -0
- package/dist/output-schema.d.ts.map +1 -0
- package/dist/output-schema.js +18 -0
- package/dist/output-schema.js.map +1 -0
- package/dist/tui/AgentExplorer.d.ts +13 -2
- package/dist/tui/AgentExplorer.d.ts.map +1 -1
- package/dist/tui/AgentExplorer.js +85 -23
- package/dist/tui/AgentExplorer.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +694 -150
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/BrandHeader.d.ts +1 -4
- package/dist/tui/BrandHeader.d.ts.map +1 -1
- package/dist/tui/BrandHeader.js +4 -8
- package/dist/tui/BrandHeader.js.map +1 -1
- package/dist/tui/Composer.d.ts +2 -1
- package/dist/tui/Composer.d.ts.map +1 -1
- package/dist/tui/Composer.js +26 -3
- package/dist/tui/Composer.js.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts +5 -2
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +14 -6
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/Picker.d.ts +2 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +104 -24
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ProviderSetup.d.ts +6 -0
- package/dist/tui/ProviderSetup.d.ts.map +1 -0
- package/dist/tui/ProviderSetup.js +125 -0
- package/dist/tui/ProviderSetup.js.map +1 -0
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +5 -3
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/StatusPanel.d.ts +5 -0
- package/dist/tui/StatusPanel.d.ts.map +1 -0
- package/dist/tui/StatusPanel.js +11 -0
- package/dist/tui/StatusPanel.js.map +1 -0
- package/dist/tui/TextPrompt.d.ts +3 -1
- package/dist/tui/TextPrompt.d.ts.map +1 -1
- package/dist/tui/TextPrompt.js +55 -9
- package/dist/tui/TextPrompt.js.map +1 -1
- package/dist/tui/ToolOutputViewer.d.ts +11 -0
- package/dist/tui/ToolOutputViewer.d.ts.map +1 -0
- package/dist/tui/ToolOutputViewer.js +39 -0
- package/dist/tui/ToolOutputViewer.js.map +1 -0
- package/dist/tui/Transcript.d.ts.map +1 -1
- package/dist/tui/Transcript.js +10 -4
- package/dist/tui/Transcript.js.map +1 -1
- package/dist/tui/agent.d.ts +24 -3
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +362 -97
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/live-window.d.ts.map +1 -1
- package/dist/tui/live-window.js +5 -1
- package/dist/tui/live-window.js.map +1 -1
- package/dist/tui/logo.d.ts +4 -4
- package/dist/tui/logo.d.ts.map +1 -1
- package/dist/tui/logo.js +4 -4
- package/dist/tui/logo.js.map +1 -1
- package/dist/tui/model-catalogue-view.d.ts +3 -0
- package/dist/tui/model-catalogue-view.d.ts.map +1 -0
- package/dist/tui/model-catalogue-view.js +50 -0
- package/dist/tui/model-catalogue-view.js.map +1 -0
- package/dist/tui/model-choices.d.ts +3 -1
- package/dist/tui/model-choices.d.ts.map +1 -1
- package/dist/tui/model-choices.js +12 -1
- package/dist/tui/model-choices.js.map +1 -1
- package/dist/tui/model-search.d.ts +4 -0
- package/dist/tui/model-search.d.ts.map +1 -0
- package/dist/tui/model-search.js +11 -0
- package/dist/tui/model-search.js.map +1 -0
- package/dist/tui/model-selection-intent.d.ts +8 -0
- package/dist/tui/model-selection-intent.d.ts.map +1 -0
- package/dist/tui/model-selection-intent.js +96 -0
- package/dist/tui/model-selection-intent.js.map +1 -0
- package/dist/tui/model-switch-tool.d.ts +7 -0
- package/dist/tui/model-switch-tool.d.ts.map +1 -0
- package/dist/tui/model-switch-tool.js +74 -0
- package/dist/tui/model-switch-tool.js.map +1 -0
- package/dist/tui/model-switch.d.ts +35 -0
- package/dist/tui/model-switch.d.ts.map +1 -0
- package/dist/tui/model-switch.js +106 -0
- package/dist/tui/model-switch.js.map +1 -0
- package/dist/tui/permission-review.d.ts +2 -0
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +82 -15
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/tui/run-interruption.d.ts +7 -0
- package/dist/tui/run-interruption.d.ts.map +1 -1
- package/dist/tui/run-interruption.js +41 -0
- package/dist/tui/run-interruption.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +7 -0
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +77 -2
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/status-card.d.ts +3 -0
- package/dist/tui/status-card.d.ts.map +1 -0
- package/dist/tui/status-card.js +30 -0
- package/dist/tui/status-card.js.map +1 -0
- package/dist/tui/status-panel-layout.d.ts +11 -0
- package/dist/tui/status-panel-layout.d.ts.map +1 -0
- package/dist/tui/status-panel-layout.js +42 -0
- package/dist/tui/status-panel-layout.js.map +1 -0
- package/dist/tui/types.d.ts +7 -1
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +9 -7
|
@@ -1,66 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Discover usable credential sources, reachable local servers, and public Zen.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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":"AAAA
|
|
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
|
-
*
|
|
2
|
+
* Discover usable credential sources, reachable local servers, and public Zen.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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 {
|
|
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: {
|
|
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 (
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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);
|