@kevin0181/rcodex 0.0.1

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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/commands/doctor.d.ts +2 -0
  4. package/dist/commands/doctor.d.ts.map +1 -0
  5. package/dist/commands/doctor.js +114 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/gateway-daemon.d.ts +2 -0
  8. package/dist/commands/gateway-daemon.d.ts.map +1 -0
  9. package/dist/commands/gateway-daemon.js +22 -0
  10. package/dist/commands/gateway-daemon.js.map +1 -0
  11. package/dist/commands/launch.d.ts +2 -0
  12. package/dist/commands/launch.d.ts.map +1 -0
  13. package/dist/commands/launch.js +129 -0
  14. package/dist/commands/launch.js.map +1 -0
  15. package/dist/commands/migrate.d.ts +4 -0
  16. package/dist/commands/migrate.d.ts.map +1 -0
  17. package/dist/commands/migrate.js +137 -0
  18. package/dist/commands/migrate.js.map +1 -0
  19. package/dist/commands/setup.d.ts +2 -0
  20. package/dist/commands/setup.d.ts.map +1 -0
  21. package/dist/commands/setup.js +78 -0
  22. package/dist/commands/setup.js.map +1 -0
  23. package/dist/commands/stop.d.ts +2 -0
  24. package/dist/commands/stop.d.ts.map +1 -0
  25. package/dist/commands/stop.js +20 -0
  26. package/dist/commands/stop.js.map +1 -0
  27. package/dist/commands/switch.d.ts +4 -0
  28. package/dist/commands/switch.d.ts.map +1 -0
  29. package/dist/commands/switch.js +78 -0
  30. package/dist/commands/switch.js.map +1 -0
  31. package/dist/commands/sync.d.ts +3 -0
  32. package/dist/commands/sync.d.ts.map +1 -0
  33. package/dist/commands/sync.js +107 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/core/codex.d.ts +6 -0
  36. package/dist/core/codex.d.ts.map +1 -0
  37. package/dist/core/codex.js +123 -0
  38. package/dist/core/codex.js.map +1 -0
  39. package/dist/core/config.d.ts +6 -0
  40. package/dist/core/config.d.ts.map +1 -0
  41. package/dist/core/config.js +68 -0
  42. package/dist/core/config.js.map +1 -0
  43. package/dist/core/constants.d.ts +4 -0
  44. package/dist/core/constants.d.ts.map +1 -0
  45. package/dist/core/constants.js +7 -0
  46. package/dist/core/constants.js.map +1 -0
  47. package/dist/core/ollama.d.ts +3 -0
  48. package/dist/core/ollama.d.ts.map +1 -0
  49. package/dist/core/ollama.js +20 -0
  50. package/dist/core/ollama.js.map +1 -0
  51. package/dist/gateway/auth.d.ts +58 -0
  52. package/dist/gateway/auth.d.ts.map +1 -0
  53. package/dist/gateway/auth.js +248 -0
  54. package/dist/gateway/auth.js.map +1 -0
  55. package/dist/gateway/providers/anthropic.d.ts +15 -0
  56. package/dist/gateway/providers/anthropic.d.ts.map +1 -0
  57. package/dist/gateway/providers/anthropic.js +122 -0
  58. package/dist/gateway/providers/anthropic.js.map +1 -0
  59. package/dist/gateway/providers/antigravity-oauth-flow.d.ts +21 -0
  60. package/dist/gateway/providers/antigravity-oauth-flow.d.ts.map +1 -0
  61. package/dist/gateway/providers/antigravity-oauth-flow.js +231 -0
  62. package/dist/gateway/providers/antigravity-oauth-flow.js.map +1 -0
  63. package/dist/gateway/providers/antigravity.d.ts +5 -0
  64. package/dist/gateway/providers/antigravity.d.ts.map +1 -0
  65. package/dist/gateway/providers/antigravity.js +111 -0
  66. package/dist/gateway/providers/antigravity.js.map +1 -0
  67. package/dist/gateway/providers/claude-oauth-flow.d.ts +16 -0
  68. package/dist/gateway/providers/claude-oauth-flow.d.ts.map +1 -0
  69. package/dist/gateway/providers/claude-oauth-flow.js +178 -0
  70. package/dist/gateway/providers/claude-oauth-flow.js.map +1 -0
  71. package/dist/gateway/providers/copilot.d.ts +19 -0
  72. package/dist/gateway/providers/copilot.d.ts.map +1 -0
  73. package/dist/gateway/providers/copilot.js +141 -0
  74. package/dist/gateway/providers/copilot.js.map +1 -0
  75. package/dist/gateway/providers/google.d.ts +12 -0
  76. package/dist/gateway/providers/google.d.ts.map +1 -0
  77. package/dist/gateway/providers/google.js +58 -0
  78. package/dist/gateway/providers/google.js.map +1 -0
  79. package/dist/gateway/providers/ollama.d.ts +6 -0
  80. package/dist/gateway/providers/ollama.d.ts.map +1 -0
  81. package/dist/gateway/providers/ollama.js +54 -0
  82. package/dist/gateway/providers/ollama.js.map +1 -0
  83. package/dist/gateway/providers/openai-oauth-flow.d.ts +15 -0
  84. package/dist/gateway/providers/openai-oauth-flow.d.ts.map +1 -0
  85. package/dist/gateway/providers/openai-oauth-flow.js +149 -0
  86. package/dist/gateway/providers/openai-oauth-flow.js.map +1 -0
  87. package/dist/gateway/providers/openai.d.ts +8 -0
  88. package/dist/gateway/providers/openai.d.ts.map +1 -0
  89. package/dist/gateway/providers/openai.js +193 -0
  90. package/dist/gateway/providers/openai.js.map +1 -0
  91. package/dist/gateway/proxy.d.ts +119 -0
  92. package/dist/gateway/proxy.d.ts.map +1 -0
  93. package/dist/gateway/proxy.js +1949 -0
  94. package/dist/gateway/proxy.js.map +1 -0
  95. package/dist/gateway/server.d.ts +6 -0
  96. package/dist/gateway/server.d.ts.map +1 -0
  97. package/dist/gateway/server.js +890 -0
  98. package/dist/gateway/server.js.map +1 -0
  99. package/dist/gateway/ui.d.ts +2 -0
  100. package/dist/gateway/ui.d.ts.map +1 -0
  101. package/dist/gateway/ui.js +1748 -0
  102. package/dist/gateway/ui.js.map +1 -0
  103. package/dist/index.d.ts +3 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +78 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/types/index.d.ts +26 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +2 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/utils/logger.d.ts +10 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +25 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/paths.d.ts +4 -0
  116. package/dist/utils/paths.d.ts.map +1 -0
  117. package/dist/utils/paths.js +22 -0
  118. package/dist/utils/paths.js.map +1 -0
  119. package/dist/utils/shell.d.ts +8 -0
  120. package/dist/utils/shell.d.ts.map +1 -0
  121. package/dist/utils/shell.js +27 -0
  122. package/dist/utils/shell.js.map +1 -0
  123. package/dist/utils/updates.d.ts +2 -0
  124. package/dist/utils/updates.d.ts.map +1 -0
  125. package/dist/utils/updates.js +83 -0
  126. package/dist/utils/updates.js.map +1 -0
  127. package/package.json +61 -0
@@ -0,0 +1,78 @@
1
+ import { execSync } from "child_process";
2
+ import { logger } from "../utils/logger.js";
3
+ import { runSync } from "./sync.js";
4
+ import { createGatewayServer } from "../gateway/server.js";
5
+ import { loadConfig, killExistingGateway } from "../gateway/auth.js";
6
+ import { getCodexConfigPath } from "../utils/paths.js";
7
+ import { readCodexConfig, writeCodexConfig, backupCodexConfig } from "../core/config.js";
8
+ import { MANAGED_PROVIDER_KEY } from "../core/constants.js";
9
+ import { openCodexApp } from "../core/codex.js";
10
+ function openBrowser(url) {
11
+ const cmd = process.platform === "darwin" ? `open "${url}"` :
12
+ process.platform === "win32" ? `start "" "${url}"` :
13
+ `xdg-open "${url}"`;
14
+ try {
15
+ execSync(cmd, { windowsHide: true });
16
+ }
17
+ catch { /* ignore */ }
18
+ }
19
+ export async function runSetup() {
20
+ logger.header();
21
+ logger.info("Setup: sync config + migrate threads + start gateway");
22
+ logger.separator();
23
+ // 1. Kill any existing gateway process so we always start fresh
24
+ const killed = killExistingGateway();
25
+ if (killed) {
26
+ logger.info("Stopped existing gateway process.");
27
+ await new Promise((r) => setTimeout(r, 600)); // let the port free up
28
+ }
29
+ // 2. Register gateway in Codex config + auto-migrate threads
30
+ await runSync({ dryRun: false, showHeader: false });
31
+ logger.separator();
32
+ logger.info("Starting rcodex Gateway...");
33
+ // 3. Capture the port runSync registered before the server might change it
34
+ const registeredPort = loadConfig().port;
35
+ const server = createGatewayServer();
36
+ let port;
37
+ try {
38
+ port = await server.start();
39
+ }
40
+ catch (err) {
41
+ logger.error(`Failed to start gateway: ${err}`);
42
+ return;
43
+ }
44
+ // If the server ended up on a different port than what was registered,
45
+ // update Codex config to match the actual port
46
+ if (port !== registeredPort) {
47
+ const configPath = getCodexConfigPath();
48
+ backupCodexConfig(configPath);
49
+ const config = readCodexConfig(configPath);
50
+ if (!config.model_providers)
51
+ config.model_providers = {};
52
+ config.model_providers[MANAGED_PROVIDER_KEY] = {
53
+ name: "rcodex Gateway",
54
+ base_url: `http://localhost:${port}/v1`,
55
+ wire_api: "responses",
56
+ };
57
+ config.model_provider = MANAGED_PROVIDER_KEY;
58
+ writeCodexConfig(configPath, config);
59
+ logger.success(`Config updated to actual port :${port}`);
60
+ }
61
+ const url = `http://localhost:${port}`;
62
+ logger.success(`Gateway running: ${url}`);
63
+ // 4. Open browser to management UI
64
+ openBrowser(url);
65
+ // 5. Open Codex app
66
+ logger.info("Opening Codex...");
67
+ await openCodexApp();
68
+ logger.separator();
69
+ logger.success("Ready. Configure providers at: " + url);
70
+ logger.info("Press Ctrl+C to stop the gateway.");
71
+ process.on("SIGINT", async () => {
72
+ logger.info("\nShutting down gateway...");
73
+ await server.stop();
74
+ process.exit(0);
75
+ });
76
+ setInterval(() => { }, 1000);
77
+ }
78
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runStop(): Promise<void>;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB7C"}
@@ -0,0 +1,20 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { killExistingGateway, loadConfig } from "../gateway/auth.js";
3
+ export async function runStop() {
4
+ logger.header();
5
+ const config = loadConfig();
6
+ if (!config.pid) {
7
+ logger.warn("No gateway process recorded. Nothing to stop.");
8
+ logger.info("If a gateway is still running, kill it manually.");
9
+ return;
10
+ }
11
+ const killed = killExistingGateway();
12
+ if (killed) {
13
+ logger.success("Gateway stopped.");
14
+ }
15
+ else {
16
+ logger.warn("Gateway process was already gone (cleared stale PID).");
17
+ }
18
+ process.exit(0);
19
+ }
20
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ type SwitchTarget = "gateway" | "openai";
2
+ export declare function runSwitch(target: SwitchTarget): Promise<void>;
3
+ export {};
4
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/commands/switch.ts"],"names":[],"mappings":"AAQA,KAAK,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzC,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EnE"}
@@ -0,0 +1,78 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { getCodexConfigPath, displayPath } from "../utils/paths.js";
3
+ import { readCodexConfig, writeCodexConfig, backupCodexConfig, removeLegacyProviders } from "../core/config.js";
4
+ import { MANAGED_PROVIDER_KEY, OPENAI_PROVIDER_KEY, DEFAULT_OPENAI_BASE_URL } from "../core/constants.js";
5
+ import { loadConfig } from "../gateway/auth.js";
6
+ import { isCodexRunning, killCodex, openCodexApp } from "../core/codex.js";
7
+ import { migrateThreads } from "./migrate.js";
8
+ export async function runSwitch(target) {
9
+ logger.header();
10
+ const configPath = getCodexConfigPath();
11
+ logger.success(`Config: ${displayPath(configPath)}`);
12
+ let config;
13
+ try {
14
+ config = readCodexConfig(configPath);
15
+ }
16
+ catch (err) {
17
+ logger.error(`Config ?�싱 ?�패: ${err}`);
18
+ return;
19
+ }
20
+ backupCodexConfig(configPath);
21
+ removeLegacyProviders(config, MANAGED_PROVIDER_KEY);
22
+ if (target === "gateway") {
23
+ const gatewayConfig = loadConfig();
24
+ const gatewayUrl = `http://localhost:${gatewayConfig.port}/v1`;
25
+ if (!config.model_providers)
26
+ config.model_providers = {};
27
+ config.model_providers[MANAGED_PROVIDER_KEY] = {
28
+ name: "rcodex Gateway",
29
+ base_url: gatewayUrl,
30
+ wire_api: "responses",
31
+ };
32
+ config.model_provider = MANAGED_PROVIDER_KEY;
33
+ // Clear top-level model so Codex picks from /v1/models
34
+ delete config.model;
35
+ logger.success(`Provider: ${MANAGED_PROVIDER_KEY} ??rcodex Gateway (${gatewayUrl})`);
36
+ logger.info("Models are managed at the gateway web UI. Run 'rcodex' if not already running.");
37
+ }
38
+ else if (target === "openai") {
39
+ // Remove gateway provider ??let Codex use its built-in OpenAI
40
+ if (config.model_providers) {
41
+ delete config.model_providers[MANAGED_PROVIDER_KEY];
42
+ if (Object.keys(config.model_providers).length === 0) {
43
+ delete config.model_providers;
44
+ }
45
+ }
46
+ delete config.model_provider;
47
+ config.model = "gpt-5.5";
48
+ logger.success(`Provider: native OpenAI (${DEFAULT_OPENAI_BASE_URL})`);
49
+ logger.success(`Model: gpt-5.5`);
50
+ logger.info("Bypassing rcodex Gateway ??using Codex built-in OpenAI auth.");
51
+ }
52
+ try {
53
+ writeCodexConfig(configPath, config);
54
+ logger.success(`Config saved: ${displayPath(configPath)}`);
55
+ }
56
+ catch (err) {
57
+ logger.error(`?�???�패: ${err}`);
58
+ return;
59
+ }
60
+ // Kill Codex (if running) before migrating ??DB must not be locked
61
+ const wasRunning = await isCodexRunning();
62
+ if (wasRunning) {
63
+ logger.info("Stopping Codex...");
64
+ await killCodex();
65
+ await new Promise((r) => setTimeout(r, 800));
66
+ }
67
+ // Migrate all threads to the new provider
68
+ logger.separator();
69
+ const migrateTarget = target === "gateway" ? MANAGED_PROVIDER_KEY : OPENAI_PROVIDER_KEY;
70
+ await migrateThreads(migrateTarget, false);
71
+ // Reopen Codex if it was running before
72
+ if (wasRunning) {
73
+ await openCodexApp();
74
+ logger.success("Codex restarted.");
75
+ }
76
+ logger.done();
77
+ }
78
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/commands/switch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SyncOptions } from "../types/index.js";
2
+ export declare function runSync(options: SyncOptions): Promise<void>;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA0BrD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFjE"}
@@ -0,0 +1,107 @@
1
+ import { createInterface } from "readline";
2
+ import { logger } from "../utils/logger.js";
3
+ import { getCodexConfigPath, displayPath } from "../utils/paths.js";
4
+ import { isCodexInstalled, isCodexRunning } from "../core/codex.js";
5
+ import { readCodexConfig, writeCodexConfig, backupCodexConfig, removeLegacyProviders } from "../core/config.js";
6
+ import { MANAGED_PROVIDER_KEY } from "../core/constants.js";
7
+ import { loadConfig } from "../gateway/auth.js";
8
+ import { runMigrate } from "./migrate.js";
9
+ async function waitUntilCodexClosed() {
10
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
11
+ const ask = () => new Promise((resolve) => {
12
+ rl.question("", async () => {
13
+ if (await isCodexRunning()) {
14
+ logger.warn("?�직 Codex가 ?�행 중입?�다. ?�전??종료 ??Enter�??�러주세??");
15
+ resolve(ask());
16
+ }
17
+ else {
18
+ rl.close();
19
+ resolve();
20
+ }
21
+ });
22
+ });
23
+ return ask();
24
+ }
25
+ export async function runSync(options) {
26
+ if (options.showHeader !== false)
27
+ logger.header();
28
+ // 1. Codex ?�치 ?�인 (미감지 ??경고�? ?�정?� 계속 진행)
29
+ if (!(await isCodexInstalled())) {
30
+ logger.warn("Codex not found in PATH. Install it first: https://github.com/openai/codex");
31
+ logger.warn("Continuing setup ??gateway config will be written but Codex won't launch automatically.");
32
+ }
33
+ else {
34
+ logger.success("Codex detected");
35
+ }
36
+ // 2. Config 경로 ?�인
37
+ let configPath;
38
+ try {
39
+ configPath = getCodexConfigPath();
40
+ }
41
+ catch (err) {
42
+ logger.error(`Config 경로�??�인?????�습?�다: ${err}`);
43
+ return;
44
+ }
45
+ logger.success(`Config found: ${displayPath(configPath)}`);
46
+ // 3. Config 백업
47
+ try {
48
+ const backupPath = backupCodexConfig(configPath);
49
+ logger.success(`Backup created: ${displayPath(backupPath)}`);
50
+ }
51
+ catch (err) {
52
+ logger.error(`Config 백업???�패?�습?�다: ${err}`);
53
+ return;
54
+ }
55
+ // 4. Config ?�기
56
+ let config;
57
+ try {
58
+ config = readCodexConfig(configPath);
59
+ }
60
+ catch (err) {
61
+ logger.error(`Config ?�싱???�패?�습?�다: ${err}`);
62
+ return;
63
+ }
64
+ // ?�전 버전 ?�거??provider ???�리
65
+ removeLegacyProviders(config, MANAGED_PROVIDER_KEY);
66
+ // 5. 게이?�웨??endpoint�??�일 provider�??�록
67
+ const gatewayConfig = loadConfig();
68
+ const gatewayUrl = `http://localhost:${gatewayConfig.port}/v1`;
69
+ if (!config.model_providers)
70
+ config.model_providers = {};
71
+ const existed = MANAGED_PROVIDER_KEY in config.model_providers;
72
+ config.model_providers[MANAGED_PROVIDER_KEY] = {
73
+ name: "rcodex Gateway",
74
+ base_url: gatewayUrl,
75
+ wire_api: "responses",
76
+ };
77
+ config.model_provider = MANAGED_PROVIDER_KEY;
78
+ logger.success(`Gateway provider ${existed ? "updated" : "registered"}: ${MANAGED_PROVIDER_KEY} ??${gatewayUrl}`);
79
+ logger.info("Run 'rcodex' to launch the gateway and configure providers.");
80
+ // 6. Dry-run 처리
81
+ if (options.dryRun) {
82
+ logger.separator();
83
+ logger.info("[DRY RUN] ?�제�??�?�되지 ?�았?�니??");
84
+ logger.info(` ${existed ? "?�데?�트" : "추�?"}????��: provider:${MANAGED_PROVIDER_KEY} ??${gatewayUrl}`);
85
+ logger.done();
86
+ return;
87
+ }
88
+ // 7. Config ?�??
89
+ try {
90
+ writeCodexConfig(configPath, config);
91
+ logger.success(`Config saved: ${displayPath(configPath)}`);
92
+ }
93
+ catch (err) {
94
+ logger.error(`Config ?�?�에 ?�패?�습?�다: ${err}`);
95
+ return;
96
+ }
97
+ // 8. Migrate ?�동 ?�행
98
+ logger.separator();
99
+ if (await isCodexRunning()) {
100
+ logger.warn("Codex ?�이 ?�행 중입?�다. migrate�?진행?�려�??�을 종료?�주?�요.");
101
+ logger.info("종료 ??Enter�??�르�??�동?�로 migrate가 진행?�니??");
102
+ await waitUntilCodexClosed();
103
+ logger.success("Codex ??종료 ?�인");
104
+ }
105
+ await runMigrate(false, false);
106
+ }
107
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function isCodexInstalled(): Promise<boolean>;
2
+ export declare function getCodexExePath(): Promise<string | null>;
3
+ export declare function isCodexRunning(): Promise<boolean>;
4
+ export declare function killCodex(): Promise<boolean>;
5
+ export declare function openCodexApp(): Promise<void>;
6
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/core/codex.ts"],"names":[],"mappings":"AAsBA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQzD;AAGD,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyC9D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAWvD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAUlD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBlD"}
@@ -0,0 +1,123 @@
1
+ import { existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { run, commandExists } from "../utils/shell.js";
4
+ const MAC_FALLBACK_PATHS = [
5
+ "/Applications/Codex.app/Contents/Resources/codex",
6
+ "/usr/local/bin/codex",
7
+ "/opt/homebrew/bin/codex",
8
+ ];
9
+ // Windows: `where` searches PATH + registry App Paths ??covers both npm CLI and desktop app
10
+ async function whereFirst(names) {
11
+ for (const name of names) {
12
+ const result = await run(`where ${name}`);
13
+ if (result.exitCode === 0) {
14
+ const found = result.stdout.split(/\r?\n/)[0].trim();
15
+ if (found)
16
+ return found;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ export async function isCodexInstalled() {
22
+ if (process.platform === "win32") {
23
+ return (await getCodexExePath()) !== null;
24
+ }
25
+ if (await commandExists("codex"))
26
+ return true;
27
+ if (MAC_FALLBACK_PATHS.some((p) => existsSync(p)))
28
+ return true;
29
+ const result = await run("codex --version");
30
+ return result.exitCode === 0;
31
+ }
32
+ // Returns the actual exe path to launch the Codex app (Windows only)
33
+ export async function getCodexExePath() {
34
+ if (process.platform !== "win32")
35
+ return null;
36
+ // 1. Check system PATH
37
+ const pathExe = await whereFirst(["Codex.exe", "codex.exe", "codex.cmd", "codex"]);
38
+ if (pathExe)
39
+ return pathExe;
40
+ // 2. Dynamic check in local AppData (OpenAI Codex installs in a dynamic version subfolder)
41
+ const localAppData = process.env.LOCALAPPDATA;
42
+ if (localAppData) {
43
+ const openAiCodexBinDir = join(localAppData, "OpenAI", "Codex", "bin");
44
+ if (existsSync(openAiCodexBinDir)) {
45
+ try {
46
+ const subdirs = readdirSync(openAiCodexBinDir, { withFileTypes: true })
47
+ .filter((dirent) => dirent.isDirectory())
48
+ .map((dirent) => dirent.name);
49
+ for (const subdir of subdirs) {
50
+ const exePath = join(openAiCodexBinDir, subdir, "codex.exe");
51
+ if (existsSync(exePath)) {
52
+ return exePath;
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // ignore read errors
58
+ }
59
+ }
60
+ }
61
+ // 3. Check other common standard installation paths
62
+ const standardPaths = [
63
+ join(process.env.ProgramFiles || "C:\\Program Files", "Codex", "Codex.exe"),
64
+ join(process.env["ProgramFiles(x86)"] || "C:\\Program Files (x86)", "Codex", "Codex.exe"),
65
+ join(process.env.APPDATA || "", "OpenAI", "Codex", "codex.exe"),
66
+ ];
67
+ for (const p of standardPaths) {
68
+ if (existsSync(p))
69
+ return p;
70
+ }
71
+ return null;
72
+ }
73
+ export async function isCodexRunning() {
74
+ let result;
75
+ if (process.platform === "win32") {
76
+ result = await run('tasklist /FI "IMAGENAME eq Codex.exe" /NH');
77
+ return result.stdout.toLowerCase().includes("codex.exe");
78
+ }
79
+ else if (process.platform === "darwin") {
80
+ result = await run('pgrep -f "Codex.app/Contents/MacOS"');
81
+ }
82
+ else {
83
+ result = await run("pgrep -f codex");
84
+ }
85
+ return result.exitCode === 0 && result.stdout.trim().length > 0;
86
+ }
87
+ export async function killCodex() {
88
+ if (!(await isCodexRunning()))
89
+ return false;
90
+ if (process.platform === "win32") {
91
+ await run("taskkill /F /IM Codex.exe");
92
+ }
93
+ else if (process.platform === "darwin") {
94
+ await run('pkill -f "Codex.app/Contents/MacOS"');
95
+ }
96
+ else {
97
+ await run("pkill -f codex");
98
+ }
99
+ return true;
100
+ }
101
+ export async function openCodexApp() {
102
+ if (process.platform === "darwin") {
103
+ await run("open -a Codex");
104
+ }
105
+ else if (process.platform === "win32") {
106
+ // 1. Try launching the Windows Store App first using AUMID via explorer
107
+ const checkStoreApp = await run('powershell -Command "Get-AppxPackage OpenAI.Codex"');
108
+ if (checkStoreApp.exitCode === 0 && checkStoreApp.stdout.includes("OpenAI.Codex_2p2nqsd0c76g0")) {
109
+ await run("explorer.exe shell:AppsFolder\\OpenAI.Codex_2p2nqsd0c76g0!App");
110
+ }
111
+ else {
112
+ // 2. Fallback to CLI executable
113
+ const exePath = await getCodexExePath();
114
+ if (exePath) {
115
+ await run(`start "" "${exePath}"`);
116
+ }
117
+ else {
118
+ await run("start Codex");
119
+ }
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/core/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CodexConfig } from "../types/index.js";
2
+ export declare function readCodexConfig(configPath: string): CodexConfig;
3
+ export declare function writeCodexConfig(configPath: string, config: CodexConfig, dryRun?: boolean): void;
4
+ export declare function backupCodexConfig(configPath: string): string;
5
+ export declare function removeLegacyProviders(config: CodexConfig, keepKey: string): void;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAS/D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAQ,GAAG,IAAI,CAS9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBhF"}
@@ -0,0 +1,68 @@
1
+ import { readFileSync, writeFileSync, copyFileSync, existsSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import { mkdirSync } from "fs";
4
+ import TOML from "@iarna/toml";
5
+ import { getCodexConfigDir } from "../utils/paths.js";
6
+ export function readCodexConfig(configPath) {
7
+ if (!existsSync(configPath)) {
8
+ return {};
9
+ }
10
+ const raw = readFileSync(configPath, "utf-8");
11
+ if (!raw.trim()) {
12
+ return {};
13
+ }
14
+ return TOML.parse(raw);
15
+ }
16
+ export function writeCodexConfig(configPath, config, dryRun = false) {
17
+ const dir = dirname(configPath);
18
+ if (!existsSync(dir)) {
19
+ mkdirSync(dir, { recursive: true });
20
+ }
21
+ const tomlStr = TOML.stringify(config);
22
+ if (!dryRun) {
23
+ writeFileSync(configPath, tomlStr, "utf-8");
24
+ }
25
+ }
26
+ export function backupCodexConfig(configPath) {
27
+ const now = new Date();
28
+ const ts = [
29
+ now.getFullYear(),
30
+ String(now.getMonth() + 1).padStart(2, "0"),
31
+ String(now.getDate()).padStart(2, "0"),
32
+ "-",
33
+ String(now.getHours()).padStart(2, "0"),
34
+ String(now.getMinutes()).padStart(2, "0"),
35
+ String(now.getSeconds()).padStart(2, "0"),
36
+ ].join("");
37
+ const backupPath = join(getCodexConfigDir(), `config.toml.backup-${ts}`);
38
+ if (existsSync(configPath)) {
39
+ copyFileSync(configPath, backupPath);
40
+ }
41
+ else {
42
+ writeFileSync(backupPath, "", "utf-8");
43
+ }
44
+ return backupPath;
45
+ }
46
+ // ?�전 버전?�서 ?�못 ?�록??provider ?�들???�리?�다.
47
+ // MANAGED_PROVIDER_KEY(rcodex)�??�기�??�머지 ?�거?????�거.
48
+ export function removeLegacyProviders(config, keepKey) {
49
+ // �?model_providers ???�거
50
+ if (config.model_providers) {
51
+ const legacyKeys = ["ollama", "ollama-local", "pi"];
52
+ for (const key of legacyKeys) {
53
+ if (key !== keepKey && key in config.model_providers) {
54
+ delete config.model_providers[key];
55
+ }
56
+ }
57
+ }
58
+ // �?provider�?참조?�는 profile??model_provider�?keepKey�??�데?�트
59
+ if (config.profiles && keepKey) {
60
+ const legacyProviders = new Set(["ollama", "ollama-local", "pi"]);
61
+ for (const profile of Object.values(config.profiles)) {
62
+ if (legacyProviders.has(profile.model_provider)) {
63
+ profile.model_provider = keepKey;
64
+ }
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const MANAGED_PROVIDER_KEY = "rcodex";
2
+ export declare const OPENAI_PROVIDER_KEY = "openai";
3
+ export declare const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAG7C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,eAAO,MAAM,uBAAuB,2BAA2B,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Single fixed provider key in Codex config ??keeping the name stable preserves
2
+ // SQLite thread history when switching between gateway providers.
3
+ export const MANAGED_PROVIDER_KEY = "rcodex";
4
+ // Built-in Codex OpenAI provider key (used when reverting from gateway)
5
+ export const OPENAI_PROVIDER_KEY = "openai";
6
+ export const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com";
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE7C,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAE5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function isOllamaInstalled(): Promise<boolean>;
2
+ export declare function getOllamaModels(): Promise<string[]>;
3
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/core/ollama.ts"],"names":[],"mappings":"AAEA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAI1D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAUzD"}
@@ -0,0 +1,20 @@
1
+ import { run, commandExists } from "../utils/shell.js";
2
+ export async function isOllamaInstalled() {
3
+ if (await commandExists("ollama"))
4
+ return true;
5
+ const result = await run("ollama --version");
6
+ return result.exitCode === 0;
7
+ }
8
+ export async function getOllamaModels() {
9
+ const result = await run("ollama list", 15_000);
10
+ if (result.exitCode !== 0)
11
+ return [];
12
+ const lines = result.stdout.split("\n");
13
+ return lines
14
+ .slice(1)
15
+ .map((line) => line.trim())
16
+ .filter((line) => line.length > 0)
17
+ .map((line) => line.split(/\s+/)[0])
18
+ .filter((name) => !!name && name.length > 0);
19
+ }
20
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/core/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,MAAM,aAAa,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,KAAK;SACT,KAAK,CAAC,CAAC,CAAC;SACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACnC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC"}