@iam-brain/opencode-codex-auth 0.3.1 → 1.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 (215) hide show
  1. package/README.md +4 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +45 -6
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/accounts-tools.d.ts.map +1 -1
  6. package/dist/lib/accounts-tools.js +88 -4
  7. package/dist/lib/accounts-tools.js.map +1 -1
  8. package/dist/lib/auth-refresh.d.ts +2 -0
  9. package/dist/lib/auth-refresh.d.ts.map +1 -0
  10. package/dist/lib/auth-refresh.js +2 -0
  11. package/dist/lib/auth-refresh.js.map +1 -0
  12. package/dist/lib/cache-io.d.ts +24 -0
  13. package/dist/lib/cache-io.d.ts.map +1 -0
  14. package/dist/lib/cache-io.js +95 -0
  15. package/dist/lib/cache-io.js.map +1 -0
  16. package/dist/lib/cache-lock.d.ts +7 -0
  17. package/dist/lib/cache-lock.d.ts.map +1 -0
  18. package/dist/lib/cache-lock.js +37 -0
  19. package/dist/lib/cache-lock.js.map +1 -0
  20. package/dist/lib/claims.d.ts.map +1 -1
  21. package/dist/lib/claims.js +4 -1
  22. package/dist/lib/claims.js.map +1 -1
  23. package/dist/lib/codex-cache-layout.d.ts +15 -0
  24. package/dist/lib/codex-cache-layout.d.ts.map +1 -0
  25. package/dist/lib/codex-cache-layout.js +52 -0
  26. package/dist/lib/codex-cache-layout.js.map +1 -0
  27. package/dist/lib/codex-native/accounts.d.ts +21 -0
  28. package/dist/lib/codex-native/accounts.d.ts.map +1 -0
  29. package/dist/lib/codex-native/accounts.js +203 -0
  30. package/dist/lib/codex-native/accounts.js.map +1 -0
  31. package/dist/lib/codex-native/acquire-auth.d.ts +22 -0
  32. package/dist/lib/codex-native/acquire-auth.d.ts.map +1 -0
  33. package/dist/lib/codex-native/acquire-auth.js +389 -0
  34. package/dist/lib/codex-native/acquire-auth.js.map +1 -0
  35. package/dist/lib/codex-native/auth-menu-flow.d.ts +9 -0
  36. package/dist/lib/codex-native/auth-menu-flow.d.ts.map +1 -0
  37. package/dist/lib/codex-native/auth-menu-flow.js +304 -0
  38. package/dist/lib/codex-native/auth-menu-flow.js.map +1 -0
  39. package/dist/lib/codex-native/auth-menu-quotas.d.ts +9 -0
  40. package/dist/lib/codex-native/auth-menu-quotas.d.ts.map +1 -0
  41. package/dist/lib/codex-native/auth-menu-quotas.js +213 -0
  42. package/dist/lib/codex-native/auth-menu-quotas.js.map +1 -0
  43. package/dist/lib/codex-native/catalog-auth.d.ts.map +1 -1
  44. package/dist/lib/codex-native/catalog-auth.js +4 -1
  45. package/dist/lib/codex-native/catalog-auth.js.map +1 -1
  46. package/dist/lib/codex-native/catalog-sync.d.ts +28 -0
  47. package/dist/lib/codex-native/catalog-sync.d.ts.map +1 -0
  48. package/dist/lib/codex-native/catalog-sync.js +36 -0
  49. package/dist/lib/codex-native/catalog-sync.js.map +1 -0
  50. package/dist/lib/codex-native/chat-hooks.d.ts +85 -0
  51. package/dist/lib/codex-native/chat-hooks.d.ts.map +1 -0
  52. package/dist/lib/codex-native/chat-hooks.js +175 -0
  53. package/dist/lib/codex-native/chat-hooks.js.map +1 -0
  54. package/dist/lib/codex-native/client-identity.d.ts.map +1 -1
  55. package/dist/lib/codex-native/client-identity.js +55 -40
  56. package/dist/lib/codex-native/client-identity.js.map +1 -1
  57. package/dist/lib/codex-native/collaboration.d.ts +25 -0
  58. package/dist/lib/codex-native/collaboration.d.ts.map +1 -0
  59. package/dist/lib/codex-native/collaboration.js +306 -0
  60. package/dist/lib/codex-native/collaboration.js.map +1 -0
  61. package/dist/lib/codex-native/oauth-auth-methods.d.ts +45 -0
  62. package/dist/lib/codex-native/oauth-auth-methods.d.ts.map +1 -0
  63. package/dist/lib/codex-native/oauth-auth-methods.js +182 -0
  64. package/dist/lib/codex-native/oauth-auth-methods.js.map +1 -0
  65. package/dist/lib/codex-native/oauth-persistence.d.ts +4 -0
  66. package/dist/lib/codex-native/oauth-persistence.d.ts.map +1 -0
  67. package/dist/lib/codex-native/oauth-persistence.js +28 -0
  68. package/dist/lib/codex-native/oauth-persistence.js.map +1 -0
  69. package/dist/lib/codex-native/oauth-server.d.ts.map +1 -1
  70. package/dist/lib/codex-native/oauth-server.js +63 -5
  71. package/dist/lib/codex-native/oauth-server.js.map +1 -1
  72. package/dist/lib/codex-native/oauth-utils.d.ts +51 -0
  73. package/dist/lib/codex-native/oauth-utils.d.ts.map +1 -0
  74. package/dist/lib/codex-native/oauth-utils.js +265 -0
  75. package/dist/lib/codex-native/oauth-utils.js.map +1 -0
  76. package/dist/lib/codex-native/openai-loader-fetch.d.ts +39 -0
  77. package/dist/lib/codex-native/openai-loader-fetch.d.ts.map +1 -0
  78. package/dist/lib/codex-native/openai-loader-fetch.js +337 -0
  79. package/dist/lib/codex-native/openai-loader-fetch.js.map +1 -0
  80. package/dist/lib/codex-native/rate-limit-snapshots.d.ts +2 -0
  81. package/dist/lib/codex-native/rate-limit-snapshots.d.ts.map +1 -0
  82. package/dist/lib/codex-native/rate-limit-snapshots.js +28 -0
  83. package/dist/lib/codex-native/rate-limit-snapshots.js.map +1 -0
  84. package/dist/lib/codex-native/request-routing.d.ts +3 -0
  85. package/dist/lib/codex-native/request-routing.d.ts.map +1 -0
  86. package/dist/lib/codex-native/request-routing.js +41 -0
  87. package/dist/lib/codex-native/request-routing.js.map +1 -0
  88. package/dist/lib/codex-native/request-transform-pipeline.d.ts +20 -0
  89. package/dist/lib/codex-native/request-transform-pipeline.d.ts.map +1 -0
  90. package/dist/lib/codex-native/request-transform-pipeline.js +25 -0
  91. package/dist/lib/codex-native/request-transform-pipeline.js.map +1 -0
  92. package/dist/lib/codex-native/request-transform.d.ts +28 -4
  93. package/dist/lib/codex-native/request-transform.d.ts.map +1 -1
  94. package/dist/lib/codex-native/request-transform.js +347 -41
  95. package/dist/lib/codex-native/request-transform.js.map +1 -1
  96. package/dist/lib/codex-native/session-affinity-state.d.ts +17 -0
  97. package/dist/lib/codex-native/session-affinity-state.d.ts.map +1 -0
  98. package/dist/lib/codex-native/session-affinity-state.js +56 -0
  99. package/dist/lib/codex-native/session-affinity-state.js.map +1 -0
  100. package/dist/lib/codex-native/session-messages.d.ts +8 -0
  101. package/dist/lib/codex-native/session-messages.d.ts.map +1 -0
  102. package/dist/lib/codex-native/session-messages.js +58 -0
  103. package/dist/lib/codex-native/session-messages.js.map +1 -0
  104. package/dist/lib/codex-native.d.ts +12 -30
  105. package/dist/lib/codex-native.d.ts.map +1 -1
  106. package/dist/lib/codex-native.js +141 -1644
  107. package/dist/lib/codex-native.js.map +1 -1
  108. package/dist/lib/codex-prompts-cache.d.ts +17 -0
  109. package/dist/lib/codex-prompts-cache.d.ts.map +1 -0
  110. package/dist/lib/codex-prompts-cache.js +184 -0
  111. package/dist/lib/codex-prompts-cache.js.map +1 -0
  112. package/dist/lib/codex-status-storage.d.ts.map +1 -1
  113. package/dist/lib/codex-status-storage.js +8 -43
  114. package/dist/lib/codex-status-storage.js.map +1 -1
  115. package/dist/lib/codex-status-tool.js +1 -1
  116. package/dist/lib/codex-status-tool.js.map +1 -1
  117. package/dist/lib/codex-status-ui.d.ts.map +1 -1
  118. package/dist/lib/codex-status-ui.js +14 -8
  119. package/dist/lib/codex-status-ui.js.map +1 -1
  120. package/dist/lib/codex-status.d.ts.map +1 -1
  121. package/dist/lib/codex-status.js +28 -2
  122. package/dist/lib/codex-status.js.map +1 -1
  123. package/dist/lib/compat-sanitizer.d.ts.map +1 -1
  124. package/dist/lib/compat-sanitizer.js +5 -4
  125. package/dist/lib/compat-sanitizer.js.map +1 -1
  126. package/dist/lib/config-dir-gitignore.d.ts +3 -0
  127. package/dist/lib/config-dir-gitignore.d.ts.map +1 -0
  128. package/dist/lib/config-dir-gitignore.js +45 -0
  129. package/dist/lib/config-dir-gitignore.js.map +1 -0
  130. package/dist/lib/config.d.ts +30 -11
  131. package/dist/lib/config.d.ts.map +1 -1
  132. package/dist/lib/config.js +359 -153
  133. package/dist/lib/config.js.map +1 -1
  134. package/dist/lib/fetch-orchestrator.d.ts +19 -0
  135. package/dist/lib/fetch-orchestrator.d.ts.map +1 -1
  136. package/dist/lib/fetch-orchestrator.js +33 -6
  137. package/dist/lib/fetch-orchestrator.js.map +1 -1
  138. package/dist/lib/installer-cli.d.ts.map +1 -1
  139. package/dist/lib/installer-cli.js +14 -1
  140. package/dist/lib/installer-cli.js.map +1 -1
  141. package/dist/lib/logger.d.ts.map +1 -1
  142. package/dist/lib/logger.js +4 -1
  143. package/dist/lib/logger.js.map +1 -1
  144. package/dist/lib/model-catalog.d.ts +1 -0
  145. package/dist/lib/model-catalog.d.ts.map +1 -1
  146. package/dist/lib/model-catalog.js +198 -103
  147. package/dist/lib/model-catalog.js.map +1 -1
  148. package/dist/lib/opencode-install.d.ts.map +1 -1
  149. package/dist/lib/opencode-install.js +30 -6
  150. package/dist/lib/opencode-install.js.map +1 -1
  151. package/dist/lib/orchestrator-agent.d.ts +31 -0
  152. package/dist/lib/orchestrator-agent.d.ts.map +1 -0
  153. package/dist/lib/orchestrator-agent.js +268 -0
  154. package/dist/lib/orchestrator-agent.js.map +1 -0
  155. package/dist/lib/paths.d.ts +1 -1
  156. package/dist/lib/paths.d.ts.map +1 -1
  157. package/dist/lib/paths.js +1 -1
  158. package/dist/lib/paths.js.map +1 -1
  159. package/dist/lib/persona-tool-cli.d.ts.map +1 -1
  160. package/dist/lib/persona-tool-cli.js +4 -1
  161. package/dist/lib/persona-tool-cli.js.map +1 -1
  162. package/dist/lib/personalities.d.ts.map +1 -1
  163. package/dist/lib/personalities.js +9 -2
  164. package/dist/lib/personalities.js.map +1 -1
  165. package/dist/lib/personality-command.d.ts.map +1 -1
  166. package/dist/lib/personality-command.js +4 -1
  167. package/dist/lib/personality-command.js.map +1 -1
  168. package/dist/lib/personality-create.d.ts.map +1 -1
  169. package/dist/lib/personality-create.js +5 -1
  170. package/dist/lib/personality-create.js.map +1 -1
  171. package/dist/lib/personality-skill.d.ts.map +1 -1
  172. package/dist/lib/personality-skill.js +4 -1
  173. package/dist/lib/personality-skill.js.map +1 -1
  174. package/dist/lib/prompt-cache-key.d.ts +7 -0
  175. package/dist/lib/prompt-cache-key.d.ts.map +1 -0
  176. package/dist/lib/prompt-cache-key.js +17 -0
  177. package/dist/lib/prompt-cache-key.js.map +1 -0
  178. package/dist/lib/quarantine.d.ts.map +1 -1
  179. package/dist/lib/quarantine.js +22 -5
  180. package/dist/lib/quarantine.js.map +1 -1
  181. package/dist/lib/quota-threshold-alerts.d.ts +31 -0
  182. package/dist/lib/quota-threshold-alerts.d.ts.map +1 -0
  183. package/dist/lib/quota-threshold-alerts.js +97 -0
  184. package/dist/lib/quota-threshold-alerts.js.map +1 -0
  185. package/dist/lib/refresh-queue.d.ts.map +1 -1
  186. package/dist/lib/refresh-queue.js +9 -2
  187. package/dist/lib/refresh-queue.js.map +1 -1
  188. package/dist/lib/remote-cache-fetch.d.ts +28 -0
  189. package/dist/lib/remote-cache-fetch.d.ts.map +1 -0
  190. package/dist/lib/remote-cache-fetch.js +67 -0
  191. package/dist/lib/remote-cache-fetch.js.map +1 -0
  192. package/dist/lib/request-snapshots.d.ts +3 -0
  193. package/dist/lib/request-snapshots.d.ts.map +1 -1
  194. package/dist/lib/request-snapshots.js +88 -13
  195. package/dist/lib/request-snapshots.js.map +1 -1
  196. package/dist/lib/rotation.d.ts +4 -0
  197. package/dist/lib/rotation.d.ts.map +1 -1
  198. package/dist/lib/rotation.js +57 -10
  199. package/dist/lib/rotation.js.map +1 -1
  200. package/dist/lib/session-affinity.d.ts.map +1 -1
  201. package/dist/lib/session-affinity.js +22 -36
  202. package/dist/lib/session-affinity.js.map +1 -1
  203. package/dist/lib/storage.d.ts +8 -5
  204. package/dist/lib/storage.d.ts.map +1 -1
  205. package/dist/lib/storage.js +50 -39
  206. package/dist/lib/storage.js.map +1 -1
  207. package/dist/lib/ui/tty/select.d.ts.map +1 -1
  208. package/dist/lib/ui/tty/select.js +8 -2
  209. package/dist/lib/ui/tty/select.js.map +1 -1
  210. package/dist/lib/util.d.ts +2 -0
  211. package/dist/lib/util.d.ts.map +1 -0
  212. package/dist/lib/util.js +4 -0
  213. package/dist/lib/util.js.map +1 -0
  214. package/package.json +8 -5
  215. package/schemas/codex-config.schema.json +29 -43
@@ -0,0 +1,306 @@
1
+ export const CODEX_PLAN_MODE_INSTRUCTIONS_FALLBACK = `# Plan Mode (Conversational)
2
+
3
+ You work in 3 phases, and you should *chat your way* to a great plan before finalizing it. A great plan is very detailed-intent- and implementation-wise-so that it can be handed to another engineer or agent to be implemented right away. It must be **decision complete**, where the implementer does not need to make any decisions.
4
+
5
+ ## Mode rules (strict)
6
+
7
+ You are in **Plan Mode** until a developer message explicitly ends it.
8
+
9
+ Plan Mode is not changed by user intent, tone, or imperative language. If a user asks for execution while still in Plan Mode, treat it as a request to **plan the execution**, not perform it.
10
+
11
+ ## Plan Mode vs update_plan tool
12
+
13
+ Plan Mode is a collaboration mode that can involve requesting user input and eventually issuing a <proposed_plan> block.
14
+
15
+ Separately, \`update_plan\` is a checklist/progress/TODOs tool; it does not enter or exit Plan Mode. Do not confuse it with Plan mode or try to use it while in Plan mode. If you try to use \`update_plan\` in Plan mode, it will return an error.
16
+
17
+ ## Execution vs. mutation in Plan Mode
18
+
19
+ You may explore and execute **non-mutating** actions that improve the plan. You must not perform **mutating** actions.
20
+
21
+ ### Allowed (non-mutating, plan-improving)
22
+
23
+ Actions that gather truth, reduce ambiguity, or validate feasibility without changing repo-tracked state. Examples:
24
+
25
+ * Reading or searching files, configs, schemas, types, manifests, and docs
26
+ * Static analysis, inspection, and repo exploration
27
+ * Dry-run style commands when they do not edit repo-tracked files
28
+ * Tests, builds, or checks that may write to caches or build artifacts (for example, \`target/\`, \`.cache/\`, or snapshots) so long as they do not edit repo-tracked files
29
+
30
+ ### Not allowed (mutating, plan-executing)
31
+
32
+ Actions that implement the plan or change repo-tracked state. Examples:
33
+
34
+ * Editing or writing files
35
+ * Running formatters or linters that rewrite files
36
+ * Applying patches, migrations, or codegen that updates repo-tracked files
37
+ * Side-effectful commands whose purpose is to carry out the plan rather than refine it
38
+
39
+ When in doubt: if the action would reasonably be described as "doing the work" rather than "planning the work," do not do it.
40
+
41
+ ## PHASE 1 - Ground in the environment (explore first, ask second)
42
+
43
+ Begin by grounding yourself in the actual environment. Eliminate unknowns in the prompt by discovering facts, not by asking the user. Resolve all questions that can be answered through exploration or inspection. Identify missing or ambiguous details only if they cannot be derived from the environment. Silent exploration between turns is allowed and encouraged.
44
+
45
+ Before asking the user any question, perform at least one targeted non-mutating exploration pass (for example: search relevant files, inspect likely entrypoints/configs, confirm current implementation shape), unless no local environment/repo is available.
46
+
47
+ Exception: you may ask clarifying questions about the user's prompt before exploring, ONLY if there are obvious ambiguities or contradictions in the prompt itself. However, if ambiguity might be resolved by exploring, always prefer exploring first.
48
+
49
+ Do not ask questions that can be answered from the repo or system (for example, "where is this struct?" or "which UI component should we use?" when exploration can make it clear). Only ask once you have exhausted reasonable non-mutating exploration.
50
+
51
+ ## PHASE 2 - Intent chat (what they actually want)
52
+
53
+ * Keep asking until you can clearly state: goal + success criteria, audience, in/out of scope, constraints, current state, and the key preferences/tradeoffs.
54
+ * Bias toward questions over guessing: if any high-impact ambiguity remains, do NOT plan yet-ask.
55
+
56
+ ## PHASE 3 - Implementation chat (what/how we'll build)
57
+
58
+ * Once intent is stable, keep asking until the spec is decision complete: approach, interfaces (APIs/schemas/I/O), data flow, edge cases/failure modes, testing + acceptance criteria, rollout/monitoring, and any migrations/compat constraints.
59
+
60
+ ## Asking questions
61
+
62
+ Critical rules:
63
+
64
+ * Strongly prefer using the \`request_user_input\` tool to ask any questions.
65
+ * Offer only meaningful multiple-choice options; don't include filler choices that are obviously wrong or irrelevant.
66
+ * In rare cases where an unavoidable, important question can't be expressed with reasonable multiple-choice options (due to extreme ambiguity), you may ask it directly without the tool.
67
+
68
+ You SHOULD ask many questions, but each question must:
69
+
70
+ * materially change the spec/plan, OR
71
+ * confirm/lock an assumption, OR
72
+ * choose between meaningful tradeoffs.
73
+ * not be answerable by non-mutating commands.
74
+
75
+ Use the \`request_user_input\` tool only for decisions that materially change the plan, for confirming important assumptions, or for information that cannot be discovered via non-mutating exploration.
76
+
77
+ ## Two kinds of unknowns (treat differently)
78
+
79
+ 1. **Discoverable facts** (repo/system truth): explore first.
80
+
81
+ * Before asking, run targeted searches and check likely sources of truth (configs/manifests/entrypoints/schemas/types/constants).
82
+ * Ask only if: multiple plausible candidates; nothing found but you need a missing identifier/context; or ambiguity is actually product intent.
83
+ * If asking, present concrete candidates (paths/service names) + recommend one.
84
+ * Never ask questions you can answer from your environment (e.g., "where is this struct").
85
+
86
+ 2. **Preferences/tradeoffs** (not discoverable): ask early.
87
+
88
+ * These are intent or implementation preferences that cannot be derived from exploration.
89
+ * Provide 2-4 mutually exclusive options + a recommended default.
90
+ * If unanswered, proceed with the recommended option and record it as an assumption in the final plan.
91
+
92
+ ## Finalization rule
93
+
94
+ Only output the final plan when it is decision complete and leaves no decisions to the implementer.
95
+
96
+ When you present the official plan, wrap it in a <proposed_plan> block so the client can render it specially:
97
+
98
+ 1) The opening tag must be on its own line.
99
+ 2) Start the plan content on the next line (no text on the same line as the tag).
100
+ 3) The closing tag must be on its own line.
101
+ 4) Use Markdown inside the block.
102
+ 5) Keep the tags exactly as <proposed_plan> and </proposed_plan> (do not translate or rename them), even if the plan content is in another language.
103
+
104
+ Example:
105
+
106
+ <proposed_plan>
107
+ plan content
108
+ </proposed_plan>
109
+
110
+ plan content should be human and agent digestible. The final plan must be plan-only and include:
111
+
112
+ * A clear title
113
+ * A brief summary section
114
+ * Important changes or additions to public APIs/interfaces/types
115
+ * Test cases and scenarios
116
+ * Explicit assumptions and defaults chosen where needed
117
+
118
+ Do not ask "should I proceed?" in the final output. The user can easily switch out of Plan mode and request implementation if you have included a <proposed_plan> block in your response. Alternatively, they can decide to stay in Plan mode and continue refining the plan.
119
+
120
+ Only produce at most one <proposed_plan> block per turn, and only when you are presenting a complete spec.`;
121
+ let codexPlanModeInstructions = CODEX_PLAN_MODE_INSTRUCTIONS_FALLBACK;
122
+ export function getCodexPlanModeInstructions() {
123
+ return codexPlanModeInstructions;
124
+ }
125
+ export function setCodexPlanModeInstructions(next) {
126
+ const trimmed = next?.trim();
127
+ codexPlanModeInstructions = trimmed ? trimmed : CODEX_PLAN_MODE_INSTRUCTIONS_FALLBACK;
128
+ }
129
+ export const CODEX_CODE_MODE_INSTRUCTIONS = "you are now in code mode.";
130
+ export const CODEX_ORCHESTRATOR_INSTRUCTIONS = `# Sub-agents
131
+
132
+ If subagent tools are unavailable, proceed solo and ignore subagent-specific guidance.
133
+
134
+ When subagents are available, delegate independent work in parallel, coordinate them with wait/send_input-style flow, and synthesize results before finalizing.
135
+
136
+ When subagents are active, your primary role is coordination and synthesis; avoid doing worker implementation in parallel with active workers unless needed for unblock/fallback.`;
137
+ const OPENCODE_TOOLING_TRANSLATION_INSTRUCTIONS = `# Tooling Compatibility (OpenCode)
138
+
139
+ Translate Codex-style tool intent to OpenCode-native tools:
140
+
141
+ - exec_command -> bash
142
+ - read/search/list -> read, grep, glob
143
+ - apply_patch/edit_file -> apply_patch
144
+ - spawn_agent -> task (launch a subagent)
145
+ - send_input -> task with existing task_id (continue the same subagent)
146
+ - wait -> do not return final output until spawned task(s) complete; poll/resume via task tool as needed
147
+ - close_agent -> stop reusing task_id (no dedicated close tool in OpenCode)
148
+
149
+ Always use the available OpenCode tool names and schemas in this runtime.`;
150
+ const CODEX_STYLE_TOOLING_INSTRUCTIONS = `# Tooling Compatibility (Codex-style)
151
+
152
+ Prefer Codex-style workflow semantics and naming when reasoning about steps. If an exact Codex tool is unavailable, fall back to the nearest OpenCode equivalent and continue.`;
153
+ function isRecord(value) {
154
+ return typeof value === "object" && value !== null && !Array.isArray(value);
155
+ }
156
+ function asString(value) {
157
+ if (typeof value !== "string")
158
+ return undefined;
159
+ const trimmed = value.trim();
160
+ return trimmed ? trimmed : undefined;
161
+ }
162
+ export function resolveHookAgentName(agent) {
163
+ const direct = asString(agent);
164
+ if (direct)
165
+ return direct;
166
+ if (!isRecord(agent))
167
+ return undefined;
168
+ return asString(agent.name) ?? asString(agent.agent);
169
+ }
170
+ function normalizeAgentName(agentName) {
171
+ return agentName.trim().toLowerCase().replace(/\s+/g, "-");
172
+ }
173
+ function tokenizeAgentName(normalizedAgentName) {
174
+ return normalizedAgentName
175
+ .split(/[-./:_]+/)
176
+ .map((token) => token.trim())
177
+ .filter((token) => token.length > 0);
178
+ }
179
+ function isCodexFamily(tokens) {
180
+ return tokens[0] === "codex";
181
+ }
182
+ function isPlanPrimary(tokens) {
183
+ return tokens.length === 1 && tokens[0] === "plan";
184
+ }
185
+ function isOrchestratorPrimary(tokens) {
186
+ return tokens.length === 1 && tokens[0] === "orchestrator";
187
+ }
188
+ export function resolveCollaborationProfile(agent) {
189
+ const name = resolveHookAgentName(agent);
190
+ if (!name)
191
+ return { enabled: false };
192
+ const normalizedAgentName = normalizeAgentName(name);
193
+ const tokens = tokenizeAgentName(normalizedAgentName);
194
+ if (tokens.length === 0)
195
+ return { enabled: false, normalizedAgentName };
196
+ const codexFamily = isCodexFamily(tokens);
197
+ const hasPlanToken = tokens.includes("plan") || tokens.includes("planner");
198
+ const hasOrchestratorToken = tokens.includes("orchestrator");
199
+ if ((isPlanPrimary(tokens) || (codexFamily && hasPlanToken)) && !hasOrchestratorToken) {
200
+ return {
201
+ enabled: true,
202
+ normalizedAgentName,
203
+ kind: "plan",
204
+ isOrchestrator: false
205
+ };
206
+ }
207
+ if (isOrchestratorPrimary(tokens) || (codexFamily && hasOrchestratorToken)) {
208
+ return {
209
+ enabled: true,
210
+ normalizedAgentName,
211
+ kind: "code",
212
+ isOrchestrator: true
213
+ };
214
+ }
215
+ if (codexFamily &&
216
+ tokens.some((token) => ["default", "code", "review", "compact", "compaction", "execute", "pair", "pairprogramming"].includes(token))) {
217
+ return {
218
+ enabled: true,
219
+ normalizedAgentName,
220
+ kind: "code",
221
+ isOrchestrator: false
222
+ };
223
+ }
224
+ return { enabled: false, normalizedAgentName };
225
+ }
226
+ export function resolveCollaborationInstructions(kind, instructions) {
227
+ if (kind === "plan")
228
+ return instructions.plan;
229
+ return instructions.code;
230
+ }
231
+ export function resolveToolingInstructions(profile) {
232
+ return profile === "codex" ? CODEX_STYLE_TOOLING_INSTRUCTIONS : OPENCODE_TOOLING_TRANSLATION_INSTRUCTIONS;
233
+ }
234
+ export function mergeInstructions(base, extra) {
235
+ const normalizedExtra = extra.trim();
236
+ if (!normalizedExtra)
237
+ return base?.trim() ?? "";
238
+ const normalizedBase = base?.trim();
239
+ if (!normalizedBase)
240
+ return normalizedExtra;
241
+ if (normalizedBase.includes(normalizedExtra))
242
+ return normalizedBase;
243
+ return `${normalizedBase}\n\n${normalizedExtra}`;
244
+ }
245
+ export function isOrchestratorInstructions(instructions) {
246
+ if (!instructions)
247
+ return false;
248
+ const normalized = instructions.trim();
249
+ if (!normalized)
250
+ return false;
251
+ if (normalized.includes("description: Codex-style orchestration profile for parallel delegation and synthesis.")) {
252
+ return true;
253
+ }
254
+ if (!normalized.includes("# Sub-agents"))
255
+ return false;
256
+ const lower = normalized.toLowerCase();
257
+ if (/\bspawn_agent\b/.test(lower))
258
+ return true;
259
+ const legacyMarkers = [
260
+ "you are codex, a coding agent based on gpt-5.",
261
+ "you and the user share the same workspace and collaborate to achieve the user's goals."
262
+ ];
263
+ if (legacyMarkers.some((marker) => lower.includes(marker)))
264
+ return true;
265
+ const strongMarkers = [
266
+ "if subagent tools are unavailable, proceed solo and ignore subagent-specific guidance.",
267
+ "when subagents are available, delegate independent work in parallel, coordinate them with wait/send_input-style flow, and synthesize results before finalizing.",
268
+ "when subagents are active, your primary role is coordination and synthesis; avoid doing worker implementation in parallel with active workers unless needed for unblock/fallback.",
269
+ "coordinate them via wait / send_input",
270
+ "sub-agents are their to make you go fast",
271
+ "ask the user before shutting sub-agents down unless you need to because you reached the agent limit"
272
+ ];
273
+ if (strongMarkers.some((marker) => lower.includes(marker)))
274
+ return true;
275
+ return (lower.includes("delegate independent work in parallel") &&
276
+ (lower.includes("wait/send_input-style flow") || lower.includes("wait / send_input")) &&
277
+ lower.includes("synthesize"));
278
+ }
279
+ export function resolveSubagentHeaderValue(agent) {
280
+ const profile = resolveCollaborationProfile(agent);
281
+ const normalized = profile.normalizedAgentName;
282
+ if (!profile.enabled || !normalized) {
283
+ return undefined;
284
+ }
285
+ const tokens = tokenizeAgentName(normalized);
286
+ const isPrimary = isPlanPrimary(tokens) ||
287
+ isOrchestratorPrimary(tokens) ||
288
+ (tokens[0] === "codex" &&
289
+ (tokens.includes("orchestrator") ||
290
+ tokens.includes("default") ||
291
+ tokens.includes("code") ||
292
+ tokens.includes("plan") ||
293
+ tokens.includes("planner") ||
294
+ tokens.includes("execute") ||
295
+ tokens.includes("pair") ||
296
+ tokens.includes("pairprogramming")));
297
+ if (isPrimary)
298
+ return undefined;
299
+ if (tokens.includes("review"))
300
+ return "review";
301
+ if (tokens.includes("compact") || tokens.includes("compaction") || normalized === "compaction") {
302
+ return "compact";
303
+ }
304
+ return "collab_spawn";
305
+ }
306
+ //# sourceMappingURL=collaboration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration.js","sourceRoot":"","sources":["../../../lib/codex-native/collaboration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { CodexSpoofMode } from "../config";
2
+ import type { OpenAIAuthMode } from "../types";
3
+ import { type PkceCodes, type TokenResponse } from "./oauth-utils";
4
+ type OAuthSuccess = {
5
+ type: "success";
6
+ refresh: string;
7
+ access: string;
8
+ expires: number;
9
+ accountId?: string;
10
+ };
11
+ type OAuthFailure = {
12
+ type: "failed";
13
+ };
14
+ type OAuthCallbackResult = OAuthSuccess | OAuthFailure;
15
+ type OAuthAuthorizePayload = {
16
+ url: string;
17
+ instructions: string;
18
+ method: "auto";
19
+ callback: () => Promise<OAuthCallbackResult>;
20
+ };
21
+ type AuthMenuResult = "add" | "exit";
22
+ type BrowserAuthorizeDeps = {
23
+ authMode: OpenAIAuthMode;
24
+ spoofMode: CodexSpoofMode;
25
+ runInteractiveAuthMenu: (options: {
26
+ allowExit: boolean;
27
+ }) => Promise<AuthMenuResult>;
28
+ startOAuthServer: () => Promise<{
29
+ redirectUri: string;
30
+ }>;
31
+ waitForOAuthCallback: (pkce: PkceCodes, state: string, authMode: OpenAIAuthMode) => Promise<TokenResponse>;
32
+ scheduleOAuthServerStop: (delayMs: number, reason: "success" | "error" | "other") => void;
33
+ persistOAuthTokens: (tokens: TokenResponse) => Promise<void>;
34
+ openAuthUrl: (url: string) => void;
35
+ shutdownGraceMs: number;
36
+ shutdownErrorGraceMs: number;
37
+ };
38
+ type HeadlessAuthorizeDeps = {
39
+ spoofMode: CodexSpoofMode;
40
+ persistOAuthTokens: (tokens: TokenResponse) => Promise<void>;
41
+ };
42
+ export declare function createBrowserOAuthAuthorize(deps: BrowserAuthorizeDeps): (inputs?: Record<string, string>) => Promise<OAuthAuthorizePayload>;
43
+ export declare function createHeadlessOAuthAuthorize(deps: HeadlessAuthorizeDeps): () => Promise<OAuthAuthorizePayload>;
44
+ export {};
45
+ //# sourceMappingURL=oauth-auth-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-auth-methods.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/oauth-auth-methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAG9C,OAAO,EAYL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,eAAe,CAAA;AAEtB,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,mBAAmB,GAAG,YAAY,GAAG,YAAY,CAAA;AAEtD,KAAK,qBAAqB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAC7C,CAAA;AAED,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,CAAA;AAEpC,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,cAAc,CAAA;IACxB,SAAS,EAAE,cAAc,CAAA;IACzB,sBAAsB,EAAE,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;IACpF,gBAAgB,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,oBAAoB,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IAC1G,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,KAAK,IAAI,CAAA;IACzF,kBAAkB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,cAAc,CAAA;IACzB,kBAAkB,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7D,CAAA;AAoBD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,oBAAoB,IACtD,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,qBAAqB,CAAC,CAkH/E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,qBAAqB,SACrD,OAAO,CAAC,qBAAqB,CAAC,CA6FhD"}
@@ -0,0 +1,182 @@
1
+ import { resolveRequestUserAgent } from "./client-identity";
2
+ import { resolveCodexOriginator } from "./originator";
3
+ import { buildAuthorizeUrl, CLIENT_ID, extractAccountId, fetchWithTimeout, generatePKCE, generateState, ISSUER, OAUTH_DEVICE_AUTH_TIMEOUT_MS, OAUTH_HTTP_TIMEOUT_MS, OAUTH_POLLING_SAFETY_MARGIN_MS, sleep } from "./oauth-utils";
4
+ function resolveDeviceAuthUserAgent(spoofMode) {
5
+ const originator = resolveCodexOriginator(spoofMode);
6
+ const userAgent = resolveRequestUserAgent(spoofMode, originator);
7
+ if (spoofMode !== "native")
8
+ return userAgent;
9
+ const prefix = userAgent.split(" ", 1)[0];
10
+ return prefix || userAgent;
11
+ }
12
+ function toOAuthSuccess(tokens) {
13
+ return {
14
+ type: "success",
15
+ refresh: tokens.refresh_token,
16
+ access: tokens.access_token,
17
+ expires: Date.now() + (tokens.expires_in ?? 3600) * 1000,
18
+ accountId: extractAccountId(tokens)
19
+ };
20
+ }
21
+ export function createBrowserOAuthAuthorize(deps) {
22
+ return async (inputs) => {
23
+ const runSingleBrowserOAuthInline = async () => {
24
+ const { redirectUri } = await deps.startOAuthServer();
25
+ const pkce = await generatePKCE();
26
+ const state = generateState();
27
+ const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, deps.spoofMode === "codex" ? "codex_cli_rs" : "opencode");
28
+ const callbackPromise = deps.waitForOAuthCallback(pkce, state, deps.authMode);
29
+ deps.openAuthUrl(authUrl);
30
+ process.stdout.write(`\nGo to: ${authUrl}\n`);
31
+ process.stdout.write("Complete authorization in your browser. This window will close automatically.\n");
32
+ let authFailed = false;
33
+ try {
34
+ const tokens = await callbackPromise;
35
+ await deps.persistOAuthTokens(tokens);
36
+ process.stdout.write("\nAccount added.\n\n");
37
+ return tokens;
38
+ }
39
+ catch (error) {
40
+ authFailed = true;
41
+ const reason = error instanceof Error ? error.message : "Authorization failed";
42
+ process.stdout.write(`\nAuthorization failed: ${reason}\n\n`);
43
+ return null;
44
+ }
45
+ finally {
46
+ deps.scheduleOAuthServerStop(authFailed ? deps.shutdownErrorGraceMs : deps.shutdownGraceMs, authFailed ? "error" : "success");
47
+ }
48
+ };
49
+ const runInteractiveBrowserAuthLoop = async () => {
50
+ let lastAddedTokens;
51
+ while (true) {
52
+ const menuResult = await deps.runInteractiveAuthMenu({ allowExit: true });
53
+ if (menuResult === "exit") {
54
+ if (!lastAddedTokens) {
55
+ return {
56
+ url: "",
57
+ method: "auto",
58
+ instructions: "Login cancelled.",
59
+ callback: async () => ({ type: "failed" })
60
+ };
61
+ }
62
+ const latest = lastAddedTokens;
63
+ return {
64
+ url: "",
65
+ method: "auto",
66
+ instructions: "",
67
+ callback: async () => toOAuthSuccess(latest)
68
+ };
69
+ }
70
+ const tokens = await runSingleBrowserOAuthInline();
71
+ if (tokens) {
72
+ lastAddedTokens = tokens;
73
+ continue;
74
+ }
75
+ return {
76
+ url: "",
77
+ method: "auto",
78
+ instructions: "Authorization failed.",
79
+ callback: async () => ({ type: "failed" })
80
+ };
81
+ }
82
+ };
83
+ if (inputs && process.env.OPENCODE_NO_BROWSER !== "1" && process.stdin.isTTY && process.stdout.isTTY) {
84
+ return runInteractiveBrowserAuthLoop();
85
+ }
86
+ const { redirectUri } = await deps.startOAuthServer();
87
+ const pkce = await generatePKCE();
88
+ const state = generateState();
89
+ const authUrl = buildAuthorizeUrl(redirectUri, pkce, state, deps.spoofMode === "codex" ? "codex_cli_rs" : "opencode");
90
+ const callbackPromise = deps.waitForOAuthCallback(pkce, state, deps.authMode);
91
+ deps.openAuthUrl(authUrl);
92
+ return {
93
+ url: authUrl,
94
+ instructions: "Complete authorization in your browser. If you close the tab early, cancel (Ctrl+C) and retry.",
95
+ method: "auto",
96
+ callback: async () => {
97
+ let authFailed = false;
98
+ try {
99
+ const tokens = await callbackPromise;
100
+ await deps.persistOAuthTokens(tokens);
101
+ return toOAuthSuccess(tokens);
102
+ }
103
+ catch (error) {
104
+ if (error instanceof Error) {
105
+ // callback failures map to a generic failed result
106
+ }
107
+ authFailed = true;
108
+ return { type: "failed" };
109
+ }
110
+ finally {
111
+ deps.scheduleOAuthServerStop(authFailed ? deps.shutdownErrorGraceMs : deps.shutdownGraceMs, authFailed ? "error" : "success");
112
+ }
113
+ }
114
+ };
115
+ };
116
+ }
117
+ export function createHeadlessOAuthAuthorize(deps) {
118
+ return async () => {
119
+ const deviceResponse = await fetchWithTimeout(`${ISSUER}/api/accounts/deviceauth/usercode`, {
120
+ method: "POST",
121
+ headers: {
122
+ "Content-Type": "application/json",
123
+ "User-Agent": resolveDeviceAuthUserAgent(deps.spoofMode)
124
+ },
125
+ body: JSON.stringify({ client_id: CLIENT_ID })
126
+ }, OAUTH_HTTP_TIMEOUT_MS);
127
+ if (!deviceResponse.ok) {
128
+ throw new Error("Failed to initiate device authorization");
129
+ }
130
+ const deviceData = (await deviceResponse.json());
131
+ const interval = Math.max(parseInt(deviceData.interval) || 5, 1) * 1000;
132
+ return {
133
+ url: `${ISSUER}/codex/device`,
134
+ instructions: `Enter code: ${deviceData.user_code}`,
135
+ method: "auto",
136
+ async callback() {
137
+ const startedAt = Date.now();
138
+ while (true) {
139
+ if (Date.now() - startedAt > OAUTH_DEVICE_AUTH_TIMEOUT_MS) {
140
+ return { type: "failed" };
141
+ }
142
+ const response = await fetchWithTimeout(`${ISSUER}/api/accounts/deviceauth/token`, {
143
+ method: "POST",
144
+ headers: {
145
+ "Content-Type": "application/json",
146
+ "User-Agent": resolveDeviceAuthUserAgent(deps.spoofMode)
147
+ },
148
+ body: JSON.stringify({
149
+ device_auth_id: deviceData.device_auth_id,
150
+ user_code: deviceData.user_code
151
+ })
152
+ }, OAUTH_HTTP_TIMEOUT_MS);
153
+ if (response.ok) {
154
+ const data = (await response.json());
155
+ const tokenResponse = await fetchWithTimeout(`${ISSUER}/oauth/token`, {
156
+ method: "POST",
157
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
158
+ body: new URLSearchParams({
159
+ grant_type: "authorization_code",
160
+ code: data.authorization_code,
161
+ redirect_uri: `${ISSUER}/deviceauth/callback`,
162
+ client_id: CLIENT_ID,
163
+ code_verifier: data.code_verifier
164
+ }).toString()
165
+ }, OAUTH_HTTP_TIMEOUT_MS);
166
+ if (!tokenResponse.ok) {
167
+ throw new Error(`Token exchange failed: ${tokenResponse.status}`);
168
+ }
169
+ const tokens = (await tokenResponse.json());
170
+ await deps.persistOAuthTokens(tokens);
171
+ return toOAuthSuccess(tokens);
172
+ }
173
+ if (response.status !== 403 && response.status !== 404) {
174
+ return { type: "failed" };
175
+ }
176
+ await sleep(interval + OAUTH_POLLING_SAFETY_MARGIN_MS);
177
+ }
178
+ }
179
+ };
180
+ };
181
+ }
182
+ //# sourceMappingURL=oauth-auth-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-auth-methods.js","sourceRoot":"","sources":["../../../lib/codex-native/oauth-auth-methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { OpenAIAuthMode } from "../types";
2
+ import { type TokenResponse } from "./oauth-utils";
3
+ export declare function persistOAuthTokensForMode(tokens: TokenResponse, authMode: OpenAIAuthMode): Promise<void>;
4
+ //# sourceMappingURL=oauth-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-persistence.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/oauth-persistence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAEpE,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB9G"}
@@ -0,0 +1,28 @@
1
+ import { extractEmailFromClaims, extractPlanFromClaims, parseJwtClaims } from "../claims";
2
+ import { ensureOpenAIOAuthDomain, saveAuthStorage } from "../storage";
3
+ import { upsertAccount } from "./accounts";
4
+ import { extractAccountId } from "./oauth-utils";
5
+ export async function persistOAuthTokensForMode(tokens, authMode) {
6
+ const now = Date.now();
7
+ const expires = now + (tokens.expires_in ?? 3600) * 1000;
8
+ const claims = parseJwtClaims(tokens.id_token ?? tokens.access_token);
9
+ const account = {
10
+ enabled: true,
11
+ refresh: tokens.refresh_token,
12
+ access: tokens.access_token,
13
+ expires,
14
+ accountId: extractAccountId(tokens),
15
+ email: extractEmailFromClaims(claims),
16
+ plan: extractPlanFromClaims(claims),
17
+ lastUsed: now
18
+ };
19
+ await saveAuthStorage(undefined, async (authFile) => {
20
+ const domain = ensureOpenAIOAuthDomain(authFile, authMode);
21
+ const stored = upsertAccount(domain, { ...account, authTypes: [authMode] });
22
+ if (stored.identityKey) {
23
+ domain.activeIdentityKey = stored.identityKey;
24
+ }
25
+ return authFile;
26
+ });
27
+ }
28
+ //# sourceMappingURL=oauth-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-persistence.js","sourceRoot":"","sources":["../../../lib/codex-native/oauth-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACzF,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAsB,MAAM,eAAe,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAqB,EAAE,QAAwB;IAC7F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,CAAA;IAErE,MAAM,OAAO,GAAkB;QAC7B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,MAAM,CAAC,aAAa;QAC7B,MAAM,EAAE,MAAM,CAAC,YAAY;QAC3B,OAAO;QACP,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC;QACrC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC;QACnC,QAAQ,EAAE,GAAG;KACd,CAAA;IAED,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC3E,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAA;QAC/C,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/oauth-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C,KAAK,qBAAqB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAA;AAE1D,KAAK,0BAA0B,CAAC,KAAK,EAAE,OAAO,IAAI;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,qBAAqB,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,KAAK,MAAM,CAAA;IAC3D,8BAA8B,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAA;IAC3D,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5F,CAAA;AAUD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EACxD,KAAK,EAAE,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,GAChD;IACD,cAAc,EAAE,MAAM,OAAO,CAAA;IAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClE,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACtE,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5F,CAmRA"}
1
+ {"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/oauth-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAG9C,KAAK,qBAAqB,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAA;AAE1D,KAAK,0BAA0B,CAAC,KAAK,EAAE,OAAO,IAAI;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,qBAAqB,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,KAAK,MAAM,CAAA;IAC3D,8BAA8B,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAA;IAC3D,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5F,CAAA;AA0CD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EACxD,KAAK,EAAE,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,GAChD;IACD,cAAc,EAAE,MAAM,OAAO,CAAA;IAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAClE,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACtE,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5F,CA2SA"}