opencode-openai-codex-auth-multi 4.3.0-multiaccount.1 → 4.5.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 (87) hide show
  1. package/LICENSE +37 -37
  2. package/README.md +463 -80
  3. package/assets/opencode-logo-ornate-dark.svg +18 -18
  4. package/assets/readme-hero.svg +31 -31
  5. package/config/README.md +98 -98
  6. package/config/minimal-opencode.json +11 -11
  7. package/config/opencode-legacy.json +568 -568
  8. package/config/opencode-modern.json +236 -236
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +391 -135
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/accounts.d.ts +85 -11
  14. package/dist/lib/accounts.d.ts.map +1 -1
  15. package/dist/lib/accounts.js +352 -62
  16. package/dist/lib/accounts.js.map +1 -1
  17. package/dist/lib/auth/auth.d.ts +9 -1
  18. package/dist/lib/auth/auth.d.ts.map +1 -1
  19. package/dist/lib/auth/auth.js +26 -13
  20. package/dist/lib/auth/auth.js.map +1 -1
  21. package/dist/lib/auth/browser.d.ts.map +1 -1
  22. package/dist/lib/auth/browser.js +9 -2
  23. package/dist/lib/auth/browser.js.map +1 -1
  24. package/dist/lib/auth/server.d.ts.map +1 -1
  25. package/dist/lib/auth/server.js +11 -4
  26. package/dist/lib/auth/server.js.map +1 -1
  27. package/dist/lib/auto-update-checker.d.ts +10 -0
  28. package/dist/lib/auto-update-checker.d.ts.map +1 -0
  29. package/dist/lib/auto-update-checker.js +129 -0
  30. package/dist/lib/auto-update-checker.js.map +1 -0
  31. package/dist/lib/cli.d.ts +1 -0
  32. package/dist/lib/cli.d.ts.map +1 -1
  33. package/dist/lib/cli.js +11 -6
  34. package/dist/lib/cli.js.map +1 -1
  35. package/dist/lib/config.d.ts +5 -7
  36. package/dist/lib/config.d.ts.map +1 -1
  37. package/dist/lib/config.js +49 -6
  38. package/dist/lib/config.js.map +1 -1
  39. package/dist/lib/constants.d.ts +7 -0
  40. package/dist/lib/constants.d.ts.map +1 -1
  41. package/dist/lib/constants.js +7 -0
  42. package/dist/lib/constants.js.map +1 -1
  43. package/dist/lib/index.d.ts +13 -0
  44. package/dist/lib/index.d.ts.map +1 -0
  45. package/dist/lib/index.js +13 -0
  46. package/dist/lib/index.js.map +1 -0
  47. package/dist/lib/logger.d.ts +13 -17
  48. package/dist/lib/logger.d.ts.map +1 -1
  49. package/dist/lib/logger.js +89 -24
  50. package/dist/lib/logger.js.map +1 -1
  51. package/dist/lib/oauth-success.html +712 -712
  52. package/dist/lib/prompts/codex-opencode-bridge.js +121 -121
  53. package/dist/lib/prompts/codex.d.ts +5 -0
  54. package/dist/lib/prompts/codex.d.ts.map +1 -1
  55. package/dist/lib/prompts/codex.js +114 -93
  56. package/dist/lib/prompts/codex.js.map +1 -1
  57. package/dist/lib/refresh-queue.d.ts +100 -0
  58. package/dist/lib/refresh-queue.d.ts.map +1 -0
  59. package/dist/lib/refresh-queue.js +196 -0
  60. package/dist/lib/refresh-queue.js.map +1 -0
  61. package/dist/lib/request/fetch-helpers.d.ts +2 -3
  62. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  63. package/dist/lib/request/fetch-helpers.js +26 -29
  64. package/dist/lib/request/fetch-helpers.js.map +1 -1
  65. package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
  66. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
  67. package/dist/lib/request/rate-limit-backoff.js +74 -0
  68. package/dist/lib/request/rate-limit-backoff.js.map +1 -0
  69. package/dist/lib/request/request-transformer.d.ts.map +1 -1
  70. package/dist/lib/request/request-transformer.js +3 -2
  71. package/dist/lib/request/request-transformer.js.map +1 -1
  72. package/dist/lib/request/response-handler.js +1 -1
  73. package/dist/lib/request/response-handler.js.map +1 -1
  74. package/dist/lib/rotation.d.ts +121 -0
  75. package/dist/lib/rotation.d.ts.map +1 -0
  76. package/dist/lib/rotation.js +248 -0
  77. package/dist/lib/rotation.js.map +1 -0
  78. package/dist/lib/storage.d.ts +72 -4
  79. package/dist/lib/storage.d.ts.map +1 -1
  80. package/dist/lib/storage.js +189 -19
  81. package/dist/lib/storage.js.map +1 -1
  82. package/dist/lib/types.d.ts +37 -1
  83. package/dist/lib/types.d.ts.map +1 -1
  84. package/package.json +85 -71
  85. package/scripts/install-opencode-codex-auth.js +191 -191
  86. package/scripts/test-all-models.sh +258 -258
  87. package/scripts/validate-model-map.sh +97 -97
@@ -7,127 +7,127 @@
7
7
  *
8
8
  * Token Count: ~450 tokens (~90% reduction vs full OpenCode prompt)
9
9
  */
10
- export const CODEX_OPENCODE_BRIDGE = `# Codex Running in OpenCode
11
-
12
- You are running Codex through OpenCode, an open-source terminal coding assistant. OpenCode provides different tools but follows Codex operating principles.
13
-
14
- ## CRITICAL: Tool Replacements
15
-
16
- <critical_rule priority="0">
17
- ❌ APPLY_PATCH DOES NOT EXIST → ✅ USE "edit" INSTEAD
18
- - NEVER use: apply_patch, applyPatch
19
- - ALWAYS use: edit tool for ALL file modifications
20
- - Before modifying files: Verify you're using "edit", NOT "apply_patch"
21
- </critical_rule>
22
-
23
- <critical_rule priority="0">
24
- ❌ UPDATE_PLAN DOES NOT EXIST → ✅ USE "todowrite" INSTEAD
25
- - NEVER use: update_plan, updatePlan, read_plan, readPlan
26
- - ALWAYS use: todowrite for task/plan updates, todoread to read plans
27
- - Before plan operations: Verify you're using "todowrite", NOT "update_plan"
28
- </critical_rule>
29
-
30
- ## Available OpenCode Tools
31
-
32
- **File Operations:**
33
- - \`write\` - Create new files
34
- - Overwriting existing files requires a prior Read in this session; default to ASCII unless the file already uses Unicode.
35
- - \`edit\` - Modify existing files (REPLACES apply_patch)
36
- - Requires a prior Read in this session; preserve exact indentation; ensure \`oldString\` uniquely matches or use \`replaceAll\`; edit fails if ambiguous or missing.
37
- - \`read\` - Read file contents
38
-
39
- **Search/Discovery:**
40
- - \`grep\` - Search file contents (tool, not bash grep); use \`include\` to filter patterns; set \`path\` only when not searching workspace root; for cross-file match counts use bash with \`rg\`.
41
- - \`glob\` - Find files by pattern; defaults to workspace cwd unless \`path\` is set.
42
- - \`list\` - List directories (requires absolute paths)
43
-
44
- **Execution:**
45
- - \`bash\` - Run shell commands
46
- - No workdir parameter; do not include it in tool calls.
47
- - Always include a short description for the command.
48
- - Do not use cd; use absolute paths in commands.
49
- - Quote paths containing spaces with double quotes.
50
- - Chain multiple commands with ';' or '&&'; avoid newlines.
51
- - Use Grep/Glob tools for searches; only use bash with \`rg\` when you need counts or advanced features.
52
- - Do not use \`ls\`/\`cat\` in bash; use \`list\`/\`read\` tools instead.
53
- - For deletions (rm), verify by listing parent dir with \`list\`.
54
-
55
- **Network:**
56
- - \`webfetch\` - Fetch web content
57
- - Use fully-formed URLs (http/https; http auto-upgrades to https).
58
- - Always set \`format\` to one of: text | markdown | html; prefer markdown unless otherwise required.
59
- - Read-only; short cache window.
60
-
61
- **Task Management:**
62
- - \`todowrite\` - Manage tasks/plans (REPLACES update_plan)
63
- - \`todoread\` - Read current plan
64
-
65
- ## Substitution Rules
66
-
67
- Base instruction says: You MUST use instead:
68
- apply_patch → edit
69
- update_plan → todowrite
70
- read_plan → todoread
71
-
72
- **Path Usage:** Use per-tool conventions to avoid conflicts:
73
- - Tool calls: \`read\`, \`edit\`, \`write\`, \`list\` require absolute paths.
74
- - Searches: \`grep\`/\`glob\` default to the workspace cwd; prefer relative include patterns; set \`path\` only when a different root is needed.
75
- - Presentation: In assistant messages, show workspace-relative paths; use absolute paths only inside tool calls.
76
- - Tool schema overrides general path preferences—do not convert required absolute paths to relative.
77
-
78
- ## Verification Checklist
79
-
80
- Before file/plan modifications:
81
- 1. Am I using "edit" NOT "apply_patch"?
82
- 2. Am I using "todowrite" NOT "update_plan"?
83
- 3. Is this tool in the approved list above?
84
- 4. Am I following each tool's path requirements?
85
-
86
- If ANY answer is NO → STOP and correct before proceeding.
87
-
88
- ## OpenCode Working Style
89
-
90
- **Communication:**
91
- - Send brief preambles (8-12 words) before tool calls, building on prior context
92
- - Provide progress updates during longer tasks
93
-
94
- **Execution:**
95
- - Keep working autonomously until query is fully resolved before yielding
96
- - Don't return to user with partial solutions
97
-
98
- **Code Approach:**
99
- - New projects: Be ambitious and creative
100
- - Existing codebases: Surgical precision - modify only what's requested unless explicitly instructed to do otherwise
101
-
102
- **Testing:**
103
- - If tests exist: Start specific to your changes, then broader validation
104
-
105
- ## Advanced Tools
106
-
107
- **Task Tool (Sub-Agents):**
108
- - Use the Task tool (functions.task) to launch sub-agents
109
- - Check the Task tool description for current agent types and their capabilities
110
- - Useful for complex analysis, specialized workflows, or tasks requiring isolated context
111
- - The agent list is dynamically generated - refer to tool schema for available agents
112
-
113
- **Parallelization:**
114
- - When multiple independent tool calls are needed, use multi_tool_use.parallel to run them concurrently.
115
- - Reserve sequential calls for ordered or data-dependent steps.
116
-
117
- **MCP Tools:**
118
- - Model Context Protocol servers provide additional capabilities
119
- - MCP tools are prefixed: \`mcp__<server-name>__<tool-name>\`
120
- - Check your available tools for MCP integrations
121
- - Use when the tool's functionality matches your task needs
122
-
123
- ## What Remains from Codex
124
-
125
- Sandbox policies, approval mechanisms, final answer formatting, git commit protocols, and file reference formats all follow Codex instructions. In approval policy "never", never request escalations.
126
-
127
- ## Approvals & Safety
128
- - Assume workspace-write filesystem, network enabled, approval on-failure unless explicitly stated otherwise.
129
- - When a command fails due to sandboxing or permissions, retry with escalated permissions if allowed by policy, including a one-line justification.
130
- - Treat destructive commands (e.g., \`rm\`, \`git reset --hard\`) as requiring explicit user request or approval.
10
+ export const CODEX_OPENCODE_BRIDGE = `# Codex Running in OpenCode
11
+
12
+ You are running Codex through OpenCode, an open-source terminal coding assistant. OpenCode provides different tools but follows Codex operating principles.
13
+
14
+ ## CRITICAL: Tool Replacements
15
+
16
+ <critical_rule priority="0">
17
+ ❌ APPLY_PATCH DOES NOT EXIST → ✅ USE "edit" INSTEAD
18
+ - NEVER use: apply_patch, applyPatch
19
+ - ALWAYS use: edit tool for ALL file modifications
20
+ - Before modifying files: Verify you're using "edit", NOT "apply_patch"
21
+ </critical_rule>
22
+
23
+ <critical_rule priority="0">
24
+ ❌ UPDATE_PLAN DOES NOT EXIST → ✅ USE "todowrite" INSTEAD
25
+ - NEVER use: update_plan, updatePlan, read_plan, readPlan
26
+ - ALWAYS use: todowrite for task/plan updates, todoread to read plans
27
+ - Before plan operations: Verify you're using "todowrite", NOT "update_plan"
28
+ </critical_rule>
29
+
30
+ ## Available OpenCode Tools
31
+
32
+ **File Operations:**
33
+ - \`write\` - Create new files
34
+ - Overwriting existing files requires a prior Read in this session; default to ASCII unless the file already uses Unicode.
35
+ - \`edit\` - Modify existing files (REPLACES apply_patch)
36
+ - Requires a prior Read in this session; preserve exact indentation; ensure \`oldString\` uniquely matches or use \`replaceAll\`; edit fails if ambiguous or missing.
37
+ - \`read\` - Read file contents
38
+
39
+ **Search/Discovery:**
40
+ - \`grep\` - Search file contents (tool, not bash grep); use \`include\` to filter patterns; set \`path\` only when not searching workspace root; for cross-file match counts use bash with \`rg\`.
41
+ - \`glob\` - Find files by pattern; defaults to workspace cwd unless \`path\` is set.
42
+ - \`list\` - List directories (requires absolute paths)
43
+
44
+ **Execution:**
45
+ - \`bash\` - Run shell commands
46
+ - No workdir parameter; do not include it in tool calls.
47
+ - Always include a short description for the command.
48
+ - Do not use cd; use absolute paths in commands.
49
+ - Quote paths containing spaces with double quotes.
50
+ - Chain multiple commands with ';' or '&&'; avoid newlines.
51
+ - Use Grep/Glob tools for searches; only use bash with \`rg\` when you need counts or advanced features.
52
+ - Do not use \`ls\`/\`cat\` in bash; use \`list\`/\`read\` tools instead.
53
+ - For deletions (rm), verify by listing parent dir with \`list\`.
54
+
55
+ **Network:**
56
+ - \`webfetch\` - Fetch web content
57
+ - Use fully-formed URLs (http/https; http auto-upgrades to https).
58
+ - Always set \`format\` to one of: text | markdown | html; prefer markdown unless otherwise required.
59
+ - Read-only; short cache window.
60
+
61
+ **Task Management:**
62
+ - \`todowrite\` - Manage tasks/plans (REPLACES update_plan)
63
+ - \`todoread\` - Read current plan
64
+
65
+ ## Substitution Rules
66
+
67
+ Base instruction says: You MUST use instead:
68
+ apply_patch → edit
69
+ update_plan → todowrite
70
+ read_plan → todoread
71
+
72
+ **Path Usage:** Use per-tool conventions to avoid conflicts:
73
+ - Tool calls: \`read\`, \`edit\`, \`write\`, \`list\` require absolute paths.
74
+ - Searches: \`grep\`/\`glob\` default to the workspace cwd; prefer relative include patterns; set \`path\` only when a different root is needed.
75
+ - Presentation: In assistant messages, show workspace-relative paths; use absolute paths only inside tool calls.
76
+ - Tool schema overrides general path preferences—do not convert required absolute paths to relative.
77
+
78
+ ## Verification Checklist
79
+
80
+ Before file/plan modifications:
81
+ 1. Am I using "edit" NOT "apply_patch"?
82
+ 2. Am I using "todowrite" NOT "update_plan"?
83
+ 3. Is this tool in the approved list above?
84
+ 4. Am I following each tool's path requirements?
85
+
86
+ If ANY answer is NO → STOP and correct before proceeding.
87
+
88
+ ## OpenCode Working Style
89
+
90
+ **Communication:**
91
+ - Send brief preambles (8-12 words) before tool calls, building on prior context
92
+ - Provide progress updates during longer tasks
93
+
94
+ **Execution:**
95
+ - Keep working autonomously until query is fully resolved before yielding
96
+ - Don't return to user with partial solutions
97
+
98
+ **Code Approach:**
99
+ - New projects: Be ambitious and creative
100
+ - Existing codebases: Surgical precision - modify only what's requested unless explicitly instructed to do otherwise
101
+
102
+ **Testing:**
103
+ - If tests exist: Start specific to your changes, then broader validation
104
+
105
+ ## Advanced Tools
106
+
107
+ **Task Tool (Sub-Agents):**
108
+ - Use the Task tool (functions.task) to launch sub-agents
109
+ - Check the Task tool description for current agent types and their capabilities
110
+ - Useful for complex analysis, specialized workflows, or tasks requiring isolated context
111
+ - The agent list is dynamically generated - refer to tool schema for available agents
112
+
113
+ **Parallelization:**
114
+ - When multiple independent tool calls are needed, use multi_tool_use.parallel to run them concurrently.
115
+ - Reserve sequential calls for ordered or data-dependent steps.
116
+
117
+ **MCP Tools:**
118
+ - Model Context Protocol servers provide additional capabilities
119
+ - MCP tools are prefixed: \`mcp__<server-name>__<tool-name>\`
120
+ - Check your available tools for MCP integrations
121
+ - Use when the tool's functionality matches your task needs
122
+
123
+ ## What Remains from Codex
124
+
125
+ Sandbox policies, approval mechanisms, final answer formatting, git commit protocols, and file reference formats all follow Codex instructions. In approval policy "never", never request escalations.
126
+
127
+ ## Approvals & Safety
128
+ - Assume workspace-write filesystem, network enabled, approval on-failure unless explicitly stated otherwise.
129
+ - When a command fails due to sandboxing or permissions, retry with escalated permissions if allowed by policy, including a one-line justification.
130
+ - Treat destructive commands (e.g., \`rm\`, \`git reset --hard\`) as requiring explicit user request or approval.
131
131
  - When uncertain, prefer non-destructive verification first (e.g., confirm file existence with \`list\`, then delete with \`bash\`).`;
132
132
  export const CODEX_OPENCODE_BRIDGE_META = {
133
133
  estimatedTokens: 550,
@@ -3,6 +3,11 @@
3
3
  * Maps to different system prompts in the Codex CLI
4
4
  */
5
5
  export type ModelFamily = "gpt-5.2-codex" | "codex-max" | "codex" | "gpt-5.2" | "gpt-5.1";
6
+ /**
7
+ * All supported model families
8
+ * Used for per-family account rotation and rate limit tracking
9
+ */
10
+ export declare const MODEL_FAMILIES: readonly ModelFamily[];
6
11
  /**
7
12
  * Determine the model family based on the normalized model name
8
13
  * @param normalizedModel - The normalized model name (e.g., "gpt-5.2-codex", "gpt-5.1-codex-max", "gpt-5.1-codex", "gpt-5.1")
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../lib/prompts/codex.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,MAAM,WAAW,GACpB,eAAe,GACf,WAAW,GACX,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AAyBb;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAqBnE;AA2CD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACzC,eAAe,SAAkB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA2GjB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,+mEA8DV,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../lib/prompts/codex.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,MAAM,WAAW,GACpB,eAAe,GACf,WAAW,GACX,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,WAAW,EAMvC,CAAC;AAyBX;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAoBnE;AAoDD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACzC,eAAe,SAAkB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA0GjB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,+mEA8DV,CAAC"}
@@ -1,12 +1,25 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
1
+ import { promises as fs } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  const GITHUB_API_RELEASES = "https://api.github.com/repos/openai/codex/releases/latest";
6
6
  const GITHUB_HTML_RELEASES = "https://github.com/openai/codex/releases/latest";
7
7
  const CACHE_DIR = join(homedir(), ".opencode", "cache");
8
+ const CACHE_TTL_MS = 15 * 60 * 1000;
8
9
  const __filename = fileURLToPath(import.meta.url);
9
10
  const __dirname = dirname(__filename);
11
+ const memoryCache = new Map();
12
+ /**
13
+ * All supported model families
14
+ * Used for per-family account rotation and rate limit tracking
15
+ */
16
+ export const MODEL_FAMILIES = [
17
+ "gpt-5.2-codex",
18
+ "codex-max",
19
+ "codex",
20
+ "gpt-5.2",
21
+ "gpt-5.1",
22
+ ];
10
23
  /**
11
24
  * Prompt file mapping for each model family
12
25
  * Based on codex-rs/core/src/model_family.rs logic
@@ -34,7 +47,6 @@ const CACHE_FILES = {
34
47
  * @returns The model family for prompt selection
35
48
  */
36
49
  export function getModelFamily(normalizedModel) {
37
- // Order matters - check more specific patterns first
38
50
  if (normalizedModel.includes("gpt-5.2-codex") ||
39
51
  normalizedModel.includes("gpt 5.2 codex")) {
40
52
  return "gpt-5.2-codex";
@@ -51,6 +63,14 @@ export function getModelFamily(normalizedModel) {
51
63
  }
52
64
  return "gpt-5.1";
53
65
  }
66
+ async function readFileOrNull(path) {
67
+ try {
68
+ return await fs.readFile(path, "utf8");
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
54
74
  /**
55
75
  * Get the latest release tag from GitHub
56
76
  * @returns Release tag name (e.g., "rust-v0.43.0")
@@ -66,6 +86,7 @@ async function getLatestReleaseTag() {
66
86
  }
67
87
  }
68
88
  catch {
89
+ // Fall through to HTML fallback
69
90
  }
70
91
  const htmlResponse = await fetch(GITHUB_HTML_RELEASES);
71
92
  if (!htmlResponse.ok) {
@@ -98,63 +119,61 @@ async function getLatestReleaseTag() {
98
119
  */
99
120
  export async function getCodexInstructions(normalizedModel = "gpt-5.1-codex") {
100
121
  const modelFamily = getModelFamily(normalizedModel);
122
+ const cached = memoryCache.get(modelFamily);
123
+ if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
124
+ return cached.content;
125
+ }
101
126
  const promptFile = PROMPT_FILES[modelFamily];
102
127
  const cacheFile = join(CACHE_DIR, CACHE_FILES[modelFamily]);
103
128
  const cacheMetaFile = join(CACHE_DIR, `${CACHE_FILES[modelFamily].replace(".md", "-meta.json")}`);
104
129
  try {
105
- // Load cached metadata (includes ETag, tag, and lastChecked timestamp)
106
130
  let cachedETag = null;
107
131
  let cachedTag = null;
108
132
  let cachedTimestamp = null;
109
- if (existsSync(cacheMetaFile)) {
110
- const metadata = JSON.parse(readFileSync(cacheMetaFile, "utf8"));
133
+ const metaContent = await readFileOrNull(cacheMetaFile);
134
+ if (metaContent) {
135
+ const metadata = JSON.parse(metaContent);
111
136
  cachedETag = metadata.etag;
112
137
  cachedTag = metadata.tag;
113
138
  cachedTimestamp = metadata.lastChecked;
114
139
  }
115
- // Rate limit protection: If cache is less than 15 minutes old, use it
116
- const CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes
117
140
  if (cachedTimestamp &&
118
- Date.now() - cachedTimestamp < CACHE_TTL_MS &&
119
- existsSync(cacheFile)) {
120
- return readFileSync(cacheFile, "utf8");
141
+ Date.now() - cachedTimestamp < CACHE_TTL_MS) {
142
+ const diskContent = await readFileOrNull(cacheFile);
143
+ if (diskContent) {
144
+ memoryCache.set(modelFamily, { content: diskContent, timestamp: Date.now() });
145
+ return diskContent;
146
+ }
121
147
  }
122
- // Get the latest release tag (only if cache is stale or missing)
123
148
  const latestTag = await getLatestReleaseTag();
124
149
  const CODEX_INSTRUCTIONS_URL = `https://raw.githubusercontent.com/openai/codex/${latestTag}/codex-rs/core/${promptFile}`;
125
- // If tag changed, we need to fetch new instructions
126
150
  if (cachedTag !== latestTag) {
127
- cachedETag = null; // Force re-fetch
151
+ cachedETag = null;
128
152
  }
129
- // Make conditional request with If-None-Match header
130
153
  const headers = {};
131
154
  if (cachedETag) {
132
155
  headers["If-None-Match"] = cachedETag;
133
156
  }
134
157
  const response = await fetch(CODEX_INSTRUCTIONS_URL, { headers });
135
- // 304 Not Modified - our cached version is still current
136
158
  if (response.status === 304) {
137
- if (existsSync(cacheFile)) {
138
- return readFileSync(cacheFile, "utf8");
159
+ const diskContent = await readFileOrNull(cacheFile);
160
+ if (diskContent) {
161
+ memoryCache.set(modelFamily, { content: diskContent, timestamp: Date.now() });
162
+ return diskContent;
139
163
  }
140
- // Cache file missing but GitHub says not modified - fall through to re-fetch
141
164
  }
142
- // 200 OK - new content or first fetch
143
165
  if (response.ok) {
144
166
  const instructions = await response.text();
145
167
  const newETag = response.headers.get("etag");
146
- // Create cache directory if it doesn't exist
147
- if (!existsSync(CACHE_DIR)) {
148
- mkdirSync(CACHE_DIR, { recursive: true });
149
- }
150
- // Cache the instructions with ETag and tag (verbatim from GitHub)
151
- writeFileSync(cacheFile, instructions, "utf8");
152
- writeFileSync(cacheMetaFile, JSON.stringify({
168
+ await fs.mkdir(CACHE_DIR, { recursive: true });
169
+ await fs.writeFile(cacheFile, instructions, "utf8");
170
+ await fs.writeFile(cacheMetaFile, JSON.stringify({
153
171
  etag: newETag,
154
172
  tag: latestTag,
155
173
  lastChecked: Date.now(),
156
174
  url: CODEX_INSTRUCTIONS_URL,
157
175
  }), "utf8");
176
+ memoryCache.set(modelFamily, { content: instructions, timestamp: Date.now() });
158
177
  return instructions;
159
178
  }
160
179
  throw new Error(`HTTP ${response.status}`);
@@ -162,80 +181,82 @@ export async function getCodexInstructions(normalizedModel = "gpt-5.1-codex") {
162
181
  catch (error) {
163
182
  const err = error;
164
183
  console.error(`[openai-codex-plugin] Failed to fetch ${modelFamily} instructions from GitHub:`, err.message);
165
- // Try to use cached version even if stale
166
- if (existsSync(cacheFile)) {
184
+ const diskContent = await readFileOrNull(cacheFile);
185
+ if (diskContent) {
167
186
  console.error(`[openai-codex-plugin] Using cached ${modelFamily} instructions`);
168
- return readFileSync(cacheFile, "utf8");
187
+ memoryCache.set(modelFamily, { content: diskContent, timestamp: Date.now() });
188
+ return diskContent;
169
189
  }
170
- // Fall back to bundled version (use codex-instructions.md as default)
171
190
  console.error(`[openai-codex-plugin] Falling back to bundled instructions for ${modelFamily}`);
172
- return readFileSync(join(__dirname, "codex-instructions.md"), "utf8");
191
+ const bundled = await fs.readFile(join(__dirname, "codex-instructions.md"), "utf8");
192
+ memoryCache.set(modelFamily, { content: bundled, timestamp: Date.now() });
193
+ return bundled;
173
194
  }
174
195
  }
175
196
  /**
176
197
  * Tool remapping instructions for opencode tools
177
198
  */
178
- export const TOOL_REMAP_MESSAGE = `<user_instructions priority="0">
179
- <environment_override priority="0">
180
- YOU ARE IN A DIFFERENT ENVIRONMENT. These instructions override ALL previous tool references.
181
- </environment_override>
182
-
183
- <tool_replacements priority="0">
184
- <critical_rule priority="0">
185
- ❌ APPLY_PATCH DOES NOT EXIST → ✅ USE "edit" INSTEAD
186
- - NEVER use: apply_patch, applyPatch
187
- - ALWAYS use: edit tool for ALL file modifications
188
- - Before modifying files: Verify you're using "edit", NOT "apply_patch"
189
- </critical_rule>
190
-
191
- <critical_rule priority="0">
192
- ❌ UPDATE_PLAN DOES NOT EXIST → ✅ USE "todowrite" INSTEAD
193
- - NEVER use: update_plan, updatePlan
194
- - ALWAYS use: todowrite for ALL task/plan operations
195
- - Use todoread to read current plan
196
- - Before plan operations: Verify you're using "todowrite", NOT "update_plan"
197
- </critical_rule>
198
- </tool_replacements>
199
-
200
- <available_tools priority="0">
201
- File Operations:
202
- • write - Create new files
203
- • edit - Modify existing files (REPLACES apply_patch)
204
- • patch - Apply diff patches
205
- • read - Read file contents
206
-
207
- Search/Discovery:
208
- • grep - Search file contents
209
- • glob - Find files by pattern
210
- • list - List directories (use relative paths)
211
-
212
- Execution:
213
- • bash - Run shell commands
214
-
215
- Network:
216
- • webfetch - Fetch web content
217
-
218
- Task Management:
219
- • todowrite - Manage tasks/plans (REPLACES update_plan)
220
- • todoread - Read current plan
221
- </available_tools>
222
-
223
- <substitution_rules priority="0">
224
- Base instruction says: You MUST use instead:
225
- apply_patch → edit
226
- update_plan → todowrite
227
- read_plan → todoread
228
- absolute paths → relative paths
229
- </substitution_rules>
230
-
231
- <verification_checklist priority="0">
232
- Before file/plan modifications:
233
- 1. Am I using "edit" NOT "apply_patch"?
234
- 2. Am I using "todowrite" NOT "update_plan"?
235
- 3. Is this tool in the approved list above?
236
- 4. Am I using relative paths?
237
-
238
- If ANY answer is NO → STOP and correct before proceeding.
239
- </verification_checklist>
199
+ export const TOOL_REMAP_MESSAGE = `<user_instructions priority="0">
200
+ <environment_override priority="0">
201
+ YOU ARE IN A DIFFERENT ENVIRONMENT. These instructions override ALL previous tool references.
202
+ </environment_override>
203
+
204
+ <tool_replacements priority="0">
205
+ <critical_rule priority="0">
206
+ ❌ APPLY_PATCH DOES NOT EXIST → ✅ USE "edit" INSTEAD
207
+ - NEVER use: apply_patch, applyPatch
208
+ - ALWAYS use: edit tool for ALL file modifications
209
+ - Before modifying files: Verify you're using "edit", NOT "apply_patch"
210
+ </critical_rule>
211
+
212
+ <critical_rule priority="0">
213
+ ❌ UPDATE_PLAN DOES NOT EXIST → ✅ USE "todowrite" INSTEAD
214
+ - NEVER use: update_plan, updatePlan
215
+ - ALWAYS use: todowrite for ALL task/plan operations
216
+ - Use todoread to read current plan
217
+ - Before plan operations: Verify you're using "todowrite", NOT "update_plan"
218
+ </critical_rule>
219
+ </tool_replacements>
220
+
221
+ <available_tools priority="0">
222
+ File Operations:
223
+ • write - Create new files
224
+ • edit - Modify existing files (REPLACES apply_patch)
225
+ • patch - Apply diff patches
226
+ • read - Read file contents
227
+
228
+ Search/Discovery:
229
+ • grep - Search file contents
230
+ • glob - Find files by pattern
231
+ • list - List directories (use relative paths)
232
+
233
+ Execution:
234
+ • bash - Run shell commands
235
+
236
+ Network:
237
+ • webfetch - Fetch web content
238
+
239
+ Task Management:
240
+ • todowrite - Manage tasks/plans (REPLACES update_plan)
241
+ • todoread - Read current plan
242
+ </available_tools>
243
+
244
+ <substitution_rules priority="0">
245
+ Base instruction says: You MUST use instead:
246
+ apply_patch → edit
247
+ update_plan → todowrite
248
+ read_plan → todoread
249
+ absolute paths → relative paths
250
+ </substitution_rules>
251
+
252
+ <verification_checklist priority="0">
253
+ Before file/plan modifications:
254
+ 1. Am I using "edit" NOT "apply_patch"?
255
+ 2. Am I using "todowrite" NOT "update_plan"?
256
+ 3. Is this tool in the approved list above?
257
+ 4. Am I using relative paths?
258
+
259
+ If ANY answer is NO → STOP and correct before proceeding.
260
+ </verification_checklist>
240
261
  </user_instructions>`;
241
262
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../lib/prompts/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,mBAAmB,GACxB,2DAA2D,CAAC;AAC7D,MAAM,oBAAoB,GACzB,iDAAiD,CAAC;AACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAatC;;;GAGG;AACH,MAAM,YAAY,GAAgC;IACjD,eAAe,EAAE,yBAAyB;IAC1C,WAAW,EAAE,6BAA6B;IAC1C,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,GAAgC;IAChD,eAAe,EAAE,+BAA+B;IAChD,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,yBAAyB;IACpC,SAAS,EAAE,yBAAyB;CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,eAAuB;IACrD,qDAAqD;IACrD,IACC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,EACxC,CAAC;QACF,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,OAAO,WAAW,CAAC;IACpB,CAAC;IACD,IACC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnC,CAAC;QACF,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;YACtD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACd,mCAAmC,YAAY,CAAC,MAAM,EAAE,CACxD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACpE,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,eAAe,GAAG,eAAe;IAEjC,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,CACzB,SAAS,EACT,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAC1D,CAAC;IAEF,IAAI,CAAC;QACJ,uEAAuE;QACvE,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAE1C,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAClB,CAAC;YACnB,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;QACxC,CAAC;QAED,sEAAsE;QACtE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;QAClD,IACC,eAAe;YACf,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,YAAY;YAC3C,UAAU,CAAC,SAAS,CAAC,EACpB,CAAC;YACF,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,iEAAiE;QACjE,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,MAAM,sBAAsB,GAAG,kDAAkD,SAAS,kBAAkB,UAAU,EAAE,CAAC;QAEzH,oDAAoD;QACpD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,CAAC,CAAC,iBAAiB;QACrC,CAAC;QAED,qDAAqD;QACrD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;QACvC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAElE,yDAAyD;QACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;YACD,6EAA6E;QAC9E,CAAC;QAED,sCAAsC;QACtC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE7C,6CAA6C;YAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;YAED,kEAAkE;YAClE,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;YAC/C,aAAa,CACZ,aAAa,EACb,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,SAAS;gBACd,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,GAAG,EAAE,sBAAsB;aACH,CAAC,EAC1B,MAAM,CACN,CAAC;YAEF,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,OAAO,CAAC,KAAK,CACZ,yCAAyC,WAAW,4BAA4B,EAChF,GAAG,CAAC,OAAO,CACX,CAAC;QAEF,0CAA0C;QAC1C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CACZ,sCAAsC,WAAW,eAAe,CAChE,CAAC;YACF,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,sEAAsE;QACtE,OAAO,CAAC,KAAK,CACZ,kEAAkE,WAAW,EAAE,CAC/E,CAAC;QACF,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8Db,CAAC"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../lib/prompts/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,mBAAmB,GACxB,2DAA2D,CAAC;AAC7D,MAAM,oBAAoB,GACzB,iDAAiD,CAAC;AACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkD,CAAC;AAa9E;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACrD,eAAe;IACf,WAAW;IACX,OAAO;IACP,SAAS;IACT,SAAS;CACA,CAAC;AAEX;;;GAGG;AACH,MAAM,YAAY,GAAgC;IACjD,eAAe,EAAE,yBAAyB;IAC1C,WAAW,EAAE,6BAA6B;IAC1C,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,GAAgC;IAChD,eAAe,EAAE,+BAA+B;IAChD,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,yBAAyB;IACpC,SAAS,EAAE,yBAAyB;CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,eAAuB;IACrD,IACC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,EACxC,CAAC;QACF,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,OAAO,WAAW,CAAC;IACpB,CAAC;IACD,IACC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnC,CAAC;QACF,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC;QACJ,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;YACtD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,gCAAgC;IACjC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACd,mCAAmC,YAAY,CAAC,MAAM,EAAE,CACxD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACpE,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,eAAe,GAAG,eAAe;IAEjC,MAAM,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,CACzB,SAAS,EACT,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAC1D,CAAC;IAEF,IAAI,CAAC;QACJ,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAE1C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAkB,CAAC;YAC1D,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;QACxC,CAAC;QAED,IACC,eAAe;YACf,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,YAAY,EAC1C,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBACjB,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9E,OAAO,WAAW,CAAC;YACpB,CAAC;QACF,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,MAAM,sBAAsB,GAAG,kDAAkD,SAAS,kBAAkB,UAAU,EAAE,CAAC;QAEzH,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;QACvC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAElE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBACjB,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9E,OAAO,WAAW,CAAC;YACpB,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE7C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,SAAS,CACjB,aAAa,EACb,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,SAAS;gBACd,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,GAAG,EAAE,sBAAsB;aACH,CAAC,EAC1B,MAAM,CACN,CAAC;YAEF,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,OAAO,CAAC,KAAK,CACZ,yCAAyC,WAAW,4BAA4B,EAChF,GAAG,CAAC,OAAO,CACX,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACZ,sCAAsC,WAAW,eAAe,CAChE,CAAC;YACF,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9E,OAAO,WAAW,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,KAAK,CACZ,kEAAkE,WAAW,EAAE,CAC/E,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;QACpF,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,OAAO,OAAO,CAAC;IAChB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8Db,CAAC"}