@nextclaw/nextclaw-narp-runtime-codex-sdk 0.1.32 → 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":";;;;;KAsBY,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,QAuCH,oBAAA;AAAA"}
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 { CodexLiveOutputStream, CodexSdkNcpAgentRuntime, buildCodexBridgeModelProviderId, ensureCodexOpenAiResponsesBridge } from "@nextclaw/nextclaw-ncp-runtime-codex-sdk";
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 CodexSdkNcpAgentRuntime(config), ensureResponsesBridge = ensureCodexOpenAiResponsesBridge) {
21
+ constructor(createRuntime = (config) => new CodexAppServerNcpAgentRuntime(config), ensureResponsesBridge = ensureCodexOpenAiResponsesBridge) {
17
22
  this.createRuntime = createRuntime;
18
23
  this.ensureResponsesBridge = ensureResponsesBridge;
19
24
  }
@@ -30,21 +35,22 @@ var CodexNarpRuntimeWrapper = class {
30
35
  const { cwd, modelId, promptMeta, sessionId, setSessionMetadata } = context;
31
36
  const providerRoute = promptMeta.providerRoute;
32
37
  const sessionMetadata = promptMeta.sessionMetadata ?? {};
33
- const providerLocalModel = stripProviderPrefix(readString(providerRoute?.model)) ?? stripProviderPrefix(readString(modelId)) ?? readString(process.env.NEXTCLAW_MODEL);
34
- const upstreamApiBase = readString(providerRoute?.apiBase) ?? readString(process.env.NEXTCLAW_API_BASE);
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,
47
- threadModel: readString(modelId) ?? composeModelRoute({
53
+ threadModel: useCodexRuntimeDefault ? void 0 : readString(modelId) ?? composeModelRoute({
48
54
  modelProvider: externalModelProvider,
49
55
  providerLocalModel
50
56
  }) ?? providerLocalModel,
@@ -76,29 +82,47 @@ var CodexNarpRuntimeWrapper = class {
76
82
  modelProvider: bridgeModelProvider,
77
83
  providerLocalModel
78
84
  }) : requestedThreadModel;
79
- return {
85
+ const config = {
80
86
  sessionId,
81
87
  apiKey,
82
88
  apiBase,
83
89
  model: providerLocalModel,
84
- threadId: readString(sessionMetadata.codex_thread_id) ?? null,
90
+ threadId: resolveReusableThreadId(sessionMetadata, threadModel ?? RUNTIME_DEFAULT_MODEL_VALUE),
85
91
  ...codexPathOverride ? { codexPathOverride } : {},
86
92
  sessionMetadata,
87
93
  ...setSessionMetadata ? { setSessionMetadata } : {},
88
94
  liveOutputStream: bridge ? liveOutputStream : void 0,
89
95
  cliConfig: buildCodexCliConfig({
90
96
  apiBase,
91
- modelProvider
97
+ modelProvider,
98
+ showRawAgentReasoning: Boolean(modelReasoningEffort)
92
99
  }),
93
100
  threadOptions: {
94
101
  ...threadModel ? { model: threadModel } : {},
95
- workingDirectory: cwd ?? process.cwd(),
102
+ workingDirectory: cwd,
96
103
  skipGitRepoCheck: true,
97
104
  ...modelReasoningEffort ? { modelReasoningEffort } : {}
98
105
  }
99
106
  };
107
+ logCodexRuntimeConfig({
108
+ bridgeModelProvider,
109
+ config,
110
+ externalModelProvider,
111
+ providerLocalModel,
112
+ requestedThreadModel,
113
+ sessionMetadata,
114
+ threadModel
115
+ });
116
+ return config;
100
117
  };
101
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
+ }
102
126
  function readString(value) {
103
127
  if (typeof value !== "string") return;
104
128
  const trimmed = value.trim();
@@ -111,6 +135,9 @@ function stripProviderPrefix(value) {
111
135
  if (slashIndex <= 0) return normalized;
112
136
  return readString(normalized.slice(slashIndex + 1));
113
137
  }
138
+ function isRuntimeDefaultModelValue(value) {
139
+ return value === RUNTIME_DEFAULT_MODEL_VALUE;
140
+ }
114
141
  function readReasoningEffort(value) {
115
142
  if (typeof value !== "string") return;
116
143
  const normalized = value.trim().toLowerCase();
@@ -129,13 +156,15 @@ function composeModelRoute(params) {
129
156
  return `${modelProvider}/${providerLocalModel}`;
130
157
  }
131
158
  function buildCodexCliConfig(params) {
132
- const { apiBase, modelProvider } = params;
133
- if (!modelProvider) return;
134
- const config = {
135
- model_provider: modelProvider,
136
- preferred_auth_method: "apikey"
137
- };
138
- if (apiBase) config.model_providers = { [modelProvider]: {
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]: {
139
168
  name: modelProvider,
140
169
  base_url: apiBase,
141
170
  wire_api: "responses",
@@ -143,6 +172,60 @@ function buildCodexCliConfig(params) {
143
172
  } };
144
173
  return config;
145
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
+ }
146
229
  function readApiMode(headers) {
147
230
  for (const [key, value] of Object.entries(headers ?? {})) if (key.toLowerCase() === NARP_API_MODE_HEADER) return readString(value)?.toLowerCase();
148
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, setSessionMetadata } = 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 setSessionMetadata,\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 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 return {\n sessionId,\n apiKey,\n apiBase,\n model: providerLocalModel,\n threadId: readString(sessionMetadata.codex_thread_id) ?? null,\n ...(codexPathOverride ? { codexPathOverride } : {}),\n sessionMetadata,\n ...(setSessionMetadata ? { setSessionMetadata } : {}),\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.32",
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/ncp": "0.6.3",
23
- "@nextclaw/nextclaw-narp-stdio-runtime-wrapper": "0.2.13",
24
- "@nextclaw/nextclaw-ncp-runtime-codex-sdk": "0.1.54"
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",