@vymalo/opencode-oauth2 0.14.1 → 0.15.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/dist/cache.d.ts +14 -3
- package/dist/cache.js +32 -86
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +3 -37
- package/dist/config.js +39 -136
- package/dist/config.js.map +1 -1
- package/dist/lib.d.ts +2 -2
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/model-discovery.d.ts +2 -2
- package/dist/model-discovery.js +1 -1
- package/dist/opencode.d.ts +1 -1
- package/dist/opencode.js +1 -1
- package/dist/opencode.js.map +1 -1
- package/dist/plugin.d.ts +4 -2
- package/dist/plugin.js +62 -31
- package/dist/plugin.js.map +1 -1
- package/dist/scheduler.d.ts +1 -1
- package/dist/types.d.ts +1 -7
- package/package.json +3 -2
- package/dist/logging.d.ts +0 -13
- package/dist/logging.js +0 -64
- package/dist/logging.js.map +0 -1
- package/dist/oauth/browser.d.ts +0 -1
- package/dist/oauth/browser.js +0 -33
- package/dist/oauth/browser.js.map +0 -1
- package/dist/oauth/client.d.ts +0 -56
- package/dist/oauth/client.js +0 -424
- package/dist/oauth/client.js.map +0 -1
- package/dist/oauth/device-code.d.ts +0 -28
- package/dist/oauth/device-code.js +0 -247
- package/dist/oauth/device-code.js.map +0 -1
- package/dist/oauth/discovery.d.ts +0 -8
- package/dist/oauth/discovery.js +0 -38
- package/dist/oauth/discovery.js.map +0 -1
- package/dist/oauth/http-utils.d.ts +0 -33
- package/dist/oauth/http-utils.js +0 -118
- package/dist/oauth/http-utils.js.map +0 -1
- package/dist/oauth/local-callback.d.ts +0 -10
- package/dist/oauth/local-callback.js +0 -84
- package/dist/oauth/local-callback.js.map +0 -1
- package/dist/oauth/pkce.d.ts +0 -5
- package/dist/oauth/pkce.js +0 -17
- package/dist/oauth/pkce.js.map +0 -1
- package/dist/oauth/subject-token.d.ts +0 -20
- package/dist/oauth/subject-token.js +0 -81
- package/dist/oauth/subject-token.js.map +0 -1
package/dist/cache.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Logger } from "@vymalo/opencode-auth-core/lib";
|
|
2
2
|
import type { CachedServerState } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* oauth2 keeps its own per-server model-sync state (a fused `CachedServerState`
|
|
5
|
+
* of models + token), written through auth-core's generic, atomic, identity-
|
|
6
|
+
* keyed `FileCacheStore`. The state *shape* and validation are oauth2's; the
|
|
7
|
+
* disk IO (per-writer temp + rename, `0o600`) is the shared implementation, so
|
|
8
|
+
* there is no second copy of the atomic-write logic.
|
|
9
|
+
*
|
|
10
|
+
* The on-disk location is deliberately preserved as
|
|
11
|
+
* `<root>/opencode-oauth2/<namespace>` — NOT under auth-core's folder — so
|
|
12
|
+
* existing installs keep their cached sessions (models + OAuth token) across
|
|
13
|
+
* the upgrade and users are not forced to re-login.
|
|
14
|
+
*/
|
|
3
15
|
export declare function resolveCacheDir(namespace: string): string;
|
|
4
16
|
export declare class FileCacheStore {
|
|
5
|
-
private readonly
|
|
6
|
-
private readonly logger?;
|
|
17
|
+
private readonly store;
|
|
7
18
|
constructor(baseDir: string, logger?: Logger | undefined);
|
|
8
19
|
ensureReady(): Promise<void>;
|
|
9
20
|
loadServerState(serverId: string): Promise<CachedServerState | undefined>;
|
package/dist/cache.js
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { FileCacheStore as AuthCacheStore, resolveCacheRoot } from "@vymalo/opencode-auth-core/lib";
|
|
3
|
+
/**
|
|
4
|
+
* oauth2 keeps its own per-server model-sync state (a fused `CachedServerState`
|
|
5
|
+
* of models + token), written through auth-core's generic, atomic, identity-
|
|
6
|
+
* keyed `FileCacheStore`. The state *shape* and validation are oauth2's; the
|
|
7
|
+
* disk IO (per-writer temp + rename, `0o600`) is the shared implementation, so
|
|
8
|
+
* there is no second copy of the atomic-write logic.
|
|
9
|
+
*
|
|
10
|
+
* The on-disk location is deliberately preserved as
|
|
11
|
+
* `<root>/opencode-oauth2/<namespace>` — NOT under auth-core's folder — so
|
|
12
|
+
* existing installs keep their cached sessions (models + OAuth token) across
|
|
13
|
+
* the upgrade and users are not forced to re-login.
|
|
14
|
+
*/
|
|
15
15
|
export function resolveCacheDir(namespace) {
|
|
16
|
-
return join(
|
|
17
|
-
}
|
|
18
|
-
function statePath(baseDir, serverId) {
|
|
19
|
-
return join(baseDir, `${serverId}.json`);
|
|
16
|
+
return join(resolveCacheRoot(), "opencode-oauth2", namespace);
|
|
20
17
|
}
|
|
21
18
|
function hasValidTokenShape(token) {
|
|
22
19
|
if (!token || typeof token !== "object" || Array.isArray(token)) {
|
|
@@ -34,82 +31,31 @@ function hasValidTokenShape(token) {
|
|
|
34
31
|
return true;
|
|
35
32
|
}
|
|
36
33
|
export class FileCacheStore {
|
|
37
|
-
|
|
38
|
-
logger;
|
|
34
|
+
store;
|
|
39
35
|
constructor(baseDir, logger) {
|
|
40
|
-
this.
|
|
41
|
-
this.logger = logger;
|
|
36
|
+
this.store = new AuthCacheStore(baseDir, logger);
|
|
42
37
|
}
|
|
43
38
|
async ensureReady() {
|
|
44
|
-
await
|
|
45
|
-
recursive: true,
|
|
46
|
-
mode: 448
|
|
47
|
-
});
|
|
39
|
+
await this.store.ensureReady();
|
|
48
40
|
}
|
|
49
41
|
async loadServerState(serverId) {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const parsed = JSON.parse(content);
|
|
54
|
-
if (!parsed || parsed.serverId !== serverId) {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
if (!Array.isArray(parsed.models) || !Array.isArray(parsed.rawModels)) {
|
|
58
|
-
return undefined;
|
|
59
|
-
}
|
|
60
|
-
if (parsed.token && !hasValidTokenShape(parsed.token)) {
|
|
61
|
-
this.logger?.trace("oauth2_cache_token_dropped_invalid_shape", { serverId });
|
|
62
|
-
parsed.token = undefined;
|
|
63
|
-
}
|
|
64
|
-
this.logger?.trace("oauth2_cache_file_read", {
|
|
65
|
-
serverId,
|
|
66
|
-
modelCount: Array.isArray(parsed.models) ? parsed.models.length : 0,
|
|
67
|
-
hasToken: Boolean(parsed.token)
|
|
68
|
-
});
|
|
69
|
-
return parsed;
|
|
70
|
-
} catch (error) {
|
|
71
|
-
if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
|
|
72
|
-
this.logger?.trace("oauth2_cache_file_missing", { serverId });
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
throw error;
|
|
42
|
+
const parsed = await this.store.load(serverId);
|
|
43
|
+
if (!parsed) {
|
|
44
|
+
return undefined;
|
|
76
45
|
}
|
|
46
|
+
if (!parsed || parsed.serverId !== serverId) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (!Array.isArray(parsed.models) || !Array.isArray(parsed.rawModels)) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
if (parsed.token && !hasValidTokenShape(parsed.token)) {
|
|
53
|
+
parsed.token = undefined;
|
|
54
|
+
}
|
|
55
|
+
return parsed;
|
|
77
56
|
}
|
|
78
57
|
async saveServerState(state) {
|
|
79
|
-
|
|
80
|
-
// Unique per-write temp name. A shared `${filePath}.tmp` collides when
|
|
81
|
-
// several opencode instances boot at once (the desktop app restores every
|
|
82
|
-
// project window in parallel) and all sync the same provider: one process'
|
|
83
|
-
// rename consumes the temp file the other is about to rename, surfacing as
|
|
84
|
-
// `sync_failed … ENOENT … rename '<serverId>.json.tmp' -> '<serverId>.json'`.
|
|
85
|
-
// pid + uuid makes each writer's temp file private; rename stays atomic so
|
|
86
|
-
// last-writer-wins on the final path. See docs/troubleshooting.md.
|
|
87
|
-
const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
88
|
-
await mkdir(dirname(filePath), {
|
|
89
|
-
recursive: true,
|
|
90
|
-
mode: 448
|
|
91
|
-
});
|
|
92
|
-
const serialized = JSON.stringify(state, null, 2);
|
|
93
|
-
try {
|
|
94
|
-
await writeFile(tempPath, serialized, {
|
|
95
|
-
encoding: "utf8",
|
|
96
|
-
mode: 384,
|
|
97
|
-
flag: fsConstants.O_CREAT | fsConstants.O_TRUNC | fsConstants.O_WRONLY
|
|
98
|
-
});
|
|
99
|
-
await rename(tempPath, filePath);
|
|
100
|
-
this.logger?.trace("oauth2_cache_file_written", {
|
|
101
|
-
serverId: state.serverId,
|
|
102
|
-
modelCount: Array.isArray(state.models) ? state.models.length : 0,
|
|
103
|
-
hasToken: Boolean(state.token)
|
|
104
|
-
});
|
|
105
|
-
} catch (error) {
|
|
106
|
-
// Best-effort cleanup so a failed write never strands an orphan temp file.
|
|
107
|
-
await unlink(tempPath).catch(() => {});
|
|
108
|
-
throw error;
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
await chmod(filePath, 384);
|
|
112
|
-
} catch {}
|
|
58
|
+
await this.store.save(state.serverId, state);
|
|
113
59
|
}
|
|
114
60
|
}
|
|
115
61
|
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,SAAS,
|
|
1
|
+
{"mappings":"AAAA,SAAS,YAAY;AAErB,SACE,kBAAkB,gBAClB,wBAEK;;;;;;;;;;;;;AAeP,OAAO,SAAS,gBAAgB,WAA2B;CACzD,OAAO,KAAK,iBAAiB,GAAG,mBAAmB,SAAS;AAC9D;AAEA,SAAS,mBAAmB,OAAyB;CACnD,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;EAC/D,OAAO;CACT;CAEA,MAAM,YAAY;CAClB,IACE,OAAO,UAAU,gBAAgB,YACjC,UAAU,YAAY,WAAW,KACjC,OAAO,UAAU,cAAc,YAC/B,UAAU,UAAU,WAAW,GAC/B;EACA,OAAO;CACT;;;CAIA,IAAI,UAAU,iBAAiB,WAAW;EACxC,OAAO,OAAO,UAAU,iBAAiB,YAAY,UAAU,aAAa,SAAS;CACvF;CACA,OAAO;AACT;AAEA,OAAO,MAAM,eAAe;CAC1B,AAAiB;CAEjB,YAAY,SAAiB,QAA6B;EACxD,KAAK,QAAQ,IAAI,eAAe,SAAS,MAAM;CACjD;CAEA,MAAM,cAA6B;EACjC,MAAM,KAAK,MAAM,YAAY;CAC/B;CAEA,MAAM,gBAAgB,UAA0D;EAC9E,MAAM,SAAS,MAAM,KAAK,MAAM,KAAwB,QAAQ;EAChE,IAAI,CAAC,QAAQ;GACX,OAAO;EACT;EAEA,IAAI,CAAC,UAAU,OAAO,aAAa,UAAU;GAC3C,OAAO;EACT;EAEA,IAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,SAAS,GAAG;GACrE,OAAO;EACT;EAEA,IAAI,OAAO,SAAS,CAAC,mBAAmB,OAAO,KAAK,GAAG;GACrD,OAAO,QAAQ;EACjB;EAEA,OAAO;CACT;CAEA,MAAM,gBAAgB,OAAyC;EAC7D,MAAM,KAAK,MAAM,KAAK,MAAM,UAAU,KAAK;CAC7C;AACF","names":[],"sources":["../src/cache.ts"],"version":3,"file":"cache.js","sourceRoot":""}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,41 +1,7 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { DEFAULT_AUTH_FLOW, DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_K8S_SA_TOKEN_PATH, DEFAULT_LOG_LEVEL, DEFAULT_TOKEN_EXPIRY_SKEW_MS, validateAuthConfig, type AuthServerConfig, type OAuthAuthFlow, type SubjectTokenSource } from "@vymalo/opencode-auth-core/lib";
|
|
2
|
+
import type { LogLevel } from "@vymalo/opencode-auth-core/lib";
|
|
3
|
+
export { DEFAULT_AUTH_FLOW, DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_K8S_SA_TOKEN_PATH, DEFAULT_LOG_LEVEL, DEFAULT_TOKEN_EXPIRY_SKEW_MS, type AuthServerConfig, type OAuthAuthFlow, type SubjectTokenSource, validateAuthConfig };
|
|
2
4
|
export declare const DEFAULT_SYNC_INTERVAL_MINUTES = 60;
|
|
3
|
-
export declare const DEFAULT_HTTP_TIMEOUT_MS = 15e3;
|
|
4
|
-
export declare const DEFAULT_TOKEN_EXPIRY_SKEW_MS = 3e4;
|
|
5
|
-
export declare const DEFAULT_LOG_LEVEL: LogLevel;
|
|
6
|
-
export type OAuthAuthFlow = "authorization_code" | "device_code" | "client_credentials" | "jwt_bearer" | "token_exchange";
|
|
7
|
-
export declare const DEFAULT_AUTH_FLOW: OAuthAuthFlow;
|
|
8
|
-
/**
|
|
9
|
-
* Where to read the platform-supplied JWT that the plugin presents as the
|
|
10
|
-
* subject token / assertion for the `jwt_bearer` and `token_exchange` flows.
|
|
11
|
-
*
|
|
12
|
-
* - `github_actions` — fetches the OIDC token from the GitHub Actions runtime
|
|
13
|
-
* via `ACTIONS_ID_TOKEN_REQUEST_URL` + `ACTIONS_ID_TOKEN_REQUEST_TOKEN`,
|
|
14
|
-
* with the workflow-declared `audience`. The `id-token: write` permission
|
|
15
|
-
* is required on the job.
|
|
16
|
-
* - `kubernetes_sa` — reads a projected service-account token from the pod
|
|
17
|
-
* filesystem. Default path `/var/run/secrets/tokens/oauth2/token`; mount a
|
|
18
|
-
* `projected.sources.serviceAccountToken` volume with the OIDC issuer as
|
|
19
|
-
* the audience.
|
|
20
|
-
* - `file` — reads any JWT from disk. Useful when an external sidecar
|
|
21
|
-
* refreshes the token to a fixed path.
|
|
22
|
-
* - `env` — reads the JWT from a named environment variable. Mostly useful
|
|
23
|
-
* for tests and ad-hoc shells.
|
|
24
|
-
*/
|
|
25
|
-
export type SubjectTokenSource = {
|
|
26
|
-
type: "github_actions";
|
|
27
|
-
audience: string;
|
|
28
|
-
} | {
|
|
29
|
-
type: "kubernetes_sa";
|
|
30
|
-
tokenPath?: string;
|
|
31
|
-
} | {
|
|
32
|
-
type: "file";
|
|
33
|
-
path: string;
|
|
34
|
-
} | {
|
|
35
|
-
type: "env";
|
|
36
|
-
var: string;
|
|
37
|
-
};
|
|
38
|
-
export declare const DEFAULT_K8S_SA_TOKEN_PATH = "/var/run/secrets/tokens/oauth2/token";
|
|
39
5
|
export interface OAuthServerConfigInput {
|
|
40
6
|
id: string;
|
|
41
7
|
name?: string;
|
package/dist/config.js
CHANGED
|
@@ -1,30 +1,12 @@
|
|
|
1
|
+
import { DEFAULT_AUTH_FLOW, DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_K8S_SA_TOKEN_PATH, DEFAULT_LOG_LEVEL, DEFAULT_TOKEN_EXPIRY_SKEW_MS, validateAuthConfig } from "@vymalo/opencode-auth-core/lib";
|
|
2
|
+
export { DEFAULT_AUTH_FLOW, DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_K8S_SA_TOKEN_PATH, DEFAULT_LOG_LEVEL, DEFAULT_TOKEN_EXPIRY_SKEW_MS, validateAuthConfig };
|
|
1
3
|
export const DEFAULT_SYNC_INTERVAL_MINUTES = 60;
|
|
2
|
-
export const DEFAULT_HTTP_TIMEOUT_MS = 15e3;
|
|
3
|
-
export const DEFAULT_TOKEN_EXPIRY_SKEW_MS = 3e4;
|
|
4
|
-
export const DEFAULT_LOG_LEVEL = "info";
|
|
5
|
-
export const DEFAULT_AUTH_FLOW = "authorization_code";
|
|
6
|
-
export const DEFAULT_K8S_SA_TOKEN_PATH = "/var/run/secrets/tokens/oauth2/token";
|
|
7
4
|
function ensureString(value, path) {
|
|
8
5
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
9
6
|
throw new Error(`${path} must be a non-empty string`);
|
|
10
7
|
}
|
|
11
8
|
return value.trim();
|
|
12
9
|
}
|
|
13
|
-
function ensureStringArray(value, path) {
|
|
14
|
-
if (!Array.isArray(value) || value.length === 0) {
|
|
15
|
-
throw new Error(`${path} must be a non-empty array of strings`);
|
|
16
|
-
}
|
|
17
|
-
return value.map((item, index) => ensureString(item, `${path}[${index}]`));
|
|
18
|
-
}
|
|
19
|
-
function validateRedirectPort(value, path) {
|
|
20
|
-
if (value === undefined || value === null) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0 || value >= 65536) {
|
|
24
|
-
throw new Error(`${path} must be a positive integer less than 65536`);
|
|
25
|
-
}
|
|
26
|
-
return value;
|
|
27
|
-
}
|
|
28
10
|
function validateLogLevel(value, path) {
|
|
29
11
|
if (value === undefined || value === null) {
|
|
30
12
|
return DEFAULT_LOG_LEVEL;
|
|
@@ -34,132 +16,53 @@ function validateLogLevel(value, path) {
|
|
|
34
16
|
}
|
|
35
17
|
throw new Error(`${path} must be one of "trace" | "debug" | "info" | "warn" | "error" (received ${JSON.stringify(value)})`);
|
|
36
18
|
}
|
|
37
|
-
function
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
function validateSubjectTokenSource(value, path) {
|
|
56
|
-
if (value === undefined || value === null) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
if (typeof value !== "object" || Array.isArray(value)) {
|
|
60
|
-
throw new Error(`${path} must be an object`);
|
|
61
|
-
}
|
|
62
|
-
const record = value;
|
|
63
|
-
const type = record.type;
|
|
64
|
-
switch (type) {
|
|
65
|
-
case "github_actions": {
|
|
66
|
-
const audience = record.audience;
|
|
67
|
-
if (typeof audience !== "string" || audience.trim().length === 0) {
|
|
68
|
-
throw new Error(`${path}.audience must be a non-empty string when type is "github_actions"`);
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
type: "github_actions",
|
|
72
|
-
audience: audience.trim()
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
case "kubernetes_sa": {
|
|
76
|
-
const tokenPath = record.tokenPath;
|
|
77
|
-
if (tokenPath !== undefined && tokenPath !== null) {
|
|
78
|
-
if (typeof tokenPath !== "string" || tokenPath.trim().length === 0) {
|
|
79
|
-
throw new Error(`${path}.tokenPath must be a non-empty string when provided`);
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
type: "kubernetes_sa",
|
|
83
|
-
tokenPath: tokenPath.trim()
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
return { type: "kubernetes_sa" };
|
|
87
|
-
}
|
|
88
|
-
case "file": {
|
|
89
|
-
const filePath = record.path;
|
|
90
|
-
if (typeof filePath !== "string" || filePath.trim().length === 0) {
|
|
91
|
-
throw new Error(`${path}.path must be a non-empty string when type is "file"`);
|
|
92
|
-
}
|
|
93
|
-
return {
|
|
94
|
-
type: "file",
|
|
95
|
-
path: filePath.trim()
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
case "env": {
|
|
99
|
-
const varName = record.var;
|
|
100
|
-
if (typeof varName !== "string" || varName.trim().length === 0) {
|
|
101
|
-
throw new Error(`${path}.var must be a non-empty string when type is "env"`);
|
|
102
|
-
}
|
|
103
|
-
return {
|
|
104
|
-
type: "env",
|
|
105
|
-
var: varName.trim()
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
default: throw new Error(`${path}.type must be one of "github_actions" | "kubernetes_sa" | "file" | "env" (received ${JSON.stringify(type)})`);
|
|
109
|
-
}
|
|
19
|
+
function toAuthInput(input) {
|
|
20
|
+
return {
|
|
21
|
+
id: input.id,
|
|
22
|
+
issuer: input.issuer,
|
|
23
|
+
clientId: input.clientId,
|
|
24
|
+
clientSecret: input.clientSecret,
|
|
25
|
+
scopes: input.scopes,
|
|
26
|
+
authorizationEndpoint: input.authorizationEndpoint,
|
|
27
|
+
tokenEndpoint: input.tokenEndpoint,
|
|
28
|
+
deviceAuthorizationEndpoint: input.deviceAuthorizationEndpoint,
|
|
29
|
+
jwksUri: input.jwksUri,
|
|
30
|
+
redirectPort: input.redirectPort,
|
|
31
|
+
authFlow: input.authFlow,
|
|
32
|
+
pkce: input.pkce,
|
|
33
|
+
subjectTokenSource: input.subjectTokenSource,
|
|
34
|
+
tokenExchangeAudience: input.tokenExchangeAudience
|
|
35
|
+
};
|
|
110
36
|
}
|
|
111
37
|
function normalizeServerConfig(input, index) {
|
|
112
38
|
const path = `servers[${index}]`;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
39
|
+
// The auth subset (issuer/client/scopes/endpoints/flows/subject-token-source,
|
|
40
|
+
// PKCE, redirect-port bounds, and the flow-required clientSecret /
|
|
41
|
+
// subjectTokenSource checks) is owned by auth-core's validateAuthConfig so
|
|
42
|
+
// it lives in exactly one place. oauth2 layers its model-sync fields on top.
|
|
43
|
+
const auth = validateAuthConfig(toAuthInput(input));
|
|
44
|
+
const name = input.name && input.name.trim().length > 0 ? input.name.trim() : auth.id;
|
|
116
45
|
const baseURL = ensureString(input.baseURL, `${path}.baseURL`);
|
|
117
|
-
const clientId = ensureString(input.clientId, `${path}.clientId`);
|
|
118
|
-
const scopes = ensureStringArray(input.scopes, `${path}.scopes`);
|
|
119
46
|
const syncIntervalMinutes = typeof input.syncIntervalMinutes === "number" && Number.isFinite(input.syncIntervalMinutes) && input.syncIntervalMinutes > 0 ? input.syncIntervalMinutes : DEFAULT_SYNC_INTERVAL_MINUTES;
|
|
120
|
-
const redirectPort = validateRedirectPort(input.redirectPort, `${path}.redirectPort`);
|
|
121
|
-
const authFlow = validateAuthFlow(input.authFlow, `${path}.authFlow`);
|
|
122
|
-
const pkce = validatePkce(input.pkce, `${path}.pkce`);
|
|
123
|
-
const subjectTokenSource = validateSubjectTokenSource(input.subjectTokenSource, `${path}.subjectTokenSource`);
|
|
124
|
-
let clientSecret;
|
|
125
|
-
if (input.clientSecret !== undefined && input.clientSecret !== null) {
|
|
126
|
-
if (typeof input.clientSecret !== "string" || input.clientSecret.length === 0) {
|
|
127
|
-
throw new Error(`${path}.clientSecret must be a non-empty string when provided`);
|
|
128
|
-
}
|
|
129
|
-
clientSecret = input.clientSecret;
|
|
130
|
-
}
|
|
131
|
-
if (authFlow === "client_credentials" && !clientSecret) {
|
|
132
|
-
throw new Error(`${path}.clientSecret is required when authFlow is "client_credentials"`);
|
|
133
|
-
}
|
|
134
|
-
if ((authFlow === "jwt_bearer" || authFlow === "token_exchange") && !subjectTokenSource) {
|
|
135
|
-
throw new Error(`${path}.subjectTokenSource is required when authFlow is "${authFlow}" — set it to {type: "github_actions" | "kubernetes_sa" | "file" | "env", ...}`);
|
|
136
|
-
}
|
|
137
|
-
let tokenExchangeAudience;
|
|
138
|
-
if (input.tokenExchangeAudience !== undefined && input.tokenExchangeAudience !== null) {
|
|
139
|
-
if (typeof input.tokenExchangeAudience !== "string" || input.tokenExchangeAudience.trim().length === 0) {
|
|
140
|
-
throw new Error(`${path}.tokenExchangeAudience must be a non-empty string when provided`);
|
|
141
|
-
}
|
|
142
|
-
tokenExchangeAudience = input.tokenExchangeAudience.trim();
|
|
143
|
-
}
|
|
144
47
|
return {
|
|
145
|
-
id,
|
|
48
|
+
id: auth.id,
|
|
146
49
|
name,
|
|
147
|
-
issuer,
|
|
50
|
+
issuer: auth.issuer,
|
|
148
51
|
baseURL,
|
|
149
|
-
clientId,
|
|
150
|
-
clientSecret,
|
|
151
|
-
scopes,
|
|
52
|
+
clientId: auth.clientId,
|
|
53
|
+
clientSecret: auth.clientSecret,
|
|
54
|
+
scopes: auth.scopes,
|
|
152
55
|
syncIntervalMinutes,
|
|
153
56
|
nameOverrides: input.nameOverrides ?? {},
|
|
154
|
-
authorizationEndpoint:
|
|
155
|
-
tokenEndpoint:
|
|
156
|
-
deviceAuthorizationEndpoint:
|
|
157
|
-
jwksUri:
|
|
158
|
-
redirectPort,
|
|
159
|
-
authFlow,
|
|
160
|
-
pkce,
|
|
161
|
-
subjectTokenSource,
|
|
162
|
-
tokenExchangeAudience
|
|
57
|
+
authorizationEndpoint: auth.authorizationEndpoint,
|
|
58
|
+
tokenEndpoint: auth.tokenEndpoint,
|
|
59
|
+
deviceAuthorizationEndpoint: auth.deviceAuthorizationEndpoint,
|
|
60
|
+
jwksUri: auth.jwksUri,
|
|
61
|
+
redirectPort: auth.redirectPort,
|
|
62
|
+
authFlow: auth.authFlow,
|
|
63
|
+
pkce: auth.pkce,
|
|
64
|
+
subjectTokenSource: auth.subjectTokenSource,
|
|
65
|
+
tokenExchangeAudience: auth.tokenExchangeAudience
|
|
163
66
|
};
|
|
164
67
|
}
|
|
165
68
|
export function validateConfig(input) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../src/config.ts"],"version":3,"file":"config.js","sourceRoot":""}
|
package/dist/lib.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_LOG_LEVEL, DEFAULT_SYNC_INTERVAL_MINUTES, type OAuth2ModelSyncConfig, type OAuth2ModelSyncConfigInput, type OAuthServerConfig, type OAuthServerConfigInput, validateConfig } from "./config.js";
|
|
2
|
-
export { createJsonConsoleLogger, type LogLevel, type Logger } from "
|
|
2
|
+
export { createJsonConsoleLogger, type LogLevel, type Logger, type TokenSet } from "@vymalo/opencode-auth-core/lib";
|
|
3
3
|
export { buildModelsUrl, fetchModels } from "./model-discovery.js";
|
|
4
4
|
export { diffModels, normalizeModelId, normalizeModelList } from "./model-normalization.js";
|
|
5
5
|
export { OAuth2ModelSyncPlugin, type PluginOptions } from "./plugin.js";
|
|
6
6
|
export { resolveCacheDir, FileCacheStore } from "./cache.js";
|
|
7
7
|
export { createOpencodeOauth2Plugin } from "./opencode.js";
|
|
8
8
|
export type { OpenCodePluginFactoryOptions } from "./opencode.js";
|
|
9
|
-
export type { CachedServerState, ModelDiff, NormalizedModel, RawModel, ServerSnapshot
|
|
9
|
+
export type { CachedServerState, ModelDiff, NormalizedModel, RawModel, ServerSnapshot } from "./types.js";
|
package/dist/lib.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_LOG_LEVEL, DEFAULT_SYNC_INTERVAL_MINUTES, validateConfig } from "./config.js";
|
|
2
|
-
export { createJsonConsoleLogger } from "
|
|
2
|
+
export { createJsonConsoleLogger } from "@vymalo/opencode-auth-core/lib";
|
|
3
3
|
export { buildModelsUrl, fetchModels } from "./model-discovery.js";
|
|
4
4
|
export { diffModels, normalizeModelId, normalizeModelList } from "./model-normalization.js";
|
|
5
5
|
export { OAuth2ModelSyncPlugin } from "./plugin.js";
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,SACE,yBACA,mBACA,+BAKA,sBACK;AAEP,
|
|
1
|
+
{"mappings":"AAAA,SACE,yBACA,mBACA,+BAKA,sBACK;AAEP,SACE,+BAIK;AAEP,SAAS,gBAAgB,mBAAmB;AAE5C,SAAS,YAAY,kBAAkB,0BAA0B;AAEjE,SAAS,6BAAiD;AAE1D,SAAS,iBAAiB,sBAAsB;AAEhD,SAAS,kCAAkC","names":[],"sources":["../src/lib.ts"],"version":3,"file":"lib.js","sourceRoot":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Logger } from "
|
|
2
|
-
import type { RawModel
|
|
1
|
+
import type { Logger, TokenSet } from "@vymalo/opencode-auth-core/lib";
|
|
2
|
+
import type { RawModel } from "./types.js";
|
|
3
3
|
export interface ModelDiscoveryOptions {
|
|
4
4
|
fetchImpl?: typeof fetch;
|
|
5
5
|
timeoutMs?: number;
|
package/dist/model-discovery.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readResponseBodyPreview, redactUrl, scrubSecrets } from "
|
|
1
|
+
import { readResponseBodyPreview, redactUrl, scrubSecrets } from "@vymalo/opencode-auth-core/lib";
|
|
2
2
|
export function buildModelsUrl(baseURL) {
|
|
3
3
|
const url = new URL(baseURL);
|
|
4
4
|
const path = url.pathname.replace(/\/+$/, "");
|
package/dist/opencode.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
-
import { type Logger, type LogLevel } from "
|
|
2
|
+
import { type Logger, type LogLevel } from "@vymalo/opencode-auth-core/lib";
|
|
3
3
|
/**
|
|
4
4
|
* Map OpenCode's host-level `config.logLevel` (uppercase `"DEBUG" | "INFO" |
|
|
5
5
|
* "WARN" | "ERROR"`) to this plugin's internal `LogLevel`. Unknown / missing
|
package/dist/opencode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { createJsonConsoleLogger, LOG_LEVEL_PRIORITY } from "@vymalo/opencode-auth-core/lib";
|
|
1
2
|
import { DEFAULT_LOG_LEVEL } from "./config.js";
|
|
2
|
-
import { createJsonConsoleLogger, LOG_LEVEL_PRIORITY } from "./logging.js";
|
|
3
3
|
import { OAuth2ModelSyncPlugin } from "./plugin.js";
|
|
4
4
|
import { createResponsesRepairFetch } from "./responses-repair.js";
|
|
5
5
|
/**
|
package/dist/opencode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAEA,SACE,
|
|
1
|
+
{"mappings":"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","names":[],"sources":["../src/opencode.ts"],"version":3,"file":"opencode.js","sourceRoot":""}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { type Logger, type TokenSet } from "@vymalo/opencode-auth-core/lib";
|
|
1
2
|
import { type OAuth2ModelSyncConfigInput } from "./config.js";
|
|
2
|
-
import {
|
|
3
|
-
import type { NormalizedModel, ServerSnapshot, TokenSet } from "./types.js";
|
|
3
|
+
import type { NormalizedModel, ServerSnapshot } from "./types.js";
|
|
4
4
|
interface StartOptions {
|
|
5
5
|
warmup?: boolean;
|
|
6
6
|
/**
|
|
@@ -28,6 +28,8 @@ export declare class OAuth2ModelSyncPlugin {
|
|
|
28
28
|
private initialized;
|
|
29
29
|
private started;
|
|
30
30
|
constructor(configInput: OAuth2ModelSyncConfigInput, options?: PluginOptions);
|
|
31
|
+
private buildTokenRuntime;
|
|
32
|
+
private ensureTokenRuntime;
|
|
31
33
|
initialize(): Promise<void>;
|
|
32
34
|
start(options?: StartOptions): Promise<void>;
|
|
33
35
|
stop(): void;
|