oc-chatgpt-multi-auth 4.9.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 (134) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +507 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +110 -0
  6. package/config/minimal-opencode.json +13 -0
  7. package/config/opencode-legacy.json +572 -0
  8. package/config/opencode-modern.json +240 -0
  9. package/dist/index.d.ts +45 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +971 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/accounts.d.ts +120 -0
  14. package/dist/lib/accounts.d.ts.map +1 -0
  15. package/dist/lib/accounts.js +579 -0
  16. package/dist/lib/accounts.js.map +1 -0
  17. package/dist/lib/auth/auth.d.ts +51 -0
  18. package/dist/lib/auth/auth.d.ts.map +1 -0
  19. package/dist/lib/auth/auth.js +180 -0
  20. package/dist/lib/auth/auth.js.map +1 -0
  21. package/dist/lib/auth/browser.d.ts +17 -0
  22. package/dist/lib/auth/browser.d.ts.map +1 -0
  23. package/dist/lib/auth/browser.js +83 -0
  24. package/dist/lib/auth/browser.js.map +1 -0
  25. package/dist/lib/auth/server.d.ts +10 -0
  26. package/dist/lib/auth/server.d.ts.map +1 -0
  27. package/dist/lib/auth/server.js +85 -0
  28. package/dist/lib/auth/server.js.map +1 -0
  29. package/dist/lib/auto-update-checker.d.ts +10 -0
  30. package/dist/lib/auto-update-checker.d.ts.map +1 -0
  31. package/dist/lib/auto-update-checker.js +129 -0
  32. package/dist/lib/auto-update-checker.js.map +1 -0
  33. package/dist/lib/cli.d.ts +9 -0
  34. package/dist/lib/cli.d.ts.map +1 -0
  35. package/dist/lib/cli.js +50 -0
  36. package/dist/lib/cli.js.map +1 -0
  37. package/dist/lib/config.d.ts +17 -0
  38. package/dist/lib/config.d.ts.map +1 -0
  39. package/dist/lib/config.js +102 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/constants.d.ts +74 -0
  42. package/dist/lib/constants.d.ts.map +1 -0
  43. package/dist/lib/constants.js +74 -0
  44. package/dist/lib/constants.js.map +1 -0
  45. package/dist/lib/context-overflow.d.ts +27 -0
  46. package/dist/lib/context-overflow.d.ts.map +1 -0
  47. package/dist/lib/context-overflow.js +124 -0
  48. package/dist/lib/context-overflow.js.map +1 -0
  49. package/dist/lib/index.d.ts +13 -0
  50. package/dist/lib/index.d.ts.map +1 -0
  51. package/dist/lib/index.js +13 -0
  52. package/dist/lib/index.js.map +1 -0
  53. package/dist/lib/logger.d.ts +22 -0
  54. package/dist/lib/logger.d.ts.map +1 -0
  55. package/dist/lib/logger.js +175 -0
  56. package/dist/lib/logger.js.map +1 -0
  57. package/dist/lib/oauth-success.html +712 -0
  58. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  59. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  60. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  61. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  62. package/dist/lib/prompts/codex.d.ts +32 -0
  63. package/dist/lib/prompts/codex.d.ts.map +1 -0
  64. package/dist/lib/prompts/codex.js +262 -0
  65. package/dist/lib/prompts/codex.js.map +1 -0
  66. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  67. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  68. package/dist/lib/prompts/opencode-codex.js +91 -0
  69. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  70. package/dist/lib/recovery/constants.d.ts +12 -0
  71. package/dist/lib/recovery/constants.d.ts.map +1 -0
  72. package/dist/lib/recovery/constants.js +25 -0
  73. package/dist/lib/recovery/constants.js.map +1 -0
  74. package/dist/lib/recovery/index.d.ts +12 -0
  75. package/dist/lib/recovery/index.d.ts.map +1 -0
  76. package/dist/lib/recovery/index.js +12 -0
  77. package/dist/lib/recovery/index.js.map +1 -0
  78. package/dist/lib/recovery/storage.d.ts +24 -0
  79. package/dist/lib/recovery/storage.d.ts.map +1 -0
  80. package/dist/lib/recovery/storage.js +354 -0
  81. package/dist/lib/recovery/storage.js.map +1 -0
  82. package/dist/lib/recovery/types.d.ts +116 -0
  83. package/dist/lib/recovery/types.d.ts.map +1 -0
  84. package/dist/lib/recovery/types.js +7 -0
  85. package/dist/lib/recovery/types.js.map +1 -0
  86. package/dist/lib/recovery.d.ts +31 -0
  87. package/dist/lib/recovery.d.ts.map +1 -0
  88. package/dist/lib/recovery.js +308 -0
  89. package/dist/lib/recovery.js.map +1 -0
  90. package/dist/lib/refresh-queue.d.ts +100 -0
  91. package/dist/lib/refresh-queue.d.ts.map +1 -0
  92. package/dist/lib/refresh-queue.js +196 -0
  93. package/dist/lib/refresh-queue.js.map +1 -0
  94. package/dist/lib/request/fetch-helpers.d.ts +81 -0
  95. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  96. package/dist/lib/request/fetch-helpers.js +325 -0
  97. package/dist/lib/request/fetch-helpers.js.map +1 -0
  98. package/dist/lib/request/helpers/input-utils.d.ts +7 -0
  99. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  100. package/dist/lib/request/helpers/input-utils.js +213 -0
  101. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  102. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  103. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  104. package/dist/lib/request/helpers/model-map.js +109 -0
  105. package/dist/lib/request/helpers/model-map.js.map +1 -0
  106. package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
  107. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
  108. package/dist/lib/request/rate-limit-backoff.js +74 -0
  109. package/dist/lib/request/rate-limit-backoff.js.map +1 -0
  110. package/dist/lib/request/request-transformer.d.ts +93 -0
  111. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  112. package/dist/lib/request/request-transformer.js +405 -0
  113. package/dist/lib/request/request-transformer.js.map +1 -0
  114. package/dist/lib/request/response-handler.d.ts +14 -0
  115. package/dist/lib/request/response-handler.d.ts.map +1 -0
  116. package/dist/lib/request/response-handler.js +90 -0
  117. package/dist/lib/request/response-handler.js.map +1 -0
  118. package/dist/lib/rotation.d.ts +121 -0
  119. package/dist/lib/rotation.d.ts.map +1 -0
  120. package/dist/lib/rotation.js +248 -0
  121. package/dist/lib/rotation.js.map +1 -0
  122. package/dist/lib/storage.d.ts +91 -0
  123. package/dist/lib/storage.d.ts.map +1 -0
  124. package/dist/lib/storage.js +323 -0
  125. package/dist/lib/storage.js.map +1 -0
  126. package/dist/lib/types.d.ts +185 -0
  127. package/dist/lib/types.d.ts.map +1 -0
  128. package/dist/lib/types.js +2 -0
  129. package/dist/lib/types.js.map +1 -0
  130. package/package.json +86 -0
  131. package/scripts/copy-oauth-success.js +37 -0
  132. package/scripts/install-opencode-codex-auth.js +193 -0
  133. package/scripts/test-all-models.sh +260 -0
  134. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Model Configuration Map
3
+ *
4
+ * Maps model config IDs to their normalized API model names.
5
+ * Only includes exact config IDs that OpenCode will pass to the plugin.
6
+ */
7
+ /**
8
+ * Map of config model IDs to normalized API model names
9
+ *
10
+ * Key: The model ID as specified in opencode.json config
11
+ * Value: The normalized model name to send to the API
12
+ */
13
+ export declare const MODEL_MAP: Record<string, string>;
14
+ /**
15
+ * Get normalized model name from config ID
16
+ *
17
+ * @param modelId - Model ID from config (e.g., "gpt-5.1-codex-low")
18
+ * @returns Normalized model name (e.g., "gpt-5.1-codex") or undefined if not found
19
+ */
20
+ export declare function getNormalizedModel(modelId: string): string | undefined;
21
+ /**
22
+ * Check if a model ID is in the model map
23
+ *
24
+ * @param modelId - Model ID to check
25
+ * @returns True if model is in the map
26
+ */
27
+ export declare function isKnownModel(modelId: string): boolean;
28
+ //# sourceMappingURL=model-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-map.d.ts","sourceRoot":"","sources":["../../../../lib/request/helpers/model-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyE5C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBtE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Model Configuration Map
3
+ *
4
+ * Maps model config IDs to their normalized API model names.
5
+ * Only includes exact config IDs that OpenCode will pass to the plugin.
6
+ */
7
+ /**
8
+ * Map of config model IDs to normalized API model names
9
+ *
10
+ * Key: The model ID as specified in opencode.json config
11
+ * Value: The normalized model name to send to the API
12
+ */
13
+ export const MODEL_MAP = {
14
+ // ============================================================================
15
+ // GPT-5.1 Codex Models
16
+ // ============================================================================
17
+ "gpt-5.1-codex": "gpt-5.1-codex",
18
+ "gpt-5.1-codex-low": "gpt-5.1-codex",
19
+ "gpt-5.1-codex-medium": "gpt-5.1-codex",
20
+ "gpt-5.1-codex-high": "gpt-5.1-codex",
21
+ // ============================================================================
22
+ // GPT-5.1 Codex Max Models
23
+ // ============================================================================
24
+ "gpt-5.1-codex-max": "gpt-5.1-codex-max",
25
+ "gpt-5.1-codex-max-low": "gpt-5.1-codex-max",
26
+ "gpt-5.1-codex-max-medium": "gpt-5.1-codex-max",
27
+ "gpt-5.1-codex-max-high": "gpt-5.1-codex-max",
28
+ "gpt-5.1-codex-max-xhigh": "gpt-5.1-codex-max",
29
+ // ============================================================================
30
+ // GPT-5.2 Models (supports none/low/medium/high/xhigh per OpenAI API docs)
31
+ // ============================================================================
32
+ "gpt-5.2": "gpt-5.2",
33
+ "gpt-5.2-none": "gpt-5.2",
34
+ "gpt-5.2-low": "gpt-5.2",
35
+ "gpt-5.2-medium": "gpt-5.2",
36
+ "gpt-5.2-high": "gpt-5.2",
37
+ "gpt-5.2-xhigh": "gpt-5.2",
38
+ // ============================================================================
39
+ // GPT-5.2 Codex Models (low/medium/high/xhigh)
40
+ // ============================================================================
41
+ "gpt-5.2-codex": "gpt-5.2-codex",
42
+ "gpt-5.2-codex-low": "gpt-5.2-codex",
43
+ "gpt-5.2-codex-medium": "gpt-5.2-codex",
44
+ "gpt-5.2-codex-high": "gpt-5.2-codex",
45
+ "gpt-5.2-codex-xhigh": "gpt-5.2-codex",
46
+ // ============================================================================
47
+ // GPT-5.1 Codex Mini Models
48
+ // ============================================================================
49
+ "gpt-5.1-codex-mini": "gpt-5.1-codex-mini",
50
+ "gpt-5.1-codex-mini-medium": "gpt-5.1-codex-mini",
51
+ "gpt-5.1-codex-mini-high": "gpt-5.1-codex-mini",
52
+ // ============================================================================
53
+ // GPT-5.1 General Purpose Models (supports none/low/medium/high per OpenAI API docs)
54
+ // ============================================================================
55
+ "gpt-5.1": "gpt-5.1",
56
+ "gpt-5.1-none": "gpt-5.1",
57
+ "gpt-5.1-low": "gpt-5.1",
58
+ "gpt-5.1-medium": "gpt-5.1",
59
+ "gpt-5.1-high": "gpt-5.1",
60
+ "gpt-5.1-chat-latest": "gpt-5.1",
61
+ // ============================================================================
62
+ // GPT-5 Codex Models (LEGACY - maps to gpt-5.1-codex as gpt-5 is being phased out)
63
+ // ============================================================================
64
+ "gpt-5-codex": "gpt-5.1-codex",
65
+ // ============================================================================
66
+ // GPT-5 Codex Mini Models (LEGACY - maps to gpt-5.1-codex-mini)
67
+ // ============================================================================
68
+ "codex-mini-latest": "gpt-5.1-codex-mini",
69
+ "gpt-5-codex-mini": "gpt-5.1-codex-mini",
70
+ "gpt-5-codex-mini-medium": "gpt-5.1-codex-mini",
71
+ "gpt-5-codex-mini-high": "gpt-5.1-codex-mini",
72
+ // ============================================================================
73
+ // GPT-5 General Purpose Models (LEGACY - maps to gpt-5.1 as gpt-5 is being phased out)
74
+ // ============================================================================
75
+ "gpt-5": "gpt-5.1",
76
+ "gpt-5-mini": "gpt-5.1",
77
+ "gpt-5-nano": "gpt-5.1",
78
+ };
79
+ /**
80
+ * Get normalized model name from config ID
81
+ *
82
+ * @param modelId - Model ID from config (e.g., "gpt-5.1-codex-low")
83
+ * @returns Normalized model name (e.g., "gpt-5.1-codex") or undefined if not found
84
+ */
85
+ export function getNormalizedModel(modelId) {
86
+ try {
87
+ // Try direct lookup first
88
+ if (MODEL_MAP[modelId]) {
89
+ return MODEL_MAP[modelId];
90
+ }
91
+ // Try case-insensitive lookup
92
+ const lowerModelId = modelId.toLowerCase();
93
+ const match = Object.keys(MODEL_MAP).find((key) => key.toLowerCase() === lowerModelId);
94
+ return match ? MODEL_MAP[match] : undefined;
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
100
+ /**
101
+ * Check if a model ID is in the model map
102
+ *
103
+ * @param modelId - Model ID to check
104
+ * @returns True if model is in the map
105
+ */
106
+ export function isKnownModel(modelId) {
107
+ return getNormalizedModel(modelId) !== undefined;
108
+ }
109
+ //# sourceMappingURL=model-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-map.js","sourceRoot":"","sources":["../../../../lib/request/helpers/model-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAA2B;IACjD,+EAA+E;IAC/E,uBAAuB;IACvB,+EAA+E;IAC9E,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,eAAe;IACpC,sBAAsB,EAAE,eAAe;IACvC,oBAAoB,EAAE,eAAe;IAErC,+EAA+E;IAC/E,2BAA2B;IAC3B,+EAA+E;IAC/E,mBAAmB,EAAE,mBAAmB;IACxC,uBAAuB,EAAE,mBAAmB;IAC5C,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,mBAAmB;IAC7C,yBAAyB,EAAE,mBAAmB;IAE9C,+EAA+E;IAC/E,2EAA2E;IAC3E,+EAA+E;IAC/E,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,SAAS;IAE1B,+EAA+E;IAC/E,+CAA+C;IAC/C,+EAA+E;IAC/E,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,eAAe;IACpC,sBAAsB,EAAE,eAAe;IACvC,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,eAAe;IAEtC,+EAA+E;IAC/E,4BAA4B;IAC5B,+EAA+E;IAC/E,oBAAoB,EAAE,oBAAoB;IAC1C,2BAA2B,EAAE,oBAAoB;IACjD,yBAAyB,EAAE,oBAAoB;IAE/C,+EAA+E;IAC/E,qFAAqF;IACrF,+EAA+E;IAC/E,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAEhC,+EAA+E;IAC/E,mFAAmF;IACnF,+EAA+E;IAC/E,aAAa,EAAE,eAAe;IAE9B,+EAA+E;IAC/E,gEAAgE;IAChE,+EAA+E;IAC/E,mBAAmB,EAAE,oBAAoB;IACzC,kBAAkB,EAAE,oBAAoB;IACxC,yBAAyB,EAAE,oBAAoB;IAC/C,uBAAuB,EAAE,oBAAoB;IAE7C,+EAA+E;IAC/E,uFAAuF;IACvF,+EAA+E;IAC/E,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IACjD,IAAI,CAAC;QACJ,0BAA0B;QAC1B,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACxC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,CAC3C,CAAC;QAEF,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAClD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { RateLimitReason } from "../accounts.js";
2
+ export interface RateLimitBackoffResult {
3
+ attempt: number;
4
+ delayMs: number;
5
+ isDuplicate: boolean;
6
+ reason?: RateLimitReason;
7
+ }
8
+ export declare const RATE_LIMIT_SHORT_RETRY_THRESHOLD_MS = 5000;
9
+ /**
10
+ * Compute rate-limit backoff for an account+quota key.
11
+ */
12
+ export declare function getRateLimitBackoff(accountIndex: number, quotaKey: string, serverRetryAfterMs: number | null | undefined): RateLimitBackoffResult;
13
+ export declare function resetRateLimitBackoff(accountIndex: number, quotaKey: string): void;
14
+ export declare function clearRateLimitBackoffState(): void;
15
+ export declare function calculateBackoffMs(baseDelayMs: number, attempt: number, reason?: RateLimitReason): number;
16
+ export declare function getRateLimitBackoffWithReason(accountIndex: number, quotaKey: string, serverRetryAfterMs: number | null | undefined, reason?: RateLimitReason): RateLimitBackoffResult;
17
+ //# sourceMappingURL=rate-limit-backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-backoff.d.ts","sourceRoot":"","sources":["../../../lib/request/rate-limit-backoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAaD,eAAO,MAAM,mCAAmC,OAAO,CAAC;AAexD;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC3C,sBAAsB,CAoCxB;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElF;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AASD,wBAAgB,kBAAkB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,eAA2B,GACjC,MAAM,CAIR;AAED,wBAAgB,6BAA6B,CAC5C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,MAAM,GAAE,eAA2B,GACjC,sBAAsB,CAQxB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Rate limit state tracking with time-window deduplication.
3
+ *
4
+ * Matches the antigravity plugin behavior:
5
+ * - Deduplicate concurrent 429s so parallel requests don't over-increment backoff.
6
+ * - Reset backoff after a quiet period.
7
+ */
8
+ const RATE_LIMIT_DEDUP_WINDOW_MS = 2000;
9
+ const RATE_LIMIT_STATE_RESET_MS = 120_000;
10
+ const MAX_BACKOFF_MS = 60_000;
11
+ export const RATE_LIMIT_SHORT_RETRY_THRESHOLD_MS = 5000;
12
+ const rateLimitStateByAccountQuota = new Map();
13
+ function normalizeDelayMs(value, fallback) {
14
+ const candidate = typeof value === "number" && Number.isFinite(value) ? value : fallback;
15
+ return Math.max(0, Math.floor(candidate));
16
+ }
17
+ /**
18
+ * Compute rate-limit backoff for an account+quota key.
19
+ */
20
+ export function getRateLimitBackoff(accountIndex, quotaKey, serverRetryAfterMs) {
21
+ const now = Date.now();
22
+ const stateKey = `${accountIndex}:${quotaKey}`;
23
+ const previous = rateLimitStateByAccountQuota.get(stateKey);
24
+ const baseDelay = normalizeDelayMs(serverRetryAfterMs, 1000);
25
+ if (previous && now - previous.lastAt < RATE_LIMIT_DEDUP_WINDOW_MS) {
26
+ const backoffDelay = Math.min(baseDelay * Math.pow(2, previous.consecutive429 - 1), MAX_BACKOFF_MS);
27
+ return {
28
+ attempt: previous.consecutive429,
29
+ delayMs: Math.max(baseDelay, backoffDelay),
30
+ isDuplicate: true,
31
+ };
32
+ }
33
+ const attempt = previous && now - previous.lastAt < RATE_LIMIT_STATE_RESET_MS
34
+ ? previous.consecutive429 + 1
35
+ : 1;
36
+ rateLimitStateByAccountQuota.set(stateKey, {
37
+ consecutive429: attempt,
38
+ lastAt: now,
39
+ quotaKey,
40
+ });
41
+ const backoffDelay = Math.min(baseDelay * Math.pow(2, attempt - 1), MAX_BACKOFF_MS);
42
+ return {
43
+ attempt,
44
+ delayMs: Math.max(baseDelay, backoffDelay),
45
+ isDuplicate: false,
46
+ };
47
+ }
48
+ export function resetRateLimitBackoff(accountIndex, quotaKey) {
49
+ rateLimitStateByAccountQuota.delete(`${accountIndex}:${quotaKey}`);
50
+ }
51
+ export function clearRateLimitBackoffState() {
52
+ rateLimitStateByAccountQuota.clear();
53
+ }
54
+ const BACKOFF_MULTIPLIERS = {
55
+ quota: 3.0,
56
+ tokens: 1.5,
57
+ concurrent: 0.5,
58
+ unknown: 1.0,
59
+ };
60
+ export function calculateBackoffMs(baseDelayMs, attempt, reason = "unknown") {
61
+ const multiplier = BACKOFF_MULTIPLIERS[reason] ?? 1.0;
62
+ const exponentialDelay = baseDelayMs * Math.pow(2, attempt - 1);
63
+ return Math.min(Math.floor(exponentialDelay * multiplier), MAX_BACKOFF_MS);
64
+ }
65
+ export function getRateLimitBackoffWithReason(accountIndex, quotaKey, serverRetryAfterMs, reason = "unknown") {
66
+ const result = getRateLimitBackoff(accountIndex, quotaKey, serverRetryAfterMs);
67
+ const adjustedDelay = calculateBackoffMs(result.delayMs, result.attempt, reason);
68
+ return {
69
+ ...result,
70
+ delayMs: adjustedDelay,
71
+ reason,
72
+ };
73
+ }
74
+ //# sourceMappingURL=rate-limit-backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-backoff.js","sourceRoot":"","sources":["../../../lib/request/rate-limit-backoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import type { ConfigOptions, InputItem, ReasoningConfig, RequestBody, UserConfig } from "../types.js";
2
+ export { isOpenCodeSystemPrompt, filterOpenCodeSystemPromptsWithCachedPrompt, } from "./helpers/input-utils.js";
3
+ /**
4
+ * Normalize model name to Codex-supported variants
5
+ *
6
+ * Uses explicit model map for known models, with fallback pattern matching
7
+ * for unknown/custom model names.
8
+ *
9
+ * @param model - Original model name (e.g., "gpt-5.1-codex-low", "openai/gpt-5-codex")
10
+ * @returns Normalized model name (e.g., "gpt-5.1-codex", "gpt-5-codex")
11
+ */
12
+ export declare function normalizeModel(model: string | undefined): string;
13
+ /**
14
+ * Extract configuration for a specific model
15
+ * Merges global options with model-specific options (model-specific takes precedence)
16
+ * @param modelName - Model name (e.g., "gpt-5-codex")
17
+ * @param userConfig - Full user configuration object
18
+ * @returns Merged configuration for this model
19
+ */
20
+ export declare function getModelConfig(modelName: string, userConfig?: UserConfig): ConfigOptions;
21
+ /**
22
+ * Configure reasoning parameters based on model variant and user config
23
+ *
24
+ * NOTE: This plugin follows Codex CLI defaults instead of opencode defaults because:
25
+ * - We're accessing the ChatGPT backend API (not OpenAI Platform API)
26
+ * - opencode explicitly excludes gpt-5-codex from automatic reasoning configuration
27
+ * - Codex CLI has been thoroughly tested against this backend
28
+ *
29
+ * @param originalModel - Original model name before normalization
30
+ * @param userConfig - User configuration object
31
+ * @returns Reasoning configuration
32
+ */
33
+ export declare function getReasoningConfig(modelName: string | undefined, userConfig?: ConfigOptions): ReasoningConfig;
34
+ /**
35
+ * Filter input array for stateless Codex API (store: false)
36
+ *
37
+ * Two transformations needed:
38
+ * 1. Remove AI SDK-specific items (not supported by Codex API)
39
+ * 2. Strip IDs from all remaining items (stateless mode)
40
+ *
41
+ * AI SDK constructs to REMOVE (not in OpenAI Responses API spec):
42
+ * - type: "item_reference" - AI SDK uses this for server-side state lookup
43
+ *
44
+ * Items to KEEP (strip IDs):
45
+ * - type: "message" - Conversation messages (provides context to LLM)
46
+ * - type: "function_call" - Tool calls from conversation
47
+ * - type: "function_call_output" - Tool results from conversation
48
+ *
49
+ * Context is maintained through:
50
+ * - Full message history (without IDs)
51
+ * - reasoning.encrypted_content (for reasoning continuity)
52
+ *
53
+ * @param input - Original input array from OpenCode/AI SDK
54
+ * @returns Filtered input array compatible with Codex API
55
+ */
56
+ export declare function filterInput(input: InputItem[] | undefined): InputItem[] | undefined;
57
+ /**
58
+ * Filter out OpenCode system prompts from input
59
+ * Used in CODEX_MODE to replace OpenCode prompts with Codex-OpenCode bridge
60
+ * @param input - Input array
61
+ * @returns Input array without OpenCode system prompts
62
+ */
63
+ export declare function filterOpenCodeSystemPrompts(input: InputItem[] | undefined): Promise<InputItem[] | undefined>;
64
+ /**
65
+ * Add Codex-OpenCode bridge message to input if tools are present
66
+ * @param input - Input array
67
+ * @param hasTools - Whether tools are present in request
68
+ * @returns Input array with bridge message prepended if needed
69
+ */
70
+ export declare function addCodexBridgeMessage(input: InputItem[] | undefined, hasTools: boolean): InputItem[] | undefined;
71
+ /**
72
+ * Add tool remapping message to input if tools are present
73
+ * @param input - Input array
74
+ * @param hasTools - Whether tools are present in request
75
+ * @returns Input array with tool remap message prepended if needed
76
+ */
77
+ export declare function addToolRemapMessage(input: InputItem[] | undefined, hasTools: boolean): InputItem[] | undefined;
78
+ /**
79
+ * Transform request body for Codex API
80
+ *
81
+ * NOTE: Configuration follows Codex CLI patterns instead of opencode defaults:
82
+ * - opencode sets textVerbosity="low" for gpt-5, but Codex CLI uses "medium"
83
+ * - opencode excludes gpt-5-codex from reasoning configuration
84
+ * - This plugin uses store=false (stateless), requiring encrypted reasoning content
85
+ *
86
+ * @param body - Original request body
87
+ * @param codexInstructions - Codex system instructions
88
+ * @param userConfig - User configuration from loader
89
+ * @param codexMode - Enable CODEX_MODE (bridge prompt instead of tool remap) - defaults to true
90
+ * @returns Transformed request body
91
+ */
92
+ export declare function transformRequestBody(body: RequestBody, codexInstructions: string, userConfig?: UserConfig, codexMode?: boolean): Promise<RequestBody>;
93
+ //# sourceMappingURL=request-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-transformer.d.ts","sourceRoot":"","sources":["../../../lib/request/request-transformer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,sBAAsB,EACtB,2CAA2C,GAC3C,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiFhE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,UAAuC,GACjD,aAAa,CAMf;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,GAAE,aAAkB,GAC5B,eAAe,CA2FjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,GAC5B,SAAS,EAAE,GAAG,SAAS,CAoBzB;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,GAC5B,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAalC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAC9B,QAAQ,EAAE,OAAO,GACf,SAAS,EAAE,GAAG,SAAS,CAezB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAC9B,QAAQ,EAAE,OAAO,GACf,SAAS,EAAE,GAAG,SAAS,CAezB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACzC,IAAI,EAAE,WAAW,EACjB,iBAAiB,EAAE,MAAM,EACzB,UAAU,GAAE,UAAuC,EACnD,SAAS,UAAO,GACd,OAAO,CAAC,WAAW,CAAC,CAyGtB"}