@nextclaw/nextclaw-narp-runtime-codex-sdk 0.1.30 → 0.1.32

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,QAsCH,oBAAA;AAAA"}
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"}
@@ -27,7 +27,7 @@ var CodexNarpRuntimeWrapper = class {
27
27
  return new DeferredCodexNarpRuntime(async () => this.createRuntime(await this.buildRuntimeConfig(context)));
28
28
  };
29
29
  buildRuntimeConfig = (context) => {
30
- const { cwd, modelId, promptMeta, sessionId } = context;
30
+ const { cwd, modelId, promptMeta, sessionId, setSessionMetadata } = context;
31
31
  const providerRoute = promptMeta.providerRoute;
32
32
  const sessionMetadata = promptMeta.sessionMetadata ?? {};
33
33
  const providerLocalModel = stripProviderPrefix(readString(providerRoute?.model)) ?? stripProviderPrefix(readString(modelId)) ?? readString(process.env.NEXTCLAW_MODEL);
@@ -43,6 +43,7 @@ var CodexNarpRuntimeWrapper = class {
43
43
  providerLocalModel,
44
44
  sessionId,
45
45
  sessionMetadata,
46
+ setSessionMetadata,
46
47
  threadModel: readString(modelId) ?? composeModelRoute({
47
48
  modelProvider: externalModelProvider,
48
49
  providerLocalModel
@@ -52,7 +53,7 @@ var CodexNarpRuntimeWrapper = class {
52
53
  });
53
54
  };
54
55
  resolveRuntimeConfig = async (params) => {
55
- const { apiKey, cwd, externalModelProvider, providerLocalModel, sessionId, sessionMetadata, threadModel: requestedThreadModel, upstreamApiBase, upstreamExtraHeaders } = params;
56
+ const { apiKey, cwd, externalModelProvider, providerLocalModel, sessionId, sessionMetadata, setSessionMetadata, threadModel: requestedThreadModel, upstreamApiBase, upstreamExtraHeaders } = params;
56
57
  const bridgeModelProvider = upstreamApiBase && shouldUseResponsesBridge({
57
58
  apiBase: upstreamApiBase,
58
59
  headers: upstreamExtraHeaders
@@ -83,6 +84,7 @@ var CodexNarpRuntimeWrapper = class {
83
84
  threadId: readString(sessionMetadata.codex_thread_id) ?? null,
84
85
  ...codexPathOverride ? { codexPathOverride } : {},
85
86
  sessionMetadata,
87
+ ...setSessionMetadata ? { setSessionMetadata } : {},
86
88
  liveOutputStream: bridge ? liveOutputStream : void 0,
87
89
  cliConfig: buildCodexCliConfig({
88
90
  apiBase,
@@ -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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/nextclaw-narp-runtime-codex-sdk",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
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/nextclaw-narp-stdio-runtime-wrapper": "0.2.11",
23
- "@nextclaw/ncp": "0.6.1",
24
- "@nextclaw/nextclaw-ncp-runtime-codex-sdk": "0.1.52"
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"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "^20.17.6",