@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":";;;;;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":";;;;;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
  }
@@ -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 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
- threadModel: readString(modelId) ?? composeModelRoute({
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
- return {
85
+ const config = {
79
86
  sessionId,
80
87
  apiKey,
81
88
  apiBase,
82
89
  model: providerLocalModel,
83
- threadId: readString(sessionMetadata.codex_thread_id) ?? null,
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 ?? process.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
- model_provider: modelProvider,
134
- preferred_auth_method: "apikey"
135
- };
136
- 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]: {
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":";;;;;;AAuBA,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AAYpC,IAAM,2BAAN,MAA0D;CACxD,iBAA0D;CAE1D,YAAY,eAAgE;AAA/C,OAAA,gBAAA;;CAE7B,MAAM,iBAEJ,OACA,SACkC;AAClC,MAAI,CAAC,KAAK,eACR,MAAK,iBAAiB,KAAK,eAAe;AAG5C,UADgB,MAAM,KAAK,gBACZ,IAAI,OAAO,QAAQ;;;AAItC,IAAa,0BAAb,MAAqC;CACnC,YACE,iBACE,WACG,IAAI,8BAA8B,OAAO,EAC9C,wBACE,kCACF;AALiB,OAAA,gBAAA;AAGA,OAAA,wBAAA;;CAInB,cAAoB;AAClB,MAAI,wBAAwB;GAC1B,WAAW;GACX,gBAAgB,YAAY,KAAK,mBAAmB,QAAQ;GAC7D,CAAC,CAAC,OAAO;;CAGZ,sBAAsB,YAA6D;AACjF,SAAO,IAAI,yBAAyB,YAClC,KAAK,cAAc,MAAM,KAAK,mBAAmB,QAAQ,CAAC,CAC3D;;CAGH,sBACE,YAC2C;EAC3C,MAAM,EAAE,KAAK,SAAS,YAAY,WAAW,uBAAuB;EACpE,MAAM,gBAAgB,WAAW;EACjC,MAAM,kBAAkB,WAAW,mBAAmB,EAAE;EACxD,MAAM,yBAAyB,2BAC7B,WAAW,gBAAgB,gBAAgB,IACzC,WAAW,gBAAgB,eAAe,IAC1C,WAAW,gBAAgB,MAAM,IACjC,WAAW,QAAQ,CACtB;EACD,MAAM,qBAAqB,yBACvB,KAAA,IACA,oBAAoB,WAAW,eAAe,MAAM,CAAC,IACrD,oBAAoB,WAAW,QAAQ,CAAC,IACxC,WAAW,QAAQ,IAAI,eAAe;EAC1C,MAAM,kBACJ,yBACI,KAAA,IACA,WAAW,eAAe,QAAQ,IAAI,WAAW,QAAQ,IAAI,kBAAkB;EACrF,MAAM,wBAAwB,6BAA6B;GACzD,SAAS;GACT;GACD,CAAC;AAEF,SAAO,KAAK,qBAAqB;GAC/B,SACG,yBACG,KAAA,IACA,WAAW,eAAe,OAAO,IAAI,WAAW,QAAQ,IAAI,iBAAiB,KACjF;GACF;GACA;GACA;GACA;GACA;GACA;GACA,aAAa,yBACT,KAAA,IACA,WAAW,QAAQ,IACnB,kBAAkB;IAChB,eAAe;IACf;IACD,CAAC,IACF;GACJ;GACA,sBAAsB,eAAe;GACtC,CAAC;;CAGJ,uBAA+B,OAAO,WAWQ;EAC5C,MAAM,EACJ,QACA,KACA,uBACA,oBACA,WACA,iBACA,oBACA,aAAa,sBACb,iBACA,yBACE;EACJ,MAAM,sBACJ,mBAAmB,yBAAyB;GAC1C,SAAS;GACT,SAAS;GACV,CAAC,GACE,gCAAgC,yBAAyB,OAAO,GAChE,KAAA;EACN,MAAM,mBAAmB,IAAI,uBAAuB;EACpD,MAAM,SAAS,sBACX,MAAM,KAAK,sBAAsB;GAC/B,iBAAiB,mBAAmB;GACpC,gBAAgB;GAChB,sBAAsB,0BAA0B,qBAAqB;GACrE,cAAc;GACd,gBAAgB;GAChB,wBAAwB,iBAAiB,mBAAmB,GAAG;GAC/D,eAAe,CACb,yBAAyB,IACzB,oBACD;GACF,CAAC,GACF;EACJ,MAAM,UAAU,QAAQ,WAAW;EACnC,MAAM,gBAAgB,uBAAuB;EAC7C,MAAM,oBACJ,WAAW,QAAQ,IAAI,oBAAoB,IAC3C,WAAW,QAAQ,IAAI,WAAW;EACpC,MAAM,uBACJ,oBAAoB,gBAAgB,mBAAmB,IACvD,oBAAoB,gBAAgB,SAAS;EAC/C,MAAM,cAAc,sBAChB,kBAAkB;GAChB,eAAe;GACf;GACD,CAAC,GACF;EAGJ,MAAM,SAAS;GACb;GACA;GACA;GACA,OAAO;GACP,UAAU,wBAAwB,iBANX,eAAe,4BAM8B;GACpE,GAAI,oBAAoB,EAAE,mBAAmB,GAAG,EAAE;GAClD;GACA,GAAI,qBAAqB,EAAE,oBAAoB,GAAG,EAAE;GACpD,kBAAkB,SAAS,mBAAmB,KAAA;GAC9C,WAAW,oBAAoB;IAC7B;IACA;IACA,uBAAuB,QAAQ,qBAAqB;IACrD,CAAC;GACF,eAAe;IACb,GAAI,cAAc,EAAE,OAAO,aAAa,GAAG,EAAE;IAC7C,kBAAkB;IAClB,kBAAkB;IAClB,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACzD;GACF;AACD,wBAAsB;GACpB;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,SAAO;;;AAIX,SAAS,wBACP,iBACA,kBACe;CACf,MAAM,WAAW,WAAW,gBAAgB,gBAAgB;AAC5D,KAAI,CAAC,SACH,QAAO;CAET,MAAM,cAAc,WAAW,gBAAgB,mBAAmB;AAClE,KAAI,CAAC,YACH,QAAO;AAET,QAAO,gBAAgB,mBAAmB,WAAW;;AAGvD,SAAS,WAAW,OAAoC;AACtD,KAAI,OAAO,UAAU,SACnB;CAEF,MAAM,UAAU,MAAM,MAAM;AAC5B,QAAO,QAAQ,SAAS,IAAI,UAAU,KAAA;;AAGxC,SAAS,oBAAoB,OAA+C;CAC1E,MAAM,aAAa,WAAW,MAAM;AACpC,KAAI,CAAC,WACH;CAEF,MAAM,aAAa,WAAW,QAAQ,IAAI;AAC1C,KAAI,cAAc,EAChB,QAAO;AAET,QAAO,WAAW,WAAW,MAAM,aAAa,EAAE,CAAC;;AAGrD,SAAS,2BAA2B,OAAoC;AACtE,QAAO,UAAU;;AAGnB,SAAS,oBAAoB,OAAkD;AAC7E,KAAI,OAAO,UAAU,SACnB;CAEF,MAAM,aAAa,MAAM,MAAM,CAAC,aAAa;AAC7C,KACE,eAAe,aACf,eAAe,SACf,eAAe,YACf,eAAe,UACf,eAAe,QAEf,QAAO;;AAKX,SAAS,kBAAkB,OAA+C;CACxE,MAAM,aAAa,WAAW,MAAM;AACpC,KAAI,CAAC,WACH;CAEF,MAAM,aAAa,WAAW,QAAQ,IAAI;AAC1C,KAAI,cAAc,EAChB;AAEF,QAAO,WAAW,WAAW,MAAM,GAAG,WAAW,CAAC;;AAGpD,SAAS,kBAAkB,QAGJ;CACrB,MAAM,EAAE,eAAe,uBAAuB;AAC9C,KAAI,CAAC,iBAAiB,CAAC,mBACrB;AAEF,QAAO,GAAG,cAAc,GAAG;;AAG7B,SAAS,oBAAoB,QAI8B;CACzD,MAAM,EAAE,SAAS,eAAe,0BAA0B;AAC1D,KAAI,CAAC,iBAAiB,CAAC,sBACrB;CAEF,MAAM,SAAkC,EAAE;AAC1C,KAAI,sBACF,QAAO,2BAA2B;AAEpC,KAAI,eAAe;AACjB,SAAO,iBAAiB;AACxB,SAAO,wBAAwB;;AAEjC,KAAI,WAAW,cACb,QAAO,kBAAkB,GACtB,gBAAgB;EACf,MAAM;EACN,UAAU;EACV,UAAU;EACV,sBAAsB;EACvB,EACF;AAEH,QAAO;;AAGT,SAAS,sBAAsB,QAQtB;AACP,KAAI,QAAQ,IAAI,iCAAiC,IAC/C;CAEF,MAAM,EACJ,qBACA,QACA,uBACA,oBACA,sBACA,iBACA,gBACE;CACJ,MAAM,YAAY,OAAO;CACzB,MAAM,iBAAiB,WAAW;CAClC,MAAM,WAAW;EACf,qBAAqB,uBAAuB;EAC5C,uBAAuB,yBAAyB;EAChD,YAAY,QAAQ,OAAO,QAAQ;EACnC,WAAW,QAAQ,OAAO,OAAO;EACjC,qBAAqB,QAAQ,OAAO,iBAAiB;EACrD,oBAAoB,sBAAsB;EAC1C,sBAAsB,wBAAwB;EAC9C,WAAW,OAAO;EAChB,iBAAiB;GACf,iBAAiB,WAAW,gBAAgB,gBAAgB,IAAI;GAChE,oBAAoB,WAAW,gBAAgB,mBAAmB,IAAI;GACtE,OAAO,WAAW,gBAAgB,MAAM,IAAI;GAC5C,iBAAiB,WAAW,gBAAgB,gBAAgB,IAAI;GAChE,oBAAoB,WAAW,gBAAgB,mBAAmB,IAAI;GACxE,UAAU,WAAW,gBAAgB,SAAS,IAAI;GACnD;EACD,WAAW;GACT,WAAW,YACP;IACE,gBAAgB,WAAW,UAAU,eAAe,IAAI;IACxD,iBACE,kBAAkB,OAAO,mBAAmB,YAAY,CAAC,MAAM,QAAQ,eAAe,GAClF,OAAO,KAAK,eAAe,GAC3B,EAAE;IACR,uBAAuB,WAAW,UAAU,sBAAsB,IAAI;IACtE,0BAA0B,UAAU,6BAA6B;IAClE,GACD;GACJ,OAAO,OAAO,SAAS;GACvB,UAAU,OAAO,YAAY;GAC7B,eAAe;IACb,OAAO,OAAO,eAAe,SAAS;IACtC,sBAAsB,OAAO,eAAe,wBAAwB;IACpE,kBAAkB,OAAO,eAAe,oBAAoB;IAC5D,kBAAkB,OAAO,eAAe,oBAAoB;IAC7D;GACF;EACD,aAAa,eAAe;EAC5B,qBAAI,IAAI,MAAM,EAAC,aAAa;EAC7B;CACD,MAAM,OAAO,wCAAwC,KAAK,UAAU,SAAS;AAC7E,SAAQ,MAAM,KAAK;AACnB,gBAAe,SAAS;;AAG1B,SAAS,eAAe,UAAyC;AAC/D,KAAI;EAEF,MAAM,UAAU,KADH,WAAW,QAAQ,IAAI,cAAc,IAAI,KAAK,SAAS,EAAE,YAAY,EACvD,QAAQ,kCAAkC;AACrE,YAAU,QAAQ,QAAQ,EAAE,EAAE,WAAW,MAAM,CAAC;AAChD,iBAAe,SAAS,GAAG,KAAK,UAAU,SAAS,CAAC,KAAK,OAAO;UACzD,OAAO;AACd,UAAQ,MACN,mEAAmE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAC1H;;;AAIL,SAAS,YAAY,SAAiE;AACpF,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,EAAE,CAAC,CACtD,KAAI,IAAI,aAAa,KAAK,qBACxB,QAAO,WAAW,MAAM,EAAE,aAAa;;AAM7C,SAAS,yBAAyB,QAGtB;AAEV,KADgB,YAAY,OAAO,QAAQ,KAC3B,mBACd,QAAO;AAET,QAAO,QAAQ,OAAO,WAAW,iBAAiB,OAAO,QAAQ,CAAC;;AAGpE,SAAS,0BACP,SACoC;CACpC,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,EAAE,CAAC,EAAE;AACxD,MAAI,IAAI,aAAa,KAAK,qBACxB;AAEF,MAAI,OAAO;;AAEb,QAAO,OAAO,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,KAAA;;AAG7C,SAAS,6BAA6B,QAGf;AACrB,QAAO,kBAAkB,OAAO,QAAQ,KACrC,OAAO,WAAW,iBAAiB,OAAO,QAAQ,GAAG,YAAY,KAAA;;AAGtE,SAAS,iBAAiB,SAA0B;AAClD,KAAI;EACF,MAAM,OAAO,IAAI,IAAI,QAAQ,CAAC,SAAS,aAAa;AACpD,SAAO,SAAS,sBAAsB,KAAK,SAAS,gBAAgB;SAC9D;AACN,SAAO,QAAQ,aAAa,CAAC,SAAS,mBAAmB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/nextclaw-narp-runtime-codex-sdk",
3
- "version": "0.1.31",
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.2",
23
- "@nextclaw/nextclaw-ncp-runtime-codex-sdk": "0.1.53",
24
- "@nextclaw/nextclaw-narp-stdio-runtime-wrapper": "0.2.12"
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",