determinate 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/dist/agent.d.ts +17 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +131 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/context/assembler.d.ts +19 -0
  8. package/dist/context/assembler.d.ts.map +1 -0
  9. package/dist/context/assembler.js +87 -0
  10. package/dist/context/assembler.js.map +1 -0
  11. package/dist/context/budget.d.ts +10 -0
  12. package/dist/context/budget.d.ts.map +1 -0
  13. package/dist/context/budget.js +13 -0
  14. package/dist/context/budget.js.map +1 -0
  15. package/dist/context/tokenizer.d.ts +6 -0
  16. package/dist/context/tokenizer.d.ts.map +1 -0
  17. package/dist/context/tokenizer.js +34 -0
  18. package/dist/context/tokenizer.js.map +1 -0
  19. package/dist/errors.d.ts +29 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +44 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +8 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/oauth/anthropic.d.ts +5 -0
  28. package/dist/oauth/anthropic.d.ts.map +1 -0
  29. package/dist/oauth/anthropic.js +84 -0
  30. package/dist/oauth/anthropic.js.map +1 -0
  31. package/dist/oauth/index.d.ts +18 -0
  32. package/dist/oauth/index.d.ts.map +1 -0
  33. package/dist/oauth/index.js +44 -0
  34. package/dist/oauth/index.js.map +1 -0
  35. package/dist/oauth/openai.d.ts +14 -0
  36. package/dist/oauth/openai.d.ts.map +1 -0
  37. package/dist/oauth/openai.js +328 -0
  38. package/dist/oauth/openai.js.map +1 -0
  39. package/dist/oauth/pkce.d.ts +9 -0
  40. package/dist/oauth/pkce.d.ts.map +1 -0
  41. package/dist/oauth/pkce.js +22 -0
  42. package/dist/oauth/pkce.js.map +1 -0
  43. package/dist/oauth/token-store.d.ts +10 -0
  44. package/dist/oauth/token-store.d.ts.map +1 -0
  45. package/dist/oauth/token-store.js +36 -0
  46. package/dist/oauth/token-store.js.map +1 -0
  47. package/dist/oauth/types.d.ts +32 -0
  48. package/dist/oauth/types.d.ts.map +1 -0
  49. package/dist/oauth/types.js +2 -0
  50. package/dist/oauth/types.js.map +1 -0
  51. package/dist/providers/anthropic.d.ts +9 -0
  52. package/dist/providers/anthropic.d.ts.map +1 -0
  53. package/dist/providers/anthropic.js +101 -0
  54. package/dist/providers/anthropic.js.map +1 -0
  55. package/dist/providers/factory.d.ts +4 -0
  56. package/dist/providers/factory.d.ts.map +1 -0
  57. package/dist/providers/factory.js +25 -0
  58. package/dist/providers/factory.js.map +1 -0
  59. package/dist/providers/openai.d.ts +9 -0
  60. package/dist/providers/openai.d.ts.map +1 -0
  61. package/dist/providers/openai.js +57 -0
  62. package/dist/providers/openai.js.map +1 -0
  63. package/dist/providers/parse-action.d.ts +3 -0
  64. package/dist/providers/parse-action.d.ts.map +1 -0
  65. package/dist/providers/parse-action.js +18 -0
  66. package/dist/providers/parse-action.js.map +1 -0
  67. package/dist/providers/types.d.ts +22 -0
  68. package/dist/providers/types.d.ts.map +1 -0
  69. package/dist/providers/types.js +2 -0
  70. package/dist/providers/types.js.map +1 -0
  71. package/dist/schema/action-schema.d.ts +9 -0
  72. package/dist/schema/action-schema.d.ts.map +1 -0
  73. package/dist/schema/action-schema.js +33 -0
  74. package/dist/schema/action-schema.js.map +1 -0
  75. package/dist/schema/history-schema.d.ts +11 -0
  76. package/dist/schema/history-schema.d.ts.map +1 -0
  77. package/dist/schema/history-schema.js +18 -0
  78. package/dist/schema/history-schema.js.map +1 -0
  79. package/dist/types.d.ts +75 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +61 -0
package/dist/errors.js ADDED
@@ -0,0 +1,44 @@
1
+ export class ValidationError extends Error {
2
+ name = "ValidationError";
3
+ }
4
+ export class BudgetExceededError extends Error {
5
+ section;
6
+ actual;
7
+ budget;
8
+ name = "BudgetExceededError";
9
+ constructor(section, actual, budget) {
10
+ super(`Token budget exceeded for "${section}": ${actual} tokens used, budget is ${budget}`);
11
+ this.section = section;
12
+ this.actual = actual;
13
+ this.budget = budget;
14
+ }
15
+ }
16
+ export class NoValidToolsError extends Error {
17
+ name = "NoValidToolsError";
18
+ constructor() {
19
+ super("No tools passed their validWhen predicate for the current state");
20
+ }
21
+ }
22
+ export class ProviderError extends Error {
23
+ provider;
24
+ name = "ProviderError";
25
+ constructor(provider, message) {
26
+ super(`[${provider}] ${message}`);
27
+ this.provider = provider;
28
+ }
29
+ }
30
+ export class OutputError extends Error {
31
+ rawOutput;
32
+ name = "OutputError";
33
+ constructor(message, rawOutput) {
34
+ super(message);
35
+ this.rawOutput = rawOutput;
36
+ }
37
+ }
38
+ export class AbortError extends Error {
39
+ name = "AbortError";
40
+ constructor(message = "Operation was aborted") {
41
+ super(message);
42
+ }
43
+ }
44
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAChC,IAAI,GAAG,iBAA0B,CAAC;CAC3C;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG5B;IACA;IACA;IAJR,IAAI,GAAG,qBAA8B,CAAC;IAC/C,YACiB,OAAe,EACf,MAAc,EACd,MAAc;QAE9B,KAAK,CAAC,8BAA8B,OAAO,MAAM,MAAM,2BAA2B,MAAM,EAAE,CAAC,CAAC;QAJ5E,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;IAG/B,CAAC;CACD;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAClC,IAAI,GAAG,mBAA4B,CAAC;IAC7C;QACC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAC1E,CAAC;CACD;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGtB;IAFR,IAAI,GAAG,eAAwB,CAAC;IACzC,YACiB,QAAgB,EAChC,OAAe;QAEf,KAAK,CAAC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QAHlB,aAAQ,GAAR,QAAQ,CAAQ;IAIjC,CAAC;CACD;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IAIpB;IAHR,IAAI,GAAG,aAAsB,CAAC;IACvC,YACC,OAAe,EACC,SAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,cAAS,GAAT,SAAS,CAAQ;IAGlC,CAAC;CACD;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC3B,IAAI,GAAG,YAAqB,CAAC;IACtC,YAAY,UAAkB,uBAAuB;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ import { Agent } from "./agent";
2
+ import type { AgentConfig } from "./types";
3
+ export declare function createAgent<TState>(config: AgentConfig<TState>): Agent<TState>;
4
+ export { Agent } from "./agent";
5
+ export { AbortError, BudgetExceededError, NoValidToolsError, OutputError, ProviderError, ValidationError, } from "./errors";
6
+ export type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface, } from "./oauth/index";
7
+ export { getOAuthApiKey, getOAuthProvider, getOAuthProviders, TokenStore } from "./oauth/index";
8
+ export type { Action, ActionMeta, ActionResult, AgentConfig, AssembledContext, HistoryEntry, ModelPricing, NextActionOptions, ProviderConfig, TokenBudgets, TokenUsage, ToolDefinition, VerboseActionResult, } from "./types";
9
+ //# 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,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAE9E;AAED,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EACN,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EACX,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChG,YAAY,EACX,MAAM,EACN,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,GACnB,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ import { Agent } from "./agent";
2
+ export function createAgent(config) {
3
+ return new Agent(config);
4
+ }
5
+ export { Agent } from "./agent";
6
+ export { AbortError, BudgetExceededError, NoValidToolsError, OutputError, ProviderError, ValidationError, } from "./errors";
7
+ export { getOAuthApiKey, getOAuthProvider, getOAuthProviders, TokenStore } from "./oauth/index";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,MAAM,UAAU,WAAW,CAAS,MAA2B;IAC9D,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EACN,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,GACf,MAAM,UAAU,CAAC;AAMlB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { OAuthCredentials, OAuthProviderInterface } from "./types";
2
+ export declare function loginAnthropic(onAuthUrl: (url: string) => void, onPromptCode: () => Promise<string>): Promise<OAuthCredentials>;
3
+ export declare function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials>;
4
+ export declare const anthropicOAuthProvider: OAuthProviderInterface;
5
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/oauth/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAS7F,wBAAsB,cAAc,CACnC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAED,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2B3F;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAkBpC,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { generatePKCE } from "./pkce";
2
+ const decode = (s) => atob(s);
3
+ const CLIENT_ID = decode("OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl");
4
+ const AUTHORIZE_URL = "https://claude.ai/oauth/authorize";
5
+ const TOKEN_URL = "https://console.anthropic.com/v1/oauth/token";
6
+ const REDIRECT_URI = "https://console.anthropic.com/oauth/code/callback";
7
+ const SCOPES = "org:create_api_key user:profile user:inference";
8
+ export async function loginAnthropic(onAuthUrl, onPromptCode) {
9
+ const { verifier, challenge } = await generatePKCE();
10
+ const authParams = new URLSearchParams({
11
+ code: "true",
12
+ client_id: CLIENT_ID,
13
+ response_type: "code",
14
+ redirect_uri: REDIRECT_URI,
15
+ scope: SCOPES,
16
+ code_challenge: challenge,
17
+ code_challenge_method: "S256",
18
+ state: verifier,
19
+ });
20
+ const authUrl = `${AUTHORIZE_URL}?${authParams.toString()}`;
21
+ onAuthUrl(authUrl);
22
+ const authCode = await onPromptCode();
23
+ const splits = authCode.split("#");
24
+ const code = splits[0];
25
+ const state = splits[1];
26
+ const tokenResponse = await fetch(TOKEN_URL, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/json" },
29
+ body: JSON.stringify({
30
+ grant_type: "authorization_code",
31
+ client_id: CLIENT_ID,
32
+ code,
33
+ state,
34
+ redirect_uri: REDIRECT_URI,
35
+ code_verifier: verifier,
36
+ }),
37
+ });
38
+ if (!tokenResponse.ok) {
39
+ const error = await tokenResponse.text();
40
+ throw new Error(`Token exchange failed: ${error}`);
41
+ }
42
+ const tokenData = (await tokenResponse.json());
43
+ const expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;
44
+ return {
45
+ refresh: tokenData.refresh_token,
46
+ access: tokenData.access_token,
47
+ expires: expiresAt,
48
+ };
49
+ }
50
+ export async function refreshAnthropicToken(refreshToken) {
51
+ const response = await fetch(TOKEN_URL, {
52
+ method: "POST",
53
+ headers: { "Content-Type": "application/json" },
54
+ body: JSON.stringify({
55
+ grant_type: "refresh_token",
56
+ client_id: CLIENT_ID,
57
+ refresh_token: refreshToken,
58
+ }),
59
+ });
60
+ if (!response.ok) {
61
+ const error = await response.text();
62
+ throw new Error(`Anthropic token refresh failed: ${error}`);
63
+ }
64
+ const data = (await response.json());
65
+ return {
66
+ refresh: data.refresh_token,
67
+ access: data.access_token,
68
+ expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
69
+ };
70
+ }
71
+ export const anthropicOAuthProvider = {
72
+ id: "anthropic",
73
+ name: "Anthropic (Claude Pro/Max)",
74
+ async login(callbacks) {
75
+ return loginAnthropic((url) => callbacks.onAuth({ url }), () => callbacks.onPrompt({ message: "Paste the authorization code:" }));
76
+ },
77
+ async refreshToken(credentials) {
78
+ return refreshAnthropicToken(credentials.refresh);
79
+ },
80
+ getApiKey(credentials) {
81
+ return credentials.access;
82
+ },
83
+ };
84
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/oauth/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { TokenStore } from "./token-store";
2
+ import type { OAuthCredentials, OAuthProviderInterface } from "./types";
3
+ export { anthropicOAuthProvider } from "./anthropic";
4
+ export { openaiOAuthProvider } from "./openai";
5
+ export { TokenStore } from "./token-store";
6
+ export type { OAuthAuthInfo, OAuthCredentials, OAuthLoginCallbacks, OAuthPrompt, OAuthProviderId, OAuthProviderInterface, } from "./types";
7
+ export declare function getOAuthProvider(id: string): OAuthProviderInterface | undefined;
8
+ export declare function getOAuthProviders(): OAuthProviderInterface[];
9
+ /**
10
+ * Get an API key from stored OAuth credentials.
11
+ * If credentials are expired but refreshable, refreshes transparently.
12
+ * Returns null if no stored credentials exist.
13
+ */
14
+ export declare function getOAuthApiKey(providerId: string, store?: TokenStore): Promise<{
15
+ apiKey: string;
16
+ credentials: OAuthCredentials;
17
+ } | null>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAExE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,sBAAsB,GACtB,MAAM,SAAS,CAAC;AAOjB,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAE/E;AAED,wBAAgB,iBAAiB,IAAI,sBAAsB,EAAE,CAE5D;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAAC,CAqBnE"}
@@ -0,0 +1,44 @@
1
+ import { anthropicOAuthProvider } from "./anthropic";
2
+ import { openaiOAuthProvider } from "./openai";
3
+ import { TokenStore } from "./token-store";
4
+ export { anthropicOAuthProvider } from "./anthropic";
5
+ export { openaiOAuthProvider } from "./openai";
6
+ export { TokenStore } from "./token-store";
7
+ const providers = new Map([
8
+ ["anthropic", anthropicOAuthProvider],
9
+ ["openai", openaiOAuthProvider],
10
+ ]);
11
+ export function getOAuthProvider(id) {
12
+ return providers.get(id);
13
+ }
14
+ export function getOAuthProviders() {
15
+ return Array.from(providers.values());
16
+ }
17
+ /**
18
+ * Get an API key from stored OAuth credentials.
19
+ * If credentials are expired but refreshable, refreshes transparently.
20
+ * Returns null if no stored credentials exist.
21
+ */
22
+ export async function getOAuthApiKey(providerId, store) {
23
+ const provider = providers.get(providerId);
24
+ if (!provider)
25
+ return null;
26
+ const tokenStore = store ?? new TokenStore();
27
+ const credentials = await tokenStore.load(providerId);
28
+ if (!credentials)
29
+ return null;
30
+ // Check if expired
31
+ if (Date.now() >= credentials.expires) {
32
+ try {
33
+ const refreshed = await provider.refreshToken(credentials);
34
+ await tokenStore.save(providerId, refreshed);
35
+ return { apiKey: provider.getApiKey(refreshed), credentials: refreshed };
36
+ }
37
+ catch {
38
+ // Refresh failed — credentials are invalid
39
+ return null;
40
+ }
41
+ }
42
+ return { apiKey: provider.getApiKey(credentials), credentials };
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAU3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiC;IACzD,CAAC,WAAW,EAAE,sBAAsB,CAAC;IACrC,CAAC,QAAQ,EAAE,mBAAmB,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IAC1C,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,UAAkB,EAClB,KAAkB;IAElB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,UAAU,GAAG,KAAK,IAAI,IAAI,UAAU,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,mBAAmB;IACnB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACR,2CAA2C;YAC3C,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { OAuthCredentials, OAuthPrompt, OAuthProviderInterface } from "./types";
2
+ export declare function loginOpenAI(options: {
3
+ onAuth: (info: {
4
+ url: string;
5
+ instructions?: string;
6
+ }) => void;
7
+ onPrompt: (prompt: OAuthPrompt) => Promise<string>;
8
+ onProgress?: (message: string) => void;
9
+ onManualCodeInput?: () => Promise<string>;
10
+ originator?: string;
11
+ }): Promise<OAuthCredentials>;
12
+ export declare function refreshOpenAIToken(refreshToken: string): Promise<OAuthCredentials>;
13
+ export declare const openaiOAuthProvider: OAuthProviderInterface;
14
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/oauth/openai.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,gBAAgB,EAEhB,WAAW,EACX,sBAAsB,EACtB,MAAM,SAAS,CAAC;AA+PjB,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwF5B;AAED,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBxF;AAED,eAAO,MAAM,mBAAmB,EAAE,sBAqBjC,CAAC"}
@@ -0,0 +1,328 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import http from "node:http";
3
+ import { generatePKCE } from "./pkce";
4
+ const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
5
+ const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
6
+ const TOKEN_URL = "https://auth.openai.com/oauth/token";
7
+ const REDIRECT_URI = "http://localhost:1455/auth/callback";
8
+ const SCOPE = "openid profile email offline_access";
9
+ const JWT_CLAIM_PATH = "https://api.openai.com/auth";
10
+ const SUCCESS_HTML = `<!doctype html>
11
+ <html lang="en">
12
+ <head>
13
+ <meta charset="utf-8" />
14
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
15
+ <title>Authentication successful</title>
16
+ </head>
17
+ <body>
18
+ <p>Authentication successful. Return to your terminal to continue.</p>
19
+ </body>
20
+ </html>`;
21
+ function createState() {
22
+ return randomBytes(16).toString("hex");
23
+ }
24
+ function parseAuthorizationInput(input) {
25
+ const value = input.trim();
26
+ if (!value)
27
+ return {};
28
+ try {
29
+ const url = new URL(value);
30
+ return {
31
+ code: url.searchParams.get("code") ?? undefined,
32
+ state: url.searchParams.get("state") ?? undefined,
33
+ };
34
+ }
35
+ catch {
36
+ // not a URL
37
+ }
38
+ if (value.includes("#")) {
39
+ const [code, state] = value.split("#", 2);
40
+ return { code, state };
41
+ }
42
+ if (value.includes("code=")) {
43
+ const params = new URLSearchParams(value);
44
+ return {
45
+ code: params.get("code") ?? undefined,
46
+ state: params.get("state") ?? undefined,
47
+ };
48
+ }
49
+ return { code: value };
50
+ }
51
+ function decodeJwt(token) {
52
+ try {
53
+ const parts = token.split(".");
54
+ if (parts.length !== 3)
55
+ return null;
56
+ const payload = parts[1] ?? "";
57
+ const decoded = atob(payload);
58
+ return JSON.parse(decoded);
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ async function exchangeAuthorizationCode(code, verifier, redirectUri = REDIRECT_URI) {
65
+ const response = await fetch(TOKEN_URL, {
66
+ method: "POST",
67
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
68
+ body: new URLSearchParams({
69
+ grant_type: "authorization_code",
70
+ client_id: CLIENT_ID,
71
+ code,
72
+ code_verifier: verifier,
73
+ redirect_uri: redirectUri,
74
+ }),
75
+ });
76
+ if (!response.ok) {
77
+ return { type: "failed" };
78
+ }
79
+ const json = (await response.json());
80
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
81
+ return { type: "failed" };
82
+ }
83
+ return {
84
+ type: "success",
85
+ access: json.access_token,
86
+ refresh: json.refresh_token,
87
+ expires: Date.now() + json.expires_in * 1000,
88
+ };
89
+ }
90
+ async function refreshAccessToken(refreshToken) {
91
+ try {
92
+ const response = await fetch(TOKEN_URL, {
93
+ method: "POST",
94
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
95
+ body: new URLSearchParams({
96
+ grant_type: "refresh_token",
97
+ refresh_token: refreshToken,
98
+ client_id: CLIENT_ID,
99
+ }),
100
+ });
101
+ if (!response.ok) {
102
+ return { type: "failed" };
103
+ }
104
+ const json = (await response.json());
105
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
106
+ return { type: "failed" };
107
+ }
108
+ return {
109
+ type: "success",
110
+ access: json.access_token,
111
+ refresh: json.refresh_token,
112
+ expires: Date.now() + json.expires_in * 1000,
113
+ };
114
+ }
115
+ catch {
116
+ return { type: "failed" };
117
+ }
118
+ }
119
+ async function createAuthorizationFlow(originator = "determinate") {
120
+ const { verifier, challenge } = await generatePKCE();
121
+ const state = createState();
122
+ const url = new URL(AUTHORIZE_URL);
123
+ url.searchParams.set("response_type", "code");
124
+ url.searchParams.set("client_id", CLIENT_ID);
125
+ url.searchParams.set("redirect_uri", REDIRECT_URI);
126
+ url.searchParams.set("scope", SCOPE);
127
+ url.searchParams.set("code_challenge", challenge);
128
+ url.searchParams.set("code_challenge_method", "S256");
129
+ url.searchParams.set("state", state);
130
+ url.searchParams.set("id_token_add_organizations", "true");
131
+ url.searchParams.set("codex_cli_simplified_flow", "true");
132
+ url.searchParams.set("originator", originator);
133
+ return { verifier, state, url: url.toString() };
134
+ }
135
+ function startLocalOAuthServer(state) {
136
+ let lastCode = null;
137
+ let cancelled = false;
138
+ const server = http.createServer((req, res) => {
139
+ try {
140
+ const url = new URL(req.url || "", "http://localhost");
141
+ if (url.pathname !== "/auth/callback") {
142
+ res.statusCode = 404;
143
+ res.end("Not found");
144
+ return;
145
+ }
146
+ if (url.searchParams.get("state") !== state) {
147
+ res.statusCode = 400;
148
+ res.end("State mismatch");
149
+ return;
150
+ }
151
+ const code = url.searchParams.get("code");
152
+ if (!code) {
153
+ res.statusCode = 400;
154
+ res.end("Missing authorization code");
155
+ return;
156
+ }
157
+ res.statusCode = 200;
158
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
159
+ res.end(SUCCESS_HTML);
160
+ lastCode = code;
161
+ }
162
+ catch {
163
+ res.statusCode = 500;
164
+ res.end("Internal error");
165
+ }
166
+ });
167
+ return new Promise((resolve) => {
168
+ server
169
+ .listen(1455, "127.0.0.1", () => {
170
+ resolve({
171
+ close: () => server.close(),
172
+ cancelWait: () => {
173
+ cancelled = true;
174
+ },
175
+ waitForCode: async () => {
176
+ const sleep = () => new Promise((r) => setTimeout(r, 100));
177
+ for (let i = 0; i < 600; i += 1) {
178
+ if (lastCode)
179
+ return { code: lastCode };
180
+ if (cancelled)
181
+ return null;
182
+ await sleep();
183
+ }
184
+ return null;
185
+ },
186
+ });
187
+ })
188
+ .on("error", (_err) => {
189
+ resolve({
190
+ close: () => {
191
+ try {
192
+ server.close();
193
+ }
194
+ catch {
195
+ // ignore
196
+ }
197
+ },
198
+ cancelWait: () => { },
199
+ waitForCode: async () => null,
200
+ });
201
+ });
202
+ });
203
+ }
204
+ function getAccountId(accessToken) {
205
+ const payload = decodeJwt(accessToken);
206
+ const auth = payload?.[JWT_CLAIM_PATH];
207
+ const accountId = auth?.chatgpt_account_id;
208
+ return typeof accountId === "string" && accountId.length > 0 ? accountId : null;
209
+ }
210
+ export async function loginOpenAI(options) {
211
+ const { verifier, state, url } = await createAuthorizationFlow(options.originator);
212
+ const server = await startLocalOAuthServer(state);
213
+ options.onAuth({ url, instructions: "A browser window should open. Complete login to finish." });
214
+ let code;
215
+ try {
216
+ if (options.onManualCodeInput) {
217
+ let manualCode;
218
+ let manualError;
219
+ const manualPromise = options
220
+ .onManualCodeInput()
221
+ .then((input) => {
222
+ manualCode = input;
223
+ server.cancelWait();
224
+ })
225
+ .catch((err) => {
226
+ manualError = err instanceof Error ? err : new Error(String(err));
227
+ server.cancelWait();
228
+ });
229
+ const result = await server.waitForCode();
230
+ if (manualError)
231
+ throw manualError;
232
+ if (result?.code) {
233
+ code = result.code;
234
+ }
235
+ else if (manualCode) {
236
+ const parsed = parseAuthorizationInput(manualCode);
237
+ if (parsed.state && parsed.state !== state) {
238
+ throw new Error("State mismatch");
239
+ }
240
+ code = parsed.code;
241
+ }
242
+ if (!code) {
243
+ await manualPromise;
244
+ if (manualError)
245
+ throw manualError;
246
+ if (manualCode) {
247
+ const parsed = parseAuthorizationInput(manualCode);
248
+ if (parsed.state && parsed.state !== state) {
249
+ throw new Error("State mismatch");
250
+ }
251
+ code = parsed.code;
252
+ }
253
+ }
254
+ }
255
+ else {
256
+ const result = await server.waitForCode();
257
+ if (result?.code) {
258
+ code = result.code;
259
+ }
260
+ }
261
+ if (!code) {
262
+ const input = await options.onPrompt({
263
+ message: "Paste the authorization code (or full redirect URL):",
264
+ });
265
+ const parsed = parseAuthorizationInput(input);
266
+ if (parsed.state && parsed.state !== state) {
267
+ throw new Error("State mismatch");
268
+ }
269
+ code = parsed.code;
270
+ }
271
+ if (!code) {
272
+ throw new Error("Missing authorization code");
273
+ }
274
+ const tokenResult = await exchangeAuthorizationCode(code, verifier);
275
+ if (tokenResult.type !== "success") {
276
+ throw new Error("Token exchange failed");
277
+ }
278
+ const accountId = getAccountId(tokenResult.access);
279
+ if (!accountId) {
280
+ throw new Error("Failed to extract accountId from token");
281
+ }
282
+ return {
283
+ access: tokenResult.access,
284
+ refresh: tokenResult.refresh,
285
+ expires: tokenResult.expires,
286
+ accountId,
287
+ };
288
+ }
289
+ finally {
290
+ server.close();
291
+ }
292
+ }
293
+ export async function refreshOpenAIToken(refreshToken) {
294
+ const result = await refreshAccessToken(refreshToken);
295
+ if (result.type !== "success") {
296
+ throw new Error("Failed to refresh OpenAI token");
297
+ }
298
+ const accountId = getAccountId(result.access);
299
+ if (!accountId) {
300
+ throw new Error("Failed to extract accountId from token");
301
+ }
302
+ return {
303
+ access: result.access,
304
+ refresh: result.refresh,
305
+ expires: result.expires,
306
+ accountId,
307
+ };
308
+ }
309
+ export const openaiOAuthProvider = {
310
+ id: "openai",
311
+ name: "ChatGPT Plus/Pro",
312
+ usesCallbackServer: true,
313
+ async login(callbacks) {
314
+ return loginOpenAI({
315
+ onAuth: callbacks.onAuth,
316
+ onPrompt: callbacks.onPrompt,
317
+ onProgress: callbacks.onProgress,
318
+ onManualCodeInput: callbacks.onManualCodeInput,
319
+ });
320
+ },
321
+ async refreshToken(credentials) {
322
+ return refreshOpenAIToken(credentials.refresh);
323
+ },
324
+ getApiKey(credentials) {
325
+ return credentials.access;
326
+ },
327
+ };
328
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/oauth/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * PKCE utilities using Web Crypto API.
3
+ * Works in both Node.js 20+ and browsers.
4
+ */
5
+ export declare function generatePKCE(): Promise<{
6
+ verifier: string;
7
+ challenge: string;
8
+ }>;
9
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAWrF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * PKCE utilities using Web Crypto API.
3
+ * Works in both Node.js 20+ and browsers.
4
+ */
5
+ function base64urlEncode(bytes) {
6
+ let binary = "";
7
+ for (const byte of bytes) {
8
+ binary += String.fromCharCode(byte);
9
+ }
10
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
11
+ }
12
+ export async function generatePKCE() {
13
+ const verifierBytes = new Uint8Array(32);
14
+ crypto.getRandomValues(verifierBytes);
15
+ const verifier = base64urlEncode(verifierBytes);
16
+ const encoder = new TextEncoder();
17
+ const data = encoder.encode(verifier);
18
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
19
+ const challenge = base64urlEncode(new Uint8Array(hashBuffer));
20
+ return { verifier, challenge };
21
+ }
22
+ //# sourceMappingURL=pkce.js.map