openai-ws-opencode 0.1.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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/SECURITY.md +11 -0
  4. package/bin/setup.js +239 -0
  5. package/dist/auth/oauth.d.ts +55 -0
  6. package/dist/auth/oauth.d.ts.map +1 -0
  7. package/dist/auth/oauth.js +205 -0
  8. package/dist/auth/oauth.js.map +1 -0
  9. package/dist/auth/tokens.d.ts +19 -0
  10. package/dist/auth/tokens.d.ts.map +1 -0
  11. package/dist/auth/tokens.js +59 -0
  12. package/dist/auth/tokens.js.map +1 -0
  13. package/dist/constants.d.ts +17 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +17 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/models/defaults.d.ts +16 -0
  22. package/dist/models/defaults.d.ts.map +1 -0
  23. package/dist/models/defaults.js +82 -0
  24. package/dist/models/defaults.js.map +1 -0
  25. package/dist/models/resolve.d.ts +112 -0
  26. package/dist/models/resolve.d.ts.map +1 -0
  27. package/dist/models/resolve.js +159 -0
  28. package/dist/models/resolve.js.map +1 -0
  29. package/dist/plugin.d.ts +4 -0
  30. package/dist/plugin.d.ts.map +1 -0
  31. package/dist/plugin.js +142 -0
  32. package/dist/plugin.js.map +1 -0
  33. package/dist/testing.d.ts +7 -0
  34. package/dist/testing.d.ts.map +1 -0
  35. package/dist/testing.js +7 -0
  36. package/dist/testing.js.map +1 -0
  37. package/dist/transport/body.d.ts +3 -0
  38. package/dist/transport/body.d.ts.map +1 -0
  39. package/dist/transport/body.js +22 -0
  40. package/dist/transport/body.js.map +1 -0
  41. package/dist/transport/bridge.d.ts +3 -0
  42. package/dist/transport/bridge.d.ts.map +1 -0
  43. package/dist/transport/bridge.js +78 -0
  44. package/dist/transport/bridge.js.map +1 -0
  45. package/dist/transport/headers.d.ts +32 -0
  46. package/dist/transport/headers.d.ts.map +1 -0
  47. package/dist/transport/headers.js +55 -0
  48. package/dist/transport/headers.js.map +1 -0
  49. package/dist/transport/pool.d.ts +56 -0
  50. package/dist/transport/pool.d.ts.map +1 -0
  51. package/dist/transport/pool.js +259 -0
  52. package/dist/transport/pool.js.map +1 -0
  53. package/package.json +59 -0
@@ -0,0 +1,19 @@
1
+ export interface TokenResponse {
2
+ id_token?: string;
3
+ access_token: string;
4
+ refresh_token?: string;
5
+ expires_in?: number;
6
+ }
7
+ export interface StoredOAuthAuth {
8
+ type: "oauth";
9
+ refresh: string;
10
+ access?: string;
11
+ expires?: number;
12
+ accountId?: string;
13
+ }
14
+ export declare function parseJwtClaims(token: string): Record<string, any> | undefined;
15
+ export declare function extractAccountId(tokens: Pick<TokenResponse, "id_token" | "access_token">): string | undefined;
16
+ export declare function exchangeCodeForTokens(code: string, redirectUri: string, verifier: string): Promise<TokenResponse>;
17
+ export declare function refreshAccessToken(refreshToken: string): Promise<TokenResponse>;
18
+ export declare function tokenExpiry(expiresInSeconds?: number): number;
19
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAQ7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,CAAC,GAAG,MAAM,GAAG,SAAS,CAW7G;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAcvH;AAED,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAYrF;AAED,wBAAgB,WAAW,CAAC,gBAAgB,SAAO,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,59 @@
1
+ import { CLIENT_ID, ISSUER } from "../constants.js";
2
+ export function parseJwtClaims(token) {
3
+ const parts = token.split(".");
4
+ if (parts.length !== 3)
5
+ return undefined;
6
+ try {
7
+ return JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ export function extractAccountId(tokens) {
14
+ for (const token of [tokens.id_token, tokens.access_token]) {
15
+ if (!token)
16
+ continue;
17
+ const claims = parseJwtClaims(token);
18
+ const id = claims?.chatgpt_account_id ||
19
+ claims?.["https://api.openai.com/auth"]?.chatgpt_account_id ||
20
+ claims?.organizations?.[0]?.id;
21
+ if (typeof id === "string" && id)
22
+ return id;
23
+ }
24
+ return undefined;
25
+ }
26
+ export async function exchangeCodeForTokens(code, redirectUri, verifier) {
27
+ const response = await fetch(`${ISSUER}/oauth/token`, {
28
+ method: "POST",
29
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
30
+ body: new URLSearchParams({
31
+ grant_type: "authorization_code",
32
+ code,
33
+ redirect_uri: redirectUri,
34
+ client_id: CLIENT_ID,
35
+ code_verifier: verifier,
36
+ }).toString(),
37
+ });
38
+ if (!response.ok)
39
+ throw new Error(`Token exchange failed: ${response.status}`);
40
+ return response.json();
41
+ }
42
+ export async function refreshAccessToken(refreshToken) {
43
+ const response = await fetch(`${ISSUER}/oauth/token`, {
44
+ method: "POST",
45
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
46
+ body: new URLSearchParams({
47
+ grant_type: "refresh_token",
48
+ refresh_token: refreshToken,
49
+ client_id: CLIENT_ID,
50
+ }).toString(),
51
+ });
52
+ if (!response.ok)
53
+ throw new Error(`Token refresh failed: ${response.status}`);
54
+ return response.json();
55
+ }
56
+ export function tokenExpiry(expiresInSeconds = 3600) {
57
+ return Date.now() + expiresInSeconds * 1000;
58
+ }
59
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAiBnD,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwD;IACvF,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,EAAE,GACN,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,CAAC,6BAA6B,CAAC,EAAE,kBAAkB;YAC3D,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAChC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE;YAAE,OAAO,EAAE,CAAA;IAC7C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAgB;IAC7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC,QAAQ,EAAE;KACd,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9E,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,YAAY;YAC3B,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC,QAAQ,EAAE;KACd,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7E,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,gBAAgB,GAAG,IAAI;IACjD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const PROVIDER_ID = "openai-ws";
2
+ export declare const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
3
+ export declare const ISSUER = "https://auth.openai.com";
4
+ export declare const OPENAI_API_BASE = "https://api.openai.com/v1";
5
+ export declare const CODEX_API_BASE = "https://chatgpt.com/backend-api/codex";
6
+ export declare const CODEX_API_ENDPOINT = "https://chatgpt.com/backend-api/codex/responses";
7
+ export declare const OPENAI_WS_URL = "wss://api.openai.com/v1/responses";
8
+ export declare const CODEX_WS_URL = "wss://chatgpt.com/backend-api/codex/responses";
9
+ export declare const OPENAI_WS_BETA = "responses_websockets=2026-02-06";
10
+ export declare const CODEX_ORIGINATOR = "codex_cli_rs";
11
+ export declare const OAUTH_PORT = 1456;
12
+ export declare const DEFAULT_INSTRUCTIONS = "You are a helpful assistant.";
13
+ export declare const INTERNAL_SESSION_HEADER = "x-openai-ws-opencode-session-id";
14
+ export declare const INTERNAL_AGENT_HEADER = "x-openai-ws-opencode-agent";
15
+ export declare const INTERNAL_MODEL_HEADER = "x-openai-ws-opencode-model-id";
16
+ export declare const INTERNAL_PREFIX_HASH_HEADER = "x-openai-ws-opencode-prefix-hash";
17
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,cAAc,CAAA;AAEtC,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,MAAM,4BAA4B,CAAA;AAC/C,eAAO,MAAM,eAAe,8BAA8B,CAAA;AAC1D,eAAO,MAAM,cAAc,0CAA0C,CAAA;AACrE,eAAO,MAAM,kBAAkB,oDAAgC,CAAA;AAC/D,eAAO,MAAM,aAAa,sCAAsC,CAAA;AAChE,eAAO,MAAM,YAAY,kDAAkD,CAAA;AAC3E,eAAO,MAAM,cAAc,oCAAoC,CAAA;AAC/D,eAAO,MAAM,gBAAgB,iBAAiB,CAAA;AAC9C,eAAO,MAAM,UAAU,OAAO,CAAA;AAC9B,eAAO,MAAM,oBAAoB,iCAAiC,CAAA;AAElE,eAAO,MAAM,uBAAuB,oCAAoC,CAAA;AACxE,eAAO,MAAM,qBAAqB,+BAA+B,CAAA;AACjE,eAAO,MAAM,qBAAqB,kCAAkC,CAAA;AACpE,eAAO,MAAM,2BAA2B,qCAAqC,CAAA"}
@@ -0,0 +1,17 @@
1
+ export const PROVIDER_ID = "openai-ws";
2
+ export const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
3
+ export const ISSUER = "https://auth.openai.com";
4
+ export const OPENAI_API_BASE = "https://api.openai.com/v1";
5
+ export const CODEX_API_BASE = "https://chatgpt.com/backend-api/codex";
6
+ export const CODEX_API_ENDPOINT = `${CODEX_API_BASE}/responses`;
7
+ export const OPENAI_WS_URL = "wss://api.openai.com/v1/responses";
8
+ export const CODEX_WS_URL = "wss://chatgpt.com/backend-api/codex/responses";
9
+ export const OPENAI_WS_BETA = "responses_websockets=2026-02-06";
10
+ export const CODEX_ORIGINATOR = "codex_cli_rs";
11
+ export const OAUTH_PORT = 1456;
12
+ export const DEFAULT_INSTRUCTIONS = "You are a helpful assistant.";
13
+ export const INTERNAL_SESSION_HEADER = "x-openai-ws-opencode-session-id";
14
+ export const INTERNAL_AGENT_HEADER = "x-openai-ws-opencode-agent";
15
+ export const INTERNAL_MODEL_HEADER = "x-openai-ws-opencode-model-id";
16
+ export const INTERNAL_PREFIX_HASH_HEADER = "x-openai-ws-opencode-prefix-hash";
17
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAA;AAEtC,MAAM,CAAC,MAAM,SAAS,GAAG,8BAA8B,CAAA;AACvD,MAAM,CAAC,MAAM,MAAM,GAAG,yBAAyB,CAAA;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,uCAAuC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,cAAc,YAAY,CAAA;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,+CAA+C,CAAA;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAA;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAA;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAA;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAAG,8BAA8B,CAAA;AAElE,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAA;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,+BAA+B,CAAA;AACpE,MAAM,CAAC,MAAM,2BAA2B,GAAG,kCAAkC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from "./plugin.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { default } from "./plugin.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,16 @@
1
+ export interface OpenAIWSModelDef {
2
+ name: string;
3
+ reasoning: boolean;
4
+ temperature: boolean;
5
+ limit: {
6
+ context: number;
7
+ input?: number;
8
+ output: number;
9
+ };
10
+ variants: Record<string, Record<string, unknown>>;
11
+ family?: string;
12
+ release_date?: string;
13
+ }
14
+ export declare function makeVariants(efforts: string[], includeSummary?: boolean): Record<string, Record<string, unknown>>;
15
+ export declare const OPENAI_WS_MODELS: Record<string, OpenAIWSModelDef>;
16
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/models/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,UAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAW9G;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAsE7D,CAAA"}
@@ -0,0 +1,82 @@
1
+ export function makeVariants(efforts, includeSummary = true) {
2
+ return Object.fromEntries(efforts.map((effort) => [
3
+ effort,
4
+ {
5
+ reasoningEffort: effort,
6
+ ...(includeSummary ? { reasoningSummary: "auto" } : {}),
7
+ include: ["reasoning.encrypted_content"],
8
+ },
9
+ ]));
10
+ }
11
+ export const OPENAI_WS_MODELS = {
12
+ "gpt-5.5": {
13
+ name: "GPT 5.5 (WebSocket)",
14
+ reasoning: true,
15
+ temperature: false,
16
+ limit: { context: 1050000, input: 922000, output: 128000 },
17
+ variants: makeVariants(["none", "minimal", "low", "medium", "high"]),
18
+ release_date: "2026-04-23",
19
+ },
20
+ "gpt-5.5-pro": {
21
+ name: "GPT 5.5 Pro (WebSocket)",
22
+ reasoning: true,
23
+ temperature: false,
24
+ limit: { context: 1050000, input: 922000, output: 128000 },
25
+ variants: makeVariants(["high"], false),
26
+ family: "gpt-pro",
27
+ release_date: "2026-04-23",
28
+ },
29
+ "gpt-5.4": {
30
+ name: "GPT 5.4 (WebSocket)",
31
+ reasoning: true,
32
+ temperature: true,
33
+ limit: { context: 1050000, output: 128000 },
34
+ variants: makeVariants(["none", "minimal", "low", "medium", "high"]),
35
+ release_date: "2026-03-05",
36
+ },
37
+ "gpt-5.3-codex": {
38
+ name: "GPT 5.3 Codex (WebSocket)",
39
+ reasoning: true,
40
+ temperature: false,
41
+ limit: { context: 400000, input: 272000, output: 128000 },
42
+ variants: makeVariants(["low", "medium", "high"]),
43
+ family: "gpt-codex",
44
+ release_date: "2026-02-05",
45
+ },
46
+ "gpt-5.3-codex-spark": {
47
+ name: "GPT 5.3 Codex Spark (WebSocket)",
48
+ reasoning: true,
49
+ temperature: false,
50
+ limit: { context: 128000, output: 128000 },
51
+ variants: makeVariants(["low", "medium", "high"], false),
52
+ family: "gpt-codex",
53
+ release_date: "2026-03-10",
54
+ },
55
+ "gpt-5.2": {
56
+ name: "GPT 5.2 (WebSocket)",
57
+ reasoning: true,
58
+ temperature: true,
59
+ limit: { context: 272000, output: 128000 },
60
+ variants: makeVariants(["none", "low", "medium", "high"]),
61
+ release_date: "2025-12-10",
62
+ },
63
+ "gpt-5.2-codex": {
64
+ name: "GPT 5.2 Codex (WebSocket)",
65
+ reasoning: true,
66
+ temperature: false,
67
+ limit: { context: 272000, output: 128000 },
68
+ variants: makeVariants(["low", "medium", "high"]),
69
+ family: "gpt-codex",
70
+ release_date: "2025-12-15",
71
+ },
72
+ "gpt-5.1-codex": {
73
+ name: "GPT 5.1 Codex (WebSocket)",
74
+ reasoning: true,
75
+ temperature: false,
76
+ limit: { context: 272000, output: 128000 },
77
+ variants: makeVariants(["low", "medium", "high"]),
78
+ family: "gpt-codex",
79
+ release_date: "2025-10-01",
80
+ },
81
+ };
82
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/models/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { type OpenAIWSModelDef } from "./defaults.js";
2
+ export type ProviderModelConfig = {
3
+ id: string;
4
+ providerID: string;
5
+ api: {
6
+ id: string;
7
+ npm: string;
8
+ url: string;
9
+ };
10
+ name: string;
11
+ capabilities: {
12
+ temperature: boolean;
13
+ reasoning: boolean;
14
+ attachment: boolean;
15
+ toolcall: boolean;
16
+ input: {
17
+ text: boolean;
18
+ audio: boolean;
19
+ image: boolean;
20
+ video: boolean;
21
+ pdf: boolean;
22
+ };
23
+ output: {
24
+ text: boolean;
25
+ audio: boolean;
26
+ image: boolean;
27
+ video: boolean;
28
+ pdf: boolean;
29
+ };
30
+ interleaved: boolean;
31
+ };
32
+ cost: {
33
+ input: number;
34
+ output: number;
35
+ cache: {
36
+ read: number;
37
+ write: number;
38
+ };
39
+ };
40
+ limit: OpenAIWSModelDef["limit"];
41
+ status: "active";
42
+ options: Record<string, unknown>;
43
+ headers: Record<string, string>;
44
+ variants: Record<string, Record<string, unknown>>;
45
+ family?: string;
46
+ release_date?: string;
47
+ [key: string]: unknown;
48
+ };
49
+ export type ProviderModelOverrides = Record<string, Partial<ProviderModelConfig>>;
50
+ type ModelsDevModel = {
51
+ id?: string;
52
+ name?: string;
53
+ family?: string;
54
+ attachment?: boolean;
55
+ reasoning?: boolean;
56
+ temperature?: boolean;
57
+ tool_call?: boolean;
58
+ release_date?: string;
59
+ limit?: {
60
+ context?: number;
61
+ input?: number;
62
+ output?: number;
63
+ };
64
+ };
65
+ type ModelsDevCatalog = {
66
+ openai?: {
67
+ models?: Record<string, ModelsDevModel>;
68
+ };
69
+ };
70
+ export type OpenCodeConfigModel = {
71
+ name: string;
72
+ family?: string;
73
+ release_date?: string;
74
+ attachment: boolean;
75
+ reasoning: boolean;
76
+ temperature: boolean;
77
+ tool_call: boolean;
78
+ limit: OpenAIWSModelDef["limit"];
79
+ modalities: {
80
+ input: Array<"text" | "image">;
81
+ output: Array<"text">;
82
+ };
83
+ cost: {
84
+ input: number;
85
+ output: number;
86
+ cache_read: number;
87
+ cache_write: number;
88
+ };
89
+ options: Record<string, unknown>;
90
+ provider: {
91
+ npm: string;
92
+ api: string;
93
+ };
94
+ variants: Record<string, Record<string, unknown>>;
95
+ };
96
+ export declare function modelToProviderConfig(id: string, model: OpenAIWSModelDef): ProviderModelConfig;
97
+ export declare function resolveModelsFromCatalog(catalog: ModelsDevCatalog | undefined, overrides?: ProviderModelOverrides): Record<string, ProviderModelConfig>;
98
+ export declare function resolveModels(overrides?: ProviderModelOverrides): Record<string, ProviderModelConfig>;
99
+ export declare function resolveModelsBestEffort(overrides?: ProviderModelOverrides, options?: {
100
+ fetchImpl?: typeof fetch;
101
+ timeoutMs?: number;
102
+ }): Promise<Record<string, ProviderModelConfig>>;
103
+ export declare function modelToOpenCodeConfig(model: OpenAIWSModelDef): OpenCodeConfigModel;
104
+ export declare function providerConfigModels(overrides?: Record<string, unknown>): Record<string, unknown>;
105
+ export declare function providerConfig(overrides?: ProviderModelOverrides): {
106
+ api: string;
107
+ name: string;
108
+ npm: string;
109
+ models: Record<string, unknown>;
110
+ };
111
+ export {};
112
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/models/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { OPENAI_API_BASE, PROVIDER_ID } from "../constants.js";
2
+ import { makeVariants, OPENAI_WS_MODELS } from "./defaults.js";
3
+ export function modelToProviderConfig(id, model) {
4
+ return {
5
+ id,
6
+ providerID: PROVIDER_ID,
7
+ api: { id, npm: "@ai-sdk/openai", url: OPENAI_API_BASE },
8
+ name: model.name,
9
+ capabilities: {
10
+ temperature: model.temperature,
11
+ reasoning: model.reasoning,
12
+ attachment: true,
13
+ toolcall: true,
14
+ input: { text: true, audio: false, image: true, video: false, pdf: false },
15
+ output: { text: true, audio: false, image: false, video: false, pdf: false },
16
+ interleaved: false,
17
+ },
18
+ cost: { input: 0, output: 0, cache: { read: 0, write: 0 } },
19
+ limit: model.limit,
20
+ status: "active",
21
+ options: {},
22
+ headers: {},
23
+ variants: model.variants,
24
+ ...(model.family ? { family: model.family } : {}),
25
+ ...(model.release_date ? { release_date: model.release_date } : {}),
26
+ };
27
+ }
28
+ function variantsForModel(id, model) {
29
+ if (!model.reasoning)
30
+ return {};
31
+ if (id.endsWith("-pro") || model.family === "gpt-pro")
32
+ return makeVariants(["high"], false);
33
+ if (id.includes("codex-spark"))
34
+ return makeVariants(["low", "medium", "high"], false);
35
+ if (id.includes("codex"))
36
+ return makeVariants(["low", "medium", "high"]);
37
+ return makeVariants(["none", "minimal", "low", "medium", "high"]);
38
+ }
39
+ function isOpenAIWSCandidate(id) {
40
+ return /^gpt-5(?:\.\d+)?(?:-(?:codex(?:-spark)?|pro|mini|nano|chat-latest))?$/.test(id);
41
+ }
42
+ function modelFromCatalog(id, model) {
43
+ if (!isOpenAIWSCandidate(id))
44
+ return undefined;
45
+ const context = model.limit?.context;
46
+ const output = model.limit?.output;
47
+ if (!context || !output)
48
+ return undefined;
49
+ const result = {
50
+ name: `${model.name ?? id} (WebSocket)`,
51
+ reasoning: model.reasoning ?? true,
52
+ temperature: model.temperature ?? false,
53
+ limit: {
54
+ context,
55
+ ...(model.limit?.input ? { input: model.limit.input } : {}),
56
+ output,
57
+ },
58
+ variants: {},
59
+ ...(model.family ? { family: model.family } : {}),
60
+ ...(model.release_date ? { release_date: model.release_date } : {}),
61
+ };
62
+ result.variants = variantsForModel(id, result);
63
+ return result;
64
+ }
65
+ export function resolveModelsFromCatalog(catalog, overrides = {}) {
66
+ const models = { ...OPENAI_WS_MODELS };
67
+ for (const [id, model] of Object.entries(catalog?.openai?.models ?? {})) {
68
+ const resolved = modelFromCatalog(id, model);
69
+ if (resolved)
70
+ models[id] = resolved;
71
+ }
72
+ const providerModels = {};
73
+ for (const [id, model] of Object.entries(models)) {
74
+ providerModels[id] = {
75
+ ...modelToProviderConfig(id, model),
76
+ ...(overrides[id] ?? {}),
77
+ };
78
+ }
79
+ for (const [id, override] of Object.entries(overrides)) {
80
+ if (providerModels[id])
81
+ continue;
82
+ providerModels[id] = {
83
+ ...modelToProviderConfig(id, {
84
+ name: typeof override.name === "string" ? override.name : `${id} (WebSocket)`,
85
+ reasoning: Boolean(override.capabilities?.reasoning),
86
+ temperature: Boolean(override.capabilities?.temperature),
87
+ limit: override.limit ?? { context: 128000, output: 16384 },
88
+ variants: override.variants ?? {},
89
+ }),
90
+ ...override,
91
+ };
92
+ }
93
+ return providerModels;
94
+ }
95
+ export function resolveModels(overrides = {}) {
96
+ return resolveModelsFromCatalog(undefined, overrides);
97
+ }
98
+ export async function resolveModelsBestEffort(overrides = {}, options = {}) {
99
+ if (process.env.OPENAI_WS_OPENCODE_SKIP_CATALOG === "1")
100
+ return resolveModels(overrides);
101
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
102
+ const timeoutMs = options.timeoutMs ?? 800;
103
+ try {
104
+ const response = await fetchImpl("https://models.dev/api.json", {
105
+ signal: AbortSignal.timeout(timeoutMs),
106
+ headers: { "User-Agent": "openai-ws-opencode/0.1.0" },
107
+ });
108
+ if (!response.ok)
109
+ return resolveModels(overrides);
110
+ return resolveModelsFromCatalog((await response.json()), overrides);
111
+ }
112
+ catch {
113
+ return resolveModels(overrides);
114
+ }
115
+ }
116
+ export function modelToOpenCodeConfig(model) {
117
+ return {
118
+ name: model.name,
119
+ ...(model.family ? { family: model.family } : {}),
120
+ ...(model.release_date ? { release_date: model.release_date } : {}),
121
+ attachment: true,
122
+ reasoning: model.reasoning,
123
+ temperature: model.temperature,
124
+ tool_call: true,
125
+ limit: model.limit,
126
+ modalities: {
127
+ input: ["text", "image"],
128
+ output: ["text"],
129
+ },
130
+ cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 },
131
+ options: {},
132
+ provider: { npm: "@ai-sdk/openai", api: OPENAI_API_BASE },
133
+ variants: model.variants,
134
+ };
135
+ }
136
+ export function providerConfigModels(overrides = {}) {
137
+ const models = {};
138
+ for (const [id, model] of Object.entries(OPENAI_WS_MODELS)) {
139
+ models[id] = {
140
+ ...modelToOpenCodeConfig(model),
141
+ ...(overrides[id] ?? {}),
142
+ };
143
+ }
144
+ for (const [id, override] of Object.entries(overrides)) {
145
+ if (models[id])
146
+ continue;
147
+ models[id] = override;
148
+ }
149
+ return models;
150
+ }
151
+ export function providerConfig(overrides = {}) {
152
+ return {
153
+ api: OPENAI_API_BASE,
154
+ name: "OpenAI WebSocket",
155
+ npm: "@ai-sdk/openai",
156
+ models: providerConfigModels(overrides),
157
+ };
158
+ }
159
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/models/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ declare const OpenAIWebSocketPlugin: Plugin;
3
+ export default OpenAIWebSocketPlugin;
4
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAyDxD,QAAA,MAAM,qBAAqB,EAAE,MA0G5B,CAAA;AAED,eAAe,qBAAqB,CAAA"}