@nextclaw/nextclaw-narp-runtime-codex-sdk 0.1.31 → 0.1.33-beta.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-narp-runtime-wrapper.service.d.ts","names":[],"sources":["../../src/services/codex-narp-runtime-wrapper.service.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"codex-narp-runtime-wrapper.service.d.ts","names":[],"sources":["../../src/services/codex-narp-runtime-wrapper.service.ts"],"mappings":";;;;;KA2BY,uBAAA,IACV,MAAA,EAAQ,6BAAA,KACL,eAAA;AAAA,KAEO,2BAAA,IACV,MAAA,EAAQ,uCAAA,KACL,OAAA,CAAQ,gCAAA;AAAA,cAsBA,uBAAA;EAAA,iBAEQ,aAAA;EAAA,iBAGA,qBAAA;cAHA,aAAA,GAAe,uBAAA,EAGf,qBAAA,GAAuB,2BAAA;EAI1C,KAAA;EAOA,kBAAA,GAAsB,OAAA,EAAS,8BAAA,KAAiC,eAAA;EAMhE,kBAAA,GACE,OAAA,EAAS,8BAAA,KACR,OAAA,CAAQ,6BAAA;EAAA,QAiDH,oBAAA;AAAA"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
1
4
|
import { NarpStdioRuntimeWrapper } from "@nextclaw/nextclaw-narp-stdio-runtime-wrapper";
|
|
2
|
-
import {
|
|
5
|
+
import { CodexAppServerNcpAgentRuntime, CodexLiveOutputStream, buildCodexBridgeModelProviderId, ensureCodexOpenAiResponsesBridge } from "@nextclaw/nextclaw-ncp-runtime-codex-sdk";
|
|
3
6
|
//#region src/services/codex-narp-runtime-wrapper.service.ts
|
|
4
7
|
const NARP_API_MODE_HEADER = "x-nextclaw-narp-api-mode";
|
|
8
|
+
const CODEX_NARP_DEBUG_CONFIG_ENV = "NEXTCLAW_CODEX_NARP_DEBUG_CONFIG";
|
|
9
|
+
const RUNTIME_DEFAULT_MODEL_VALUE = "__nextclaw_runtime_default__";
|
|
5
10
|
var DeferredCodexNarpRuntime = class {
|
|
6
11
|
runtimePromise = null;
|
|
7
12
|
constructor(createRuntime) {
|
|
@@ -13,7 +18,7 @@ var DeferredCodexNarpRuntime = class {
|
|
|
13
18
|
};
|
|
14
19
|
};
|
|
15
20
|
var CodexNarpRuntimeWrapper = class {
|
|
16
|
-
constructor(createRuntime = (config) => new
|
|
21
|
+
constructor(createRuntime = (config) => new CodexAppServerNcpAgentRuntime(config), ensureResponsesBridge = ensureCodexOpenAiResponsesBridge) {
|
|
17
22
|
this.createRuntime = createRuntime;
|
|
18
23
|
this.ensureResponsesBridge = ensureResponsesBridge;
|
|
19
24
|
}
|
|
@@ -27,23 +32,25 @@ var CodexNarpRuntimeWrapper = class {
|
|
|
27
32
|
return new DeferredCodexNarpRuntime(async () => this.createRuntime(await this.buildRuntimeConfig(context)));
|
|
28
33
|
};
|
|
29
34
|
buildRuntimeConfig = (context) => {
|
|
30
|
-
const { cwd, modelId, promptMeta, sessionId } = context;
|
|
35
|
+
const { cwd, modelId, promptMeta, sessionId, setSessionMetadata } = context;
|
|
31
36
|
const providerRoute = promptMeta.providerRoute;
|
|
32
37
|
const sessionMetadata = promptMeta.sessionMetadata ?? {};
|
|
33
|
-
const
|
|
34
|
-
const
|
|
38
|
+
const useCodexRuntimeDefault = isRuntimeDefaultModelValue(readString(sessionMetadata.preferred_model) ?? readString(sessionMetadata.preferredModel) ?? readString(sessionMetadata.model) ?? readString(modelId));
|
|
39
|
+
const providerLocalModel = useCodexRuntimeDefault ? void 0 : stripProviderPrefix(readString(providerRoute?.model)) ?? stripProviderPrefix(readString(modelId)) ?? readString(process.env.NEXTCLAW_MODEL);
|
|
40
|
+
const upstreamApiBase = useCodexRuntimeDefault ? void 0 : readString(providerRoute?.apiBase) ?? readString(process.env.NEXTCLAW_API_BASE);
|
|
35
41
|
const externalModelProvider = resolveExternalModelProvider({
|
|
36
42
|
apiBase: upstreamApiBase,
|
|
37
43
|
modelId
|
|
38
44
|
});
|
|
39
45
|
return this.resolveRuntimeConfig({
|
|
40
|
-
apiKey: readString(providerRoute?.apiKey) ?? readString(process.env.NEXTCLAW_API_KEY) ?? "",
|
|
46
|
+
apiKey: (useCodexRuntimeDefault ? void 0 : readString(providerRoute?.apiKey) ?? readString(process.env.NEXTCLAW_API_KEY)) ?? "",
|
|
41
47
|
cwd,
|
|
42
48
|
externalModelProvider,
|
|
43
49
|
providerLocalModel,
|
|
44
50
|
sessionId,
|
|
45
51
|
sessionMetadata,
|
|
46
|
-
|
|
52
|
+
setSessionMetadata,
|
|
53
|
+
threadModel: useCodexRuntimeDefault ? void 0 : readString(modelId) ?? composeModelRoute({
|
|
47
54
|
modelProvider: externalModelProvider,
|
|
48
55
|
providerLocalModel
|
|
49
56
|
}) ?? providerLocalModel,
|
|
@@ -52,7 +59,7 @@ var CodexNarpRuntimeWrapper = class {
|
|
|
52
59
|
});
|
|
53
60
|
};
|
|
54
61
|
resolveRuntimeConfig = async (params) => {
|
|
55
|
-
const { apiKey, cwd, externalModelProvider, providerLocalModel, sessionId, sessionMetadata, threadModel: requestedThreadModel, upstreamApiBase, upstreamExtraHeaders } = params;
|
|
62
|
+
const { apiKey, cwd, externalModelProvider, providerLocalModel, sessionId, sessionMetadata, setSessionMetadata, threadModel: requestedThreadModel, upstreamApiBase, upstreamExtraHeaders } = params;
|
|
56
63
|
const bridgeModelProvider = upstreamApiBase && shouldUseResponsesBridge({
|
|
57
64
|
apiBase: upstreamApiBase,
|
|
58
65
|
headers: upstreamExtraHeaders
|
|
@@ -75,28 +82,47 @@ var CodexNarpRuntimeWrapper = class {
|
|
|
75
82
|
modelProvider: bridgeModelProvider,
|
|
76
83
|
providerLocalModel
|
|
77
84
|
}) : requestedThreadModel;
|
|
78
|
-
|
|
85
|
+
const config = {
|
|
79
86
|
sessionId,
|
|
80
87
|
apiKey,
|
|
81
88
|
apiBase,
|
|
82
89
|
model: providerLocalModel,
|
|
83
|
-
threadId:
|
|
90
|
+
threadId: resolveReusableThreadId(sessionMetadata, threadModel ?? RUNTIME_DEFAULT_MODEL_VALUE),
|
|
84
91
|
...codexPathOverride ? { codexPathOverride } : {},
|
|
85
92
|
sessionMetadata,
|
|
93
|
+
...setSessionMetadata ? { setSessionMetadata } : {},
|
|
86
94
|
liveOutputStream: bridge ? liveOutputStream : void 0,
|
|
87
95
|
cliConfig: buildCodexCliConfig({
|
|
88
96
|
apiBase,
|
|
89
|
-
modelProvider
|
|
97
|
+
modelProvider,
|
|
98
|
+
showRawAgentReasoning: Boolean(modelReasoningEffort)
|
|
90
99
|
}),
|
|
91
100
|
threadOptions: {
|
|
92
101
|
...threadModel ? { model: threadModel } : {},
|
|
93
|
-
workingDirectory: cwd
|
|
102
|
+
workingDirectory: cwd,
|
|
94
103
|
skipGitRepoCheck: true,
|
|
95
104
|
...modelReasoningEffort ? { modelReasoningEffort } : {}
|
|
96
105
|
}
|
|
97
106
|
};
|
|
107
|
+
logCodexRuntimeConfig({
|
|
108
|
+
bridgeModelProvider,
|
|
109
|
+
config,
|
|
110
|
+
externalModelProvider,
|
|
111
|
+
providerLocalModel,
|
|
112
|
+
requestedThreadModel,
|
|
113
|
+
sessionMetadata,
|
|
114
|
+
threadModel
|
|
115
|
+
});
|
|
116
|
+
return config;
|
|
98
117
|
};
|
|
99
118
|
};
|
|
119
|
+
function resolveReusableThreadId(sessionMetadata, threadModelScope) {
|
|
120
|
+
const threadId = readString(sessionMetadata.codex_thread_id);
|
|
121
|
+
if (!threadId) return null;
|
|
122
|
+
const threadScope = readString(sessionMetadata.codex_thread_model);
|
|
123
|
+
if (!threadScope) return null;
|
|
124
|
+
return threadScope === threadModelScope ? threadId : null;
|
|
125
|
+
}
|
|
100
126
|
function readString(value) {
|
|
101
127
|
if (typeof value !== "string") return;
|
|
102
128
|
const trimmed = value.trim();
|
|
@@ -109,6 +135,9 @@ function stripProviderPrefix(value) {
|
|
|
109
135
|
if (slashIndex <= 0) return normalized;
|
|
110
136
|
return readString(normalized.slice(slashIndex + 1));
|
|
111
137
|
}
|
|
138
|
+
function isRuntimeDefaultModelValue(value) {
|
|
139
|
+
return value === RUNTIME_DEFAULT_MODEL_VALUE;
|
|
140
|
+
}
|
|
112
141
|
function readReasoningEffort(value) {
|
|
113
142
|
if (typeof value !== "string") return;
|
|
114
143
|
const normalized = value.trim().toLowerCase();
|
|
@@ -127,13 +156,15 @@ function composeModelRoute(params) {
|
|
|
127
156
|
return `${modelProvider}/${providerLocalModel}`;
|
|
128
157
|
}
|
|
129
158
|
function buildCodexCliConfig(params) {
|
|
130
|
-
const { apiBase, modelProvider } = params;
|
|
131
|
-
if (!modelProvider) return;
|
|
132
|
-
const config = {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
159
|
+
const { apiBase, modelProvider, showRawAgentReasoning } = params;
|
|
160
|
+
if (!modelProvider && !showRawAgentReasoning) return;
|
|
161
|
+
const config = {};
|
|
162
|
+
if (showRawAgentReasoning) config.show_raw_agent_reasoning = true;
|
|
163
|
+
if (modelProvider) {
|
|
164
|
+
config.model_provider = modelProvider;
|
|
165
|
+
config.preferred_auth_method = "apikey";
|
|
166
|
+
}
|
|
167
|
+
if (apiBase && modelProvider) config.model_providers = { [modelProvider]: {
|
|
137
168
|
name: modelProvider,
|
|
138
169
|
base_url: apiBase,
|
|
139
170
|
wire_api: "responses",
|
|
@@ -141,6 +172,60 @@ function buildCodexCliConfig(params) {
|
|
|
141
172
|
} };
|
|
142
173
|
return config;
|
|
143
174
|
}
|
|
175
|
+
function logCodexRuntimeConfig(params) {
|
|
176
|
+
if (process.env[CODEX_NARP_DEBUG_CONFIG_ENV] !== "1") return;
|
|
177
|
+
const { bridgeModelProvider, config, externalModelProvider, providerLocalModel, requestedThreadModel, sessionMetadata, threadModel } = params;
|
|
178
|
+
const cliConfig = config.cliConfig;
|
|
179
|
+
const modelProviders = cliConfig?.model_providers;
|
|
180
|
+
const snapshot = {
|
|
181
|
+
bridgeModelProvider: bridgeModelProvider ?? null,
|
|
182
|
+
externalModelProvider: externalModelProvider ?? null,
|
|
183
|
+
hasApiBase: Boolean(config.apiBase),
|
|
184
|
+
hasApiKey: Boolean(config.apiKey),
|
|
185
|
+
hasLiveOutputStream: Boolean(config.liveOutputStream),
|
|
186
|
+
providerLocalModel: providerLocalModel ?? null,
|
|
187
|
+
requestedThreadModel: requestedThreadModel ?? null,
|
|
188
|
+
sessionId: config.sessionId,
|
|
189
|
+
sessionMetadata: {
|
|
190
|
+
codex_thread_id: readString(sessionMetadata.codex_thread_id) ?? null,
|
|
191
|
+
codex_thread_model: readString(sessionMetadata.codex_thread_model) ?? null,
|
|
192
|
+
model: readString(sessionMetadata.model) ?? null,
|
|
193
|
+
preferred_model: readString(sessionMetadata.preferred_model) ?? null,
|
|
194
|
+
preferred_thinking: readString(sessionMetadata.preferred_thinking) ?? null,
|
|
195
|
+
thinking: readString(sessionMetadata.thinking) ?? null
|
|
196
|
+
},
|
|
197
|
+
sdkConfig: {
|
|
198
|
+
cliConfig: cliConfig ? {
|
|
199
|
+
model_provider: readString(cliConfig.model_provider) ?? null,
|
|
200
|
+
model_providers: modelProviders && typeof modelProviders === "object" && !Array.isArray(modelProviders) ? Object.keys(modelProviders) : [],
|
|
201
|
+
preferred_auth_method: readString(cliConfig.preferred_auth_method) ?? null,
|
|
202
|
+
show_raw_agent_reasoning: cliConfig.show_raw_agent_reasoning === true
|
|
203
|
+
} : null,
|
|
204
|
+
model: config.model ?? null,
|
|
205
|
+
threadId: config.threadId ?? null,
|
|
206
|
+
threadOptions: {
|
|
207
|
+
model: config.threadOptions?.model ?? null,
|
|
208
|
+
modelReasoningEffort: config.threadOptions?.modelReasoningEffort ?? null,
|
|
209
|
+
skipGitRepoCheck: config.threadOptions?.skipGitRepoCheck ?? null,
|
|
210
|
+
workingDirectory: config.threadOptions?.workingDirectory ?? null
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
threadModel: threadModel ?? null,
|
|
214
|
+
ts: (/* @__PURE__ */ new Date()).toISOString()
|
|
215
|
+
};
|
|
216
|
+
const line = `[nextclaw-codex-narp] runtime-config ${JSON.stringify(snapshot)}`;
|
|
217
|
+
console.error(line);
|
|
218
|
+
appendDebugLog(snapshot);
|
|
219
|
+
}
|
|
220
|
+
function appendDebugLog(snapshot) {
|
|
221
|
+
try {
|
|
222
|
+
const logPath = join(readString(process.env.NEXTCLAW_HOME) ?? join(homedir(), ".nextclaw"), "logs", "codex-narp-runtime-config.jsonl");
|
|
223
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
224
|
+
appendFileSync(logPath, `${JSON.stringify(snapshot)}\n`, "utf8");
|
|
225
|
+
} catch (error) {
|
|
226
|
+
console.error(`[nextclaw-codex-narp] failed to write runtime config debug log: ${error instanceof Error ? error.message : String(error)}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
144
229
|
function readApiMode(headers) {
|
|
145
230
|
for (const [key, value] of Object.entries(headers ?? {})) if (key.toLowerCase() === NARP_API_MODE_HEADER) return readString(value)?.toLowerCase();
|
|
146
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-narp-runtime-wrapper.service.js","names":[],"sources":["../../src/services/codex-narp-runtime-wrapper.service.ts"],"sourcesContent":["import type {\n NcpAgentRunInput,\n NcpAgentRunOptions,\n NcpAgentRuntime,\n NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\nimport {\n NarpStdioRuntimeWrapper,\n type NarpStdioRuntimeWrapperContext,\n} from \"@nextclaw/nextclaw-narp-stdio-runtime-wrapper\";\nimport {\n CodexLiveOutputStream,\n CodexSdkNcpAgentRuntime,\n buildCodexBridgeModelProviderId,\n ensureCodexOpenAiResponsesBridge,\n type CodexSdkNcpAgentRuntimeConfig,\n type CodexOpenAiResponsesBridgeResult,\n type CodexOpenAiResponsesBridgeRuntimeConfig,\n} from \"@nextclaw/nextclaw-ncp-runtime-codex-sdk\";\n\nconst NARP_API_MODE_HEADER = \"x-nextclaw-narp-api-mode\";\n\nexport type CodexNarpRuntimeFactory = (\n config: CodexSdkNcpAgentRuntimeConfig,\n) => NcpAgentRuntime;\n\nexport type CodexResponsesBridgeFactory = (\n config: CodexOpenAiResponsesBridgeRuntimeConfig,\n) => Promise<CodexOpenAiResponsesBridgeResult>;\n\ntype CodexReasoningEffort = \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\nclass DeferredCodexNarpRuntime implements NcpAgentRuntime {\n private runtimePromise: Promise<NcpAgentRuntime> | null = null;\n\n constructor(private readonly createRuntime: () => Promise<NcpAgentRuntime>) {}\n\n run = async function* (\n this: DeferredCodexNarpRuntime,\n input: NcpAgentRunInput,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n if (!this.runtimePromise) {\n this.runtimePromise = this.createRuntime();\n }\n const runtime = await this.runtimePromise;\n yield* runtime.run(input, options);\n };\n}\n\nexport class CodexNarpRuntimeWrapper {\n constructor(\n private readonly createRuntime: CodexNarpRuntimeFactory = (\n config,\n ) => new CodexSdkNcpAgentRuntime(config),\n private readonly ensureResponsesBridge: CodexResponsesBridgeFactory =\n ensureCodexOpenAiResponsesBridge,\n ) {}\n\n start = (): void => {\n new NarpStdioRuntimeWrapper({\n agentName: \"NextClaw Codex NARP\",\n createRuntime: (context) => this.createCodexRuntime(context),\n }).start();\n };\n\n createCodexRuntime = (context: NarpStdioRuntimeWrapperContext): NcpAgentRuntime => {\n return new DeferredCodexNarpRuntime(async () =>\n this.createRuntime(await this.buildRuntimeConfig(context)),\n );\n };\n\n buildRuntimeConfig = (\n context: NarpStdioRuntimeWrapperContext,\n ): Promise<CodexSdkNcpAgentRuntimeConfig> => {\n const { cwd, modelId, promptMeta, sessionId } = context;\n const providerRoute = promptMeta.providerRoute;\n const sessionMetadata = promptMeta.sessionMetadata ?? {};\n const providerLocalModel =\n stripProviderPrefix(readString(providerRoute?.model)) ??\n stripProviderPrefix(readString(modelId)) ??\n readString(process.env.NEXTCLAW_MODEL);\n const upstreamApiBase =\n readString(providerRoute?.apiBase) ??\n readString(process.env.NEXTCLAW_API_BASE);\n const externalModelProvider = resolveExternalModelProvider({\n apiBase: upstreamApiBase,\n modelId,\n });\n\n return this.resolveRuntimeConfig({\n apiKey:\n readString(providerRoute?.apiKey) ??\n readString(process.env.NEXTCLAW_API_KEY) ??\n \"\",\n cwd,\n externalModelProvider,\n providerLocalModel,\n sessionId,\n sessionMetadata,\n threadModel:\n readString(modelId) ??\n composeModelRoute({\n modelProvider: externalModelProvider,\n providerLocalModel,\n }) ??\n providerLocalModel,\n upstreamApiBase,\n upstreamExtraHeaders: providerRoute?.headers,\n });\n };\n\n private resolveRuntimeConfig = async (params: {\n apiKey: string;\n cwd?: string;\n externalModelProvider?: string;\n providerLocalModel?: string;\n sessionId: string;\n sessionMetadata: Record<string, unknown>;\n threadModel?: string;\n upstreamApiBase?: string;\n upstreamExtraHeaders?: Record<string, string>;\n }): Promise<CodexSdkNcpAgentRuntimeConfig> => {\n const {\n apiKey,\n cwd,\n externalModelProvider,\n providerLocalModel,\n sessionId,\n sessionMetadata,\n threadModel: requestedThreadModel,\n upstreamApiBase,\n upstreamExtraHeaders,\n } = params;\n const bridgeModelProvider =\n upstreamApiBase && shouldUseResponsesBridge({\n apiBase: upstreamApiBase,\n headers: upstreamExtraHeaders,\n })\n ? buildCodexBridgeModelProviderId(externalModelProvider ?? \"chat\")\n : undefined;\n const liveOutputStream = new CodexLiveOutputStream();\n const bridge = bridgeModelProvider\n ? await this.ensureResponsesBridge({\n upstreamApiBase: upstreamApiBase ?? \"\",\n upstreamApiKey: apiKey,\n upstreamExtraHeaders: stripInternalRouteHeaders(upstreamExtraHeaders),\n defaultModel: providerLocalModel,\n outputObserver: liveOutputStream,\n upstreamReasoningSplit: isMiniMaxApiBase(upstreamApiBase ?? \"\"),\n modelPrefixes: [\n externalModelProvider ?? \"\",\n bridgeModelProvider,\n ],\n })\n : null;\n const apiBase = bridge?.baseUrl ?? upstreamApiBase;\n const modelProvider = bridgeModelProvider ?? externalModelProvider;\n const codexPathOverride =\n readString(process.env.NEXTCLAW_CODEX_PATH) ??\n readString(process.env.CODEX_PATH);\n const modelReasoningEffort =\n readReasoningEffort(sessionMetadata.preferred_thinking) ??\n readReasoningEffort(sessionMetadata.thinking);\n const threadModel = bridgeModelProvider\n ? composeModelRoute({\n modelProvider: bridgeModelProvider,\n providerLocalModel,\n })\n : requestedThreadModel;\n\n return {\n sessionId,\n apiKey,\n apiBase,\n model: providerLocalModel,\n threadId: readString(sessionMetadata.codex_thread_id) ?? null,\n ...(codexPathOverride ? { codexPathOverride } : {}),\n sessionMetadata,\n liveOutputStream: bridge ? liveOutputStream : undefined,\n cliConfig: buildCodexCliConfig({\n apiBase,\n modelProvider,\n }),\n threadOptions: {\n ...(threadModel ? { model: threadModel } : {}),\n workingDirectory: cwd ?? process.cwd(),\n skipGitRepoCheck: true,\n ...(modelReasoningEffort ? { modelReasoningEffort } : {}),\n },\n };\n };\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction stripProviderPrefix(value: string | undefined): string | undefined {\n const normalized = readString(value);\n if (!normalized) {\n return undefined;\n }\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex <= 0) {\n return normalized;\n }\n return readString(normalized.slice(slashIndex + 1));\n}\n\nfunction readReasoningEffort(value: unknown): CodexReasoningEffort | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"minimal\" ||\n normalized === \"low\" ||\n normalized === \"medium\" ||\n normalized === \"high\" ||\n normalized === \"xhigh\"\n ) {\n return normalized;\n }\n return undefined;\n}\n\nfunction readModelProvider(value: string | undefined): string | undefined {\n const normalized = readString(value);\n if (!normalized) {\n return undefined;\n }\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex <= 0) {\n return undefined;\n }\n return readString(normalized.slice(0, slashIndex));\n}\n\nfunction composeModelRoute(params: {\n modelProvider?: string;\n providerLocalModel?: string;\n}): string | undefined {\n const { modelProvider, providerLocalModel } = params;\n if (!modelProvider || !providerLocalModel) {\n return undefined;\n }\n return `${modelProvider}/${providerLocalModel}`;\n}\n\nfunction buildCodexCliConfig(params: {\n apiBase?: string;\n modelProvider?: string;\n}): CodexSdkNcpAgentRuntimeConfig[\"cliConfig\"] | undefined {\n const { apiBase, modelProvider } = params;\n if (!modelProvider) {\n return undefined;\n }\n const config: Record<string, unknown> = {\n model_provider: modelProvider,\n preferred_auth_method: \"apikey\",\n };\n if (apiBase) {\n config.model_providers = {\n [modelProvider]: {\n name: modelProvider,\n base_url: apiBase,\n wire_api: \"responses\",\n requires_openai_auth: true,\n },\n };\n }\n return config as CodexSdkNcpAgentRuntimeConfig[\"cliConfig\"];\n}\n\nfunction readApiMode(headers: Record<string, string> | undefined): string | undefined {\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === NARP_API_MODE_HEADER) {\n return readString(value)?.toLowerCase();\n }\n }\n return undefined;\n}\n\nfunction shouldUseResponsesBridge(params: {\n apiBase?: string;\n headers?: Record<string, string>;\n}): boolean {\n const apiMode = readApiMode(params.headers);\n if (apiMode === \"chat_completions\") {\n return true;\n }\n return Boolean(params.apiBase && isMiniMaxApiBase(params.apiBase));\n}\n\nfunction stripInternalRouteHeaders(\n headers: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === NARP_API_MODE_HEADER) {\n continue;\n }\n out[key] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction resolveExternalModelProvider(params: {\n apiBase?: string;\n modelId?: string;\n}): string | undefined {\n return readModelProvider(params.modelId) ??\n (params.apiBase && isMiniMaxApiBase(params.apiBase) ? \"minimax\" : undefined);\n}\n\nfunction isMiniMaxApiBase(apiBase: string): boolean {\n try {\n const host = new URL(apiBase).hostname.toLowerCase();\n return host === \"api.minimaxi.com\" || host.endsWith(\".minimaxi.com\");\n } catch {\n return apiBase.toLowerCase().includes(\"api.minimaxi.com\");\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codex-narp-runtime-wrapper.service.js","names":[],"sources":["../../src/services/codex-narp-runtime-wrapper.service.ts"],"sourcesContent":["import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type {\n NcpAgentRunInput,\n NcpAgentRunOptions,\n NcpAgentRuntime,\n NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\nimport {\n NarpStdioRuntimeWrapper,\n type NarpStdioRuntimeWrapperContext,\n} from \"@nextclaw/nextclaw-narp-stdio-runtime-wrapper\";\nimport {\n CodexAppServerNcpAgentRuntime,\n CodexLiveOutputStream,\n buildCodexBridgeModelProviderId,\n ensureCodexOpenAiResponsesBridge,\n type CodexSdkNcpAgentRuntimeConfig,\n type CodexOpenAiResponsesBridgeResult,\n type CodexOpenAiResponsesBridgeRuntimeConfig,\n} from \"@nextclaw/nextclaw-ncp-runtime-codex-sdk\";\n\nconst NARP_API_MODE_HEADER = \"x-nextclaw-narp-api-mode\";\nconst CODEX_NARP_DEBUG_CONFIG_ENV = \"NEXTCLAW_CODEX_NARP_DEBUG_CONFIG\";\nconst RUNTIME_DEFAULT_MODEL_VALUE = \"__nextclaw_runtime_default__\";\n\nexport type CodexNarpRuntimeFactory = (\n config: CodexSdkNcpAgentRuntimeConfig,\n) => NcpAgentRuntime;\n\nexport type CodexResponsesBridgeFactory = (\n config: CodexOpenAiResponsesBridgeRuntimeConfig,\n) => Promise<CodexOpenAiResponsesBridgeResult>;\n\ntype CodexReasoningEffort = \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\nclass DeferredCodexNarpRuntime implements NcpAgentRuntime {\n private runtimePromise: Promise<NcpAgentRuntime> | null = null;\n\n constructor(private readonly createRuntime: () => Promise<NcpAgentRuntime>) {}\n\n run = async function* (\n this: DeferredCodexNarpRuntime,\n input: NcpAgentRunInput,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n if (!this.runtimePromise) {\n this.runtimePromise = this.createRuntime();\n }\n const runtime = await this.runtimePromise;\n yield* runtime.run(input, options);\n };\n}\n\nexport class CodexNarpRuntimeWrapper {\n constructor(\n private readonly createRuntime: CodexNarpRuntimeFactory = (\n config,\n ) => new CodexAppServerNcpAgentRuntime(config),\n private readonly ensureResponsesBridge: CodexResponsesBridgeFactory =\n ensureCodexOpenAiResponsesBridge,\n ) {}\n\n start = (): void => {\n new NarpStdioRuntimeWrapper({\n agentName: \"NextClaw Codex NARP\",\n createRuntime: (context) => this.createCodexRuntime(context),\n }).start();\n };\n\n createCodexRuntime = (context: NarpStdioRuntimeWrapperContext): NcpAgentRuntime => {\n return new DeferredCodexNarpRuntime(async () =>\n this.createRuntime(await this.buildRuntimeConfig(context)),\n );\n };\n\n buildRuntimeConfig = (\n context: NarpStdioRuntimeWrapperContext,\n ): Promise<CodexSdkNcpAgentRuntimeConfig> => {\n const { cwd, modelId, promptMeta, sessionId, setSessionMetadata } = context;\n const providerRoute = promptMeta.providerRoute;\n const sessionMetadata = promptMeta.sessionMetadata ?? {};\n const useCodexRuntimeDefault = isRuntimeDefaultModelValue(\n readString(sessionMetadata.preferred_model) ??\n readString(sessionMetadata.preferredModel) ??\n readString(sessionMetadata.model) ??\n readString(modelId),\n );\n const providerLocalModel = useCodexRuntimeDefault\n ? undefined\n : stripProviderPrefix(readString(providerRoute?.model)) ??\n stripProviderPrefix(readString(modelId)) ??\n readString(process.env.NEXTCLAW_MODEL);\n const upstreamApiBase =\n useCodexRuntimeDefault\n ? undefined\n : readString(providerRoute?.apiBase) ?? readString(process.env.NEXTCLAW_API_BASE);\n const externalModelProvider = resolveExternalModelProvider({\n apiBase: upstreamApiBase,\n modelId,\n });\n\n return this.resolveRuntimeConfig({\n apiKey:\n (useCodexRuntimeDefault\n ? undefined\n : readString(providerRoute?.apiKey) ?? readString(process.env.NEXTCLAW_API_KEY)) ??\n \"\",\n cwd,\n externalModelProvider,\n providerLocalModel,\n sessionId,\n sessionMetadata,\n setSessionMetadata,\n threadModel: useCodexRuntimeDefault\n ? undefined\n : readString(modelId) ??\n composeModelRoute({\n modelProvider: externalModelProvider,\n providerLocalModel,\n }) ??\n providerLocalModel,\n upstreamApiBase,\n upstreamExtraHeaders: providerRoute?.headers,\n });\n };\n\n private resolveRuntimeConfig = async (params: {\n apiKey: string;\n cwd?: string;\n externalModelProvider?: string;\n providerLocalModel?: string;\n sessionId: string;\n sessionMetadata: Record<string, unknown>;\n threadModel?: string;\n upstreamApiBase?: string;\n upstreamExtraHeaders?: Record<string, string>;\n setSessionMetadata?: CodexSdkNcpAgentRuntimeConfig[\"setSessionMetadata\"];\n }): Promise<CodexSdkNcpAgentRuntimeConfig> => {\n const {\n apiKey,\n cwd,\n externalModelProvider,\n providerLocalModel,\n sessionId,\n sessionMetadata,\n setSessionMetadata,\n threadModel: requestedThreadModel,\n upstreamApiBase,\n upstreamExtraHeaders,\n } = params;\n const bridgeModelProvider =\n upstreamApiBase && shouldUseResponsesBridge({\n apiBase: upstreamApiBase,\n headers: upstreamExtraHeaders,\n })\n ? buildCodexBridgeModelProviderId(externalModelProvider ?? \"chat\")\n : undefined;\n const liveOutputStream = new CodexLiveOutputStream();\n const bridge = bridgeModelProvider\n ? await this.ensureResponsesBridge({\n upstreamApiBase: upstreamApiBase ?? \"\",\n upstreamApiKey: apiKey,\n upstreamExtraHeaders: stripInternalRouteHeaders(upstreamExtraHeaders),\n defaultModel: providerLocalModel,\n outputObserver: liveOutputStream,\n upstreamReasoningSplit: isMiniMaxApiBase(upstreamApiBase ?? \"\"),\n modelPrefixes: [\n externalModelProvider ?? \"\",\n bridgeModelProvider,\n ],\n })\n : null;\n const apiBase = bridge?.baseUrl ?? upstreamApiBase;\n const modelProvider = bridgeModelProvider ?? externalModelProvider;\n const codexPathOverride =\n readString(process.env.NEXTCLAW_CODEX_PATH) ??\n readString(process.env.CODEX_PATH);\n const modelReasoningEffort =\n readReasoningEffort(sessionMetadata.preferred_thinking) ??\n readReasoningEffort(sessionMetadata.thinking);\n const threadModel = bridgeModelProvider\n ? composeModelRoute({\n modelProvider: bridgeModelProvider,\n providerLocalModel,\n })\n : requestedThreadModel;\n\n const threadModelScope = threadModel ?? RUNTIME_DEFAULT_MODEL_VALUE;\n const config = {\n sessionId,\n apiKey,\n apiBase,\n model: providerLocalModel,\n threadId: resolveReusableThreadId(sessionMetadata, threadModelScope),\n ...(codexPathOverride ? { codexPathOverride } : {}),\n sessionMetadata,\n ...(setSessionMetadata ? { setSessionMetadata } : {}),\n liveOutputStream: bridge ? liveOutputStream : undefined,\n cliConfig: buildCodexCliConfig({\n apiBase,\n modelProvider,\n showRawAgentReasoning: Boolean(modelReasoningEffort),\n }),\n threadOptions: {\n ...(threadModel ? { model: threadModel } : {}),\n workingDirectory: cwd,\n skipGitRepoCheck: true,\n ...(modelReasoningEffort ? { modelReasoningEffort } : {}),\n },\n };\n logCodexRuntimeConfig({\n bridgeModelProvider,\n config,\n externalModelProvider,\n providerLocalModel,\n requestedThreadModel,\n sessionMetadata,\n threadModel,\n });\n return config;\n };\n}\n\nfunction resolveReusableThreadId(\n sessionMetadata: Record<string, unknown>,\n threadModelScope: string,\n): string | null {\n const threadId = readString(sessionMetadata.codex_thread_id);\n if (!threadId) {\n return null;\n }\n const threadScope = readString(sessionMetadata.codex_thread_model);\n if (!threadScope) {\n return null;\n }\n return threadScope === threadModelScope ? threadId : null;\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction stripProviderPrefix(value: string | undefined): string | undefined {\n const normalized = readString(value);\n if (!normalized) {\n return undefined;\n }\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex <= 0) {\n return normalized;\n }\n return readString(normalized.slice(slashIndex + 1));\n}\n\nfunction isRuntimeDefaultModelValue(value: string | undefined): boolean {\n return value === RUNTIME_DEFAULT_MODEL_VALUE;\n}\n\nfunction readReasoningEffort(value: unknown): CodexReasoningEffort | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"minimal\" ||\n normalized === \"low\" ||\n normalized === \"medium\" ||\n normalized === \"high\" ||\n normalized === \"xhigh\"\n ) {\n return normalized;\n }\n return undefined;\n}\n\nfunction readModelProvider(value: string | undefined): string | undefined {\n const normalized = readString(value);\n if (!normalized) {\n return undefined;\n }\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex <= 0) {\n return undefined;\n }\n return readString(normalized.slice(0, slashIndex));\n}\n\nfunction composeModelRoute(params: {\n modelProvider?: string;\n providerLocalModel?: string;\n}): string | undefined {\n const { modelProvider, providerLocalModel } = params;\n if (!modelProvider || !providerLocalModel) {\n return undefined;\n }\n return `${modelProvider}/${providerLocalModel}`;\n}\n\nfunction buildCodexCliConfig(params: {\n apiBase?: string;\n modelProvider?: string;\n showRawAgentReasoning?: boolean;\n}): CodexSdkNcpAgentRuntimeConfig[\"cliConfig\"] | undefined {\n const { apiBase, modelProvider, showRawAgentReasoning } = params;\n if (!modelProvider && !showRawAgentReasoning) {\n return undefined;\n }\n const config: Record<string, unknown> = {};\n if (showRawAgentReasoning) {\n config.show_raw_agent_reasoning = true;\n }\n if (modelProvider) {\n config.model_provider = modelProvider;\n config.preferred_auth_method = \"apikey\";\n }\n if (apiBase && modelProvider) {\n config.model_providers = {\n [modelProvider]: {\n name: modelProvider,\n base_url: apiBase,\n wire_api: \"responses\",\n requires_openai_auth: true,\n },\n };\n }\n return config as CodexSdkNcpAgentRuntimeConfig[\"cliConfig\"];\n}\n\nfunction logCodexRuntimeConfig(params: {\n bridgeModelProvider?: string;\n config: CodexSdkNcpAgentRuntimeConfig;\n externalModelProvider?: string;\n providerLocalModel?: string;\n requestedThreadModel?: string;\n sessionMetadata: Record<string, unknown>;\n threadModel?: string;\n}): void {\n if (process.env[CODEX_NARP_DEBUG_CONFIG_ENV] !== \"1\") {\n return;\n }\n const {\n bridgeModelProvider,\n config,\n externalModelProvider,\n providerLocalModel,\n requestedThreadModel,\n sessionMetadata,\n threadModel,\n } = params;\n const cliConfig = config.cliConfig as Record<string, unknown> | undefined;\n const modelProviders = cliConfig?.model_providers;\n const snapshot = {\n bridgeModelProvider: bridgeModelProvider ?? null,\n externalModelProvider: externalModelProvider ?? null,\n hasApiBase: Boolean(config.apiBase),\n hasApiKey: Boolean(config.apiKey),\n hasLiveOutputStream: Boolean(config.liveOutputStream),\n providerLocalModel: providerLocalModel ?? null,\n requestedThreadModel: requestedThreadModel ?? null,\n sessionId: config.sessionId,\n sessionMetadata: {\n codex_thread_id: readString(sessionMetadata.codex_thread_id) ?? null,\n codex_thread_model: readString(sessionMetadata.codex_thread_model) ?? null,\n model: readString(sessionMetadata.model) ?? null,\n preferred_model: readString(sessionMetadata.preferred_model) ?? null,\n preferred_thinking: readString(sessionMetadata.preferred_thinking) ?? null,\n thinking: readString(sessionMetadata.thinking) ?? null,\n },\n sdkConfig: {\n cliConfig: cliConfig\n ? {\n model_provider: readString(cliConfig.model_provider) ?? null,\n model_providers:\n modelProviders && typeof modelProviders === \"object\" && !Array.isArray(modelProviders)\n ? Object.keys(modelProviders)\n : [],\n preferred_auth_method: readString(cliConfig.preferred_auth_method) ?? null,\n show_raw_agent_reasoning: cliConfig.show_raw_agent_reasoning === true,\n }\n : null,\n model: config.model ?? null,\n threadId: config.threadId ?? null,\n threadOptions: {\n model: config.threadOptions?.model ?? null,\n modelReasoningEffort: config.threadOptions?.modelReasoningEffort ?? null,\n skipGitRepoCheck: config.threadOptions?.skipGitRepoCheck ?? null,\n workingDirectory: config.threadOptions?.workingDirectory ?? null,\n },\n },\n threadModel: threadModel ?? null,\n ts: new Date().toISOString(),\n };\n const line = `[nextclaw-codex-narp] runtime-config ${JSON.stringify(snapshot)}`;\n console.error(line);\n appendDebugLog(snapshot);\n}\n\nfunction appendDebugLog(snapshot: Record<string, unknown>): void {\n try {\n const home = readString(process.env.NEXTCLAW_HOME) ?? join(homedir(), \".nextclaw\");\n const logPath = join(home, \"logs\", \"codex-narp-runtime-config.jsonl\");\n mkdirSync(dirname(logPath), { recursive: true });\n appendFileSync(logPath, `${JSON.stringify(snapshot)}\\n`, \"utf8\");\n } catch (error) {\n console.error(\n `[nextclaw-codex-narp] failed to write runtime config debug log: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction readApiMode(headers: Record<string, string> | undefined): string | undefined {\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === NARP_API_MODE_HEADER) {\n return readString(value)?.toLowerCase();\n }\n }\n return undefined;\n}\n\nfunction shouldUseResponsesBridge(params: {\n apiBase?: string;\n headers?: Record<string, string>;\n}): boolean {\n const apiMode = readApiMode(params.headers);\n if (apiMode === \"chat_completions\") {\n return true;\n }\n return Boolean(params.apiBase && isMiniMaxApiBase(params.apiBase));\n}\n\nfunction stripInternalRouteHeaders(\n headers: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers ?? {})) {\n if (key.toLowerCase() === NARP_API_MODE_HEADER) {\n continue;\n }\n out[key] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction resolveExternalModelProvider(params: {\n apiBase?: string;\n modelId?: string;\n}): string | undefined {\n return readModelProvider(params.modelId) ??\n (params.apiBase && isMiniMaxApiBase(params.apiBase) ? \"minimax\" : undefined);\n}\n\nfunction isMiniMaxApiBase(apiBase: string): boolean {\n try {\n const host = new URL(apiBase).hostname.toLowerCase();\n return host === \"api.minimaxi.com\" || host.endsWith(\".minimaxi.com\");\n } catch {\n return apiBase.toLowerCase().includes(\"api.minimaxi.com\");\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/nextclaw-narp-runtime-codex-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.33-beta.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "NARP stdio launcher for the NextClaw Codex SDK runtime.",
|
|
6
6
|
"type": "module",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nextclaw/
|
|
23
|
-
"@nextclaw/nextclaw-ncp-runtime-codex-sdk": "0.1.
|
|
24
|
-
"@nextclaw/
|
|
22
|
+
"@nextclaw/nextclaw-narp-stdio-runtime-wrapper": "0.2.14-beta.0",
|
|
23
|
+
"@nextclaw/nextclaw-ncp-runtime-codex-sdk": "0.1.55-beta.0",
|
|
24
|
+
"@nextclaw/ncp": "0.6.4-beta.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^20.17.6",
|