@nextclaw/ncp-agent-runtime 0.4.0 → 0.4.2

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.
package/dist/index.d.ts CHANGED
@@ -210,6 +210,34 @@ declare class DefaultNcpStreamEncoder implements NcpStreamEncoder {
210
210
  encode(stream: AsyncIterable<OpenAIChatChunk>, context: NcpEncodeContext): AsyncGenerator<NcpEndpointEvent>;
211
211
  }
212
212
  //#endregion
213
+ //#region src/runtime/runtime-stream-recovery.utils.d.ts
214
+ declare const NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS = 2000;
215
+ declare const NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS = 30000;
216
+ declare const NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE = "retry";
217
+ type NcpRuntimeStreamAttemptState = {
218
+ messageId: string | null;
219
+ };
220
+ type NcpRuntimeStreamFailure = {
221
+ events: readonly (NcpEndpointEvent | null)[];
222
+ error?: unknown;
223
+ };
224
+ declare function createNcpRuntimeStreamAttemptState(): NcpRuntimeStreamAttemptState;
225
+ declare function observeNcpRuntimeStreamAttemptEvent(state: NcpRuntimeStreamAttemptState, event: NcpEndpointEvent): NcpRuntimeStreamAttemptState;
226
+ declare function shouldRetryNcpRuntimeStreamAttempt(params: {
227
+ failure: NcpRuntimeStreamFailure;
228
+ signal?: AbortSignal;
229
+ }): boolean;
230
+ declare function createNcpRuntimeStreamRetryEvents(params: {
231
+ attempt: number;
232
+ correlationId?: string;
233
+ failure: NcpRuntimeStreamFailure;
234
+ runId?: string;
235
+ sessionId: string;
236
+ state: NcpRuntimeStreamAttemptState;
237
+ }): NcpEndpointEvent[];
238
+ declare function getNcpRuntimeStreamRetryDelayMs(attempt: number): number;
239
+ declare function readNcpRuntimeStreamFailureReason(failure: NcpRuntimeStreamFailure): string;
240
+ //#endregion
213
241
  //#region src/runtime/tool-registry.manager.d.ts
214
242
  declare class DefaultNcpToolRegistry implements NcpToolRegistry {
215
243
  private readonly tools;
@@ -295,5 +323,5 @@ declare function createToolExecutionFailedResult(params: {
295
323
  };
296
324
  declare function appendToolRoundToInput(input: NcpLLMApiInput, reasoning: string, text: string, toolResults: ReadonlyArray<NcpToolCallResult>, toolResultContentManager?: ToolResultContentManager): NcpLLMApiInput;
297
325
  //#endregion
298
- export { type AssetMeta, type AssetPutInput, type AssetRef, type CollectedToolCall, DefaultNcpAgentRuntime, type DefaultNcpAgentRuntimeConfig, DefaultNcpContextBuilder, DefaultNcpRoundBuffer, DefaultNcpRoundCollector, DefaultNcpStreamEncoder, DefaultNcpToolRegistry, EchoNcpLLMApi, type ExecuteCollectedToolCallOptions, LocalAssetStore, type NcpMessageToOpenAiMessagesOptions, type StoredAssetRecord, ToolResultContentManager, type ToolResultContentManagerOptions, appendToolRoundToInput, assertOpenAiFunctionParametersSchema, buildAssetContentPath, buildNcpUserContent, buildOpenAiFunctionTool, createInvalidToolArgumentsResult, createToolExecutionFailedResult, defaultToolResultContentManager, executeCollectedToolCall, genId, getOpenAiFunctionParametersSchemaIssues, isTextLikeAsset, ncpMessageToOpenAiMessages, parseToolArgs, validateToolArgs };
326
+ export { type AssetMeta, type AssetPutInput, type AssetRef, type CollectedToolCall, DefaultNcpAgentRuntime, type DefaultNcpAgentRuntimeConfig, DefaultNcpContextBuilder, DefaultNcpRoundBuffer, DefaultNcpRoundCollector, DefaultNcpStreamEncoder, DefaultNcpToolRegistry, EchoNcpLLMApi, type ExecuteCollectedToolCallOptions, LocalAssetStore, NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS, NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS, NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE, type NcpMessageToOpenAiMessagesOptions, type NcpRuntimeStreamAttemptState, type NcpRuntimeStreamFailure, type StoredAssetRecord, ToolResultContentManager, type ToolResultContentManagerOptions, appendToolRoundToInput, assertOpenAiFunctionParametersSchema, buildAssetContentPath, buildNcpUserContent, buildOpenAiFunctionTool, createInvalidToolArgumentsResult, createNcpRuntimeStreamAttemptState, createNcpRuntimeStreamRetryEvents, createToolExecutionFailedResult, defaultToolResultContentManager, executeCollectedToolCall, genId, getNcpRuntimeStreamRetryDelayMs, getOpenAiFunctionParametersSchemaIssues, isTextLikeAsset, ncpMessageToOpenAiMessages, observeNcpRuntimeStreamAttemptEvent, parseToolArgs, readNcpRuntimeStreamFailureReason, shouldRetryNcpRuntimeStreamAttempt, validateToolArgs };
299
327
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/assets/stores/local-asset.store.ts","../src/runtime/context-builder.service.ts","../src/runtime/user-content.utils.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/round-buffer.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts","../src/runtime/runtime.utils.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/assets/stores/local-asset.store.ts","../src/runtime/context-builder.service.ts","../src/runtime/user-content.utils.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/round-buffer.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/runtime-stream-recovery.utils.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts","../src/runtime/runtime.utils.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -558,15 +558,11 @@ function buildNcpUserContent(parts, options = {}) {
558
558
  }
559
559
  //#endregion
560
560
  //#region src/runtime/utils/message-converter.utils.ts
561
- function isRecord$2(value) {
562
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
563
- }
561
+ const isRecord$2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
564
562
  function isTextLikePart(part) {
565
563
  return part.type === "text" || part.type === "rich-text";
566
564
  }
567
- function readText(parts) {
568
- return parts.filter(isTextLikePart).map((part) => part.text).join("");
569
- }
565
+ const readText = (parts) => parts.filter(isTextLikePart).map((part) => part.text).join("");
570
566
  function ncpMessageToOpenAiMessages(rawMessage, options = {}) {
571
567
  const message = rawMessage.role === "assistant" ? sanitizeAssistantReplyTags(rawMessage) : rawMessage;
572
568
  const parts = message.parts ?? [];
@@ -628,14 +624,14 @@ function ncpMessageToOpenAiMessages(rawMessage, options = {}) {
628
624
  }),
629
625
  tool_call_id: toolInvocation.toolCallId
630
626
  })),
631
- ...toolResultContentManager.toVisualObservationMessages(toolInvocations.map((toolInvocation) => ({
627
+ ...message.status !== "final" ? toolResultContentManager.toVisualObservationMessages(toolInvocations.map((toolInvocation) => ({
632
628
  toolCallId: toolInvocation.toolCallId,
633
629
  toolName: toolInvocation.toolName,
634
630
  args: isRecord$2(toolInvocation.args) ? toolInvocation.args : null,
635
631
  rawArgsText: typeof toolInvocation.args === "string" ? toolInvocation.args : JSON.stringify(toolInvocation.args ?? {}),
636
632
  result: toolInvocation.result,
637
633
  contentItems: toolInvocation.resultContentItems
638
- })))
634
+ }))) : []
639
635
  ];
640
636
  }
641
637
  //#endregion
@@ -1581,6 +1577,90 @@ var DefaultNcpStreamEncoder = class {
1581
1577
  }
1582
1578
  };
1583
1579
  //#endregion
1580
+ //#region src/runtime/runtime-stream-recovery.utils.ts
1581
+ const NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS = 2e3;
1582
+ const NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS = 3e4;
1583
+ const NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE = "retry";
1584
+ function createNcpRuntimeStreamAttemptState() {
1585
+ return { messageId: null };
1586
+ }
1587
+ function observeNcpRuntimeStreamAttemptEvent(state, event) {
1588
+ let nextState = state;
1589
+ if ("payload" in event && "messageId" in event.payload && typeof event.payload.messageId === "string") nextState = {
1590
+ ...nextState,
1591
+ messageId: event.payload.messageId
1592
+ };
1593
+ return nextState;
1594
+ }
1595
+ function shouldRetryNcpRuntimeStreamAttempt(params) {
1596
+ const { failure, signal } = params;
1597
+ return signal?.aborted !== true && isRetryableNcpRuntimeStreamFailure(failure);
1598
+ }
1599
+ function createNcpRuntimeStreamRetryEvents(params) {
1600
+ const { attempt, correlationId, failure, runId, sessionId, state } = params;
1601
+ const message = readNcpRuntimeStreamFailureReason(failure);
1602
+ const delayMs = getNcpRuntimeStreamRetryDelayMs(attempt);
1603
+ return [createNcpEndpointEvent({
1604
+ type: NcpEventType.RunMetadata,
1605
+ payload: {
1606
+ sessionId,
1607
+ messageId: state.messageId ?? void 0,
1608
+ runId,
1609
+ correlationId,
1610
+ metadata: {
1611
+ type: NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE,
1612
+ attempt,
1613
+ message,
1614
+ action: void 0,
1615
+ next: Date.now() + delayMs
1616
+ }
1617
+ }
1618
+ })];
1619
+ }
1620
+ function getNcpRuntimeStreamRetryDelayMs(attempt) {
1621
+ return Math.min(NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS * 2 ** Math.max(0, attempt - 1), NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS);
1622
+ }
1623
+ function readNcpRuntimeStreamFailureReason(failure) {
1624
+ const eventReasons = failure.events.filter((event) => Boolean(event)).map(readNcpRuntimeStreamEventFailureReason).filter(Boolean);
1625
+ if (eventReasons.length > 0) return eventReasons.join("; ");
1626
+ if (failure.error instanceof Error) return failure.error.message;
1627
+ return typeof failure.error === "string" ? failure.error : "Runtime stream failed.";
1628
+ }
1629
+ function readNcpRuntimeStreamEventFailureReason(event) {
1630
+ if (event.type === NcpEventType.RunError) return event.payload.error ?? "";
1631
+ if (event.type === NcpEventType.MessageFailed) {
1632
+ const code = event.payload.error?.code;
1633
+ const message = event.payload.error?.message ?? "";
1634
+ return code ? `${code}: ${message}` : message;
1635
+ }
1636
+ return "";
1637
+ }
1638
+ function isRetryableNcpRuntimeStreamFailure(failure) {
1639
+ const reason = readNcpRuntimeStreamFailureReason(failure).toLowerCase();
1640
+ if (!reason) return false;
1641
+ if (reason.includes("abort") || reason.includes("cancel") || reason.includes("user terminated") || reason.includes("用户终止") || reason.includes("用户取消")) return false;
1642
+ return [
1643
+ "429",
1644
+ "503",
1645
+ "504",
1646
+ "closed before",
1647
+ "connection closed",
1648
+ "connection reset",
1649
+ "econnreset",
1650
+ "fetch failed",
1651
+ "network",
1652
+ "overloaded",
1653
+ "premature",
1654
+ "rate limit",
1655
+ "socket",
1656
+ "stream",
1657
+ "temporarily unavailable",
1658
+ "timed out",
1659
+ "timeout",
1660
+ "und_err_socket"
1661
+ ].some((marker) => reason.includes(marker));
1662
+ }
1663
+ //#endregion
1584
1664
  //#region src/runtime/tool-registry.manager.ts
1585
1665
  var DefaultNcpToolRegistry = class {
1586
1666
  tools = /* @__PURE__ */ new Map();
@@ -1785,6 +1865,6 @@ var DefaultNcpAgentRuntime = class {
1785
1865
  };
1786
1866
  };
1787
1867
  //#endregion
1788
- export { DefaultNcpAgentRuntime, DefaultNcpContextBuilder, DefaultNcpRoundBuffer, DefaultNcpRoundCollector, DefaultNcpStreamEncoder, DefaultNcpToolRegistry, EchoNcpLLMApi, LocalAssetStore, ToolResultContentManager, appendToolRoundToInput, assertOpenAiFunctionParametersSchema, buildAssetContentPath, buildNcpUserContent, buildOpenAiFunctionTool, createInvalidToolArgumentsResult, createToolExecutionFailedResult, defaultToolResultContentManager, executeCollectedToolCall, genId, getOpenAiFunctionParametersSchemaIssues, isTextLikeAsset, ncpMessageToOpenAiMessages, parseToolArgs, validateToolArgs };
1868
+ export { DefaultNcpAgentRuntime, DefaultNcpContextBuilder, DefaultNcpRoundBuffer, DefaultNcpRoundCollector, DefaultNcpStreamEncoder, DefaultNcpToolRegistry, EchoNcpLLMApi, LocalAssetStore, NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS, NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS, NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE, ToolResultContentManager, appendToolRoundToInput, assertOpenAiFunctionParametersSchema, buildAssetContentPath, buildNcpUserContent, buildOpenAiFunctionTool, createInvalidToolArgumentsResult, createNcpRuntimeStreamAttemptState, createNcpRuntimeStreamRetryEvents, createToolExecutionFailedResult, defaultToolResultContentManager, executeCollectedToolCall, genId, getNcpRuntimeStreamRetryDelayMs, getOpenAiFunctionParametersSchemaIssues, isTextLikeAsset, ncpMessageToOpenAiMessages, observeNcpRuntimeStreamAttemptEvent, parseToolArgs, readNcpRuntimeStreamFailureReason, shouldRetryNcpRuntimeStreamAttempt, validateToolArgs };
1789
1869
 
1790
1870
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["LARGE_INLINE_PAYLOAD_CHARS","DEFAULT_MAX_MODEL_VISIBLE_IMAGES","DEFAULT_MAX_ARRAY_ITEMS","DEFAULT_MAX_OBJECT_KEYS","DEFAULT_MAX_DEPTH","readOptionalString","isRecord","isRecord","createStreamEvent","createStreamEvent","createRuntimeEvent"],"sources":["../src/tool-result/tool-result-content.utils.ts","../src/tool-result/tool-result-image.service.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/user-content.utils.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/runtime.utils.ts","../src/runtime/context-builder.service.ts","../src/assets/stores/local-asset.store.ts","../src/runtime/round-buffer.ts","../src/runtime/stream-encoder.utils.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts"],"sourcesContent":["const LARGE_INLINE_PAYLOAD_CHARS = 2_048;\n\nexport type SafeSerializedValue = {\n text: string;\n ok: boolean;\n};\n\nexport function sanitizePositiveInt(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : fallback;\n}\n\nexport function serializeValue(value: unknown): SafeSerializedValue {\n if (typeof value === \"string\") {\n return { text: value, ok: true };\n }\n try {\n return { text: JSON.stringify(value ?? null), ok: true };\n } catch (error) {\n return {\n text: `[unserializable tool result: ${error instanceof Error ? error.message : String(error)}]`,\n ok: false,\n };\n }\n}\n\nexport function truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n if (maxChars <= 0) {\n return \"\";\n }\n const marker = \"\\n... [truncated] ...\\n\";\n if (maxChars <= marker.length) {\n return value.slice(0, maxChars);\n }\n const keepChars = maxChars - marker.length;\n const headChars = Math.ceil(keepChars / 2);\n const tailChars = Math.floor(keepChars / 2);\n return `${value.slice(0, headChars)}${marker}${value.slice(value.length - tailChars)}`;\n}\n\nexport function isLargeDataUrl(value: string): boolean {\n return value.length > LARGE_INLINE_PAYLOAD_CHARS && /^data:[^,]+;base64,/i.test(value);\n}\n\nexport function readDataUrlMime(value: string): string {\n const match = /^data:([^;,]+)/i.exec(value);\n return match?.[1] ?? \"application/octet-stream\";\n}\n\nexport function isLargeBase64LikeString(value: string): boolean {\n if (value.length <= LARGE_INLINE_PAYLOAD_CHARS) {\n return false;\n }\n const compact = value.replace(/\\s+/g, \"\");\n return compact.length > LARGE_INLINE_PAYLOAD_CHARS && /^[A-Za-z0-9+/=_-]+$/.test(compact);\n}\n\nexport function isBinaryLike(value: object): boolean {\n return value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\n\nexport function getBinaryByteLength(value: object): number {\n if (value instanceof ArrayBuffer) {\n return value.byteLength;\n }\n if (ArrayBuffer.isView(value)) {\n return value.byteLength;\n }\n return 0;\n}\n\nexport function readStringField(value: Record<string, unknown>, key: string): string | null {\n const field = value[key];\n return typeof field === \"string\" && field.length > 0 ? field : null;\n}\n","import type {\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIContentPart,\n} from \"@nextclaw/ncp\";\n\nimport {\n isBinaryLike,\n isLargeDataUrl,\n readDataUrlMime,\n readStringField,\n sanitizePositiveInt,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\n\nconst LARGE_INLINE_PAYLOAD_CHARS = 2_048;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\n\ntype ImageCollectionContext = {\n depth: number;\n};\n\nexport type ToolResultImageServiceOptions = {\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\nexport class ToolResultImageService {\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n\n constructor(options: ToolResultImageServiceOptions = {}) {\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n }\n\n extractImageItems = (value: unknown): NcpToolOutputImageItem[] => {\n const images: NcpToolOutputImageItem[] = [];\n this.collectImageItems(value, images, { depth: 0 });\n return images;\n };\n\n readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => {\n if (!contentItems) {\n return [];\n }\n return contentItems\n .filter((item): item is NcpToolOutputImageItem => item.type === \"input_image\")\n .slice(0, this.maxModelVisibleImages);\n };\n\n toOpenAiImagePart = (item: NcpToolOutputImageItem): OpenAIContentPart => ({\n type: \"image_url\",\n image_url: {\n url: item.imageUrl,\n ...(item.detail ? { detail: toOpenAiImageDetail(item.detail) } : {}),\n },\n });\n\n summarizeImageContentItem = (value: Record<string, unknown>): Record<string, unknown> | null => {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n return {\n type: \"image\",\n mimeType: readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\"),\n detail: readImageDetail(value),\n dataOmitted: true,\n originalDataChars: readStringField(value, \"data\")?.length ?? 0,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n return {\n type,\n imageUrl: imageUrl ? redactImageUrl(imageUrl) : undefined,\n detail: readImageDetail(value),\n };\n }\n return null;\n };\n\n private readonly collectImageItems = (\n value: unknown,\n output: NcpToolOutputImageItem[],\n context: ImageCollectionContext,\n ): void => {\n if (output.length >= this.maxModelVisibleImages || context.depth > this.maxDepth) {\n return;\n }\n if (typeof value === \"string\") {\n const image = imageDataUrlToContentItem(value);\n if (image) {\n output.push(image);\n }\n return;\n }\n if (!value || typeof value !== \"object\" || isBinaryLike(value)) {\n return;\n }\n if (Array.isArray(value)) {\n value\n .slice(0, this.maxArrayItems)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n return;\n }\n const image = readImageContentItem(value as Record<string, unknown>);\n if (image) {\n output.push(image);\n return;\n }\n Object.values(value as Record<string, unknown>)\n .slice(0, this.maxObjectKeys)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n };\n}\n\nfunction imageDataUrlToContentItem(value: string): NcpToolOutputImageItem | null {\n if (!/^data:image\\/[^,]+;base64,/i.test(value)) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: value,\n mimeType: readDataUrlMime(value),\n originalDataChars: value.length,\n };\n}\n\nfunction readImageContentItem(value: Record<string, unknown>): NcpToolOutputImageItem | null {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n const data = readStringField(value, \"data\");\n const mimeType =\n readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\") ?? \"image/png\";\n if (!data) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: `data:${mimeType};base64,${data}`,\n mimeType,\n detail: readImageDetail(value),\n originalDataChars: data.length,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n if (!imageUrl) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl,\n detail: readImageDetail(value),\n };\n }\n return null;\n}\n\nfunction toOpenAiImageDetail(\n detail: NcpToolOutputImageItem[\"detail\"],\n): \"low\" | \"high\" | \"auto\" | undefined {\n if (detail === \"low\" || detail === \"high\" || detail === \"auto\") {\n return detail;\n }\n if (detail === \"original\") {\n return \"high\";\n }\n return undefined;\n}\n\nfunction readImageDetail(\n value: Record<string, unknown>,\n): \"low\" | \"high\" | \"auto\" | \"original\" | undefined {\n const direct = readStringField(value, \"detail\");\n if (isImageDetail(direct)) {\n return direct;\n }\n const meta = value._meta;\n if (!meta || typeof meta !== \"object\" || Array.isArray(meta)) {\n return undefined;\n }\n const codexDetail = readStringField(meta as Record<string, unknown>, \"codex/imageDetail\");\n return isImageDetail(codexDetail) ? codexDetail : undefined;\n}\n\nfunction isImageDetail(value: string | null): value is \"low\" | \"high\" | \"auto\" | \"original\" {\n return value === \"low\" || value === \"high\" || value === \"auto\" || value === \"original\";\n}\n\nfunction readImageUrl(value: Record<string, unknown>): string | null {\n const direct = readStringField(value, \"image_url\");\n if (direct) {\n return direct;\n }\n const nested = value.image_url;\n if (!nested || typeof nested !== \"object\" || Array.isArray(nested)) {\n return null;\n }\n return readStringField(nested as Record<string, unknown>, \"url\");\n}\n\nfunction redactImageUrl(value: string): string {\n if (isLargeDataUrl(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n return value.length > LARGE_INLINE_PAYLOAD_CHARS\n ? truncateMiddle(value, LARGE_INLINE_PAYLOAD_CHARS)\n : value;\n}\n","import type {\n NcpLLMApiInput,\n NcpToolCallResult,\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\n\nimport {\n getBinaryByteLength,\n isBinaryLike,\n isLargeBase64LikeString,\n readDataUrlMime,\n sanitizePositiveInt,\n serializeValue,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\nimport { ToolResultImageService } from \"./tool-result-image.service.js\";\n\nconst DEFAULT_MAX_MODEL_VISIBLE_CHARS = 60_000;\nconst DEFAULT_MAX_TOOL_MESSAGES_CHARS = 60_000;\nconst DEFAULT_MAX_STRING_VALUE_CHARS = 60_000;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\nconst TRUNCATION_MARKER = \"[NextClaw tool result truncated]\";\n\ntype ToolResultContentContext = {\n toolCallId?: string;\n toolName?: string;\n};\n\nexport type ToolResultContentManagerOptions = {\n maxModelVisibleChars?: number;\n maxToolMessagesChars?: number;\n maxStringValueChars?: number;\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\ntype RedactContext = {\n depth: number;\n};\n\ntype NormalizeOutcome = {\n value: unknown;\n changed: boolean;\n};\n\nexport class ToolResultContentManager {\n private readonly maxModelVisibleChars: number;\n private readonly maxToolMessagesChars: number;\n private readonly maxStringValueChars: number;\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n private readonly imageService: ToolResultImageService;\n\n constructor(options: ToolResultContentManagerOptions = {}) {\n this.maxModelVisibleChars = sanitizePositiveInt(\n options.maxModelVisibleChars,\n DEFAULT_MAX_MODEL_VISIBLE_CHARS,\n );\n this.maxToolMessagesChars = sanitizePositiveInt(\n options.maxToolMessagesChars,\n DEFAULT_MAX_TOOL_MESSAGES_CHARS,\n );\n this.maxStringValueChars = sanitizePositiveInt(\n options.maxStringValueChars,\n DEFAULT_MAX_STRING_VALUE_CHARS,\n );\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n this.imageService = new ToolResultImageService({\n maxModelVisibleImages: this.maxModelVisibleImages,\n maxArrayItems: this.maxArrayItems,\n maxObjectKeys: this.maxObjectKeys,\n maxDepth: this.maxDepth,\n });\n }\n\n normalizeToolCallResult = (result: NcpToolCallResult): NcpToolCallResult => {\n const context = {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n };\n const normalized = this.normalizeResult(result.result, {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n });\n const contentItems = this.buildContentItems(result.result, normalized.value, context);\n return {\n ...result,\n ...(normalized.changed ? { result: normalized.value } : {}),\n contentItems,\n };\n };\n\n compactInput = (input: NcpLLMApiInput): NcpLLMApiInput => ({\n ...input,\n messages: this.compactToolMessages(input.messages),\n });\n\n toModelContent = (result: unknown, context: ToolResultContentContext = {}): string => {\n const normalized = this.normalizeResult(result, context);\n const serialized = serializeValue(normalized.value);\n if (serialized.text.length <= this.maxModelVisibleChars) {\n return serialized.text;\n }\n return this.boundModelContentText(\n JSON.stringify(\n this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: serialized.text,\n }),\n ),\n );\n };\n\n toVisualObservationMessages = (\n toolResults: ReadonlyArray<NcpToolCallResult>,\n ): OpenAIChatMessage[] => {\n return toolResults.flatMap((result) => {\n const images = this.readVisibleImages(result.contentItems);\n if (images.length === 0) {\n return [];\n }\n return [this.buildVisualObservationMessage(result, images)];\n });\n };\n\n private readonly normalizeResult = (\n result: unknown,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n if (typeof result === \"string\") {\n return this.normalizeStringResult(result, context);\n }\n\n const serialized = serializeValue(result);\n const containsImageContent = this.imageService.extractImageItems(result).length > 0;\n if (\n serialized.ok &&\n serialized.text.length <= this.maxModelVisibleChars &&\n !containsImageContent\n ) {\n return { value: result, changed: false };\n }\n\n const redacted = this.redactValue(result, { depth: 0 });\n const redactedSerialized = serializeValue(redacted);\n if (redactedSerialized.text.length <= this.maxModelVisibleChars) {\n return {\n value: this.attachNotice(redacted, {\n context,\n originalSerializedChars: serialized.text.length,\n }),\n changed: true,\n };\n }\n\n return {\n value: this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: redactedSerialized.text,\n }),\n changed: true,\n };\n };\n\n private readonly buildContentItems = (\n rawResult: unknown,\n normalizedResult: unknown,\n context: ToolResultContentContext,\n ): NcpToolOutputContentItem[] => {\n const text = this.toModelContent(normalizedResult, context);\n return [\n { type: \"input_text\", text },\n ...this.imageService.extractImageItems(rawResult).slice(0, this.maxModelVisibleImages),\n ];\n };\n\n private readonly readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => this.imageService.readVisibleImages(contentItems);\n\n private readonly buildVisualObservationMessage = (\n toolResult: NcpToolCallResult,\n images: NcpToolOutputImageItem[],\n ): OpenAIChatMessage => {\n const imageParts = images.map(this.imageService.toOpenAiImagePart);\n const omittedCount = Math.max(\n 0,\n (toolResult.contentItems ?? []).filter((item) => item.type === \"input_image\").length -\n imageParts.length,\n );\n return {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: [\n `Tool \"${toolResult.toolName}\" returned ${imageParts.length} image(s).`,\n \"Use the attached image content as the visual observation for the preceding tool result.\",\n omittedCount > 0 ? `${omittedCount} additional image(s) were omitted by budget.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n },\n ...imageParts,\n ],\n };\n };\n\n private readonly compactToolMessages = (\n messages: ReadonlyArray<OpenAIChatMessage>,\n ): OpenAIChatMessage[] => {\n let remainingChars = this.maxToolMessagesChars;\n const output = messages.slice();\n for (let index = output.length - 1; index >= 0; index -= 1) {\n const message = output[index];\n if (message.role !== \"tool\") {\n continue;\n }\n const compacted = this.compactToolMessage(message, remainingChars);\n output[index] = compacted.message;\n remainingChars = compacted.remainingChars;\n }\n return output;\n };\n\n private readonly compactToolMessage = (\n message: Extract<OpenAIChatMessage, { role: \"tool\" }>,\n remainingChars: number,\n ): { message: OpenAIChatMessage; remainingChars: number } => {\n if (message.content.length <= remainingChars) {\n return {\n message,\n remainingChars: remainingChars - message.content.length,\n };\n }\n const content =\n remainingChars >= 1_000\n ? truncateMiddle(message.content, remainingChars)\n : this.buildOmittedHistoricalToolResult(message.content.length);\n return {\n message: { ...message, content },\n remainingChars: Math.max(0, remainingChars - content.length),\n };\n };\n\n private readonly normalizeStringResult = (\n result: string,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n const redacted = this.redactString(result);\n if (redacted.length <= this.maxModelVisibleChars && redacted === result) {\n return { value: result, changed: false };\n }\n if (redacted.length <= this.maxModelVisibleChars) {\n return {\n value: this.buildStringNotice(context, result.length, redacted),\n changed: true,\n };\n }\n return {\n value: this.buildStringNotice(\n context,\n result.length,\n truncateMiddle(redacted, this.maxModelVisibleChars),\n ),\n changed: true,\n };\n };\n\n private readonly redactValue = (value: unknown, context: RedactContext): unknown => {\n if (typeof value === \"string\") {\n return this.redactString(value);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n const imageSummary = this.imageService.summarizeImageContentItem(\n value as Record<string, unknown>,\n );\n if (imageSummary) {\n return imageSummary;\n }\n if (isBinaryLike(value)) {\n return `[omitted binary payload: bytes=${getBinaryByteLength(value)}]`;\n }\n if (context.depth >= this.maxDepth) {\n return `[omitted nested ${Array.isArray(value) ? \"array\" : \"object\"} beyond depth ${this.maxDepth}]`;\n }\n if (Array.isArray(value)) {\n return this.redactArray(value, context);\n }\n return this.redactObject(value as Record<string, unknown>, context);\n };\n\n private readonly redactArray = (value: unknown[], context: RedactContext): unknown[] => {\n const visibleItems = value\n .slice(0, this.maxArrayItems)\n .map((item) => this.redactValue(item, { depth: context.depth + 1 }));\n if (value.length <= this.maxArrayItems) {\n return visibleItems;\n }\n return [\n ...visibleItems,\n `[omitted ${value.length - this.maxArrayItems} array items from tool result]`,\n ];\n };\n\n private readonly redactObject = (\n value: Record<string, unknown>,\n context: RedactContext,\n ): Record<string, unknown> => {\n const entries = Object.entries(value);\n const visibleEntries = entries.slice(0, this.maxObjectKeys);\n const output = Object.fromEntries(\n visibleEntries.map(([key, item]) => [\n key,\n this.redactValue(item, { depth: context.depth + 1 }),\n ]),\n );\n if (entries.length > this.maxObjectKeys) {\n output._nextclawOmittedKeys = entries.length - this.maxObjectKeys;\n }\n return output;\n };\n\n private readonly redactString = (value: string): string => {\n if (/^data:[^,]+;base64,/i.test(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n if (isLargeBase64LikeString(value)) {\n return `[omitted base64-like payload: originalChars=${value.length}]`;\n }\n if (value.length <= this.maxStringValueChars) {\n return value;\n }\n return truncateMiddle(value, this.maxStringValueChars);\n };\n\n private readonly attachNotice = (\n value: unknown,\n params: { context: ToolResultContentContext; originalSerializedChars: number },\n ): unknown => {\n const notice = this.buildNotice(params.context, params.originalSerializedChars);\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return {\n ...(value as Record<string, unknown>),\n _nextclawToolResultNotice: notice,\n };\n }\n return {\n type: \"nextclaw.tool_result_sanitized\",\n notice,\n result: value,\n };\n };\n\n private readonly buildEnvelope = (params: {\n context: ToolResultContentContext;\n originalSerializedChars: number;\n previewSource: string;\n }): Record<string, unknown> => {\n const { context, originalSerializedChars, previewSource } = params;\n return {\n type: \"nextclaw.tool_result_truncated\",\n notice: this.buildNotice(context, originalSerializedChars),\n originalSerializedChars,\n visibleLimitChars: this.maxModelVisibleChars,\n preview: truncateMiddle(\n previewSource,\n Math.max(1_000, this.maxModelVisibleChars - 1_000),\n ),\n };\n };\n\n private readonly buildStringNotice = (\n context: ToolResultContentContext,\n originalChars: number,\n preview: string,\n ): string =>\n [\n TRUNCATION_MARKER,\n this.buildNotice(context, originalChars),\n \"\",\n preview,\n ].join(\"\\n\");\n\n private readonly buildNotice = (\n context: ToolResultContentContext,\n originalSerializedChars: number,\n ): string => {\n const { toolCallId: rawToolCallId, toolName: rawToolName } = context;\n const toolName = rawToolName ? ` tool=${rawToolName}` : \"\";\n const toolCallId = rawToolCallId ? ` toolCallId=${rawToolCallId}` : \"\";\n return `${TRUNCATION_MARKER}${toolName}${toolCallId} originalSerializedChars=${originalSerializedChars} visibleLimitChars=${this.maxModelVisibleChars}`;\n };\n\n private readonly buildOmittedHistoricalToolResult = (originalChars: number): string =>\n `${TRUNCATION_MARKER} older tool result omitted from active model context originalChars=${originalChars}`;\n\n private readonly boundModelContentText = (value: string): string => {\n if (value.length <= this.maxModelVisibleChars) {\n return value;\n }\n return truncateMiddle(value, this.maxModelVisibleChars);\n };\n}\n\nexport const defaultToolResultContentManager = new ToolResultContentManager();\n","import { readFileSync } from \"node:fs\";\nimport type { NcpMessagePart, OpenAIContentPart } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction formatAssetReferenceBlock(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n url?: string | null;\n sizeBytes?: number;\n}): string {\n const { fileName: rawFileName, mimeType: rawMimeType, assetUri: rawAssetUri, url: rawUrl, sizeBytes } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const url = readOptionalString(rawUrl);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Asset: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n ...(url ? [`[Preview URL: ${url}]`] : []),\n \"[Instruction: This file is not embedded in the prompt. If you need to inspect or transform it, use asset_export to copy it to a normal file path first.]\",\n ];\n return lines.join(\"\\n\");\n}\n\ntype ResolvedFilePart = {\n fileName: string;\n mimeType: string;\n assetUri: string | null;\n url: string | null;\n contentBase64: string | null;\n sizeBytes?: number;\n contentPath: string | null;\n};\n\nfunction resolveFilePart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): ResolvedFilePart {\n const assetUri = readOptionalString(part.assetUri);\n const stored = assetUri ? assetStore?.getByUri(assetUri) : null;\n return {\n fileName: readOptionalString(stored?.fileName) ?? readOptionalString(part.name) ?? \"asset\",\n mimeType:\n readOptionalString(stored?.mimeType) ??\n readOptionalString(part.mimeType) ??\n \"application/octet-stream\",\n assetUri,\n url: readOptionalString(part.url),\n contentBase64: readOptionalString(part.contentBase64),\n sizeBytes: stored?.sizeBytes ?? (typeof part.sizeBytes === \"number\" ? part.sizeBytes : undefined),\n contentPath: assetUri ? assetStore?.resolveContentPath(assetUri) ?? null : null,\n };\n}\n\nfunction formatImageAttachmentHint(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n sizeBytes?: number;\n}): string {\n const {\n fileName: rawFileName,\n mimeType: rawMimeType,\n assetUri: rawAssetUri,\n sizeBytes,\n } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Attached Image: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n assetUri\n ? \"[Instruction: This image is embedded in the prompt. If you need to transform or process the original file with tools, use the asset URI.]\"\n : \"[Instruction: This image is embedded in the prompt.]\",\n ];\n return lines.join(\"\\n\");\n}\n\nfunction isImageMimeType(value: string | null): boolean {\n return value?.startsWith(\"image/\") ?? false;\n}\n\nfunction isModelReachableImageUrl(value: string | null): value is string {\n return value !== null && (/^https?:\\/\\//i.test(value) || /^data:/i.test(value));\n}\n\nfunction buildImageDataUrl(mimeType: string, bytes: Uint8Array): string {\n return `data:${mimeType};base64,${Buffer.from(bytes).toString(\"base64\")}`;\n}\n\nfunction resolveImageContentPart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): OpenAIContentPart | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n if (resolved.contentBase64) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${resolved.mimeType};base64,${resolved.contentBase64}`,\n },\n };\n }\n\n if (resolved.contentPath) {\n return {\n type: \"image_url\",\n image_url: {\n url: buildImageDataUrl(resolved.mimeType, readFileSync(resolved.contentPath)),\n },\n };\n }\n\n const reachableImageUrl = resolved.url;\n if (isModelReachableImageUrl(reachableImageUrl)) {\n return {\n type: \"image_url\",\n image_url: {\n url: reachableImageUrl,\n },\n };\n }\n\n return null;\n}\n\nfunction resolveImageAttachmentHint(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n return formatImageAttachmentHint({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n sizeBytes: resolved.sizeBytes,\n });\n}\n\nfunction resolveAssetReferenceBlock(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n\n if (resolved.assetUri) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n if (resolved.url || resolved.contentBase64) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n return null;\n}\n\nexport function buildNcpUserContent(\n parts: NcpMessagePart[],\n options: {\n assetStore?: LocalAssetStore | null;\n } = {},\n): string | OpenAIContentPart[] {\n const content: OpenAIContentPart[] = [];\n\n for (const part of parts) {\n if ((part.type === \"text\" || part.type === \"rich-text\") && part.text.trim().length > 0) {\n content.push({ type: \"text\", text: part.text });\n continue;\n }\n\n if (part.type !== \"file\") {\n continue;\n }\n\n const imageContentPart = resolveImageContentPart(part, options.assetStore);\n if (imageContentPart) {\n content.push(imageContentPart);\n const imageAttachmentHint = resolveImageAttachmentHint(part, options.assetStore);\n if (imageAttachmentHint) {\n content.push({ type: \"text\", text: imageAttachmentHint });\n }\n continue;\n }\n\n const assetReferenceBlock = resolveAssetReferenceBlock(part, options.assetStore);\n if (assetReferenceBlock) {\n content.push({ type: \"text\", text: assetReferenceBlock });\n }\n }\n\n if (content.length === 0) {\n return \"\";\n }\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text;\n }\n return content;\n}\n","import {\n sanitizeAssistantReplyTags,\n type NcpMessage,\n type NcpMessagePart,\n type NcpToolOutputContentItem,\n type OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../../assets/stores/local-asset.store.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../../tool-result/tool-result-content.manager.js\";\nimport { buildNcpUserContent } from \"../user-content.utils.js\";\n\nexport type NcpMessageToOpenAiMessagesOptions = {\n assetStore?: LocalAssetStore | null;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isTextLikePart(part: NcpMessagePart): part is Extract<NcpMessagePart, { type: \"text\" | \"rich-text\" }> {\n return part.type === \"text\" || part.type === \"rich-text\";\n}\n\nfunction readText(parts: readonly NcpMessagePart[]): string {\n return parts.filter(isTextLikePart).map((part) => part.text).join(\"\");\n}\n\nexport function ncpMessageToOpenAiMessages(\n rawMessage: NcpMessage,\n options: NcpMessageToOpenAiMessagesOptions = {},\n): OpenAIChatMessage[] {\n const message =\n rawMessage.role === \"assistant\" ? sanitizeAssistantReplyTags(rawMessage) : rawMessage;\n const parts = message.parts ?? [];\n\n if (message.role === \"user\") {\n return [\n {\n role: \"user\",\n content: buildNcpUserContent(parts, {\n assetStore: options.assetStore,\n }),\n },\n ];\n }\n\n if (message.role === \"system\" || message.role === \"service\") {\n return [{ role: \"system\", content: readText(parts) }];\n }\n\n if (message.role === \"tool\") {\n return [\n {\n role: \"tool\",\n content: readText(parts),\n tool_call_id: message.id,\n },\n ];\n }\n\n if (message.role !== \"assistant\") {\n return [];\n }\n\n const texts: string[] = [];\n const reasonings: string[] = [];\n const toolInvocations: Array<{\n toolCallId: string;\n toolName: string;\n args: unknown;\n result: unknown;\n resultContentItems?: NcpToolOutputContentItem[];\n }> = [];\n\n for (const part of parts) {\n if (part.type === \"reasoning\") {\n reasonings.push(part.text);\n }\n if (part.type === \"text\") {\n texts.push(part.text);\n }\n if (part.type === \"tool-invocation\" && part.state === \"result\" && part.result !== undefined) {\n toolInvocations.push({\n toolCallId: part.toolCallId ?? \"\",\n toolName: part.toolName,\n args: part.args ?? {},\n result: part.result,\n resultContentItems: part.resultContentItems,\n });\n }\n }\n\n const text = texts.join(\"\");\n const reasoning = reasonings.join(\"\");\n const toolResultContentManager =\n options.toolResultContentManager ?? defaultToolResultContentManager;\n\n if (toolInvocations.length === 0) {\n return [\n {\n role: \"assistant\",\n content: text,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n },\n ];\n }\n\n return [\n {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolInvocations.map((toolInvocation) => ({\n id: toolInvocation.toolCallId,\n type: \"function\" as const,\n function: {\n name: toolInvocation.toolName,\n arguments:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n },\n })),\n },\n ...toolInvocations.map((toolInvocation): OpenAIChatMessage => ({\n role: \"tool\",\n content: toolResultContentManager.toModelContent(toolInvocation.result, {\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n }),\n tool_call_id: toolInvocation.toolCallId,\n })),\n ...toolResultContentManager.toVisualObservationMessages(\n toolInvocations.map((toolInvocation) => ({\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n args: isRecord(toolInvocation.args)\n ? (toolInvocation.args as Record<string, unknown>)\n : null,\n rawArgsText:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n result: toolInvocation.result,\n contentItems: toolInvocation.resultContentItems,\n })),\n ),\n ];\n}\n","import AjvPkg, { type ErrorObject, type ValidateFunction } from \"ajv\";\nimport type {\n NcpInvalidToolArgumentsResult,\n NcpLLMApiInput,\n NcpToolDefinition,\n NcpToolCallResult,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\nexport type ParsedToolArgs =\n | {\n ok: true;\n rawText: string;\n value: Record<string, unknown>;\n }\n | {\n ok: false;\n rawText: string;\n issues: string[];\n };\n\nconst AjvCtor = AjvPkg as unknown as new (opts?: object) => AjvLike;\n\ntype AjvLike = {\n compile: (schema: Record<string, unknown>) => ValidateFunction;\n};\n\nconst toolSchemaValidator = new AjvCtor({\n allErrors: true,\n strict: false,\n removeAdditional: false,\n});\nconst validatorCache = new WeakMap<Record<string, unknown>, ValidateFunction>();\nconst DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS = [\n \"oneOf\",\n \"anyOf\",\n \"allOf\",\n \"enum\",\n \"not\",\n] as const;\n\nexport function genId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringifyRawArgs(args: unknown): string {\n if (typeof args === \"string\") {\n return args;\n }\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n try {\n return JSON.stringify(args);\n } catch {\n return \"[unserializable-object]\";\n }\n }\n return String(args ?? \"\");\n}\n\nexport function getOpenAiFunctionParametersSchemaIssues(\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return ['parameters must be declared as a JSON Schema object'];\n }\n if (!isRecord(schema)) {\n return ['parameters must be a JSON Schema object'];\n }\n\n const issues: string[] = [];\n if (schema.type !== \"object\") {\n issues.push('root schema must set type to \"object\"');\n }\n\n for (const keyword of DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS) {\n if (keyword in schema) {\n issues.push(`root schema must not declare top-level \"${keyword}\"`);\n }\n }\n\n return issues;\n}\n\nexport function assertOpenAiFunctionParametersSchema(params: {\n toolName: string;\n schema: Record<string, unknown> | undefined;\n}): void {\n const issues = getOpenAiFunctionParametersSchemaIssues(params.schema);\n if (issues.length === 0) {\n return;\n }\n throw new Error(\n `Tool \"${params.toolName}\" declares an unsupported OpenAI-compatible parameters schema: ${issues.join(\n \"; \",\n )}. See docs/internal/openai-tool-schema.md.`,\n );\n}\n\nexport function buildOpenAiFunctionTool(definition: NcpToolDefinition): OpenAITool {\n assertOpenAiFunctionParametersSchema({\n toolName: definition.name,\n schema: definition.parameters,\n });\n return {\n type: \"function\" as const,\n function: {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n },\n };\n}\n\nexport function parseToolArgs(args: unknown): ParsedToolArgs {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return {\n ok: true,\n rawText: stringifyRawArgs(args),\n value: args as Record<string, unknown>,\n };\n }\n\n const rawText = stringifyRawArgs(args);\n if (typeof args !== \"string\") {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments must be a JSON object string.\"],\n };\n }\n\n const trimmed = args.trim();\n if (!trimmed) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments are empty.\"],\n };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments JSON must decode to an object.\"],\n };\n }\n return {\n ok: true,\n rawText,\n value: parsed as Record<string, unknown>,\n };\n } catch (error) {\n return {\n ok: false,\n rawText,\n issues: [error instanceof Error ? error.message : \"Failed to parse tool arguments JSON.\"],\n };\n }\n}\n\nexport function validateToolArgs(\n args: Record<string, unknown>,\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return [];\n }\n const validate = getOrCreateValidator(schema);\n const valid = validate(args);\n if (valid) {\n return [];\n }\n return formatSchemaIssues(validate.errors);\n}\n\nfunction getOrCreateValidator(schema: Record<string, unknown>): ValidateFunction {\n const cached = validatorCache.get(schema);\n if (cached) {\n return cached;\n }\n const validate = toolSchemaValidator.compile(schema);\n validatorCache.set(schema, validate);\n return validate;\n}\n\nfunction formatSchemaIssues(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors || errors.length === 0) {\n return [\"Tool arguments do not match the declared schema.\"];\n }\n\n return errors.map((error) => {\n const instancePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n if (\n error.keyword === \"required\" &&\n \"missingProperty\" in error.params &&\n typeof error.params.missingProperty === \"string\"\n ) {\n const missingPath = instancePath\n ? `${instancePath}.${error.params.missingProperty}`\n : error.params.missingProperty;\n return `${missingPath} is required`;\n }\n if (\n error.keyword === \"additionalProperties\" &&\n \"additionalProperty\" in error.params &&\n typeof error.params.additionalProperty === \"string\"\n ) {\n const extraPath = instancePath\n ? `${instancePath}.${error.params.additionalProperty}`\n : error.params.additionalProperty;\n return `${extraPath} is not allowed`;\n }\n const label = instancePath || \"parameter\";\n return `${label}: ${error.message ?? \"invalid\"}`;\n });\n}\n\nexport function createInvalidToolArgumentsResult(params: {\n toolCallId: string;\n toolName: string;\n rawArgumentsText: string;\n issues: string[];\n}): NcpInvalidToolArgumentsResult {\n const { toolCallId, toolName, rawArgumentsText, issues } = params;\n return {\n ok: false,\n error: {\n code: \"invalid_tool_arguments\",\n message: \"Tool arguments are invalid.\",\n toolCallId,\n toolName,\n rawArgumentsText,\n issues,\n },\n };\n}\n\nexport function createToolExecutionFailedResult(params: {\n toolCallId: string;\n toolName: string;\n error: unknown;\n}): {\n ok: false;\n error: {\n code: \"tool_execution_failed\";\n message: string;\n toolCallId: string;\n toolName: string;\n };\n} {\n const { toolCallId, toolName, error } = params;\n return {\n ok: false,\n error: {\n code: \"tool_execution_failed\",\n message: error instanceof Error ? error.message : String(error),\n toolCallId,\n toolName,\n },\n };\n}\n\nexport function appendToolRoundToInput(\n input: NcpLLMApiInput,\n reasoning: string,\n text: string,\n toolResults: ReadonlyArray<NcpToolCallResult>,\n toolResultContentManager: ToolResultContentManager = defaultToolResultContentManager,\n): NcpLLMApiInput {\n const assistantMsg: OpenAIChatMessage = {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolResults.map((tr) => ({\n id: tr.toolCallId,\n type: \"function\" as const,\n function: {\n name: tr.toolName,\n arguments: tr.rawArgsText,\n },\n })),\n };\n const toolMsgs: OpenAIChatMessage[] = toolResults.map((tr) => ({\n role: \"tool\" as const,\n content: toolResultContentManager.toModelContent(tr.result, {\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n }),\n tool_call_id: tr.toolCallId,\n }));\n const visualMessages = toolResultContentManager.toVisualObservationMessages(toolResults);\n return toolResultContentManager.compactInput({\n ...input,\n messages: [...input.messages, assistantMsg, ...toolMsgs, ...visualMessages],\n });\n}\n","import type {\n NcpContextBuilder,\n NcpContextPrepareOptions,\n NcpLLMApiInput,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport type { NcpAgentRunInput } from \"@nextclaw/ncp\";\nimport type { NcpToolRegistry } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\nimport { ncpMessageToOpenAiMessages } from \"./utils/message-converter.utils.js\";\nimport { buildOpenAiFunctionTool } from \"./runtime.utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction mergeMessageAndRequestMetadata(input: NcpAgentRunInput): Record<string, unknown> {\n const messageMetadata = input.messages\n .slice()\n .reverse()\n .find((message) => isRecord(message.metadata))?.metadata;\n return {\n ...(isRecord(messageMetadata) ? messageMetadata : {}),\n ...(isRecord(input.metadata) ? input.metadata : {}),\n };\n}\n\nfunction readRequestedToolNames(metadata: Record<string, unknown>): string[] {\n const raw =\n metadata.requested_tools ??\n metadata.requestedTools ??\n metadata.requested_skills ??\n metadata.requestedSkills;\n if (!Array.isArray(raw)) {\n return [];\n }\n const deduped = new Set<string>();\n for (const item of raw) {\n const value = readOptionalString(item);\n if (value) {\n deduped.add(value);\n }\n }\n return [...deduped];\n}\n\ntype DefaultNcpContextBuilderOptions = {\n toolRegistry?: NcpToolRegistry;\n assetStore?: LocalAssetStore | null;\n};\n\nfunction isDefaultNcpContextBuilderOptions(\n value: NcpToolRegistry | DefaultNcpContextBuilderOptions | undefined,\n): value is DefaultNcpContextBuilderOptions {\n return Boolean(value) && typeof value === \"object\" && !(\"getToolDefinitions\" in value);\n}\n\nexport class DefaultNcpContextBuilder implements NcpContextBuilder {\n private readonly toolRegistry?: NcpToolRegistry;\n private readonly assetStore?: LocalAssetStore | null;\n\n constructor(toolRegistry?: NcpToolRegistry);\n constructor(options?: DefaultNcpContextBuilderOptions);\n constructor(toolRegistryOrOptions?: NcpToolRegistry | DefaultNcpContextBuilderOptions) {\n if (isDefaultNcpContextBuilderOptions(toolRegistryOrOptions)) {\n this.toolRegistry = toolRegistryOrOptions.toolRegistry;\n this.assetStore = toolRegistryOrOptions.assetStore;\n return;\n }\n this.toolRegistry = toolRegistryOrOptions;\n }\n\n prepare = (\n input: NcpAgentRunInput,\n options?: NcpContextPrepareOptions,\n ): NcpLLMApiInput => {\n const maxMessages = options?.maxMessages ?? 50;\n const sessionMessages = options?.sessionMessages ?? [];\n const systemPrompt = options?.systemPrompt;\n\n const requestMetadata = mergeMessageAndRequestMetadata(input);\n const requestedToolNames = readRequestedToolNames(requestMetadata);\n\n const messages: OpenAIChatMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of sessionMessages.slice(-maxMessages)) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n for (const msg of input.messages) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n const toolDefinitions = this.toolRegistry?.getToolDefinitions() ?? [];\n const filteredToolDefinitions =\n requestedToolNames.length > 0\n ? toolDefinitions.filter((definition) => requestedToolNames.includes(definition.name))\n : toolDefinitions;\n const tools: OpenAITool[] | undefined = filteredToolDefinitions.map(buildOpenAiFunctionTool);\n\n return {\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n model:\n readOptionalString(requestMetadata.model) ??\n readOptionalString(requestMetadata.llm_model) ??\n readOptionalString(requestMetadata.agent_model) ??\n undefined,\n thinkingLevel:\n readOptionalString(requestMetadata.thinking) ??\n readOptionalString(requestMetadata.thinking_level) ??\n readOptionalString(requestMetadata.thinkingLevel) ??\n readOptionalString(requestMetadata.thinking_effort) ??\n readOptionalString(requestMetadata.thinkingEffort) ??\n null,\n };\n };\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { copyFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { copyFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst ASSET_URI_SCHEME = \"asset://store/\";\n\nexport type StoredAssetRecord = {\n id: string;\n uri: string;\n storageKey: string;\n fileName: string;\n storedName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n sha256: string;\n};\n\nexport type AssetRef = {\n uri: string;\n};\n\nexport type AssetMeta = {\n uri: string;\n fileName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n};\n\nexport type AssetPutInput =\n | {\n kind: \"path\";\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }\n | {\n kind: \"bytes\";\n bytes: Uint8Array;\n fileName: string;\n mimeType?: string | null;\n createdAt?: Date;\n };\n\nfunction normalizeSegment(value: string): string {\n return value.replace(/[^\\w.-]+/g, \"_\").replace(/^_+|_+$/g, \"\") || \"asset.bin\";\n}\n\nfunction normalizeFileName(value: string): string {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : \"asset.bin\";\n}\n\nfunction normalizeMimeType(value: string | null | undefined): string {\n const normalized = value?.trim().toLowerCase() ?? \"\";\n return normalized.length > 0 ? normalized : \"application/octet-stream\";\n}\n\nfunction inferMimeTypeFromFileName(fileName: string): string | null {\n const normalized = fileName.trim().toLowerCase();\n if (normalized.endsWith(\".mp3\")) return \"audio/mpeg\";\n if (normalized.endsWith(\".m4a\")) return \"audio/mp4\";\n if (normalized.endsWith(\".wav\")) return \"audio/wav\";\n if (normalized.endsWith(\".ogg\")) return \"audio/ogg\";\n if (normalized.endsWith(\".opus\")) return \"audio/opus\";\n if (normalized.endsWith(\".flac\")) return \"audio/flac\";\n if (normalized.endsWith(\".aac\")) return \"audio/aac\";\n if (normalized.endsWith(\".weba\")) return \"audio/webm\";\n if (normalized.endsWith(\".mp4\") || normalized.endsWith(\".m4v\")) return \"video/mp4\";\n if (normalized.endsWith(\".mov\")) return \"video/quicktime\";\n if (normalized.endsWith(\".webm\")) return \"video/webm\";\n if (normalized.endsWith(\".mkv\")) return \"video/x-matroska\";\n if (normalized.endsWith(\".avi\")) return \"video/x-msvideo\";\n if (normalized.endsWith(\".wmv\")) return \"video/x-ms-wmv\";\n if (normalized.endsWith(\".png\")) return \"image/png\";\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (normalized.endsWith(\".gif\")) return \"image/gif\";\n if (normalized.endsWith(\".webp\")) return \"image/webp\";\n if (normalized.endsWith(\".svg\")) return \"image/svg+xml\";\n if (normalized.endsWith(\".pdf\")) return \"application/pdf\";\n if (normalized.endsWith(\".json\")) return \"application/json\";\n if (normalized.endsWith(\".txt\")) return \"text/plain\";\n return null;\n}\n\nfunction resolveStoredMimeType(fileName: string, mimeType?: string | null): string {\n const normalized = normalizeMimeType(mimeType);\n if (normalized !== \"application/octet-stream\") {\n return normalized;\n }\n return inferMimeTypeFromFileName(fileName) ?? normalized;\n}\n\nfunction buildAssetId(): string {\n return `asset_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;\n}\n\nfunction ensureAssetRoot(rootDir: string): string {\n const normalized = rootDir.trim();\n if (!normalized) {\n throw new Error(\"LocalAssetStore requires a non-empty rootDir.\");\n }\n return resolve(normalized);\n}\n\nfunction buildStorageKey(timestamp: Date, assetId: string): string {\n const year = String(timestamp.getFullYear());\n const month = String(timestamp.getMonth() + 1).padStart(2, \"0\");\n const day = String(timestamp.getDate()).padStart(2, \"0\");\n return `${year}/${month}/${day}/${assetId}`;\n}\n\nfunction buildAssetUri(storageKey: string): string {\n return `${ASSET_URI_SCHEME}${storageKey}`;\n}\n\nfunction parseAssetUri(uri: string): string | null {\n const normalized = uri.trim();\n if (!normalized.startsWith(ASSET_URI_SCHEME)) {\n return null;\n }\n const storageKey = normalized.slice(ASSET_URI_SCHEME.length).replace(/^\\/+/, \"\").trim();\n return storageKey.length > 0 ? storageKey : null;\n}\n\nfunction ensureStorageKey(storageKey: string): string {\n const normalized = storageKey.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (!normalized) {\n throw new Error(\"Asset storage key must not be empty.\");\n }\n const segments = normalized.split(\"/\");\n if (segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n throw new Error(`Invalid asset storage key: ${storageKey}`);\n }\n return segments.join(\"/\");\n}\n\nfunction hydrateStoredAssetRecord(value: StoredAssetRecord): StoredAssetRecord {\n const fileName = normalizeFileName(value.fileName);\n return {\n ...value,\n fileName,\n storedName: normalizeSegment(value.storedName || fileName),\n mimeType: normalizeMimeType(value.mimeType),\n };\n}\n\nfunction toAssetMeta(record: StoredAssetRecord): AssetMeta {\n return {\n uri: record.uri,\n fileName: record.fileName,\n mimeType: record.mimeType,\n sizeBytes: record.sizeBytes,\n createdAt: record.createdAt,\n };\n}\n\nexport function isTextLikeAsset(params: { mimeType?: string | null; fileName?: string | null }): boolean {\n const mimeType = normalizeMimeType(params.mimeType);\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"text/xml\" ||\n mimeType === \"application/yaml\" ||\n mimeType === \"text/yaml\" ||\n mimeType === \"application/x-yaml\" ||\n mimeType === \"text/csv\"\n ) {\n return true;\n }\n\n const normalizedName = (params.fileName ?? \"\").trim().toLowerCase();\n return [\n \".json\",\n \".md\",\n \".txt\",\n \".csv\",\n \".xml\",\n \".yaml\",\n \".yml\",\n \".js\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n \".jsx\",\n \".py\",\n \".rb\",\n \".go\",\n \".rs\",\n \".java\",\n \".kt\",\n \".swift\",\n \".php\",\n \".css\",\n \".scss\",\n \".html\",\n \".sql\",\n \".sh\",\n ].some((suffix) => normalizedName.endsWith(suffix));\n}\n\nexport class LocalAssetStore {\n readonly rootDir: string;\n\n constructor(options: { rootDir: string }) {\n this.rootDir = ensureAssetRoot(options.rootDir);\n }\n\n put = async (input: AssetPutInput): Promise<AssetRef> => {\n const record =\n input.kind === \"path\"\n ? await this.putFromPath(input)\n : await this.putFromBytes({\n fileName: input.fileName,\n mimeType: input.mimeType,\n bytes: input.bytes,\n createdAt: input.createdAt,\n });\n return { uri: record.uri };\n };\n\n putBytes = async (params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromBytes(params);\n };\n\n putPath = async (params: {\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromPath({ kind: \"path\", ...params });\n };\n\n export = async (ref: AssetRef, targetPath: string): Promise<string> => {\n const record = await this.statRecord(ref.uri);\n if (!record) {\n throw new Error(`Asset not found: ${ref.uri}`);\n }\n const outputPath = resolve(targetPath);\n await ensureParentDirectory(outputPath);\n await copyFile(this.resolveContentPathOrThrow(record), outputPath);\n return outputPath;\n };\n\n stat = async (ref: AssetRef): Promise<AssetMeta | null> => {\n const record = await this.statRecord(ref.uri);\n return record ? toAssetMeta(record) : null;\n };\n\n getByUri = (uri: string): StoredAssetRecord | null => {\n const storageKey = parseAssetUri(uri);\n if (!storageKey) {\n return null;\n }\n const metaPath = join(this.resolveStorageKeyDirectory(storageKey), \"meta.json\");\n if (!existsSync(metaPath)) {\n return null;\n }\n const text = readFileSync(metaPath, \"utf8\");\n return hydrateStoredAssetRecord(JSON.parse(text) as StoredAssetRecord);\n };\n\n statRecord = async (uri: string): Promise<StoredAssetRecord | null> => {\n const record = this.getByUri(uri);\n if (!record) {\n return null;\n }\n try {\n await stat(this.resolveContentPathOrThrow(record));\n return record;\n } catch {\n return null;\n }\n };\n\n readAssetBytes = async (uri: string): Promise<Buffer | null> => {\n const record = await this.statRecord(uri);\n if (!record) {\n return null;\n }\n try {\n return await readFile(this.resolveContentPathOrThrow(record));\n } catch {\n return null;\n }\n };\n\n resolveContentPath = (uri: string): string | null => {\n const record = this.getByUri(uri);\n return record ? this.resolveContentPathOrThrow(record) : null;\n };\n\n private async putFromPath(input: Extract<AssetPutInput, { kind: \"path\" }>): Promise<StoredAssetRecord> {\n const sourcePath = resolve(input.path);\n const sourceStats = await stat(sourcePath);\n if (!sourceStats.isFile()) {\n throw new Error(`Asset source path is not a file: ${sourcePath}`);\n }\n const bytes = readFileSync(sourcePath);\n const record = this.buildRecord({\n fileName: input.fileName ?? basename(sourcePath),\n mimeType: input.mimeType,\n bytes,\n createdAt: input.createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n copyFileSync(sourcePath, join(assetDir, record.storedName));\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private async putFromBytes(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> {\n const { bytes: rawBytes, createdAt, fileName, mimeType } = params;\n const bytes = Buffer.from(rawBytes);\n const record = this.buildRecord({\n fileName,\n mimeType,\n bytes,\n createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n await writeFile(join(assetDir, record.storedName), bytes);\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private buildRecord(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Buffer;\n createdAt?: Date;\n }): StoredAssetRecord {\n const { bytes, createdAt: rawCreatedAt, fileName: rawFileName, mimeType } = params;\n const createdAt = rawCreatedAt ?? new Date();\n const id = buildAssetId();\n const storageKey = buildStorageKey(createdAt, id);\n const fileName = normalizeFileName(rawFileName);\n return {\n id,\n uri: buildAssetUri(storageKey),\n storageKey,\n fileName,\n storedName: normalizeSegment(fileName),\n mimeType: resolveStoredMimeType(fileName, mimeType),\n sizeBytes: bytes.length,\n createdAt: createdAt.toISOString(),\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n\n private async writeMeta(assetDir: string, record: StoredAssetRecord): Promise<void> {\n await writeFile(join(assetDir, \"meta.json\"), `${JSON.stringify(record)}\\n`, \"utf8\");\n }\n\n private resolveContentPathOrThrow(record: StoredAssetRecord): string {\n return join(this.resolveStorageKeyDirectory(record.storageKey), record.storedName);\n }\n\n private resolveStorageKeyDirectory(storageKey: string): string {\n return join(this.rootDir, ensureStorageKey(storageKey));\n }\n}\n\nexport function buildAssetContentPath(params: {\n basePath: string;\n assetUri: string;\n}): string {\n const query = new URLSearchParams({ uri: params.assetUri });\n return `${params.basePath}?${query.toString()}`;\n}\n\nexport async function ensureParentDirectory(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n","import type { NcpRoundBuffer, NcpToolCallResult } from \"@nextclaw/ncp\";\n\nexport class DefaultNcpRoundBuffer implements NcpRoundBuffer {\n private text = \"\";\n private readonly toolCalls: NcpToolCallResult[] = [];\n private pending: { toolCallId: string; toolName: string; args: unknown } | null = null;\n\n appendText = (delta: string): void => {\n this.text += delta;\n };\n\n getText = (): string => {\n return this.text;\n };\n\n appendToolCall = (result: NcpToolCallResult): void => {\n this.toolCalls.push(result);\n };\n\n getToolCalls = (): ReadonlyArray<NcpToolCallResult> => {\n return [...this.toolCalls];\n };\n\n startToolCall = (toolCallId: string, toolName: string): void => {\n this.pending = { toolCallId, toolName, args: undefined };\n };\n\n appendToolCallArgs = (args: unknown): void => {\n if (this.pending) this.pending.args = args;\n };\n\n consumePendingToolCall = (): { toolCallId: string; toolName: string; args: unknown } | null => {\n const p = this.pending;\n this.pending = null;\n return p;\n };\n\n clear = (): void => {\n this.text = \"\";\n this.toolCalls.length = 0;\n this.pending = null;\n };\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n NcpAssistantTextStreamNormalizer,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\nimport { NcpEventType } from \"@nextclaw/ncp\";\n\ntype StreamEventContext = Pick<NcpEncodeContext, \"sessionId\" | \"messageId\" | \"correlationId\">;\n\nexport type ToolCallBuffer = {\n id?: string;\n name?: string;\n argumentsText: string;\n emittedStart?: boolean;\n emittedArgsDelta?: boolean;\n emittedEnd?: boolean;\n pendingArgumentDeltas?: string[];\n};\n\nexport type ToolCallDelta = {\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n};\n\nexport type DeltaLike = {\n content?: string;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: ToolCallDelta[];\n};\n\nexport type StreamContentState = {\n textStarted: boolean;\n normalizer: NcpAssistantTextStreamNormalizer | null;\n};\n\nexport function getToolCallIndex(toolDelta: ToolCallDelta, fallback: number): number {\n const idx = toolDelta.index;\n return typeof idx === \"number\" && Number.isFinite(idx) ? idx : fallback;\n}\n\nexport function applyToolDelta(current: ToolCallBuffer, toolDelta: ToolCallDelta): ToolCallBuffer {\n const next: ToolCallBuffer = { ...current, argumentsText: current.argumentsText };\n if (typeof toolDelta.id === \"string\" && toolDelta.id.trim()) {\n next.id = toolDelta.id;\n }\n const fn = toolDelta.function;\n if (fn && typeof fn === \"object\" && !Array.isArray(fn)) {\n if (typeof fn.name === \"string\" && fn.name.trim()) {\n next.name = fn.name.trim();\n }\n if (typeof fn.arguments === \"string\" && fn.arguments.length > 0) {\n next.argumentsText += fn.arguments;\n }\n }\n return next;\n}\n\nexport function* emitTextDeltas(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n const content = delta.content;\n if (typeof content !== \"string\" || content.length === 0) return state;\n\n if (state.normalizer) {\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.push(content)) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n }\n\n if (!state.textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return {\n ...state,\n textStarted: true,\n };\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return state;\n}\n\nexport function* flushTextDeltas(\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!state.normalizer) {\n return state;\n }\n\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.finish()) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n}\n\nexport function* closeTextPartBeforeToolCalls(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!Array.isArray(delta.tool_calls) || delta.tool_calls.length === 0) {\n return state;\n }\n\n let nextState = state;\n if (nextState.normalizer) {\n nextState = yield* flushTextDeltas(ctx, nextState);\n }\n if (!nextState.textStarted) {\n return nextState;\n }\n\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: ctx,\n });\n\n return {\n ...nextState,\n textStarted: false,\n };\n}\n\nexport function* emitReasoningDelta(\n delta: DeltaLike,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning !== \"string\" || !reasoning) return;\n\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: reasoning },\n });\n}\n\nclass ToolCallDeltaEmitter {\n constructor(\n private readonly buffers: Map<number, ToolCallBuffer>,\n private readonly ctx: StreamEventContext,\n ) {}\n\n emit = function* (\n this: ToolCallDeltaEmitter,\n delta: DeltaLike,\n options: { flushReadyBeforeNextIndex?: boolean },\n ): Generator<NcpEndpointEvent> {\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) return;\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.buffers.size);\n if (options.flushReadyBeforeNextIndex) {\n yield* flushReadyToolCallsBeforeIndex(this.buffers, index, this.ctx);\n }\n const prev = this.buffers.get(index) ?? {\n argumentsText: \"\",\n pendingArgumentDeltas: [],\n };\n const current = applyToolDelta(prev, toolDelta);\n const argsDelta =\n typeof toolDelta.function?.arguments === \"string\" &&\n toolDelta.function.arguments.length > 0\n ? toolDelta.function.arguments\n : null;\n const toolCallId = current.id;\n const toolName = current.name;\n if (toolCallId && toolName && !current.emittedStart) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallStart,\n payload: { ...this.ctx, toolCallId, toolName },\n });\n current.emittedStart = true;\n }\n\n if (argsDelta) {\n if (current.emittedStart && current.id) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: argsDelta,\n },\n });\n current.emittedArgsDelta = true;\n } else {\n current.pendingArgumentDeltas = [\n ...(current.pendingArgumentDeltas ?? []),\n argsDelta,\n ];\n }\n }\n\n if (current.emittedStart && current.id && (current.pendingArgumentDeltas?.length ?? 0) > 0) {\n for (const pendingDelta of current.pendingArgumentDeltas ?? []) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: pendingDelta,\n },\n });\n }\n current.emittedArgsDelta = true;\n current.pendingArgumentDeltas = [];\n }\n\n this.buffers.set(index, current);\n }\n };\n}\n\nexport function* emitToolCallDeltas(\n delta: DeltaLike,\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n options: { flushReadyBeforeNextIndex?: boolean } = {},\n): Generator<NcpEndpointEvent> {\n yield* new ToolCallDeltaEmitter(buffers, ctx).emit(delta, options);\n}\n\nfunction isCompleteToolCallArgs(argumentsText: string): boolean {\n const trimmed = argumentsText.trim();\n if (!trimmed) return false;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return Boolean(parsed) && typeof parsed === \"object\" && !Array.isArray(parsed);\n } catch {\n return false;\n }\n}\n\nfunction* flushReadyToolCallsBeforeIndex(\n buffers: Map<number, ToolCallBuffer>,\n beforeIndex: number,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [index, buf] of ordered) {\n if (index >= beforeIndex || buf.emittedEnd || !buf.id || !buf.name) continue;\n if (!isCompleteToolCallArgs(buf.argumentsText)) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function* flushToolCalls(\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [, buf] of ordered) {\n if (!buf.id || !buf.name || buf.emittedEnd) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function createStreamContentState(\n reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode,\n): StreamContentState {\n return {\n textStarted: false,\n normalizer:\n reasoningNormalizationMode === \"think-tags\"\n ? new NcpAssistantTextStreamNormalizer(reasoningNormalizationMode)\n : null,\n };\n}\n","import {\n normalizeAssistantText,\n type NcpAssistantReasoningNormalizationMode,\n type OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\nimport { applyToolDelta, getToolCallIndex, type DeltaLike, type ToolCallBuffer } from \"./stream-encoder.utils.js\";\n\nexport type CollectedToolCall = {\n toolCallId: string;\n toolName: string;\n args: string;\n};\n\nexport class DefaultNcpRoundCollector {\n private rawText = \"\";\n private explicitReasoning = \"\";\n private readonly toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n constructor(\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode = \"off\",\n ) {}\n\n clear(): void {\n this.rawText = \"\";\n this.explicitReasoning = \"\";\n this.toolCallBuffers.clear();\n }\n\n consumeChunk(chunk: OpenAIChatChunk): void {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n const delta = choice.delta as DeltaLike | undefined;\n if (!delta) {\n return;\n }\n\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n this.rawText += delta.content;\n }\n\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n this.explicitReasoning += reasoning;\n }\n\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) {\n return;\n }\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.toolCallBuffers.size);\n const previous = this.toolCallBuffers.get(index) ?? { argumentsText: \"\" };\n const current = applyToolDelta(previous, toolDelta);\n this.toolCallBuffers.set(index, current);\n }\n }\n\n getText(): string {\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return this.rawText;\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).text;\n }\n\n getReasoning(): string {\n if (this.explicitReasoning.length > 0) {\n return this.explicitReasoning;\n }\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return \"\";\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).reasoning;\n }\n\n getToolCalls(): CollectedToolCall[] {\n const orderedEntries = Array.from(this.toolCallBuffers.entries()).sort(([left], [right]) => left - right);\n const toolCalls: CollectedToolCall[] = [];\n\n for (const [, buffer] of orderedEntries) {\n if (!buffer.id || !buffer.name) {\n continue;\n }\n toolCalls.push({\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.argumentsText,\n });\n }\n\n return toolCalls;\n }\n}\n","import type { NcpTool, NcpToolCallResult } from \"@nextclaw/ncp\";\nimport type { CollectedToolCall } from \"../round-collector.js\";\nimport {\n createInvalidToolArgumentsResult,\n createToolExecutionFailedResult,\n parseToolArgs,\n validateToolArgs,\n} from \"../runtime.utils.js\";\n\nexport type ExecuteCollectedToolCallOptions = {\n toolCall: CollectedToolCall;\n tool: NcpTool | undefined;\n execute: (tool: NcpTool | undefined, args: Record<string, unknown>) => Promise<unknown>;\n};\n\nexport async function executeCollectedToolCall(\n options: ExecuteCollectedToolCallOptions,\n): Promise<NcpToolCallResult> {\n const { toolCall, tool } = options;\n const parsedArgs = parseToolArgs(toolCall.args);\n if (!parsedArgs.ok) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: parsedArgs.issues,\n }),\n };\n }\n\n const validationIssues = tool\n ? [\n ...validateToolArgs(parsedArgs.value, tool.parameters),\n ...(tool.validateArgs?.(parsedArgs.value) ?? []),\n ]\n : [];\n if (validationIssues.length > 0) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: validationIssues,\n }),\n };\n }\n\n try {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: await options.execute(tool, parsedArgs.value),\n };\n } catch (error) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: createToolExecutionFailedResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n error,\n }),\n };\n }\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpStreamEncoder,\n type OpenAIChatChunk,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport {\n closeTextPartBeforeToolCalls,\n createStreamContentState,\n type DeltaLike,\n emitReasoningDelta,\n emitTextDeltas,\n emitToolCallDeltas,\n flushTextDeltas,\n flushToolCalls,\n type ToolCallBuffer,\n} from \"./stream-encoder.utils.js\";\n\nexport type DefaultNcpStreamEncoderConfig = {\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolCallEndMode?: \"finish-only\" | \"sequential-index\";\n};\n\n/**\n * Converts LLM stream chunks to NCP events (text, reasoning, tool calls).\n * Does not emit RunFinished; that is the runtime's responsibility after the loop completes.\n */\nexport class DefaultNcpStreamEncoder implements NcpStreamEncoder {\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolCallEndMode: \"finish-only\" | \"sequential-index\";\n\n constructor(config: DefaultNcpStreamEncoderConfig = {}) {\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolCallEndMode = config.toolCallEndMode ?? \"finish-only\";\n }\n\n async *encode(\n stream: AsyncIterable<OpenAIChatChunk>,\n context: NcpEncodeContext,\n ): AsyncGenerator<NcpEndpointEvent> {\n const { sessionId, messageId } = context;\n const streamContext = {\n sessionId,\n messageId,\n correlationId: context.correlationId,\n };\n let state = createStreamContentState(this.reasoningNormalizationMode);\n const toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta as DeltaLike | undefined;\n if (delta) {\n yield* emitReasoningDelta(delta, streamContext);\n const nextState = yield* emitTextDeltas(delta, streamContext, state);\n state = nextState;\n state = yield* closeTextPartBeforeToolCalls(\n delta,\n streamContext,\n state,\n );\n yield* emitToolCallDeltas(delta, toolCallBuffers, streamContext, {\n flushReadyBeforeNextIndex: this.toolCallEndMode === \"sequential-index\",\n });\n }\n\n const finishReason = choice.finish_reason;\n if (typeof finishReason === \"string\" && finishReason.trim().length > 0) {\n state = yield* flushTextDeltas(streamContext, state);\n yield* flushToolCalls(toolCallBuffers, streamContext);\n if (state.textStarted) {\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: streamContext,\n });\n }\n }\n }\n }\n}\n","import type {\n NcpTool,\n NcpToolDefinition,\n NcpToolRegistry,\n} from \"@nextclaw/ncp\";\n\nexport class DefaultNcpToolRegistry implements NcpToolRegistry {\n private readonly tools = new Map<string, NcpTool>();\n\n constructor(tools: ReadonlyArray<NcpTool> = []) {\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n register = (tool: NcpTool): void => {\n this.tools.set(tool.name, tool);\n };\n\n listTools = (): ReadonlyArray<NcpTool> => {\n return [...this.tools.values()];\n };\n\n getTool = (name: string): NcpTool | undefined => {\n return this.tools.get(name);\n };\n\n getToolDefinitions = (): ReadonlyArray<NcpToolDefinition> => {\n return this.listTools().map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n };\n}\n","import type {\n NcpLLMApi,\n NcpLLMApiInput,\n NcpLLMApiOptions,\n OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\n\nfunction getLastUserContent(messages: NcpLLMApiInput[\"messages\"]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m.role !== \"user\") continue;\n if (typeof m.content === \"string\") return m.content;\n if (Array.isArray(m.content)) {\n return m.content\n .map((p) => (p.type === \"text\" ? p.text : \"\"))\n .join(\"\");\n }\n }\n return \"\";\n}\n\nexport class EchoNcpLLMApi implements NcpLLMApi {\n generate = async function* (\n input: NcpLLMApiInput,\n options?: NcpLLMApiOptions,\n ): AsyncGenerator<OpenAIChatChunk> {\n const text = getLastUserContent(input.messages);\n const signal = options?.signal;\n for (const char of text) {\n if (signal?.aborted) break;\n yield {\n choices: [{ index: 0, delta: { content: char } }],\n };\n }\n yield {\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: text.length, total_tokens: text.length },\n };\n };\n}\n","import {\n createNcpEndpointEvent as createRuntimeEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpAgentConversationStateManager,\n type NcpAgentRunInput,\n type NcpAgentRunOptions,\n type NcpAgentRuntime,\n type NcpContextBuilder,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpLLMApi,\n type NcpLLMApiInput,\n type NcpToolCallResult,\n type NcpStreamEncoder,\n type NcpToolRegistry,\n type OpenAIChatChunk,\n isHiddenNcpMessage,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport { DefaultNcpStreamEncoder } from \"./stream-encoder.service.js\";\nimport {\n appendToolRoundToInput,\n genId,\n} from \"./runtime.utils.js\";\nimport {\n DefaultNcpRoundCollector,\n type CollectedToolCall,\n} from \"./round-collector.js\";\nimport { executeCollectedToolCall } from \"./utils/tool-call-execution.utils.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\ntype RuntimeEncodeContext = NcpEncodeContext & {\n startedAt: string;\n};\n\nexport type DefaultNcpAgentRuntimeConfig = {\n contextBuilder: NcpContextBuilder;\n llmApi: NcpLLMApi;\n toolRegistry: NcpToolRegistry;\n stateManager: NcpAgentConversationStateManager;\n streamEncoder?: NcpStreamEncoder;\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nexport class DefaultNcpAgentRuntime implements NcpAgentRuntime {\n private readonly contextBuilder: NcpContextBuilder;\n private readonly llmApi: NcpLLMApi;\n private readonly toolRegistry: NcpToolRegistry;\n private readonly stateManager: NcpAgentConversationStateManager;\n private readonly streamEncoder: NcpStreamEncoder;\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolResultContentManager: ToolResultContentManager;\n\n constructor(config: DefaultNcpAgentRuntimeConfig) {\n this.contextBuilder = config.contextBuilder;\n this.llmApi = config.llmApi;\n this.toolRegistry = config.toolRegistry;\n this.stateManager = config.stateManager;\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolResultContentManager =\n config.toolResultContentManager ?? defaultToolResultContentManager;\n this.streamEncoder =\n config.streamEncoder ??\n new DefaultNcpStreamEncoder({\n reasoningNormalizationMode: this.reasoningNormalizationMode,\n });\n }\n\n run = async function* (\n this: DefaultNcpAgentRuntime,\n input: NcpAgentRunInput,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const ctxBase: NcpEncodeContext = {\n messageId: genId(),\n runId: (input as NcpAgentRunInput & { runId?: string }).runId ?? genId(),\n sessionId: input.sessionId,\n correlationId: input.correlationId,\n };\n\n const sessionMessages = this.stateManager.getSnapshot().messages;\n const modelInput = this.contextBuilder.prepare(input, {\n sessionMessages,\n });\n\n for (const msg of input.messages) {\n if (isHiddenNcpMessage(msg)) {\n continue;\n }\n const messageSent = createRuntimeEvent({\n type: NcpEventType.MessageSent,\n payload: { sessionId: input.sessionId, message: msg },\n });\n await this.stateManager.dispatch(messageSent);\n }\n\n const startedAt = new Date().toISOString();\n const ctx: RuntimeEncodeContext = { ...ctxBase, startedAt };\n const runStarted = createRuntimeEvent({\n type: NcpEventType.RunStarted,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n },\n }, ctx.startedAt);\n await this.stateManager.dispatch(runStarted);\n yield runStarted;\n\n for await (const event of this.runLoop(modelInput, ctx, options)) {\n await this.stateManager.dispatch(event);\n yield event;\n }\n };\n\n /**\n * Agent loop: LLM stream → encoder events → tool execution (if any) → next round or finish.\n * RunFinished is emitted only when the entire loop completes (no more tool calls).\n * The stream encoder does not emit RunFinished; it only converts chunks to NCP events.\n */\n private runLoop = async function* (\n this: DefaultNcpAgentRuntime,\n llmInput: NcpLLMApiInput,\n ctx: RuntimeEncodeContext,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const roundCollector = new DefaultNcpRoundCollector(this.reasoningNormalizationMode);\n let currentInput = llmInput;\n let done = false;\n\n while (!done && !options?.signal?.aborted) {\n roundCollector.clear();\n\n const stream = this.llmApi.generate(currentInput, { signal: options?.signal });\n const tappedStream = this.tapStream(stream, (chunk) => roundCollector.consumeChunk(chunk));\n\n for await (const event of this.streamEncoder.encode(tappedStream, ctx)) {\n yield event;\n }\n\n const toolResults: NcpToolCallResult[] = [];\n for (const toolCall of roundCollector.getToolCalls()) {\n const toolResult = this.toolResultContentManager.normalizeToolCallResult(\n await this.executeToolCall(toolCall, ctx),\n );\n toolResults.push(toolResult);\n yield createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: toolResult.result,\n contentItems: toolResult.contentItems,\n },\n });\n }\n\n if (toolResults.length === 0) {\n const endedAt = new Date().toISOString();\n yield createRuntimeEvent({\n type: NcpEventType.RunFinished,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n endedAt,\n },\n }, endedAt);\n done = true;\n break;\n }\n\n currentInput = appendToolRoundToInput(\n currentInput,\n roundCollector.getReasoning(),\n roundCollector.getText(),\n toolResults,\n this.toolResultContentManager,\n );\n }\n };\n\n private executeToolCall = async function (\n this: DefaultNcpAgentRuntime,\n toolCall: CollectedToolCall,\n ctx: RuntimeEncodeContext,\n ): Promise<NcpToolCallResult> {\n return executeCollectedToolCall({\n toolCall,\n tool: this.toolRegistry.getTool(toolCall.toolName),\n execute: async (tool, args) => {\n const updateToolCallResult = async (updatedResult: unknown): Promise<void> => {\n const normalized = this.toolResultContentManager.normalizeToolCallResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? args as Record<string, unknown>\n : null,\n rawArgsText: toolCall.args,\n result: updatedResult,\n });\n await this.stateManager.dispatch(createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: normalized.result,\n contentItems: normalized.contentItems,\n correlationId: ctx.correlationId,\n },\n }));\n };\n return tool\n ? await tool.execute(args, {\n toolCallId: toolCall.toolCallId,\n updateToolCallResult,\n })\n : undefined;\n },\n });\n };\n\n private tapStream = async function* (\n this: DefaultNcpAgentRuntime,\n stream: AsyncIterable<OpenAIChatChunk>,\n onChunk: (chunk: OpenAIChatChunk) => void,\n ): AsyncGenerator<OpenAIChatChunk> {\n for await (const chunk of stream) {\n onChunk(chunk);\n yield chunk;\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["LARGE_INLINE_PAYLOAD_CHARS","DEFAULT_MAX_MODEL_VISIBLE_IMAGES","DEFAULT_MAX_ARRAY_ITEMS","DEFAULT_MAX_OBJECT_KEYS","DEFAULT_MAX_DEPTH","readOptionalString","isRecord","isRecord","createStreamEvent","createStreamEvent","createRuntimeEvent"],"sources":["../src/tool-result/tool-result-content.utils.ts","../src/tool-result/tool-result-image.service.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/user-content.utils.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/runtime.utils.ts","../src/runtime/context-builder.service.ts","../src/assets/stores/local-asset.store.ts","../src/runtime/round-buffer.ts","../src/runtime/stream-encoder.utils.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/runtime-stream-recovery.utils.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts"],"sourcesContent":["const LARGE_INLINE_PAYLOAD_CHARS = 2_048;\n\nexport type SafeSerializedValue = {\n text: string;\n ok: boolean;\n};\n\nexport function sanitizePositiveInt(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : fallback;\n}\n\nexport function serializeValue(value: unknown): SafeSerializedValue {\n if (typeof value === \"string\") {\n return { text: value, ok: true };\n }\n try {\n return { text: JSON.stringify(value ?? null), ok: true };\n } catch (error) {\n return {\n text: `[unserializable tool result: ${error instanceof Error ? error.message : String(error)}]`,\n ok: false,\n };\n }\n}\n\nexport function truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n if (maxChars <= 0) {\n return \"\";\n }\n const marker = \"\\n... [truncated] ...\\n\";\n if (maxChars <= marker.length) {\n return value.slice(0, maxChars);\n }\n const keepChars = maxChars - marker.length;\n const headChars = Math.ceil(keepChars / 2);\n const tailChars = Math.floor(keepChars / 2);\n return `${value.slice(0, headChars)}${marker}${value.slice(value.length - tailChars)}`;\n}\n\nexport function isLargeDataUrl(value: string): boolean {\n return value.length > LARGE_INLINE_PAYLOAD_CHARS && /^data:[^,]+;base64,/i.test(value);\n}\n\nexport function readDataUrlMime(value: string): string {\n const match = /^data:([^;,]+)/i.exec(value);\n return match?.[1] ?? \"application/octet-stream\";\n}\n\nexport function isLargeBase64LikeString(value: string): boolean {\n if (value.length <= LARGE_INLINE_PAYLOAD_CHARS) {\n return false;\n }\n const compact = value.replace(/\\s+/g, \"\");\n return compact.length > LARGE_INLINE_PAYLOAD_CHARS && /^[A-Za-z0-9+/=_-]+$/.test(compact);\n}\n\nexport function isBinaryLike(value: object): boolean {\n return value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\n\nexport function getBinaryByteLength(value: object): number {\n if (value instanceof ArrayBuffer) {\n return value.byteLength;\n }\n if (ArrayBuffer.isView(value)) {\n return value.byteLength;\n }\n return 0;\n}\n\nexport function readStringField(value: Record<string, unknown>, key: string): string | null {\n const field = value[key];\n return typeof field === \"string\" && field.length > 0 ? field : null;\n}\n","import type {\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIContentPart,\n} from \"@nextclaw/ncp\";\n\nimport {\n isBinaryLike,\n isLargeDataUrl,\n readDataUrlMime,\n readStringField,\n sanitizePositiveInt,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\n\nconst LARGE_INLINE_PAYLOAD_CHARS = 2_048;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\n\ntype ImageCollectionContext = {\n depth: number;\n};\n\nexport type ToolResultImageServiceOptions = {\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\nexport class ToolResultImageService {\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n\n constructor(options: ToolResultImageServiceOptions = {}) {\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n }\n\n extractImageItems = (value: unknown): NcpToolOutputImageItem[] => {\n const images: NcpToolOutputImageItem[] = [];\n this.collectImageItems(value, images, { depth: 0 });\n return images;\n };\n\n readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => {\n if (!contentItems) {\n return [];\n }\n return contentItems\n .filter((item): item is NcpToolOutputImageItem => item.type === \"input_image\")\n .slice(0, this.maxModelVisibleImages);\n };\n\n toOpenAiImagePart = (item: NcpToolOutputImageItem): OpenAIContentPart => ({\n type: \"image_url\",\n image_url: {\n url: item.imageUrl,\n ...(item.detail ? { detail: toOpenAiImageDetail(item.detail) } : {}),\n },\n });\n\n summarizeImageContentItem = (value: Record<string, unknown>): Record<string, unknown> | null => {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n return {\n type: \"image\",\n mimeType: readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\"),\n detail: readImageDetail(value),\n dataOmitted: true,\n originalDataChars: readStringField(value, \"data\")?.length ?? 0,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n return {\n type,\n imageUrl: imageUrl ? redactImageUrl(imageUrl) : undefined,\n detail: readImageDetail(value),\n };\n }\n return null;\n };\n\n private readonly collectImageItems = (\n value: unknown,\n output: NcpToolOutputImageItem[],\n context: ImageCollectionContext,\n ): void => {\n if (output.length >= this.maxModelVisibleImages || context.depth > this.maxDepth) {\n return;\n }\n if (typeof value === \"string\") {\n const image = imageDataUrlToContentItem(value);\n if (image) {\n output.push(image);\n }\n return;\n }\n if (!value || typeof value !== \"object\" || isBinaryLike(value)) {\n return;\n }\n if (Array.isArray(value)) {\n value\n .slice(0, this.maxArrayItems)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n return;\n }\n const image = readImageContentItem(value as Record<string, unknown>);\n if (image) {\n output.push(image);\n return;\n }\n Object.values(value as Record<string, unknown>)\n .slice(0, this.maxObjectKeys)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n };\n}\n\nfunction imageDataUrlToContentItem(value: string): NcpToolOutputImageItem | null {\n if (!/^data:image\\/[^,]+;base64,/i.test(value)) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: value,\n mimeType: readDataUrlMime(value),\n originalDataChars: value.length,\n };\n}\n\nfunction readImageContentItem(value: Record<string, unknown>): NcpToolOutputImageItem | null {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n const data = readStringField(value, \"data\");\n const mimeType =\n readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\") ?? \"image/png\";\n if (!data) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: `data:${mimeType};base64,${data}`,\n mimeType,\n detail: readImageDetail(value),\n originalDataChars: data.length,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n if (!imageUrl) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl,\n detail: readImageDetail(value),\n };\n }\n return null;\n}\n\nfunction toOpenAiImageDetail(\n detail: NcpToolOutputImageItem[\"detail\"],\n): \"low\" | \"high\" | \"auto\" | undefined {\n if (detail === \"low\" || detail === \"high\" || detail === \"auto\") {\n return detail;\n }\n if (detail === \"original\") {\n return \"high\";\n }\n return undefined;\n}\n\nfunction readImageDetail(\n value: Record<string, unknown>,\n): \"low\" | \"high\" | \"auto\" | \"original\" | undefined {\n const direct = readStringField(value, \"detail\");\n if (isImageDetail(direct)) {\n return direct;\n }\n const meta = value._meta;\n if (!meta || typeof meta !== \"object\" || Array.isArray(meta)) {\n return undefined;\n }\n const codexDetail = readStringField(meta as Record<string, unknown>, \"codex/imageDetail\");\n return isImageDetail(codexDetail) ? codexDetail : undefined;\n}\n\nfunction isImageDetail(value: string | null): value is \"low\" | \"high\" | \"auto\" | \"original\" {\n return value === \"low\" || value === \"high\" || value === \"auto\" || value === \"original\";\n}\n\nfunction readImageUrl(value: Record<string, unknown>): string | null {\n const direct = readStringField(value, \"image_url\");\n if (direct) {\n return direct;\n }\n const nested = value.image_url;\n if (!nested || typeof nested !== \"object\" || Array.isArray(nested)) {\n return null;\n }\n return readStringField(nested as Record<string, unknown>, \"url\");\n}\n\nfunction redactImageUrl(value: string): string {\n if (isLargeDataUrl(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n return value.length > LARGE_INLINE_PAYLOAD_CHARS\n ? truncateMiddle(value, LARGE_INLINE_PAYLOAD_CHARS)\n : value;\n}\n","import type {\n NcpLLMApiInput,\n NcpToolCallResult,\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\n\nimport {\n getBinaryByteLength,\n isBinaryLike,\n isLargeBase64LikeString,\n readDataUrlMime,\n sanitizePositiveInt,\n serializeValue,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\nimport { ToolResultImageService } from \"./tool-result-image.service.js\";\n\nconst DEFAULT_MAX_MODEL_VISIBLE_CHARS = 60_000;\nconst DEFAULT_MAX_TOOL_MESSAGES_CHARS = 60_000;\nconst DEFAULT_MAX_STRING_VALUE_CHARS = 60_000;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\nconst TRUNCATION_MARKER = \"[NextClaw tool result truncated]\";\n\ntype ToolResultContentContext = {\n toolCallId?: string;\n toolName?: string;\n};\n\nexport type ToolResultContentManagerOptions = {\n maxModelVisibleChars?: number;\n maxToolMessagesChars?: number;\n maxStringValueChars?: number;\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\ntype RedactContext = {\n depth: number;\n};\n\ntype NormalizeOutcome = {\n value: unknown;\n changed: boolean;\n};\n\nexport class ToolResultContentManager {\n private readonly maxModelVisibleChars: number;\n private readonly maxToolMessagesChars: number;\n private readonly maxStringValueChars: number;\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n private readonly imageService: ToolResultImageService;\n\n constructor(options: ToolResultContentManagerOptions = {}) {\n this.maxModelVisibleChars = sanitizePositiveInt(\n options.maxModelVisibleChars,\n DEFAULT_MAX_MODEL_VISIBLE_CHARS,\n );\n this.maxToolMessagesChars = sanitizePositiveInt(\n options.maxToolMessagesChars,\n DEFAULT_MAX_TOOL_MESSAGES_CHARS,\n );\n this.maxStringValueChars = sanitizePositiveInt(\n options.maxStringValueChars,\n DEFAULT_MAX_STRING_VALUE_CHARS,\n );\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n this.imageService = new ToolResultImageService({\n maxModelVisibleImages: this.maxModelVisibleImages,\n maxArrayItems: this.maxArrayItems,\n maxObjectKeys: this.maxObjectKeys,\n maxDepth: this.maxDepth,\n });\n }\n\n normalizeToolCallResult = (result: NcpToolCallResult): NcpToolCallResult => {\n const context = {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n };\n const normalized = this.normalizeResult(result.result, {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n });\n const contentItems = this.buildContentItems(result.result, normalized.value, context);\n return {\n ...result,\n ...(normalized.changed ? { result: normalized.value } : {}),\n contentItems,\n };\n };\n\n compactInput = (input: NcpLLMApiInput): NcpLLMApiInput => ({\n ...input,\n messages: this.compactToolMessages(input.messages),\n });\n\n toModelContent = (result: unknown, context: ToolResultContentContext = {}): string => {\n const normalized = this.normalizeResult(result, context);\n const serialized = serializeValue(normalized.value);\n if (serialized.text.length <= this.maxModelVisibleChars) {\n return serialized.text;\n }\n return this.boundModelContentText(\n JSON.stringify(\n this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: serialized.text,\n }),\n ),\n );\n };\n\n toVisualObservationMessages = (\n toolResults: ReadonlyArray<NcpToolCallResult>,\n ): OpenAIChatMessage[] => {\n return toolResults.flatMap((result) => {\n const images = this.readVisibleImages(result.contentItems);\n if (images.length === 0) {\n return [];\n }\n return [this.buildVisualObservationMessage(result, images)];\n });\n };\n\n private readonly normalizeResult = (\n result: unknown,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n if (typeof result === \"string\") {\n return this.normalizeStringResult(result, context);\n }\n\n const serialized = serializeValue(result);\n const containsImageContent = this.imageService.extractImageItems(result).length > 0;\n if (\n serialized.ok &&\n serialized.text.length <= this.maxModelVisibleChars &&\n !containsImageContent\n ) {\n return { value: result, changed: false };\n }\n\n const redacted = this.redactValue(result, { depth: 0 });\n const redactedSerialized = serializeValue(redacted);\n if (redactedSerialized.text.length <= this.maxModelVisibleChars) {\n return {\n value: this.attachNotice(redacted, {\n context,\n originalSerializedChars: serialized.text.length,\n }),\n changed: true,\n };\n }\n\n return {\n value: this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: redactedSerialized.text,\n }),\n changed: true,\n };\n };\n\n private readonly buildContentItems = (\n rawResult: unknown,\n normalizedResult: unknown,\n context: ToolResultContentContext,\n ): NcpToolOutputContentItem[] => {\n const text = this.toModelContent(normalizedResult, context);\n return [\n { type: \"input_text\", text },\n ...this.imageService.extractImageItems(rawResult).slice(0, this.maxModelVisibleImages),\n ];\n };\n\n private readonly readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => this.imageService.readVisibleImages(contentItems);\n\n private readonly buildVisualObservationMessage = (\n toolResult: NcpToolCallResult,\n images: NcpToolOutputImageItem[],\n ): OpenAIChatMessage => {\n const imageParts = images.map(this.imageService.toOpenAiImagePart);\n const omittedCount = Math.max(\n 0,\n (toolResult.contentItems ?? []).filter((item) => item.type === \"input_image\").length -\n imageParts.length,\n );\n return {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: [\n `Tool \"${toolResult.toolName}\" returned ${imageParts.length} image(s).`,\n \"Use the attached image content as the visual observation for the preceding tool result.\",\n omittedCount > 0 ? `${omittedCount} additional image(s) were omitted by budget.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n },\n ...imageParts,\n ],\n };\n };\n\n private readonly compactToolMessages = (\n messages: ReadonlyArray<OpenAIChatMessage>,\n ): OpenAIChatMessage[] => {\n let remainingChars = this.maxToolMessagesChars;\n const output = messages.slice();\n for (let index = output.length - 1; index >= 0; index -= 1) {\n const message = output[index];\n if (message.role !== \"tool\") {\n continue;\n }\n const compacted = this.compactToolMessage(message, remainingChars);\n output[index] = compacted.message;\n remainingChars = compacted.remainingChars;\n }\n return output;\n };\n\n private readonly compactToolMessage = (\n message: Extract<OpenAIChatMessage, { role: \"tool\" }>,\n remainingChars: number,\n ): { message: OpenAIChatMessage; remainingChars: number } => {\n if (message.content.length <= remainingChars) {\n return {\n message,\n remainingChars: remainingChars - message.content.length,\n };\n }\n const content =\n remainingChars >= 1_000\n ? truncateMiddle(message.content, remainingChars)\n : this.buildOmittedHistoricalToolResult(message.content.length);\n return {\n message: { ...message, content },\n remainingChars: Math.max(0, remainingChars - content.length),\n };\n };\n\n private readonly normalizeStringResult = (\n result: string,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n const redacted = this.redactString(result);\n if (redacted.length <= this.maxModelVisibleChars && redacted === result) {\n return { value: result, changed: false };\n }\n if (redacted.length <= this.maxModelVisibleChars) {\n return {\n value: this.buildStringNotice(context, result.length, redacted),\n changed: true,\n };\n }\n return {\n value: this.buildStringNotice(\n context,\n result.length,\n truncateMiddle(redacted, this.maxModelVisibleChars),\n ),\n changed: true,\n };\n };\n\n private readonly redactValue = (value: unknown, context: RedactContext): unknown => {\n if (typeof value === \"string\") {\n return this.redactString(value);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n const imageSummary = this.imageService.summarizeImageContentItem(\n value as Record<string, unknown>,\n );\n if (imageSummary) {\n return imageSummary;\n }\n if (isBinaryLike(value)) {\n return `[omitted binary payload: bytes=${getBinaryByteLength(value)}]`;\n }\n if (context.depth >= this.maxDepth) {\n return `[omitted nested ${Array.isArray(value) ? \"array\" : \"object\"} beyond depth ${this.maxDepth}]`;\n }\n if (Array.isArray(value)) {\n return this.redactArray(value, context);\n }\n return this.redactObject(value as Record<string, unknown>, context);\n };\n\n private readonly redactArray = (value: unknown[], context: RedactContext): unknown[] => {\n const visibleItems = value\n .slice(0, this.maxArrayItems)\n .map((item) => this.redactValue(item, { depth: context.depth + 1 }));\n if (value.length <= this.maxArrayItems) {\n return visibleItems;\n }\n return [\n ...visibleItems,\n `[omitted ${value.length - this.maxArrayItems} array items from tool result]`,\n ];\n };\n\n private readonly redactObject = (\n value: Record<string, unknown>,\n context: RedactContext,\n ): Record<string, unknown> => {\n const entries = Object.entries(value);\n const visibleEntries = entries.slice(0, this.maxObjectKeys);\n const output = Object.fromEntries(\n visibleEntries.map(([key, item]) => [\n key,\n this.redactValue(item, { depth: context.depth + 1 }),\n ]),\n );\n if (entries.length > this.maxObjectKeys) {\n output._nextclawOmittedKeys = entries.length - this.maxObjectKeys;\n }\n return output;\n };\n\n private readonly redactString = (value: string): string => {\n if (/^data:[^,]+;base64,/i.test(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n if (isLargeBase64LikeString(value)) {\n return `[omitted base64-like payload: originalChars=${value.length}]`;\n }\n if (value.length <= this.maxStringValueChars) {\n return value;\n }\n return truncateMiddle(value, this.maxStringValueChars);\n };\n\n private readonly attachNotice = (\n value: unknown,\n params: { context: ToolResultContentContext; originalSerializedChars: number },\n ): unknown => {\n const notice = this.buildNotice(params.context, params.originalSerializedChars);\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return {\n ...(value as Record<string, unknown>),\n _nextclawToolResultNotice: notice,\n };\n }\n return {\n type: \"nextclaw.tool_result_sanitized\",\n notice,\n result: value,\n };\n };\n\n private readonly buildEnvelope = (params: {\n context: ToolResultContentContext;\n originalSerializedChars: number;\n previewSource: string;\n }): Record<string, unknown> => {\n const { context, originalSerializedChars, previewSource } = params;\n return {\n type: \"nextclaw.tool_result_truncated\",\n notice: this.buildNotice(context, originalSerializedChars),\n originalSerializedChars,\n visibleLimitChars: this.maxModelVisibleChars,\n preview: truncateMiddle(\n previewSource,\n Math.max(1_000, this.maxModelVisibleChars - 1_000),\n ),\n };\n };\n\n private readonly buildStringNotice = (\n context: ToolResultContentContext,\n originalChars: number,\n preview: string,\n ): string =>\n [\n TRUNCATION_MARKER,\n this.buildNotice(context, originalChars),\n \"\",\n preview,\n ].join(\"\\n\");\n\n private readonly buildNotice = (\n context: ToolResultContentContext,\n originalSerializedChars: number,\n ): string => {\n const { toolCallId: rawToolCallId, toolName: rawToolName } = context;\n const toolName = rawToolName ? ` tool=${rawToolName}` : \"\";\n const toolCallId = rawToolCallId ? ` toolCallId=${rawToolCallId}` : \"\";\n return `${TRUNCATION_MARKER}${toolName}${toolCallId} originalSerializedChars=${originalSerializedChars} visibleLimitChars=${this.maxModelVisibleChars}`;\n };\n\n private readonly buildOmittedHistoricalToolResult = (originalChars: number): string =>\n `${TRUNCATION_MARKER} older tool result omitted from active model context originalChars=${originalChars}`;\n\n private readonly boundModelContentText = (value: string): string => {\n if (value.length <= this.maxModelVisibleChars) {\n return value;\n }\n return truncateMiddle(value, this.maxModelVisibleChars);\n };\n}\n\nexport const defaultToolResultContentManager = new ToolResultContentManager();\n","import { readFileSync } from \"node:fs\";\nimport type { NcpMessagePart, OpenAIContentPart } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction formatAssetReferenceBlock(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n url?: string | null;\n sizeBytes?: number;\n}): string {\n const { fileName: rawFileName, mimeType: rawMimeType, assetUri: rawAssetUri, url: rawUrl, sizeBytes } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const url = readOptionalString(rawUrl);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Asset: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n ...(url ? [`[Preview URL: ${url}]`] : []),\n \"[Instruction: This file is not embedded in the prompt. If you need to inspect or transform it, use asset_export to copy it to a normal file path first.]\",\n ];\n return lines.join(\"\\n\");\n}\n\ntype ResolvedFilePart = {\n fileName: string;\n mimeType: string;\n assetUri: string | null;\n url: string | null;\n contentBase64: string | null;\n sizeBytes?: number;\n contentPath: string | null;\n};\n\nfunction resolveFilePart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): ResolvedFilePart {\n const assetUri = readOptionalString(part.assetUri);\n const stored = assetUri ? assetStore?.getByUri(assetUri) : null;\n return {\n fileName: readOptionalString(stored?.fileName) ?? readOptionalString(part.name) ?? \"asset\",\n mimeType:\n readOptionalString(stored?.mimeType) ??\n readOptionalString(part.mimeType) ??\n \"application/octet-stream\",\n assetUri,\n url: readOptionalString(part.url),\n contentBase64: readOptionalString(part.contentBase64),\n sizeBytes: stored?.sizeBytes ?? (typeof part.sizeBytes === \"number\" ? part.sizeBytes : undefined),\n contentPath: assetUri ? assetStore?.resolveContentPath(assetUri) ?? null : null,\n };\n}\n\nfunction formatImageAttachmentHint(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n sizeBytes?: number;\n}): string {\n const {\n fileName: rawFileName,\n mimeType: rawMimeType,\n assetUri: rawAssetUri,\n sizeBytes,\n } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Attached Image: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n assetUri\n ? \"[Instruction: This image is embedded in the prompt. If you need to transform or process the original file with tools, use the asset URI.]\"\n : \"[Instruction: This image is embedded in the prompt.]\",\n ];\n return lines.join(\"\\n\");\n}\n\nfunction isImageMimeType(value: string | null): boolean {\n return value?.startsWith(\"image/\") ?? false;\n}\n\nfunction isModelReachableImageUrl(value: string | null): value is string {\n return value !== null && (/^https?:\\/\\//i.test(value) || /^data:/i.test(value));\n}\n\nfunction buildImageDataUrl(mimeType: string, bytes: Uint8Array): string {\n return `data:${mimeType};base64,${Buffer.from(bytes).toString(\"base64\")}`;\n}\n\nfunction resolveImageContentPart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): OpenAIContentPart | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n if (resolved.contentBase64) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${resolved.mimeType};base64,${resolved.contentBase64}`,\n },\n };\n }\n\n if (resolved.contentPath) {\n return {\n type: \"image_url\",\n image_url: {\n url: buildImageDataUrl(resolved.mimeType, readFileSync(resolved.contentPath)),\n },\n };\n }\n\n const reachableImageUrl = resolved.url;\n if (isModelReachableImageUrl(reachableImageUrl)) {\n return {\n type: \"image_url\",\n image_url: {\n url: reachableImageUrl,\n },\n };\n }\n\n return null;\n}\n\nfunction resolveImageAttachmentHint(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n return formatImageAttachmentHint({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n sizeBytes: resolved.sizeBytes,\n });\n}\n\nfunction resolveAssetReferenceBlock(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n\n if (resolved.assetUri) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n if (resolved.url || resolved.contentBase64) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n return null;\n}\n\nexport function buildNcpUserContent(\n parts: NcpMessagePart[],\n options: {\n assetStore?: LocalAssetStore | null;\n } = {},\n): string | OpenAIContentPart[] {\n const content: OpenAIContentPart[] = [];\n\n for (const part of parts) {\n if ((part.type === \"text\" || part.type === \"rich-text\") && part.text.trim().length > 0) {\n content.push({ type: \"text\", text: part.text });\n continue;\n }\n\n if (part.type !== \"file\") {\n continue;\n }\n\n const imageContentPart = resolveImageContentPart(part, options.assetStore);\n if (imageContentPart) {\n content.push(imageContentPart);\n const imageAttachmentHint = resolveImageAttachmentHint(part, options.assetStore);\n if (imageAttachmentHint) {\n content.push({ type: \"text\", text: imageAttachmentHint });\n }\n continue;\n }\n\n const assetReferenceBlock = resolveAssetReferenceBlock(part, options.assetStore);\n if (assetReferenceBlock) {\n content.push({ type: \"text\", text: assetReferenceBlock });\n }\n }\n\n if (content.length === 0) {\n return \"\";\n }\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text;\n }\n return content;\n}\n","import {\n sanitizeAssistantReplyTags,\n type NcpMessage,\n type NcpMessagePart,\n type NcpToolOutputContentItem,\n type OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../../assets/stores/local-asset.store.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../../tool-result/tool-result-content.manager.js\";\nimport { buildNcpUserContent } from \"../user-content.utils.js\";\n\nexport type NcpMessageToOpenAiMessagesOptions = {\n assetStore?: LocalAssetStore | null;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nfunction isTextLikePart(part: NcpMessagePart): part is Extract<NcpMessagePart, { type: \"text\" | \"rich-text\" }> {\n return part.type === \"text\" || part.type === \"rich-text\";\n}\n\nconst readText = (parts: readonly NcpMessagePart[]): string =>\n parts.filter(isTextLikePart).map((part) => part.text).join(\"\");\n\nexport function ncpMessageToOpenAiMessages(\n rawMessage: NcpMessage,\n options: NcpMessageToOpenAiMessagesOptions = {},\n): OpenAIChatMessage[] {\n const message =\n rawMessage.role === \"assistant\" ? sanitizeAssistantReplyTags(rawMessage) : rawMessage;\n const parts = message.parts ?? [];\n\n if (message.role === \"user\") {\n return [\n {\n role: \"user\",\n content: buildNcpUserContent(parts, {\n assetStore: options.assetStore,\n }),\n },\n ];\n }\n\n if (message.role === \"system\" || message.role === \"service\") {\n return [{ role: \"system\", content: readText(parts) }];\n }\n\n if (message.role === \"tool\") {\n return [\n {\n role: \"tool\",\n content: readText(parts),\n tool_call_id: message.id,\n },\n ];\n }\n\n if (message.role !== \"assistant\") {\n return [];\n }\n\n const texts: string[] = [];\n const reasonings: string[] = [];\n const toolInvocations: Array<{\n toolCallId: string;\n toolName: string;\n args: unknown;\n result: unknown;\n resultContentItems?: NcpToolOutputContentItem[];\n }> = [];\n\n for (const part of parts) {\n if (part.type === \"reasoning\") {\n reasonings.push(part.text);\n }\n if (part.type === \"text\") {\n texts.push(part.text);\n }\n if (part.type === \"tool-invocation\" && part.state === \"result\" && part.result !== undefined) {\n toolInvocations.push({\n toolCallId: part.toolCallId ?? \"\",\n toolName: part.toolName,\n args: part.args ?? {},\n result: part.result,\n resultContentItems: part.resultContentItems,\n });\n }\n }\n\n const text = texts.join(\"\");\n const reasoning = reasonings.join(\"\");\n const toolResultContentManager =\n options.toolResultContentManager ?? defaultToolResultContentManager;\n\n if (toolInvocations.length === 0) {\n return [\n {\n role: \"assistant\",\n content: text,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n },\n ];\n }\n\n return [\n {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolInvocations.map((toolInvocation) => ({\n id: toolInvocation.toolCallId,\n type: \"function\" as const,\n function: {\n name: toolInvocation.toolName,\n arguments:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n },\n })),\n },\n ...toolInvocations.map((toolInvocation): OpenAIChatMessage => ({\n role: \"tool\",\n content: toolResultContentManager.toModelContent(toolInvocation.result, {\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n }),\n tool_call_id: toolInvocation.toolCallId,\n })),\n ...(message.status !== \"final\"\n ? toolResultContentManager.toVisualObservationMessages(\n toolInvocations.map((toolInvocation) => ({\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n args: isRecord(toolInvocation.args)\n ? (toolInvocation.args as Record<string, unknown>)\n : null,\n rawArgsText:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n result: toolInvocation.result,\n contentItems: toolInvocation.resultContentItems,\n })),\n )\n : []),\n ];\n}\n","import AjvPkg, { type ErrorObject, type ValidateFunction } from \"ajv\";\nimport type {\n NcpInvalidToolArgumentsResult,\n NcpLLMApiInput,\n NcpToolDefinition,\n NcpToolCallResult,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\nexport type ParsedToolArgs =\n | {\n ok: true;\n rawText: string;\n value: Record<string, unknown>;\n }\n | {\n ok: false;\n rawText: string;\n issues: string[];\n };\n\nconst AjvCtor = AjvPkg as unknown as new (opts?: object) => AjvLike;\n\ntype AjvLike = {\n compile: (schema: Record<string, unknown>) => ValidateFunction;\n};\n\nconst toolSchemaValidator = new AjvCtor({\n allErrors: true,\n strict: false,\n removeAdditional: false,\n});\nconst validatorCache = new WeakMap<Record<string, unknown>, ValidateFunction>();\nconst DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS = [\n \"oneOf\",\n \"anyOf\",\n \"allOf\",\n \"enum\",\n \"not\",\n] as const;\n\nexport function genId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringifyRawArgs(args: unknown): string {\n if (typeof args === \"string\") {\n return args;\n }\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n try {\n return JSON.stringify(args);\n } catch {\n return \"[unserializable-object]\";\n }\n }\n return String(args ?? \"\");\n}\n\nexport function getOpenAiFunctionParametersSchemaIssues(\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return ['parameters must be declared as a JSON Schema object'];\n }\n if (!isRecord(schema)) {\n return ['parameters must be a JSON Schema object'];\n }\n\n const issues: string[] = [];\n if (schema.type !== \"object\") {\n issues.push('root schema must set type to \"object\"');\n }\n\n for (const keyword of DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS) {\n if (keyword in schema) {\n issues.push(`root schema must not declare top-level \"${keyword}\"`);\n }\n }\n\n return issues;\n}\n\nexport function assertOpenAiFunctionParametersSchema(params: {\n toolName: string;\n schema: Record<string, unknown> | undefined;\n}): void {\n const issues = getOpenAiFunctionParametersSchemaIssues(params.schema);\n if (issues.length === 0) {\n return;\n }\n throw new Error(\n `Tool \"${params.toolName}\" declares an unsupported OpenAI-compatible parameters schema: ${issues.join(\n \"; \",\n )}. See docs/internal/openai-tool-schema.md.`,\n );\n}\n\nexport function buildOpenAiFunctionTool(definition: NcpToolDefinition): OpenAITool {\n assertOpenAiFunctionParametersSchema({\n toolName: definition.name,\n schema: definition.parameters,\n });\n return {\n type: \"function\" as const,\n function: {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n },\n };\n}\n\nexport function parseToolArgs(args: unknown): ParsedToolArgs {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return {\n ok: true,\n rawText: stringifyRawArgs(args),\n value: args as Record<string, unknown>,\n };\n }\n\n const rawText = stringifyRawArgs(args);\n if (typeof args !== \"string\") {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments must be a JSON object string.\"],\n };\n }\n\n const trimmed = args.trim();\n if (!trimmed) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments are empty.\"],\n };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments JSON must decode to an object.\"],\n };\n }\n return {\n ok: true,\n rawText,\n value: parsed as Record<string, unknown>,\n };\n } catch (error) {\n return {\n ok: false,\n rawText,\n issues: [error instanceof Error ? error.message : \"Failed to parse tool arguments JSON.\"],\n };\n }\n}\n\nexport function validateToolArgs(\n args: Record<string, unknown>,\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return [];\n }\n const validate = getOrCreateValidator(schema);\n const valid = validate(args);\n if (valid) {\n return [];\n }\n return formatSchemaIssues(validate.errors);\n}\n\nfunction getOrCreateValidator(schema: Record<string, unknown>): ValidateFunction {\n const cached = validatorCache.get(schema);\n if (cached) {\n return cached;\n }\n const validate = toolSchemaValidator.compile(schema);\n validatorCache.set(schema, validate);\n return validate;\n}\n\nfunction formatSchemaIssues(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors || errors.length === 0) {\n return [\"Tool arguments do not match the declared schema.\"];\n }\n\n return errors.map((error) => {\n const instancePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n if (\n error.keyword === \"required\" &&\n \"missingProperty\" in error.params &&\n typeof error.params.missingProperty === \"string\"\n ) {\n const missingPath = instancePath\n ? `${instancePath}.${error.params.missingProperty}`\n : error.params.missingProperty;\n return `${missingPath} is required`;\n }\n if (\n error.keyword === \"additionalProperties\" &&\n \"additionalProperty\" in error.params &&\n typeof error.params.additionalProperty === \"string\"\n ) {\n const extraPath = instancePath\n ? `${instancePath}.${error.params.additionalProperty}`\n : error.params.additionalProperty;\n return `${extraPath} is not allowed`;\n }\n const label = instancePath || \"parameter\";\n return `${label}: ${error.message ?? \"invalid\"}`;\n });\n}\n\nexport function createInvalidToolArgumentsResult(params: {\n toolCallId: string;\n toolName: string;\n rawArgumentsText: string;\n issues: string[];\n}): NcpInvalidToolArgumentsResult {\n const { toolCallId, toolName, rawArgumentsText, issues } = params;\n return {\n ok: false,\n error: {\n code: \"invalid_tool_arguments\",\n message: \"Tool arguments are invalid.\",\n toolCallId,\n toolName,\n rawArgumentsText,\n issues,\n },\n };\n}\n\nexport function createToolExecutionFailedResult(params: {\n toolCallId: string;\n toolName: string;\n error: unknown;\n}): {\n ok: false;\n error: {\n code: \"tool_execution_failed\";\n message: string;\n toolCallId: string;\n toolName: string;\n };\n} {\n const { toolCallId, toolName, error } = params;\n return {\n ok: false,\n error: {\n code: \"tool_execution_failed\",\n message: error instanceof Error ? error.message : String(error),\n toolCallId,\n toolName,\n },\n };\n}\n\nexport function appendToolRoundToInput(\n input: NcpLLMApiInput,\n reasoning: string,\n text: string,\n toolResults: ReadonlyArray<NcpToolCallResult>,\n toolResultContentManager: ToolResultContentManager = defaultToolResultContentManager,\n): NcpLLMApiInput {\n const assistantMsg: OpenAIChatMessage = {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolResults.map((tr) => ({\n id: tr.toolCallId,\n type: \"function\" as const,\n function: {\n name: tr.toolName,\n arguments: tr.rawArgsText,\n },\n })),\n };\n const toolMsgs: OpenAIChatMessage[] = toolResults.map((tr) => ({\n role: \"tool\" as const,\n content: toolResultContentManager.toModelContent(tr.result, {\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n }),\n tool_call_id: tr.toolCallId,\n }));\n const visualMessages = toolResultContentManager.toVisualObservationMessages(toolResults);\n return toolResultContentManager.compactInput({\n ...input,\n messages: [...input.messages, assistantMsg, ...toolMsgs, ...visualMessages],\n });\n}\n","import type {\n NcpContextBuilder,\n NcpContextPrepareOptions,\n NcpLLMApiInput,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport type { NcpAgentRunInput } from \"@nextclaw/ncp\";\nimport type { NcpToolRegistry } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\nimport { ncpMessageToOpenAiMessages } from \"./utils/message-converter.utils.js\";\nimport { buildOpenAiFunctionTool } from \"./runtime.utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction mergeMessageAndRequestMetadata(input: NcpAgentRunInput): Record<string, unknown> {\n const messageMetadata = input.messages\n .slice()\n .reverse()\n .find((message) => isRecord(message.metadata))?.metadata;\n return {\n ...(isRecord(messageMetadata) ? messageMetadata : {}),\n ...(isRecord(input.metadata) ? input.metadata : {}),\n };\n}\n\nfunction readRequestedToolNames(metadata: Record<string, unknown>): string[] {\n const raw =\n metadata.requested_tools ??\n metadata.requestedTools ??\n metadata.requested_skills ??\n metadata.requestedSkills;\n if (!Array.isArray(raw)) {\n return [];\n }\n const deduped = new Set<string>();\n for (const item of raw) {\n const value = readOptionalString(item);\n if (value) {\n deduped.add(value);\n }\n }\n return [...deduped];\n}\n\ntype DefaultNcpContextBuilderOptions = {\n toolRegistry?: NcpToolRegistry;\n assetStore?: LocalAssetStore | null;\n};\n\nfunction isDefaultNcpContextBuilderOptions(\n value: NcpToolRegistry | DefaultNcpContextBuilderOptions | undefined,\n): value is DefaultNcpContextBuilderOptions {\n return Boolean(value) && typeof value === \"object\" && !(\"getToolDefinitions\" in value);\n}\n\nexport class DefaultNcpContextBuilder implements NcpContextBuilder {\n private readonly toolRegistry?: NcpToolRegistry;\n private readonly assetStore?: LocalAssetStore | null;\n\n constructor(toolRegistry?: NcpToolRegistry);\n constructor(options?: DefaultNcpContextBuilderOptions);\n constructor(toolRegistryOrOptions?: NcpToolRegistry | DefaultNcpContextBuilderOptions) {\n if (isDefaultNcpContextBuilderOptions(toolRegistryOrOptions)) {\n this.toolRegistry = toolRegistryOrOptions.toolRegistry;\n this.assetStore = toolRegistryOrOptions.assetStore;\n return;\n }\n this.toolRegistry = toolRegistryOrOptions;\n }\n\n prepare = (\n input: NcpAgentRunInput,\n options?: NcpContextPrepareOptions,\n ): NcpLLMApiInput => {\n const maxMessages = options?.maxMessages ?? 50;\n const sessionMessages = options?.sessionMessages ?? [];\n const systemPrompt = options?.systemPrompt;\n\n const requestMetadata = mergeMessageAndRequestMetadata(input);\n const requestedToolNames = readRequestedToolNames(requestMetadata);\n\n const messages: OpenAIChatMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of sessionMessages.slice(-maxMessages)) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n for (const msg of input.messages) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n const toolDefinitions = this.toolRegistry?.getToolDefinitions() ?? [];\n const filteredToolDefinitions =\n requestedToolNames.length > 0\n ? toolDefinitions.filter((definition) => requestedToolNames.includes(definition.name))\n : toolDefinitions;\n const tools: OpenAITool[] | undefined = filteredToolDefinitions.map(buildOpenAiFunctionTool);\n\n return {\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n model:\n readOptionalString(requestMetadata.model) ??\n readOptionalString(requestMetadata.llm_model) ??\n readOptionalString(requestMetadata.agent_model) ??\n undefined,\n thinkingLevel:\n readOptionalString(requestMetadata.thinking) ??\n readOptionalString(requestMetadata.thinking_level) ??\n readOptionalString(requestMetadata.thinkingLevel) ??\n readOptionalString(requestMetadata.thinking_effort) ??\n readOptionalString(requestMetadata.thinkingEffort) ??\n null,\n };\n };\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { copyFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { copyFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst ASSET_URI_SCHEME = \"asset://store/\";\n\nexport type StoredAssetRecord = {\n id: string;\n uri: string;\n storageKey: string;\n fileName: string;\n storedName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n sha256: string;\n};\n\nexport type AssetRef = {\n uri: string;\n};\n\nexport type AssetMeta = {\n uri: string;\n fileName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n};\n\nexport type AssetPutInput =\n | {\n kind: \"path\";\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }\n | {\n kind: \"bytes\";\n bytes: Uint8Array;\n fileName: string;\n mimeType?: string | null;\n createdAt?: Date;\n };\n\nfunction normalizeSegment(value: string): string {\n return value.replace(/[^\\w.-]+/g, \"_\").replace(/^_+|_+$/g, \"\") || \"asset.bin\";\n}\n\nfunction normalizeFileName(value: string): string {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : \"asset.bin\";\n}\n\nfunction normalizeMimeType(value: string | null | undefined): string {\n const normalized = value?.trim().toLowerCase() ?? \"\";\n return normalized.length > 0 ? normalized : \"application/octet-stream\";\n}\n\nfunction inferMimeTypeFromFileName(fileName: string): string | null {\n const normalized = fileName.trim().toLowerCase();\n if (normalized.endsWith(\".mp3\")) return \"audio/mpeg\";\n if (normalized.endsWith(\".m4a\")) return \"audio/mp4\";\n if (normalized.endsWith(\".wav\")) return \"audio/wav\";\n if (normalized.endsWith(\".ogg\")) return \"audio/ogg\";\n if (normalized.endsWith(\".opus\")) return \"audio/opus\";\n if (normalized.endsWith(\".flac\")) return \"audio/flac\";\n if (normalized.endsWith(\".aac\")) return \"audio/aac\";\n if (normalized.endsWith(\".weba\")) return \"audio/webm\";\n if (normalized.endsWith(\".mp4\") || normalized.endsWith(\".m4v\")) return \"video/mp4\";\n if (normalized.endsWith(\".mov\")) return \"video/quicktime\";\n if (normalized.endsWith(\".webm\")) return \"video/webm\";\n if (normalized.endsWith(\".mkv\")) return \"video/x-matroska\";\n if (normalized.endsWith(\".avi\")) return \"video/x-msvideo\";\n if (normalized.endsWith(\".wmv\")) return \"video/x-ms-wmv\";\n if (normalized.endsWith(\".png\")) return \"image/png\";\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (normalized.endsWith(\".gif\")) return \"image/gif\";\n if (normalized.endsWith(\".webp\")) return \"image/webp\";\n if (normalized.endsWith(\".svg\")) return \"image/svg+xml\";\n if (normalized.endsWith(\".pdf\")) return \"application/pdf\";\n if (normalized.endsWith(\".json\")) return \"application/json\";\n if (normalized.endsWith(\".txt\")) return \"text/plain\";\n return null;\n}\n\nfunction resolveStoredMimeType(fileName: string, mimeType?: string | null): string {\n const normalized = normalizeMimeType(mimeType);\n if (normalized !== \"application/octet-stream\") {\n return normalized;\n }\n return inferMimeTypeFromFileName(fileName) ?? normalized;\n}\n\nfunction buildAssetId(): string {\n return `asset_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;\n}\n\nfunction ensureAssetRoot(rootDir: string): string {\n const normalized = rootDir.trim();\n if (!normalized) {\n throw new Error(\"LocalAssetStore requires a non-empty rootDir.\");\n }\n return resolve(normalized);\n}\n\nfunction buildStorageKey(timestamp: Date, assetId: string): string {\n const year = String(timestamp.getFullYear());\n const month = String(timestamp.getMonth() + 1).padStart(2, \"0\");\n const day = String(timestamp.getDate()).padStart(2, \"0\");\n return `${year}/${month}/${day}/${assetId}`;\n}\n\nfunction buildAssetUri(storageKey: string): string {\n return `${ASSET_URI_SCHEME}${storageKey}`;\n}\n\nfunction parseAssetUri(uri: string): string | null {\n const normalized = uri.trim();\n if (!normalized.startsWith(ASSET_URI_SCHEME)) {\n return null;\n }\n const storageKey = normalized.slice(ASSET_URI_SCHEME.length).replace(/^\\/+/, \"\").trim();\n return storageKey.length > 0 ? storageKey : null;\n}\n\nfunction ensureStorageKey(storageKey: string): string {\n const normalized = storageKey.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (!normalized) {\n throw new Error(\"Asset storage key must not be empty.\");\n }\n const segments = normalized.split(\"/\");\n if (segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n throw new Error(`Invalid asset storage key: ${storageKey}`);\n }\n return segments.join(\"/\");\n}\n\nfunction hydrateStoredAssetRecord(value: StoredAssetRecord): StoredAssetRecord {\n const fileName = normalizeFileName(value.fileName);\n return {\n ...value,\n fileName,\n storedName: normalizeSegment(value.storedName || fileName),\n mimeType: normalizeMimeType(value.mimeType),\n };\n}\n\nfunction toAssetMeta(record: StoredAssetRecord): AssetMeta {\n return {\n uri: record.uri,\n fileName: record.fileName,\n mimeType: record.mimeType,\n sizeBytes: record.sizeBytes,\n createdAt: record.createdAt,\n };\n}\n\nexport function isTextLikeAsset(params: { mimeType?: string | null; fileName?: string | null }): boolean {\n const mimeType = normalizeMimeType(params.mimeType);\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"text/xml\" ||\n mimeType === \"application/yaml\" ||\n mimeType === \"text/yaml\" ||\n mimeType === \"application/x-yaml\" ||\n mimeType === \"text/csv\"\n ) {\n return true;\n }\n\n const normalizedName = (params.fileName ?? \"\").trim().toLowerCase();\n return [\n \".json\",\n \".md\",\n \".txt\",\n \".csv\",\n \".xml\",\n \".yaml\",\n \".yml\",\n \".js\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n \".jsx\",\n \".py\",\n \".rb\",\n \".go\",\n \".rs\",\n \".java\",\n \".kt\",\n \".swift\",\n \".php\",\n \".css\",\n \".scss\",\n \".html\",\n \".sql\",\n \".sh\",\n ].some((suffix) => normalizedName.endsWith(suffix));\n}\n\nexport class LocalAssetStore {\n readonly rootDir: string;\n\n constructor(options: { rootDir: string }) {\n this.rootDir = ensureAssetRoot(options.rootDir);\n }\n\n put = async (input: AssetPutInput): Promise<AssetRef> => {\n const record =\n input.kind === \"path\"\n ? await this.putFromPath(input)\n : await this.putFromBytes({\n fileName: input.fileName,\n mimeType: input.mimeType,\n bytes: input.bytes,\n createdAt: input.createdAt,\n });\n return { uri: record.uri };\n };\n\n putBytes = async (params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromBytes(params);\n };\n\n putPath = async (params: {\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromPath({ kind: \"path\", ...params });\n };\n\n export = async (ref: AssetRef, targetPath: string): Promise<string> => {\n const record = await this.statRecord(ref.uri);\n if (!record) {\n throw new Error(`Asset not found: ${ref.uri}`);\n }\n const outputPath = resolve(targetPath);\n await ensureParentDirectory(outputPath);\n await copyFile(this.resolveContentPathOrThrow(record), outputPath);\n return outputPath;\n };\n\n stat = async (ref: AssetRef): Promise<AssetMeta | null> => {\n const record = await this.statRecord(ref.uri);\n return record ? toAssetMeta(record) : null;\n };\n\n getByUri = (uri: string): StoredAssetRecord | null => {\n const storageKey = parseAssetUri(uri);\n if (!storageKey) {\n return null;\n }\n const metaPath = join(this.resolveStorageKeyDirectory(storageKey), \"meta.json\");\n if (!existsSync(metaPath)) {\n return null;\n }\n const text = readFileSync(metaPath, \"utf8\");\n return hydrateStoredAssetRecord(JSON.parse(text) as StoredAssetRecord);\n };\n\n statRecord = async (uri: string): Promise<StoredAssetRecord | null> => {\n const record = this.getByUri(uri);\n if (!record) {\n return null;\n }\n try {\n await stat(this.resolveContentPathOrThrow(record));\n return record;\n } catch {\n return null;\n }\n };\n\n readAssetBytes = async (uri: string): Promise<Buffer | null> => {\n const record = await this.statRecord(uri);\n if (!record) {\n return null;\n }\n try {\n return await readFile(this.resolveContentPathOrThrow(record));\n } catch {\n return null;\n }\n };\n\n resolveContentPath = (uri: string): string | null => {\n const record = this.getByUri(uri);\n return record ? this.resolveContentPathOrThrow(record) : null;\n };\n\n private async putFromPath(input: Extract<AssetPutInput, { kind: \"path\" }>): Promise<StoredAssetRecord> {\n const sourcePath = resolve(input.path);\n const sourceStats = await stat(sourcePath);\n if (!sourceStats.isFile()) {\n throw new Error(`Asset source path is not a file: ${sourcePath}`);\n }\n const bytes = readFileSync(sourcePath);\n const record = this.buildRecord({\n fileName: input.fileName ?? basename(sourcePath),\n mimeType: input.mimeType,\n bytes,\n createdAt: input.createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n copyFileSync(sourcePath, join(assetDir, record.storedName));\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private async putFromBytes(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> {\n const { bytes: rawBytes, createdAt, fileName, mimeType } = params;\n const bytes = Buffer.from(rawBytes);\n const record = this.buildRecord({\n fileName,\n mimeType,\n bytes,\n createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n await writeFile(join(assetDir, record.storedName), bytes);\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private buildRecord(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Buffer;\n createdAt?: Date;\n }): StoredAssetRecord {\n const { bytes, createdAt: rawCreatedAt, fileName: rawFileName, mimeType } = params;\n const createdAt = rawCreatedAt ?? new Date();\n const id = buildAssetId();\n const storageKey = buildStorageKey(createdAt, id);\n const fileName = normalizeFileName(rawFileName);\n return {\n id,\n uri: buildAssetUri(storageKey),\n storageKey,\n fileName,\n storedName: normalizeSegment(fileName),\n mimeType: resolveStoredMimeType(fileName, mimeType),\n sizeBytes: bytes.length,\n createdAt: createdAt.toISOString(),\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n\n private async writeMeta(assetDir: string, record: StoredAssetRecord): Promise<void> {\n await writeFile(join(assetDir, \"meta.json\"), `${JSON.stringify(record)}\\n`, \"utf8\");\n }\n\n private resolveContentPathOrThrow(record: StoredAssetRecord): string {\n return join(this.resolveStorageKeyDirectory(record.storageKey), record.storedName);\n }\n\n private resolveStorageKeyDirectory(storageKey: string): string {\n return join(this.rootDir, ensureStorageKey(storageKey));\n }\n}\n\nexport function buildAssetContentPath(params: {\n basePath: string;\n assetUri: string;\n}): string {\n const query = new URLSearchParams({ uri: params.assetUri });\n return `${params.basePath}?${query.toString()}`;\n}\n\nexport async function ensureParentDirectory(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n","import type { NcpRoundBuffer, NcpToolCallResult } from \"@nextclaw/ncp\";\n\nexport class DefaultNcpRoundBuffer implements NcpRoundBuffer {\n private text = \"\";\n private readonly toolCalls: NcpToolCallResult[] = [];\n private pending: { toolCallId: string; toolName: string; args: unknown } | null = null;\n\n appendText = (delta: string): void => {\n this.text += delta;\n };\n\n getText = (): string => {\n return this.text;\n };\n\n appendToolCall = (result: NcpToolCallResult): void => {\n this.toolCalls.push(result);\n };\n\n getToolCalls = (): ReadonlyArray<NcpToolCallResult> => {\n return [...this.toolCalls];\n };\n\n startToolCall = (toolCallId: string, toolName: string): void => {\n this.pending = { toolCallId, toolName, args: undefined };\n };\n\n appendToolCallArgs = (args: unknown): void => {\n if (this.pending) this.pending.args = args;\n };\n\n consumePendingToolCall = (): { toolCallId: string; toolName: string; args: unknown } | null => {\n const p = this.pending;\n this.pending = null;\n return p;\n };\n\n clear = (): void => {\n this.text = \"\";\n this.toolCalls.length = 0;\n this.pending = null;\n };\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n NcpAssistantTextStreamNormalizer,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\nimport { NcpEventType } from \"@nextclaw/ncp\";\n\ntype StreamEventContext = Pick<NcpEncodeContext, \"sessionId\" | \"messageId\" | \"correlationId\">;\n\nexport type ToolCallBuffer = {\n id?: string;\n name?: string;\n argumentsText: string;\n emittedStart?: boolean;\n emittedArgsDelta?: boolean;\n emittedEnd?: boolean;\n pendingArgumentDeltas?: string[];\n};\n\nexport type ToolCallDelta = {\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n};\n\nexport type DeltaLike = {\n content?: string;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: ToolCallDelta[];\n};\n\nexport type StreamContentState = {\n textStarted: boolean;\n normalizer: NcpAssistantTextStreamNormalizer | null;\n};\n\nexport function getToolCallIndex(toolDelta: ToolCallDelta, fallback: number): number {\n const idx = toolDelta.index;\n return typeof idx === \"number\" && Number.isFinite(idx) ? idx : fallback;\n}\n\nexport function applyToolDelta(current: ToolCallBuffer, toolDelta: ToolCallDelta): ToolCallBuffer {\n const next: ToolCallBuffer = { ...current, argumentsText: current.argumentsText };\n if (typeof toolDelta.id === \"string\" && toolDelta.id.trim()) {\n next.id = toolDelta.id;\n }\n const fn = toolDelta.function;\n if (fn && typeof fn === \"object\" && !Array.isArray(fn)) {\n if (typeof fn.name === \"string\" && fn.name.trim()) {\n next.name = fn.name.trim();\n }\n if (typeof fn.arguments === \"string\" && fn.arguments.length > 0) {\n next.argumentsText += fn.arguments;\n }\n }\n return next;\n}\n\nexport function* emitTextDeltas(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n const content = delta.content;\n if (typeof content !== \"string\" || content.length === 0) return state;\n\n if (state.normalizer) {\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.push(content)) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n }\n\n if (!state.textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return {\n ...state,\n textStarted: true,\n };\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return state;\n}\n\nexport function* flushTextDeltas(\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!state.normalizer) {\n return state;\n }\n\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.finish()) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n}\n\nexport function* closeTextPartBeforeToolCalls(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!Array.isArray(delta.tool_calls) || delta.tool_calls.length === 0) {\n return state;\n }\n\n let nextState = state;\n if (nextState.normalizer) {\n nextState = yield* flushTextDeltas(ctx, nextState);\n }\n if (!nextState.textStarted) {\n return nextState;\n }\n\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: ctx,\n });\n\n return {\n ...nextState,\n textStarted: false,\n };\n}\n\nexport function* emitReasoningDelta(\n delta: DeltaLike,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning !== \"string\" || !reasoning) return;\n\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: reasoning },\n });\n}\n\nclass ToolCallDeltaEmitter {\n constructor(\n private readonly buffers: Map<number, ToolCallBuffer>,\n private readonly ctx: StreamEventContext,\n ) {}\n\n emit = function* (\n this: ToolCallDeltaEmitter,\n delta: DeltaLike,\n options: { flushReadyBeforeNextIndex?: boolean },\n ): Generator<NcpEndpointEvent> {\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) return;\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.buffers.size);\n if (options.flushReadyBeforeNextIndex) {\n yield* flushReadyToolCallsBeforeIndex(this.buffers, index, this.ctx);\n }\n const prev = this.buffers.get(index) ?? {\n argumentsText: \"\",\n pendingArgumentDeltas: [],\n };\n const current = applyToolDelta(prev, toolDelta);\n const argsDelta =\n typeof toolDelta.function?.arguments === \"string\" &&\n toolDelta.function.arguments.length > 0\n ? toolDelta.function.arguments\n : null;\n const toolCallId = current.id;\n const toolName = current.name;\n if (toolCallId && toolName && !current.emittedStart) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallStart,\n payload: { ...this.ctx, toolCallId, toolName },\n });\n current.emittedStart = true;\n }\n\n if (argsDelta) {\n if (current.emittedStart && current.id) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: argsDelta,\n },\n });\n current.emittedArgsDelta = true;\n } else {\n current.pendingArgumentDeltas = [\n ...(current.pendingArgumentDeltas ?? []),\n argsDelta,\n ];\n }\n }\n\n if (current.emittedStart && current.id && (current.pendingArgumentDeltas?.length ?? 0) > 0) {\n for (const pendingDelta of current.pendingArgumentDeltas ?? []) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: pendingDelta,\n },\n });\n }\n current.emittedArgsDelta = true;\n current.pendingArgumentDeltas = [];\n }\n\n this.buffers.set(index, current);\n }\n };\n}\n\nexport function* emitToolCallDeltas(\n delta: DeltaLike,\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n options: { flushReadyBeforeNextIndex?: boolean } = {},\n): Generator<NcpEndpointEvent> {\n yield* new ToolCallDeltaEmitter(buffers, ctx).emit(delta, options);\n}\n\nfunction isCompleteToolCallArgs(argumentsText: string): boolean {\n const trimmed = argumentsText.trim();\n if (!trimmed) return false;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return Boolean(parsed) && typeof parsed === \"object\" && !Array.isArray(parsed);\n } catch {\n return false;\n }\n}\n\nfunction* flushReadyToolCallsBeforeIndex(\n buffers: Map<number, ToolCallBuffer>,\n beforeIndex: number,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [index, buf] of ordered) {\n if (index >= beforeIndex || buf.emittedEnd || !buf.id || !buf.name) continue;\n if (!isCompleteToolCallArgs(buf.argumentsText)) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function* flushToolCalls(\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [, buf] of ordered) {\n if (!buf.id || !buf.name || buf.emittedEnd) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function createStreamContentState(\n reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode,\n): StreamContentState {\n return {\n textStarted: false,\n normalizer:\n reasoningNormalizationMode === \"think-tags\"\n ? new NcpAssistantTextStreamNormalizer(reasoningNormalizationMode)\n : null,\n };\n}\n","import {\n normalizeAssistantText,\n type NcpAssistantReasoningNormalizationMode,\n type OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\nimport { applyToolDelta, getToolCallIndex, type DeltaLike, type ToolCallBuffer } from \"./stream-encoder.utils.js\";\n\nexport type CollectedToolCall = {\n toolCallId: string;\n toolName: string;\n args: string;\n};\n\nexport class DefaultNcpRoundCollector {\n private rawText = \"\";\n private explicitReasoning = \"\";\n private readonly toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n constructor(\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode = \"off\",\n ) {}\n\n clear(): void {\n this.rawText = \"\";\n this.explicitReasoning = \"\";\n this.toolCallBuffers.clear();\n }\n\n consumeChunk(chunk: OpenAIChatChunk): void {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n const delta = choice.delta as DeltaLike | undefined;\n if (!delta) {\n return;\n }\n\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n this.rawText += delta.content;\n }\n\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n this.explicitReasoning += reasoning;\n }\n\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) {\n return;\n }\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.toolCallBuffers.size);\n const previous = this.toolCallBuffers.get(index) ?? { argumentsText: \"\" };\n const current = applyToolDelta(previous, toolDelta);\n this.toolCallBuffers.set(index, current);\n }\n }\n\n getText(): string {\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return this.rawText;\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).text;\n }\n\n getReasoning(): string {\n if (this.explicitReasoning.length > 0) {\n return this.explicitReasoning;\n }\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return \"\";\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).reasoning;\n }\n\n getToolCalls(): CollectedToolCall[] {\n const orderedEntries = Array.from(this.toolCallBuffers.entries()).sort(([left], [right]) => left - right);\n const toolCalls: CollectedToolCall[] = [];\n\n for (const [, buffer] of orderedEntries) {\n if (!buffer.id || !buffer.name) {\n continue;\n }\n toolCalls.push({\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.argumentsText,\n });\n }\n\n return toolCalls;\n }\n}\n","import type { NcpTool, NcpToolCallResult } from \"@nextclaw/ncp\";\nimport type { CollectedToolCall } from \"../round-collector.js\";\nimport {\n createInvalidToolArgumentsResult,\n createToolExecutionFailedResult,\n parseToolArgs,\n validateToolArgs,\n} from \"../runtime.utils.js\";\n\nexport type ExecuteCollectedToolCallOptions = {\n toolCall: CollectedToolCall;\n tool: NcpTool | undefined;\n execute: (tool: NcpTool | undefined, args: Record<string, unknown>) => Promise<unknown>;\n};\n\nexport async function executeCollectedToolCall(\n options: ExecuteCollectedToolCallOptions,\n): Promise<NcpToolCallResult> {\n const { toolCall, tool } = options;\n const parsedArgs = parseToolArgs(toolCall.args);\n if (!parsedArgs.ok) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: parsedArgs.issues,\n }),\n };\n }\n\n const validationIssues = tool\n ? [\n ...validateToolArgs(parsedArgs.value, tool.parameters),\n ...(tool.validateArgs?.(parsedArgs.value) ?? []),\n ]\n : [];\n if (validationIssues.length > 0) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: validationIssues,\n }),\n };\n }\n\n try {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: await options.execute(tool, parsedArgs.value),\n };\n } catch (error) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: createToolExecutionFailedResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n error,\n }),\n };\n }\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpStreamEncoder,\n type OpenAIChatChunk,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport {\n closeTextPartBeforeToolCalls,\n createStreamContentState,\n type DeltaLike,\n emitReasoningDelta,\n emitTextDeltas,\n emitToolCallDeltas,\n flushTextDeltas,\n flushToolCalls,\n type ToolCallBuffer,\n} from \"./stream-encoder.utils.js\";\n\nexport type DefaultNcpStreamEncoderConfig = {\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolCallEndMode?: \"finish-only\" | \"sequential-index\";\n};\n\n/**\n * Converts LLM stream chunks to NCP events (text, reasoning, tool calls).\n * Does not emit RunFinished; that is the runtime's responsibility after the loop completes.\n */\nexport class DefaultNcpStreamEncoder implements NcpStreamEncoder {\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolCallEndMode: \"finish-only\" | \"sequential-index\";\n\n constructor(config: DefaultNcpStreamEncoderConfig = {}) {\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolCallEndMode = config.toolCallEndMode ?? \"finish-only\";\n }\n\n async *encode(\n stream: AsyncIterable<OpenAIChatChunk>,\n context: NcpEncodeContext,\n ): AsyncGenerator<NcpEndpointEvent> {\n const { sessionId, messageId } = context;\n const streamContext = {\n sessionId,\n messageId,\n correlationId: context.correlationId,\n };\n let state = createStreamContentState(this.reasoningNormalizationMode);\n const toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta as DeltaLike | undefined;\n if (delta) {\n yield* emitReasoningDelta(delta, streamContext);\n const nextState = yield* emitTextDeltas(delta, streamContext, state);\n state = nextState;\n state = yield* closeTextPartBeforeToolCalls(\n delta,\n streamContext,\n state,\n );\n yield* emitToolCallDeltas(delta, toolCallBuffers, streamContext, {\n flushReadyBeforeNextIndex: this.toolCallEndMode === \"sequential-index\",\n });\n }\n\n const finishReason = choice.finish_reason;\n if (typeof finishReason === \"string\" && finishReason.trim().length > 0) {\n state = yield* flushTextDeltas(streamContext, state);\n yield* flushToolCalls(toolCallBuffers, streamContext);\n if (state.textStarted) {\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: streamContext,\n });\n }\n }\n }\n }\n}\n","import {\n createNcpEndpointEvent,\n NcpEventType,\n type NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\n\nexport const NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS = 2_000;\nexport const NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS = 30_000;\nexport const NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE = \"retry\";\n\nexport type NcpRuntimeStreamAttemptState = {\n messageId: string | null;\n};\n\nexport type NcpRuntimeStreamFailure = {\n events: readonly (NcpEndpointEvent | null)[];\n error?: unknown;\n};\n\nexport function createNcpRuntimeStreamAttemptState(): NcpRuntimeStreamAttemptState {\n return {\n messageId: null,\n };\n}\n\nexport function observeNcpRuntimeStreamAttemptEvent(\n state: NcpRuntimeStreamAttemptState,\n event: NcpEndpointEvent,\n): NcpRuntimeStreamAttemptState {\n let nextState = state;\n if (\"payload\" in event && \"messageId\" in event.payload && typeof event.payload.messageId === \"string\") {\n nextState = { ...nextState, messageId: event.payload.messageId };\n }\n return nextState;\n}\n\nexport function shouldRetryNcpRuntimeStreamAttempt(params: {\n failure: NcpRuntimeStreamFailure;\n signal?: AbortSignal;\n}): boolean {\n const { failure, signal } = params;\n return (\n signal?.aborted !== true &&\n isRetryableNcpRuntimeStreamFailure(failure)\n );\n}\n\nexport function createNcpRuntimeStreamRetryEvents(params: {\n attempt: number;\n correlationId?: string;\n failure: NcpRuntimeStreamFailure;\n runId?: string;\n sessionId: string;\n state: NcpRuntimeStreamAttemptState;\n}): NcpEndpointEvent[] {\n const { attempt, correlationId, failure, runId, sessionId, state } = params;\n const message = readNcpRuntimeStreamFailureReason(failure);\n const delayMs = getNcpRuntimeStreamRetryDelayMs(attempt);\n const metadataEvent = createNcpEndpointEvent({\n type: NcpEventType.RunMetadata,\n payload: {\n sessionId,\n messageId: state.messageId ?? undefined,\n runId,\n correlationId,\n metadata: {\n type: NCP_RUNTIME_STREAM_RETRY_METADATA_TYPE,\n attempt,\n message,\n action: undefined,\n next: Date.now() + delayMs,\n },\n },\n });\n return [metadataEvent];\n}\n\nexport function getNcpRuntimeStreamRetryDelayMs(attempt: number): number {\n return Math.min(\n NCP_RUNTIME_STREAM_RETRY_INITIAL_DELAY_MS * 2 ** Math.max(0, attempt - 1),\n NCP_RUNTIME_STREAM_RETRY_MAX_DELAY_MS,\n );\n}\n\nexport function readNcpRuntimeStreamFailureReason(\n failure: NcpRuntimeStreamFailure,\n): string {\n const eventReasons = failure.events\n .filter((event): event is NcpEndpointEvent => Boolean(event))\n .map(readNcpRuntimeStreamEventFailureReason)\n .filter(Boolean);\n if (eventReasons.length > 0) {\n return eventReasons.join(\"; \");\n }\n if (failure.error instanceof Error) {\n return failure.error.message;\n }\n return typeof failure.error === \"string\" ? failure.error : \"Runtime stream failed.\";\n}\n\nfunction readNcpRuntimeStreamEventFailureReason(event: NcpEndpointEvent): string {\n if (event.type === NcpEventType.RunError) {\n return event.payload.error ?? \"\";\n }\n if (event.type === NcpEventType.MessageFailed) {\n const code = event.payload.error?.code;\n const message = event.payload.error?.message ?? \"\";\n return code ? `${code}: ${message}` : message;\n }\n return \"\";\n}\n\nfunction isRetryableNcpRuntimeStreamFailure(failure: NcpRuntimeStreamFailure): boolean {\n const reason = readNcpRuntimeStreamFailureReason(failure).toLowerCase();\n if (!reason) {\n return false;\n }\n if (\n reason.includes(\"abort\") ||\n reason.includes(\"cancel\") ||\n reason.includes(\"user terminated\") ||\n reason.includes(\"用户终止\") ||\n reason.includes(\"用户取消\")\n ) {\n return false;\n }\n return [\n \"429\",\n \"503\",\n \"504\",\n \"closed before\",\n \"connection closed\",\n \"connection reset\",\n \"econnreset\",\n \"fetch failed\",\n \"network\",\n \"overloaded\",\n \"premature\",\n \"rate limit\",\n \"socket\",\n \"stream\",\n \"temporarily unavailable\",\n \"timed out\",\n \"timeout\",\n \"und_err_socket\",\n ].some((marker) => reason.includes(marker));\n}\n","import type {\n NcpTool,\n NcpToolDefinition,\n NcpToolRegistry,\n} from \"@nextclaw/ncp\";\n\nexport class DefaultNcpToolRegistry implements NcpToolRegistry {\n private readonly tools = new Map<string, NcpTool>();\n\n constructor(tools: ReadonlyArray<NcpTool> = []) {\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n register = (tool: NcpTool): void => {\n this.tools.set(tool.name, tool);\n };\n\n listTools = (): ReadonlyArray<NcpTool> => {\n return [...this.tools.values()];\n };\n\n getTool = (name: string): NcpTool | undefined => {\n return this.tools.get(name);\n };\n\n getToolDefinitions = (): ReadonlyArray<NcpToolDefinition> => {\n return this.listTools().map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n };\n}\n","import type {\n NcpLLMApi,\n NcpLLMApiInput,\n NcpLLMApiOptions,\n OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\n\nfunction getLastUserContent(messages: NcpLLMApiInput[\"messages\"]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m.role !== \"user\") continue;\n if (typeof m.content === \"string\") return m.content;\n if (Array.isArray(m.content)) {\n return m.content\n .map((p) => (p.type === \"text\" ? p.text : \"\"))\n .join(\"\");\n }\n }\n return \"\";\n}\n\nexport class EchoNcpLLMApi implements NcpLLMApi {\n generate = async function* (\n input: NcpLLMApiInput,\n options?: NcpLLMApiOptions,\n ): AsyncGenerator<OpenAIChatChunk> {\n const text = getLastUserContent(input.messages);\n const signal = options?.signal;\n for (const char of text) {\n if (signal?.aborted) break;\n yield {\n choices: [{ index: 0, delta: { content: char } }],\n };\n }\n yield {\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: text.length, total_tokens: text.length },\n };\n };\n}\n","import {\n createNcpEndpointEvent as createRuntimeEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpAgentConversationStateManager,\n type NcpAgentRunInput,\n type NcpAgentRunOptions,\n type NcpAgentRuntime,\n type NcpContextBuilder,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpLLMApi,\n type NcpLLMApiInput,\n type NcpToolCallResult,\n type NcpStreamEncoder,\n type NcpToolRegistry,\n type OpenAIChatChunk,\n isHiddenNcpMessage,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport { DefaultNcpStreamEncoder } from \"./stream-encoder.service.js\";\nimport {\n appendToolRoundToInput,\n genId,\n} from \"./runtime.utils.js\";\nimport {\n DefaultNcpRoundCollector,\n type CollectedToolCall,\n} from \"./round-collector.js\";\nimport { executeCollectedToolCall } from \"./utils/tool-call-execution.utils.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\ntype RuntimeEncodeContext = NcpEncodeContext & {\n startedAt: string;\n};\n\nexport type DefaultNcpAgentRuntimeConfig = {\n contextBuilder: NcpContextBuilder;\n llmApi: NcpLLMApi;\n toolRegistry: NcpToolRegistry;\n stateManager: NcpAgentConversationStateManager;\n streamEncoder?: NcpStreamEncoder;\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nexport class DefaultNcpAgentRuntime implements NcpAgentRuntime {\n private readonly contextBuilder: NcpContextBuilder;\n private readonly llmApi: NcpLLMApi;\n private readonly toolRegistry: NcpToolRegistry;\n private readonly stateManager: NcpAgentConversationStateManager;\n private readonly streamEncoder: NcpStreamEncoder;\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolResultContentManager: ToolResultContentManager;\n\n constructor(config: DefaultNcpAgentRuntimeConfig) {\n this.contextBuilder = config.contextBuilder;\n this.llmApi = config.llmApi;\n this.toolRegistry = config.toolRegistry;\n this.stateManager = config.stateManager;\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolResultContentManager =\n config.toolResultContentManager ?? defaultToolResultContentManager;\n this.streamEncoder =\n config.streamEncoder ??\n new DefaultNcpStreamEncoder({\n reasoningNormalizationMode: this.reasoningNormalizationMode,\n });\n }\n\n run = async function* (\n this: DefaultNcpAgentRuntime,\n input: NcpAgentRunInput,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const ctxBase: NcpEncodeContext = {\n messageId: genId(),\n runId: (input as NcpAgentRunInput & { runId?: string }).runId ?? genId(),\n sessionId: input.sessionId,\n correlationId: input.correlationId,\n };\n\n const sessionMessages = this.stateManager.getSnapshot().messages;\n const modelInput = this.contextBuilder.prepare(input, {\n sessionMessages,\n });\n\n for (const msg of input.messages) {\n if (isHiddenNcpMessage(msg)) {\n continue;\n }\n const messageSent = createRuntimeEvent({\n type: NcpEventType.MessageSent,\n payload: { sessionId: input.sessionId, message: msg },\n });\n await this.stateManager.dispatch(messageSent);\n }\n\n const startedAt = new Date().toISOString();\n const ctx: RuntimeEncodeContext = { ...ctxBase, startedAt };\n const runStarted = createRuntimeEvent({\n type: NcpEventType.RunStarted,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n },\n }, ctx.startedAt);\n await this.stateManager.dispatch(runStarted);\n yield runStarted;\n\n for await (const event of this.runLoop(modelInput, ctx, options)) {\n await this.stateManager.dispatch(event);\n yield event;\n }\n };\n\n /**\n * Agent loop: LLM stream → encoder events → tool execution (if any) → next round or finish.\n * RunFinished is emitted only when the entire loop completes (no more tool calls).\n * The stream encoder does not emit RunFinished; it only converts chunks to NCP events.\n */\n private runLoop = async function* (\n this: DefaultNcpAgentRuntime,\n llmInput: NcpLLMApiInput,\n ctx: RuntimeEncodeContext,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const roundCollector = new DefaultNcpRoundCollector(this.reasoningNormalizationMode);\n let currentInput = llmInput;\n let done = false;\n\n while (!done && !options?.signal?.aborted) {\n roundCollector.clear();\n\n const stream = this.llmApi.generate(currentInput, { signal: options?.signal });\n const tappedStream = this.tapStream(stream, (chunk) => roundCollector.consumeChunk(chunk));\n\n for await (const event of this.streamEncoder.encode(tappedStream, ctx)) {\n yield event;\n }\n\n const toolResults: NcpToolCallResult[] = [];\n for (const toolCall of roundCollector.getToolCalls()) {\n const toolResult = this.toolResultContentManager.normalizeToolCallResult(\n await this.executeToolCall(toolCall, ctx),\n );\n toolResults.push(toolResult);\n yield createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: toolResult.result,\n contentItems: toolResult.contentItems,\n },\n });\n }\n\n if (toolResults.length === 0) {\n const endedAt = new Date().toISOString();\n yield createRuntimeEvent({\n type: NcpEventType.RunFinished,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n endedAt,\n },\n }, endedAt);\n done = true;\n break;\n }\n\n currentInput = appendToolRoundToInput(\n currentInput,\n roundCollector.getReasoning(),\n roundCollector.getText(),\n toolResults,\n this.toolResultContentManager,\n );\n }\n };\n\n private executeToolCall = async function (\n this: DefaultNcpAgentRuntime,\n toolCall: CollectedToolCall,\n ctx: RuntimeEncodeContext,\n ): Promise<NcpToolCallResult> {\n return executeCollectedToolCall({\n toolCall,\n tool: this.toolRegistry.getTool(toolCall.toolName),\n execute: async (tool, args) => {\n const updateToolCallResult = async (updatedResult: unknown): Promise<void> => {\n const normalized = this.toolResultContentManager.normalizeToolCallResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? args as Record<string, unknown>\n : null,\n rawArgsText: toolCall.args,\n result: updatedResult,\n });\n await this.stateManager.dispatch(createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: normalized.result,\n contentItems: normalized.contentItems,\n correlationId: ctx.correlationId,\n },\n }));\n };\n return tool\n ? await tool.execute(args, {\n toolCallId: toolCall.toolCallId,\n updateToolCallResult,\n })\n : undefined;\n },\n });\n };\n\n private tapStream = async function* (\n this: DefaultNcpAgentRuntime,\n stream: AsyncIterable<OpenAIChatChunk>,\n onChunk: (chunk: OpenAIChatChunk) => void,\n ): AsyncGenerator<OpenAIChatChunk> {\n for await (const chunk of stream) {\n onChunk(chunk);\n yield chunk;\n }\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ncp-agent-runtime",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "private": false,
5
5
  "description": "Default agent runtime implementation built on NCP interfaces.",
6
6
  "type": "module",
@@ -16,7 +16,7 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "ajv": "^8.17.1",
19
- "@nextclaw/ncp": "0.7.0"
19
+ "@nextclaw/ncp": "0.7.2"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^20.17.6",