@nextclaw/ncp-agent-runtime 0.3.38-beta.0 → 0.3.39
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.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -196,9 +196,9 @@ function redactImageUrl(value) {
|
|
|
196
196
|
}
|
|
197
197
|
//#endregion
|
|
198
198
|
//#region src/tool-result/tool-result-content.manager.ts
|
|
199
|
-
const DEFAULT_MAX_MODEL_VISIBLE_CHARS =
|
|
199
|
+
const DEFAULT_MAX_MODEL_VISIBLE_CHARS = 6e4;
|
|
200
200
|
const DEFAULT_MAX_TOOL_MESSAGES_CHARS = 6e4;
|
|
201
|
-
const DEFAULT_MAX_STRING_VALUE_CHARS =
|
|
201
|
+
const DEFAULT_MAX_STRING_VALUE_CHARS = 6e4;
|
|
202
202
|
const DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;
|
|
203
203
|
const DEFAULT_MAX_ARRAY_ITEMS = 50;
|
|
204
204
|
const DEFAULT_MAX_OBJECT_KEYS = 80;
|
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"],"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.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 isLargeDataUrl,\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 = 10_000;\nconst DEFAULT_MAX_TOOL_MESSAGES_CHARS = 60_000;\nconst DEFAULT_MAX_STRING_VALUE_CHARS = 4_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 if (serialized.ok && serialized.text.length <= this.maxModelVisibleChars) {\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 (isLargeDataUrl(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 detail: \"auto\",\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 detail: \"auto\",\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 detail: \"auto\",\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 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 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 {\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n };\n continue;\n }\n\n if (!textStarted) {\n yield { type: NcpEventType.MessageTextStart, payload: ctx };\n textStarted = true;\n }\n yield {\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 { type: NcpEventType.MessageTextStart, payload: ctx };\n yield { type: NcpEventType.MessageTextDelta, payload: { ...ctx, delta: content } };\n return {\n ...state,\n textStarted: true,\n };\n }\n yield { type: NcpEventType.MessageTextDelta, payload: { ...ctx, delta: content } };\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 {\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n };\n continue;\n }\n\n if (!textStarted) {\n yield { type: NcpEventType.MessageTextStart, payload: ctx };\n textStarted = true;\n }\n yield {\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 {\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 { type: NcpEventType.MessageReasoningDelta, payload: { ...ctx, delta: reasoning } };\n}\n\nexport function* emitToolCallDeltas(\n delta: DeltaLike,\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\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, buffers.size);\n const prev = 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 {\n type: NcpEventType.MessageToolCallStart,\n payload: { ...ctx, toolCallId, toolName },\n };\n current.emittedStart = true;\n }\n\n if (argsDelta) {\n if (current.emittedStart && current.id) {\n yield {\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...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 {\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...ctx,\n toolCallId: current.id,\n delta: pendingDelta,\n },\n };\n }\n current.emittedArgsDelta = true;\n current.pendingArgumentDeltas = [];\n }\n\n buffers.set(index, current);\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) continue;\n if (!buf.emittedArgsDelta) {\n yield {\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n };\n }\n yield {\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n };\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 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};\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\n constructor(config: DefaultNcpStreamEncoderConfig = {}) {\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\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 }\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 { type: NcpEventType.MessageTextEnd, payload: streamContext };\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 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.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\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 ctx: 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: NcpEndpointEvent = {\n type: NcpEventType.MessageSent,\n payload: { sessionId: input.sessionId, message: msg },\n };\n await this.stateManager.dispatch(messageSent);\n }\n\n const runStarted: NcpEndpointEvent = {\n type: NcpEventType.RunStarted,\n payload: { sessionId: ctx.sessionId, messageId: ctx.messageId, runId: ctx.runId },\n };\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: NcpEncodeContext,\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 {\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 yield {\n type: NcpEventType.RunFinished,\n payload: { sessionId: ctx.sessionId, messageId: ctx.messageId, runId: ctx.runId },\n };\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: NcpEncodeContext,\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({\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"],"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.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 isLargeDataUrl,\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 if (serialized.ok && serialized.text.length <= this.maxModelVisibleChars) {\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 (isLargeDataUrl(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 detail: \"auto\",\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 detail: \"auto\",\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 detail: \"auto\",\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 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 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 {\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n };\n continue;\n }\n\n if (!textStarted) {\n yield { type: NcpEventType.MessageTextStart, payload: ctx };\n textStarted = true;\n }\n yield {\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 { type: NcpEventType.MessageTextStart, payload: ctx };\n yield { type: NcpEventType.MessageTextDelta, payload: { ...ctx, delta: content } };\n return {\n ...state,\n textStarted: true,\n };\n }\n yield { type: NcpEventType.MessageTextDelta, payload: { ...ctx, delta: content } };\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 {\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n };\n continue;\n }\n\n if (!textStarted) {\n yield { type: NcpEventType.MessageTextStart, payload: ctx };\n textStarted = true;\n }\n yield {\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 {\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 { type: NcpEventType.MessageReasoningDelta, payload: { ...ctx, delta: reasoning } };\n}\n\nexport function* emitToolCallDeltas(\n delta: DeltaLike,\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\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, buffers.size);\n const prev = 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 {\n type: NcpEventType.MessageToolCallStart,\n payload: { ...ctx, toolCallId, toolName },\n };\n current.emittedStart = true;\n }\n\n if (argsDelta) {\n if (current.emittedStart && current.id) {\n yield {\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...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 {\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...ctx,\n toolCallId: current.id,\n delta: pendingDelta,\n },\n };\n }\n current.emittedArgsDelta = true;\n current.pendingArgumentDeltas = [];\n }\n\n buffers.set(index, current);\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) continue;\n if (!buf.emittedArgsDelta) {\n yield {\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n };\n }\n yield {\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n };\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 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};\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\n constructor(config: DefaultNcpStreamEncoderConfig = {}) {\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\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 }\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 { type: NcpEventType.MessageTextEnd, payload: streamContext };\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 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.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\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 ctx: 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: NcpEndpointEvent = {\n type: NcpEventType.MessageSent,\n payload: { sessionId: input.sessionId, message: msg },\n };\n await this.stateManager.dispatch(messageSent);\n }\n\n const runStarted: NcpEndpointEvent = {\n type: NcpEventType.RunStarted,\n payload: { sessionId: ctx.sessionId, messageId: ctx.messageId, runId: ctx.runId },\n };\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: NcpEncodeContext,\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 {\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 yield {\n type: NcpEventType.RunFinished,\n payload: { sessionId: ctx.sessionId, messageId: ctx.messageId, runId: ctx.runId },\n };\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: NcpEncodeContext,\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({\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.3.
|
|
3
|
+
"version": "0.3.39",
|
|
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.5.
|
|
19
|
+
"@nextclaw/ncp": "0.5.28"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/node": "^20.17.6",
|