@nextclaw/ncp-agent-runtime 0.3.47-beta.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +152 -105
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -194,9 +194,10 @@ type ExecuteCollectedToolCallOptions = {
|
|
|
194
194
|
};
|
|
195
195
|
declare function executeCollectedToolCall(options: ExecuteCollectedToolCallOptions): Promise<NcpToolCallResult>;
|
|
196
196
|
//#endregion
|
|
197
|
-
//#region src/runtime/stream-encoder.d.ts
|
|
197
|
+
//#region src/runtime/stream-encoder.service.d.ts
|
|
198
198
|
type DefaultNcpStreamEncoderConfig = {
|
|
199
199
|
reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;
|
|
200
|
+
toolCallEndMode?: "finish-only" | "sequential-index";
|
|
200
201
|
};
|
|
201
202
|
/**
|
|
202
203
|
* Converts LLM stream chunks to NCP events (text, reasoning, tool calls).
|
|
@@ -204,6 +205,7 @@ type DefaultNcpStreamEncoderConfig = {
|
|
|
204
205
|
*/
|
|
205
206
|
declare class DefaultNcpStreamEncoder implements NcpStreamEncoder {
|
|
206
207
|
private readonly reasoningNormalizationMode;
|
|
208
|
+
private readonly toolCallEndMode;
|
|
207
209
|
constructor(config?: DefaultNcpStreamEncoderConfig);
|
|
208
210
|
encode(stream: AsyncIterable<OpenAIChatChunk>, context: NcpEncodeContext): AsyncGenerator<NcpEndpointEvent>;
|
|
209
211
|
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/assets/stores/local-asset.store.ts","../src/runtime/context-builder.service.ts","../src/runtime/user-content.utils.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/round-buffer.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts","../src/runtime/runtime.utils.ts"],"mappings":";;;KAOY,iBAAA;EACV,EAAA;EACA,GAAA;EACA,UAAA;EACA,QAAA;EACA,UAAA;EACA,QAAA;EACA,SAAA;EACA,SAAA;EACA,MAAA;AAAA;AAAA,KAGU,QAAA;EACV,GAAA;AAAA;AAAA,KAGU,SAAA;EACV,GAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,KAGU,aAAA;EAEN,IAAA;EACA,IAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA,GAAY,IAAA;AAAA;EAGZ,IAAA;EACA,KAAA,EAAO,UAAA;EACP,QAAA;EACA,QAAA;EACA,SAAA,GAAY,IAAA;AAAA;AAAA,iBAoHF,eAAA,CAAgB,MAAA;EAAU,QAAA;EAA0B,QAAA;AAAA;AAAA,cA8CvD,eAAA;EAAA,SACF,OAAA;cAEG,OAAA;IAAW,OAAA;EAAA;EAIvB,GAAA,GAAa,KAAA,EAAO,aAAA,KAAgB,OAAA,CAAQ,QAAA;EAa5C,QAAA,GAAkB,MAAA;IAChB,QAAA;IACA,QAAA;IACA,KAAA,EAAO,UAAA;IACP,SAAA,GAAY,IAAA;EAAA,MACV,OAAA,CAAQ,iBAAA;EAIZ,OAAA,GAAiB,MAAA;IACf,IAAA;IACA,QAAA;IACA,QAAA;IACA,SAAA,GAAY,IAAA;EAAA,MACV,OAAA,CAAQ,iBAAA;EAIZ,MAAA,GAAgB,GAAA,EAAK,QAAA,EAAU,UAAA,aAAqB,OAAA;EAWpD,IAAA,GAAc,GAAA,EAAK,QAAA,KAAW,OAAA,CAAQ,SAAA;EAKtC,QAAA,GAAY,GAAA,aAAc,iBAAA;EAa1B,UAAA,GAAoB,GAAA,aAAc,OAAA,CAAQ,iBAAA;EAa1C,cAAA,GAAwB,GAAA,aAAc,OAAA,CAAQ,MAAA;EAY9C,kBAAA,GAAsB,GAAA;EAAA,QAKR,WAAA;EAAA,QAoBA,YAAA;EAAA,QAqBN,WAAA;EAAA,QAwBM,SAAA;EAAA,QAIN,yBAAA;EAAA,QAIA,0BAAA;AAAA;AAAA,iBAKM,qBAAA,CAAsB,MAAA;EACpC,QAAA;EACA,QAAA;AAAA;;;KCxUG,+BAAA;EACH,YAAA,GAAe,eAAA;EACf,UAAA,GAAa,eAAA;AAAA;AAAA,cASF,wBAAA,YAAoC,iBAAA;EAAA,iBAC9B,YAAA;EAAA,iBACA,UAAA;cAEL,YAAA,GAAe,eAAA;cACf,OAAA,GAAU,+BAAA;EAUtB,OAAA,GACE,KAAA,EAAO,gBAAA,EACP,OAAA,GAAU,wBAAA,KACT,cAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/assets/stores/local-asset.store.ts","../src/runtime/context-builder.service.ts","../src/runtime/user-content.utils.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/round-buffer.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts","../src/runtime/runtime.utils.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NcpAssistantTextStreamNormalizer, NcpEventType, isHiddenNcpMessage, normalizeAssistantText, sanitizeAssistantReplyTags } from "@nextclaw/ncp";
|
|
1
|
+
import { NcpAssistantTextStreamNormalizer, NcpEventType, createNcpEndpointEvent, isHiddenNcpMessage, normalizeAssistantText, sanitizeAssistantReplyTags } from "@nextclaw/ncp";
|
|
2
2
|
import { copyFileSync, existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import AjvPkg from "ajv";
|
|
4
4
|
import { createHash, randomUUID } from "node:crypto";
|
|
@@ -267,7 +267,8 @@ var ToolResultContentManager = class {
|
|
|
267
267
|
normalizeResult = (result, context) => {
|
|
268
268
|
if (typeof result === "string") return this.normalizeStringResult(result, context);
|
|
269
269
|
const serialized = serializeValue(result);
|
|
270
|
-
|
|
270
|
+
const containsImageContent = this.imageService.extractImageItems(result).length > 0;
|
|
271
|
+
if (serialized.ok && serialized.text.length <= this.maxModelVisibleChars && !containsImageContent) return {
|
|
271
272
|
value: result,
|
|
272
273
|
changed: false
|
|
273
274
|
};
|
|
@@ -376,7 +377,7 @@ var ToolResultContentManager = class {
|
|
|
376
377
|
return output;
|
|
377
378
|
};
|
|
378
379
|
redactString = (value) => {
|
|
379
|
-
if (
|
|
380
|
+
if (/^data:[^,]+;base64,/i.test(value)) return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;
|
|
380
381
|
if (isLargeBase64LikeString(value)) return `[omitted base64-like payload: originalChars=${value.length}]`;
|
|
381
382
|
if (value.length <= this.maxStringValueChars) return value;
|
|
382
383
|
return truncateMiddle(value, this.maxStringValueChars);
|
|
@@ -484,25 +485,16 @@ function resolveImageContentPart(part, assetStore) {
|
|
|
484
485
|
if (!isImageMimeType(resolved.mimeType)) return null;
|
|
485
486
|
if (resolved.contentBase64) return {
|
|
486
487
|
type: "image_url",
|
|
487
|
-
image_url: {
|
|
488
|
-
url: `data:${resolved.mimeType};base64,${resolved.contentBase64}`,
|
|
489
|
-
detail: "auto"
|
|
490
|
-
}
|
|
488
|
+
image_url: { url: `data:${resolved.mimeType};base64,${resolved.contentBase64}` }
|
|
491
489
|
};
|
|
492
490
|
if (resolved.contentPath) return {
|
|
493
491
|
type: "image_url",
|
|
494
|
-
image_url: {
|
|
495
|
-
url: buildImageDataUrl(resolved.mimeType, readFileSync(resolved.contentPath)),
|
|
496
|
-
detail: "auto"
|
|
497
|
-
}
|
|
492
|
+
image_url: { url: buildImageDataUrl(resolved.mimeType, readFileSync(resolved.contentPath)) }
|
|
498
493
|
};
|
|
499
494
|
const reachableImageUrl = resolved.url;
|
|
500
495
|
if (isModelReachableImageUrl(reachableImageUrl)) return {
|
|
501
496
|
type: "image_url",
|
|
502
|
-
image_url: {
|
|
503
|
-
url: reachableImageUrl,
|
|
504
|
-
detail: "auto"
|
|
505
|
-
}
|
|
497
|
+
image_url: { url: reachableImageUrl }
|
|
506
498
|
};
|
|
507
499
|
return null;
|
|
508
500
|
}
|
|
@@ -1205,29 +1197,29 @@ function* emitTextDeltas(delta, ctx, state) {
|
|
|
1205
1197
|
let textStarted = state.textStarted;
|
|
1206
1198
|
for (const segment of state.normalizer.push(content)) {
|
|
1207
1199
|
if (segment.type === "reasoning") {
|
|
1208
|
-
yield {
|
|
1200
|
+
yield createNcpEndpointEvent({
|
|
1209
1201
|
type: NcpEventType.MessageReasoningDelta,
|
|
1210
1202
|
payload: {
|
|
1211
1203
|
...ctx,
|
|
1212
1204
|
delta: segment.text
|
|
1213
1205
|
}
|
|
1214
|
-
};
|
|
1206
|
+
});
|
|
1215
1207
|
continue;
|
|
1216
1208
|
}
|
|
1217
1209
|
if (!textStarted) {
|
|
1218
|
-
yield {
|
|
1210
|
+
yield createNcpEndpointEvent({
|
|
1219
1211
|
type: NcpEventType.MessageTextStart,
|
|
1220
1212
|
payload: ctx
|
|
1221
|
-
};
|
|
1213
|
+
});
|
|
1222
1214
|
textStarted = true;
|
|
1223
1215
|
}
|
|
1224
|
-
yield {
|
|
1216
|
+
yield createNcpEndpointEvent({
|
|
1225
1217
|
type: NcpEventType.MessageTextDelta,
|
|
1226
1218
|
payload: {
|
|
1227
1219
|
...ctx,
|
|
1228
1220
|
delta: segment.text
|
|
1229
1221
|
}
|
|
1230
|
-
};
|
|
1222
|
+
});
|
|
1231
1223
|
}
|
|
1232
1224
|
return {
|
|
1233
1225
|
...state,
|
|
@@ -1235,29 +1227,29 @@ function* emitTextDeltas(delta, ctx, state) {
|
|
|
1235
1227
|
};
|
|
1236
1228
|
}
|
|
1237
1229
|
if (!state.textStarted) {
|
|
1238
|
-
yield {
|
|
1230
|
+
yield createNcpEndpointEvent({
|
|
1239
1231
|
type: NcpEventType.MessageTextStart,
|
|
1240
1232
|
payload: ctx
|
|
1241
|
-
};
|
|
1242
|
-
yield {
|
|
1233
|
+
});
|
|
1234
|
+
yield createNcpEndpointEvent({
|
|
1243
1235
|
type: NcpEventType.MessageTextDelta,
|
|
1244
1236
|
payload: {
|
|
1245
1237
|
...ctx,
|
|
1246
1238
|
delta: content
|
|
1247
1239
|
}
|
|
1248
|
-
};
|
|
1240
|
+
});
|
|
1249
1241
|
return {
|
|
1250
1242
|
...state,
|
|
1251
1243
|
textStarted: true
|
|
1252
1244
|
};
|
|
1253
1245
|
}
|
|
1254
|
-
yield {
|
|
1246
|
+
yield createNcpEndpointEvent({
|
|
1255
1247
|
type: NcpEventType.MessageTextDelta,
|
|
1256
1248
|
payload: {
|
|
1257
1249
|
...ctx,
|
|
1258
1250
|
delta: content
|
|
1259
1251
|
}
|
|
1260
|
-
};
|
|
1252
|
+
});
|
|
1261
1253
|
return state;
|
|
1262
1254
|
}
|
|
1263
1255
|
function* flushTextDeltas(ctx, state) {
|
|
@@ -1265,29 +1257,29 @@ function* flushTextDeltas(ctx, state) {
|
|
|
1265
1257
|
let textStarted = state.textStarted;
|
|
1266
1258
|
for (const segment of state.normalizer.finish()) {
|
|
1267
1259
|
if (segment.type === "reasoning") {
|
|
1268
|
-
yield {
|
|
1260
|
+
yield createNcpEndpointEvent({
|
|
1269
1261
|
type: NcpEventType.MessageReasoningDelta,
|
|
1270
1262
|
payload: {
|
|
1271
1263
|
...ctx,
|
|
1272
1264
|
delta: segment.text
|
|
1273
1265
|
}
|
|
1274
|
-
};
|
|
1266
|
+
});
|
|
1275
1267
|
continue;
|
|
1276
1268
|
}
|
|
1277
1269
|
if (!textStarted) {
|
|
1278
|
-
yield {
|
|
1270
|
+
yield createNcpEndpointEvent({
|
|
1279
1271
|
type: NcpEventType.MessageTextStart,
|
|
1280
1272
|
payload: ctx
|
|
1281
|
-
};
|
|
1273
|
+
});
|
|
1282
1274
|
textStarted = true;
|
|
1283
1275
|
}
|
|
1284
|
-
yield {
|
|
1276
|
+
yield createNcpEndpointEvent({
|
|
1285
1277
|
type: NcpEventType.MessageTextDelta,
|
|
1286
1278
|
payload: {
|
|
1287
1279
|
...ctx,
|
|
1288
1280
|
delta: segment.text
|
|
1289
1281
|
}
|
|
1290
|
-
};
|
|
1282
|
+
});
|
|
1291
1283
|
}
|
|
1292
1284
|
return {
|
|
1293
1285
|
...state,
|
|
@@ -1299,10 +1291,10 @@ function* closeTextPartBeforeToolCalls(delta, ctx, state) {
|
|
|
1299
1291
|
let nextState = state;
|
|
1300
1292
|
if (nextState.normalizer) nextState = yield* flushTextDeltas(ctx, nextState);
|
|
1301
1293
|
if (!nextState.textStarted) return nextState;
|
|
1302
|
-
yield {
|
|
1294
|
+
yield createNcpEndpointEvent({
|
|
1303
1295
|
type: NcpEventType.MessageTextEnd,
|
|
1304
1296
|
payload: ctx
|
|
1305
|
-
};
|
|
1297
|
+
});
|
|
1306
1298
|
return {
|
|
1307
1299
|
...nextState,
|
|
1308
1300
|
textStarted: false
|
|
@@ -1311,82 +1303,126 @@ function* closeTextPartBeforeToolCalls(delta, ctx, state) {
|
|
|
1311
1303
|
function* emitReasoningDelta(delta, ctx) {
|
|
1312
1304
|
const reasoning = delta.reasoning_content ?? delta.reasoning;
|
|
1313
1305
|
if (typeof reasoning !== "string" || !reasoning) return;
|
|
1314
|
-
yield {
|
|
1306
|
+
yield createNcpEndpointEvent({
|
|
1315
1307
|
type: NcpEventType.MessageReasoningDelta,
|
|
1316
1308
|
payload: {
|
|
1317
1309
|
...ctx,
|
|
1318
1310
|
delta: reasoning
|
|
1319
1311
|
}
|
|
1320
|
-
};
|
|
1312
|
+
});
|
|
1321
1313
|
}
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1314
|
+
var ToolCallDeltaEmitter = class {
|
|
1315
|
+
constructor(buffers, ctx) {
|
|
1316
|
+
this.buffers = buffers;
|
|
1317
|
+
this.ctx = ctx;
|
|
1318
|
+
}
|
|
1319
|
+
emit = function* (delta, options) {
|
|
1320
|
+
const toolDeltas = delta.tool_calls;
|
|
1321
|
+
if (!Array.isArray(toolDeltas)) return;
|
|
1322
|
+
for (const toolDelta of toolDeltas) {
|
|
1323
|
+
const index = getToolCallIndex(toolDelta, this.buffers.size);
|
|
1324
|
+
if (options.flushReadyBeforeNextIndex) yield* flushReadyToolCallsBeforeIndex(this.buffers, index, this.ctx);
|
|
1325
|
+
const current = applyToolDelta(this.buffers.get(index) ?? {
|
|
1326
|
+
argumentsText: "",
|
|
1327
|
+
pendingArgumentDeltas: []
|
|
1328
|
+
}, toolDelta);
|
|
1329
|
+
const argsDelta = typeof toolDelta.function?.arguments === "string" && toolDelta.function.arguments.length > 0 ? toolDelta.function.arguments : null;
|
|
1330
|
+
const toolCallId = current.id;
|
|
1331
|
+
const toolName = current.name;
|
|
1332
|
+
if (toolCallId && toolName && !current.emittedStart) {
|
|
1333
|
+
yield createNcpEndpointEvent({
|
|
1334
|
+
type: NcpEventType.MessageToolCallStart,
|
|
1335
|
+
payload: {
|
|
1336
|
+
...this.ctx,
|
|
1337
|
+
toolCallId,
|
|
1338
|
+
toolName
|
|
1339
|
+
}
|
|
1340
|
+
});
|
|
1341
|
+
current.emittedStart = true;
|
|
1342
|
+
}
|
|
1343
|
+
if (argsDelta) if (current.emittedStart && current.id) {
|
|
1344
|
+
yield createNcpEndpointEvent({
|
|
1345
|
+
type: NcpEventType.MessageToolCallArgsDelta,
|
|
1346
|
+
payload: {
|
|
1347
|
+
...this.ctx,
|
|
1348
|
+
toolCallId: current.id,
|
|
1349
|
+
delta: argsDelta
|
|
1350
|
+
}
|
|
1351
|
+
});
|
|
1352
|
+
current.emittedArgsDelta = true;
|
|
1353
|
+
} else current.pendingArgumentDeltas = [...current.pendingArgumentDeltas ?? [], argsDelta];
|
|
1354
|
+
if (current.emittedStart && current.id && (current.pendingArgumentDeltas?.length ?? 0) > 0) {
|
|
1355
|
+
for (const pendingDelta of current.pendingArgumentDeltas ?? []) yield createNcpEndpointEvent({
|
|
1356
|
+
type: NcpEventType.MessageToolCallArgsDelta,
|
|
1357
|
+
payload: {
|
|
1358
|
+
...this.ctx,
|
|
1359
|
+
toolCallId: current.id,
|
|
1360
|
+
delta: pendingDelta
|
|
1361
|
+
}
|
|
1362
|
+
});
|
|
1363
|
+
current.emittedArgsDelta = true;
|
|
1364
|
+
current.pendingArgumentDeltas = [];
|
|
1365
|
+
}
|
|
1366
|
+
this.buffers.set(index, current);
|
|
1367
1367
|
}
|
|
1368
|
-
|
|
1368
|
+
};
|
|
1369
|
+
};
|
|
1370
|
+
function* emitToolCallDeltas(delta, buffers, ctx, options = {}) {
|
|
1371
|
+
yield* new ToolCallDeltaEmitter(buffers, ctx).emit(delta, options);
|
|
1372
|
+
}
|
|
1373
|
+
function isCompleteToolCallArgs(argumentsText) {
|
|
1374
|
+
const trimmed = argumentsText.trim();
|
|
1375
|
+
if (!trimmed) return false;
|
|
1376
|
+
try {
|
|
1377
|
+
const parsed = JSON.parse(trimmed);
|
|
1378
|
+
return Boolean(parsed) && typeof parsed === "object" && !Array.isArray(parsed);
|
|
1379
|
+
} catch {
|
|
1380
|
+
return false;
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
function* flushReadyToolCallsBeforeIndex(buffers, beforeIndex, ctx) {
|
|
1384
|
+
const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);
|
|
1385
|
+
for (const [index, buf] of ordered) {
|
|
1386
|
+
if (index >= beforeIndex || buf.emittedEnd || !buf.id || !buf.name) continue;
|
|
1387
|
+
if (!isCompleteToolCallArgs(buf.argumentsText)) continue;
|
|
1388
|
+
if (!buf.emittedArgsDelta) yield createNcpEndpointEvent({
|
|
1389
|
+
type: NcpEventType.MessageToolCallArgs,
|
|
1390
|
+
payload: {
|
|
1391
|
+
...ctx,
|
|
1392
|
+
toolCallId: buf.id,
|
|
1393
|
+
args: buf.argumentsText
|
|
1394
|
+
}
|
|
1395
|
+
});
|
|
1396
|
+
yield createNcpEndpointEvent({
|
|
1397
|
+
type: NcpEventType.MessageToolCallEnd,
|
|
1398
|
+
payload: {
|
|
1399
|
+
...ctx,
|
|
1400
|
+
toolCallId: buf.id
|
|
1401
|
+
}
|
|
1402
|
+
});
|
|
1403
|
+
buf.emittedEnd = true;
|
|
1369
1404
|
}
|
|
1370
1405
|
}
|
|
1371
1406
|
function* flushToolCalls(buffers, ctx) {
|
|
1372
1407
|
const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);
|
|
1373
1408
|
for (const [, buf] of ordered) {
|
|
1374
|
-
if (!buf.id || !buf.name) continue;
|
|
1375
|
-
if (!buf.emittedArgsDelta) yield {
|
|
1409
|
+
if (!buf.id || !buf.name || buf.emittedEnd) continue;
|
|
1410
|
+
if (!buf.emittedArgsDelta) yield createNcpEndpointEvent({
|
|
1376
1411
|
type: NcpEventType.MessageToolCallArgs,
|
|
1377
1412
|
payload: {
|
|
1378
1413
|
...ctx,
|
|
1379
1414
|
toolCallId: buf.id,
|
|
1380
1415
|
args: buf.argumentsText
|
|
1381
1416
|
}
|
|
1382
|
-
};
|
|
1383
|
-
yield {
|
|
1417
|
+
});
|
|
1418
|
+
yield createNcpEndpointEvent({
|
|
1384
1419
|
type: NcpEventType.MessageToolCallEnd,
|
|
1385
1420
|
payload: {
|
|
1386
1421
|
...ctx,
|
|
1387
1422
|
toolCallId: buf.id
|
|
1388
1423
|
}
|
|
1389
|
-
};
|
|
1424
|
+
});
|
|
1425
|
+
buf.emittedEnd = true;
|
|
1390
1426
|
}
|
|
1391
1427
|
}
|
|
1392
1428
|
function createStreamContentState(reasoningNormalizationMode) {
|
|
@@ -1501,15 +1537,17 @@ async function executeCollectedToolCall(options) {
|
|
|
1501
1537
|
}
|
|
1502
1538
|
}
|
|
1503
1539
|
//#endregion
|
|
1504
|
-
//#region src/runtime/stream-encoder.ts
|
|
1540
|
+
//#region src/runtime/stream-encoder.service.ts
|
|
1505
1541
|
/**
|
|
1506
1542
|
* Converts LLM stream chunks to NCP events (text, reasoning, tool calls).
|
|
1507
1543
|
* Does not emit RunFinished; that is the runtime's responsibility after the loop completes.
|
|
1508
1544
|
*/
|
|
1509
1545
|
var DefaultNcpStreamEncoder = class {
|
|
1510
1546
|
reasoningNormalizationMode;
|
|
1547
|
+
toolCallEndMode;
|
|
1511
1548
|
constructor(config = {}) {
|
|
1512
1549
|
this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? "off";
|
|
1550
|
+
this.toolCallEndMode = config.toolCallEndMode ?? "finish-only";
|
|
1513
1551
|
}
|
|
1514
1552
|
async *encode(stream, context) {
|
|
1515
1553
|
const { sessionId, messageId } = context;
|
|
@@ -1528,16 +1566,16 @@ var DefaultNcpStreamEncoder = class {
|
|
|
1528
1566
|
yield* emitReasoningDelta(delta, streamContext);
|
|
1529
1567
|
state = yield* emitTextDeltas(delta, streamContext, state);
|
|
1530
1568
|
state = yield* closeTextPartBeforeToolCalls(delta, streamContext, state);
|
|
1531
|
-
yield* emitToolCallDeltas(delta, toolCallBuffers, streamContext);
|
|
1569
|
+
yield* emitToolCallDeltas(delta, toolCallBuffers, streamContext, { flushReadyBeforeNextIndex: this.toolCallEndMode === "sequential-index" });
|
|
1532
1570
|
}
|
|
1533
1571
|
const finishReason = choice.finish_reason;
|
|
1534
1572
|
if (typeof finishReason === "string" && finishReason.trim().length > 0) {
|
|
1535
1573
|
state = yield* flushTextDeltas(streamContext, state);
|
|
1536
1574
|
yield* flushToolCalls(toolCallBuffers, streamContext);
|
|
1537
|
-
if (state.textStarted) yield {
|
|
1575
|
+
if (state.textStarted) yield createNcpEndpointEvent({
|
|
1538
1576
|
type: NcpEventType.MessageTextEnd,
|
|
1539
1577
|
payload: streamContext
|
|
1540
|
-
};
|
|
1578
|
+
});
|
|
1541
1579
|
}
|
|
1542
1580
|
}
|
|
1543
1581
|
}
|
|
@@ -1622,7 +1660,7 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1622
1660
|
this.streamEncoder = config.streamEncoder ?? new DefaultNcpStreamEncoder({ reasoningNormalizationMode: this.reasoningNormalizationMode });
|
|
1623
1661
|
}
|
|
1624
1662
|
run = async function* (input, options) {
|
|
1625
|
-
const
|
|
1663
|
+
const ctxBase = {
|
|
1626
1664
|
messageId: genId(),
|
|
1627
1665
|
runId: input.runId ?? genId(),
|
|
1628
1666
|
sessionId: input.sessionId,
|
|
@@ -1632,23 +1670,29 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1632
1670
|
const modelInput = this.contextBuilder.prepare(input, { sessionMessages });
|
|
1633
1671
|
for (const msg of input.messages) {
|
|
1634
1672
|
if (isHiddenNcpMessage(msg)) continue;
|
|
1635
|
-
const messageSent = {
|
|
1673
|
+
const messageSent = createNcpEndpointEvent({
|
|
1636
1674
|
type: NcpEventType.MessageSent,
|
|
1637
1675
|
payload: {
|
|
1638
1676
|
sessionId: input.sessionId,
|
|
1639
1677
|
message: msg
|
|
1640
1678
|
}
|
|
1641
|
-
};
|
|
1679
|
+
});
|
|
1642
1680
|
await this.stateManager.dispatch(messageSent);
|
|
1643
1681
|
}
|
|
1644
|
-
const
|
|
1682
|
+
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1683
|
+
const ctx = {
|
|
1684
|
+
...ctxBase,
|
|
1685
|
+
startedAt
|
|
1686
|
+
};
|
|
1687
|
+
const runStarted = createNcpEndpointEvent({
|
|
1645
1688
|
type: NcpEventType.RunStarted,
|
|
1646
1689
|
payload: {
|
|
1647
1690
|
sessionId: ctx.sessionId,
|
|
1648
1691
|
messageId: ctx.messageId,
|
|
1649
|
-
runId: ctx.runId
|
|
1692
|
+
runId: ctx.runId,
|
|
1693
|
+
startedAt: ctx.startedAt
|
|
1650
1694
|
}
|
|
1651
|
-
};
|
|
1695
|
+
}, ctx.startedAt);
|
|
1652
1696
|
await this.stateManager.dispatch(runStarted);
|
|
1653
1697
|
yield runStarted;
|
|
1654
1698
|
for await (const event of this.runLoop(modelInput, ctx, options)) {
|
|
@@ -1674,7 +1718,7 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1674
1718
|
for (const toolCall of roundCollector.getToolCalls()) {
|
|
1675
1719
|
const toolResult = this.toolResultContentManager.normalizeToolCallResult(await this.executeToolCall(toolCall, ctx));
|
|
1676
1720
|
toolResults.push(toolResult);
|
|
1677
|
-
yield {
|
|
1721
|
+
yield createNcpEndpointEvent({
|
|
1678
1722
|
type: NcpEventType.MessageToolCallResult,
|
|
1679
1723
|
payload: {
|
|
1680
1724
|
sessionId: ctx.sessionId,
|
|
@@ -1682,17 +1726,20 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1682
1726
|
content: toolResult.result,
|
|
1683
1727
|
contentItems: toolResult.contentItems
|
|
1684
1728
|
}
|
|
1685
|
-
};
|
|
1729
|
+
});
|
|
1686
1730
|
}
|
|
1687
1731
|
if (toolResults.length === 0) {
|
|
1688
|
-
|
|
1732
|
+
const endedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1733
|
+
yield createNcpEndpointEvent({
|
|
1689
1734
|
type: NcpEventType.RunFinished,
|
|
1690
1735
|
payload: {
|
|
1691
1736
|
sessionId: ctx.sessionId,
|
|
1692
1737
|
messageId: ctx.messageId,
|
|
1693
|
-
runId: ctx.runId
|
|
1738
|
+
runId: ctx.runId,
|
|
1739
|
+
startedAt: ctx.startedAt,
|
|
1740
|
+
endedAt
|
|
1694
1741
|
}
|
|
1695
|
-
};
|
|
1742
|
+
}, endedAt);
|
|
1696
1743
|
done = true;
|
|
1697
1744
|
break;
|
|
1698
1745
|
}
|
|
@@ -1712,7 +1759,7 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1712
1759
|
rawArgsText: toolCall.args,
|
|
1713
1760
|
result: updatedResult
|
|
1714
1761
|
});
|
|
1715
|
-
await this.stateManager.dispatch({
|
|
1762
|
+
await this.stateManager.dispatch(createNcpEndpointEvent({
|
|
1716
1763
|
type: NcpEventType.MessageToolCallResult,
|
|
1717
1764
|
payload: {
|
|
1718
1765
|
sessionId: ctx.sessionId,
|
|
@@ -1721,7 +1768,7 @@ var DefaultNcpAgentRuntime = class {
|
|
|
1721
1768
|
contentItems: normalized.contentItems,
|
|
1722
1769
|
correlationId: ctx.correlationId
|
|
1723
1770
|
}
|
|
1724
|
-
});
|
|
1771
|
+
}));
|
|
1725
1772
|
};
|
|
1726
1773
|
return tool ? await tool.execute(args, {
|
|
1727
1774
|
toolCallId: toolCall.toolCallId,
|
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 = 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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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["LARGE_INLINE_PAYLOAD_CHARS","DEFAULT_MAX_MODEL_VISIBLE_IMAGES","DEFAULT_MAX_ARRAY_ITEMS","DEFAULT_MAX_OBJECT_KEYS","DEFAULT_MAX_DEPTH","readOptionalString","isRecord","isRecord","createStreamEvent","createStreamEvent","createRuntimeEvent"],"sources":["../src/tool-result/tool-result-content.utils.ts","../src/tool-result/tool-result-image.service.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/user-content.utils.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/runtime.utils.ts","../src/runtime/context-builder.service.ts","../src/assets/stores/local-asset.store.ts","../src/runtime/round-buffer.ts","../src/runtime/stream-encoder.utils.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/tool-registry.manager.ts","../src/runtime/llm-api-echo.ts","../src/runtime/agent-runtime.service.ts"],"sourcesContent":["const LARGE_INLINE_PAYLOAD_CHARS = 2_048;\n\nexport type SafeSerializedValue = {\n text: string;\n ok: boolean;\n};\n\nexport function sanitizePositiveInt(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : fallback;\n}\n\nexport function serializeValue(value: unknown): SafeSerializedValue {\n if (typeof value === \"string\") {\n return { text: value, ok: true };\n }\n try {\n return { text: JSON.stringify(value ?? null), ok: true };\n } catch (error) {\n return {\n text: `[unserializable tool result: ${error instanceof Error ? error.message : String(error)}]`,\n ok: false,\n };\n }\n}\n\nexport function truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) {\n return value;\n }\n if (maxChars <= 0) {\n return \"\";\n }\n const marker = \"\\n... [truncated] ...\\n\";\n if (maxChars <= marker.length) {\n return value.slice(0, maxChars);\n }\n const keepChars = maxChars - marker.length;\n const headChars = Math.ceil(keepChars / 2);\n const tailChars = Math.floor(keepChars / 2);\n return `${value.slice(0, headChars)}${marker}${value.slice(value.length - tailChars)}`;\n}\n\nexport function isLargeDataUrl(value: string): boolean {\n return value.length > LARGE_INLINE_PAYLOAD_CHARS && /^data:[^,]+;base64,/i.test(value);\n}\n\nexport function readDataUrlMime(value: string): string {\n const match = /^data:([^;,]+)/i.exec(value);\n return match?.[1] ?? \"application/octet-stream\";\n}\n\nexport function isLargeBase64LikeString(value: string): boolean {\n if (value.length <= LARGE_INLINE_PAYLOAD_CHARS) {\n return false;\n }\n const compact = value.replace(/\\s+/g, \"\");\n return compact.length > LARGE_INLINE_PAYLOAD_CHARS && /^[A-Za-z0-9+/=_-]+$/.test(compact);\n}\n\nexport function isBinaryLike(value: object): boolean {\n return value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\n\nexport function getBinaryByteLength(value: object): number {\n if (value instanceof ArrayBuffer) {\n return value.byteLength;\n }\n if (ArrayBuffer.isView(value)) {\n return value.byteLength;\n }\n return 0;\n}\n\nexport function readStringField(value: Record<string, unknown>, key: string): string | null {\n const field = value[key];\n return typeof field === \"string\" && field.length > 0 ? field : null;\n}\n","import type {\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIContentPart,\n} from \"@nextclaw/ncp\";\n\nimport {\n isBinaryLike,\n isLargeDataUrl,\n readDataUrlMime,\n readStringField,\n sanitizePositiveInt,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\n\nconst LARGE_INLINE_PAYLOAD_CHARS = 2_048;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\n\ntype ImageCollectionContext = {\n depth: number;\n};\n\nexport type ToolResultImageServiceOptions = {\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\nexport class ToolResultImageService {\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n\n constructor(options: ToolResultImageServiceOptions = {}) {\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n }\n\n extractImageItems = (value: unknown): NcpToolOutputImageItem[] => {\n const images: NcpToolOutputImageItem[] = [];\n this.collectImageItems(value, images, { depth: 0 });\n return images;\n };\n\n readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => {\n if (!contentItems) {\n return [];\n }\n return contentItems\n .filter((item): item is NcpToolOutputImageItem => item.type === \"input_image\")\n .slice(0, this.maxModelVisibleImages);\n };\n\n toOpenAiImagePart = (item: NcpToolOutputImageItem): OpenAIContentPart => ({\n type: \"image_url\",\n image_url: {\n url: item.imageUrl,\n ...(item.detail ? { detail: toOpenAiImageDetail(item.detail) } : {}),\n },\n });\n\n summarizeImageContentItem = (value: Record<string, unknown>): Record<string, unknown> | null => {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n return {\n type: \"image\",\n mimeType: readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\"),\n detail: readImageDetail(value),\n dataOmitted: true,\n originalDataChars: readStringField(value, \"data\")?.length ?? 0,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n return {\n type,\n imageUrl: imageUrl ? redactImageUrl(imageUrl) : undefined,\n detail: readImageDetail(value),\n };\n }\n return null;\n };\n\n private readonly collectImageItems = (\n value: unknown,\n output: NcpToolOutputImageItem[],\n context: ImageCollectionContext,\n ): void => {\n if (output.length >= this.maxModelVisibleImages || context.depth > this.maxDepth) {\n return;\n }\n if (typeof value === \"string\") {\n const image = imageDataUrlToContentItem(value);\n if (image) {\n output.push(image);\n }\n return;\n }\n if (!value || typeof value !== \"object\" || isBinaryLike(value)) {\n return;\n }\n if (Array.isArray(value)) {\n value\n .slice(0, this.maxArrayItems)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n return;\n }\n const image = readImageContentItem(value as Record<string, unknown>);\n if (image) {\n output.push(image);\n return;\n }\n Object.values(value as Record<string, unknown>)\n .slice(0, this.maxObjectKeys)\n .forEach((item) => this.collectImageItems(item, output, { depth: context.depth + 1 }));\n };\n}\n\nfunction imageDataUrlToContentItem(value: string): NcpToolOutputImageItem | null {\n if (!/^data:image\\/[^,]+;base64,/i.test(value)) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: value,\n mimeType: readDataUrlMime(value),\n originalDataChars: value.length,\n };\n}\n\nfunction readImageContentItem(value: Record<string, unknown>): NcpToolOutputImageItem | null {\n const type = readStringField(value, \"type\");\n if (type === \"image\") {\n const data = readStringField(value, \"data\");\n const mimeType =\n readStringField(value, \"mimeType\") ?? readStringField(value, \"mime_type\") ?? \"image/png\";\n if (!data) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl: `data:${mimeType};base64,${data}`,\n mimeType,\n detail: readImageDetail(value),\n originalDataChars: data.length,\n };\n }\n if (type === \"input_image\" || type === \"image_url\") {\n const imageUrl = readImageUrl(value);\n if (!imageUrl) {\n return null;\n }\n return {\n type: \"input_image\",\n imageUrl,\n detail: readImageDetail(value),\n };\n }\n return null;\n}\n\nfunction toOpenAiImageDetail(\n detail: NcpToolOutputImageItem[\"detail\"],\n): \"low\" | \"high\" | \"auto\" | undefined {\n if (detail === \"low\" || detail === \"high\" || detail === \"auto\") {\n return detail;\n }\n if (detail === \"original\") {\n return \"high\";\n }\n return undefined;\n}\n\nfunction readImageDetail(\n value: Record<string, unknown>,\n): \"low\" | \"high\" | \"auto\" | \"original\" | undefined {\n const direct = readStringField(value, \"detail\");\n if (isImageDetail(direct)) {\n return direct;\n }\n const meta = value._meta;\n if (!meta || typeof meta !== \"object\" || Array.isArray(meta)) {\n return undefined;\n }\n const codexDetail = readStringField(meta as Record<string, unknown>, \"codex/imageDetail\");\n return isImageDetail(codexDetail) ? codexDetail : undefined;\n}\n\nfunction isImageDetail(value: string | null): value is \"low\" | \"high\" | \"auto\" | \"original\" {\n return value === \"low\" || value === \"high\" || value === \"auto\" || value === \"original\";\n}\n\nfunction readImageUrl(value: Record<string, unknown>): string | null {\n const direct = readStringField(value, \"image_url\");\n if (direct) {\n return direct;\n }\n const nested = value.image_url;\n if (!nested || typeof nested !== \"object\" || Array.isArray(nested)) {\n return null;\n }\n return readStringField(nested as Record<string, unknown>, \"url\");\n}\n\nfunction redactImageUrl(value: string): string {\n if (isLargeDataUrl(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n return value.length > LARGE_INLINE_PAYLOAD_CHARS\n ? truncateMiddle(value, LARGE_INLINE_PAYLOAD_CHARS)\n : value;\n}\n","import type {\n NcpLLMApiInput,\n NcpToolCallResult,\n NcpToolOutputContentItem,\n NcpToolOutputImageItem,\n OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\n\nimport {\n getBinaryByteLength,\n isBinaryLike,\n isLargeBase64LikeString,\n readDataUrlMime,\n sanitizePositiveInt,\n serializeValue,\n truncateMiddle,\n} from \"./tool-result-content.utils.js\";\nimport { ToolResultImageService } from \"./tool-result-image.service.js\";\n\nconst DEFAULT_MAX_MODEL_VISIBLE_CHARS = 60_000;\nconst DEFAULT_MAX_TOOL_MESSAGES_CHARS = 60_000;\nconst DEFAULT_MAX_STRING_VALUE_CHARS = 60_000;\nconst DEFAULT_MAX_MODEL_VISIBLE_IMAGES = 4;\nconst DEFAULT_MAX_ARRAY_ITEMS = 50;\nconst DEFAULT_MAX_OBJECT_KEYS = 80;\nconst DEFAULT_MAX_DEPTH = 8;\nconst TRUNCATION_MARKER = \"[NextClaw tool result truncated]\";\n\ntype ToolResultContentContext = {\n toolCallId?: string;\n toolName?: string;\n};\n\nexport type ToolResultContentManagerOptions = {\n maxModelVisibleChars?: number;\n maxToolMessagesChars?: number;\n maxStringValueChars?: number;\n maxModelVisibleImages?: number;\n maxArrayItems?: number;\n maxObjectKeys?: number;\n maxDepth?: number;\n};\n\ntype RedactContext = {\n depth: number;\n};\n\ntype NormalizeOutcome = {\n value: unknown;\n changed: boolean;\n};\n\nexport class ToolResultContentManager {\n private readonly maxModelVisibleChars: number;\n private readonly maxToolMessagesChars: number;\n private readonly maxStringValueChars: number;\n private readonly maxModelVisibleImages: number;\n private readonly maxArrayItems: number;\n private readonly maxObjectKeys: number;\n private readonly maxDepth: number;\n private readonly imageService: ToolResultImageService;\n\n constructor(options: ToolResultContentManagerOptions = {}) {\n this.maxModelVisibleChars = sanitizePositiveInt(\n options.maxModelVisibleChars,\n DEFAULT_MAX_MODEL_VISIBLE_CHARS,\n );\n this.maxToolMessagesChars = sanitizePositiveInt(\n options.maxToolMessagesChars,\n DEFAULT_MAX_TOOL_MESSAGES_CHARS,\n );\n this.maxStringValueChars = sanitizePositiveInt(\n options.maxStringValueChars,\n DEFAULT_MAX_STRING_VALUE_CHARS,\n );\n this.maxModelVisibleImages = sanitizePositiveInt(\n options.maxModelVisibleImages,\n DEFAULT_MAX_MODEL_VISIBLE_IMAGES,\n );\n this.maxArrayItems = sanitizePositiveInt(options.maxArrayItems, DEFAULT_MAX_ARRAY_ITEMS);\n this.maxObjectKeys = sanitizePositiveInt(options.maxObjectKeys, DEFAULT_MAX_OBJECT_KEYS);\n this.maxDepth = sanitizePositiveInt(options.maxDepth, DEFAULT_MAX_DEPTH);\n this.imageService = new ToolResultImageService({\n maxModelVisibleImages: this.maxModelVisibleImages,\n maxArrayItems: this.maxArrayItems,\n maxObjectKeys: this.maxObjectKeys,\n maxDepth: this.maxDepth,\n });\n }\n\n normalizeToolCallResult = (result: NcpToolCallResult): NcpToolCallResult => {\n const context = {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n };\n const normalized = this.normalizeResult(result.result, {\n toolCallId: result.toolCallId,\n toolName: result.toolName,\n });\n const contentItems = this.buildContentItems(result.result, normalized.value, context);\n return {\n ...result,\n ...(normalized.changed ? { result: normalized.value } : {}),\n contentItems,\n };\n };\n\n compactInput = (input: NcpLLMApiInput): NcpLLMApiInput => ({\n ...input,\n messages: this.compactToolMessages(input.messages),\n });\n\n toModelContent = (result: unknown, context: ToolResultContentContext = {}): string => {\n const normalized = this.normalizeResult(result, context);\n const serialized = serializeValue(normalized.value);\n if (serialized.text.length <= this.maxModelVisibleChars) {\n return serialized.text;\n }\n return this.boundModelContentText(\n JSON.stringify(\n this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: serialized.text,\n }),\n ),\n );\n };\n\n toVisualObservationMessages = (\n toolResults: ReadonlyArray<NcpToolCallResult>,\n ): OpenAIChatMessage[] => {\n return toolResults.flatMap((result) => {\n const images = this.readVisibleImages(result.contentItems);\n if (images.length === 0) {\n return [];\n }\n return [this.buildVisualObservationMessage(result, images)];\n });\n };\n\n private readonly normalizeResult = (\n result: unknown,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n if (typeof result === \"string\") {\n return this.normalizeStringResult(result, context);\n }\n\n const serialized = serializeValue(result);\n const containsImageContent = this.imageService.extractImageItems(result).length > 0;\n if (\n serialized.ok &&\n serialized.text.length <= this.maxModelVisibleChars &&\n !containsImageContent\n ) {\n return { value: result, changed: false };\n }\n\n const redacted = this.redactValue(result, { depth: 0 });\n const redactedSerialized = serializeValue(redacted);\n if (redactedSerialized.text.length <= this.maxModelVisibleChars) {\n return {\n value: this.attachNotice(redacted, {\n context,\n originalSerializedChars: serialized.text.length,\n }),\n changed: true,\n };\n }\n\n return {\n value: this.buildEnvelope({\n context,\n originalSerializedChars: serialized.text.length,\n previewSource: redactedSerialized.text,\n }),\n changed: true,\n };\n };\n\n private readonly buildContentItems = (\n rawResult: unknown,\n normalizedResult: unknown,\n context: ToolResultContentContext,\n ): NcpToolOutputContentItem[] => {\n const text = this.toModelContent(normalizedResult, context);\n return [\n { type: \"input_text\", text },\n ...this.imageService.extractImageItems(rawResult).slice(0, this.maxModelVisibleImages),\n ];\n };\n\n private readonly readVisibleImages = (\n contentItems: ReadonlyArray<NcpToolOutputContentItem> | undefined,\n ): NcpToolOutputImageItem[] => this.imageService.readVisibleImages(contentItems);\n\n private readonly buildVisualObservationMessage = (\n toolResult: NcpToolCallResult,\n images: NcpToolOutputImageItem[],\n ): OpenAIChatMessage => {\n const imageParts = images.map(this.imageService.toOpenAiImagePart);\n const omittedCount = Math.max(\n 0,\n (toolResult.contentItems ?? []).filter((item) => item.type === \"input_image\").length -\n imageParts.length,\n );\n return {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: [\n `Tool \"${toolResult.toolName}\" returned ${imageParts.length} image(s).`,\n \"Use the attached image content as the visual observation for the preceding tool result.\",\n omittedCount > 0 ? `${omittedCount} additional image(s) were omitted by budget.` : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n },\n ...imageParts,\n ],\n };\n };\n\n private readonly compactToolMessages = (\n messages: ReadonlyArray<OpenAIChatMessage>,\n ): OpenAIChatMessage[] => {\n let remainingChars = this.maxToolMessagesChars;\n const output = messages.slice();\n for (let index = output.length - 1; index >= 0; index -= 1) {\n const message = output[index];\n if (message.role !== \"tool\") {\n continue;\n }\n const compacted = this.compactToolMessage(message, remainingChars);\n output[index] = compacted.message;\n remainingChars = compacted.remainingChars;\n }\n return output;\n };\n\n private readonly compactToolMessage = (\n message: Extract<OpenAIChatMessage, { role: \"tool\" }>,\n remainingChars: number,\n ): { message: OpenAIChatMessage; remainingChars: number } => {\n if (message.content.length <= remainingChars) {\n return {\n message,\n remainingChars: remainingChars - message.content.length,\n };\n }\n const content =\n remainingChars >= 1_000\n ? truncateMiddle(message.content, remainingChars)\n : this.buildOmittedHistoricalToolResult(message.content.length);\n return {\n message: { ...message, content },\n remainingChars: Math.max(0, remainingChars - content.length),\n };\n };\n\n private readonly normalizeStringResult = (\n result: string,\n context: ToolResultContentContext,\n ): NormalizeOutcome => {\n const redacted = this.redactString(result);\n if (redacted.length <= this.maxModelVisibleChars && redacted === result) {\n return { value: result, changed: false };\n }\n if (redacted.length <= this.maxModelVisibleChars) {\n return {\n value: this.buildStringNotice(context, result.length, redacted),\n changed: true,\n };\n }\n return {\n value: this.buildStringNotice(\n context,\n result.length,\n truncateMiddle(redacted, this.maxModelVisibleChars),\n ),\n changed: true,\n };\n };\n\n private readonly redactValue = (value: unknown, context: RedactContext): unknown => {\n if (typeof value === \"string\") {\n return this.redactString(value);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n const imageSummary = this.imageService.summarizeImageContentItem(\n value as Record<string, unknown>,\n );\n if (imageSummary) {\n return imageSummary;\n }\n if (isBinaryLike(value)) {\n return `[omitted binary payload: bytes=${getBinaryByteLength(value)}]`;\n }\n if (context.depth >= this.maxDepth) {\n return `[omitted nested ${Array.isArray(value) ? \"array\" : \"object\"} beyond depth ${this.maxDepth}]`;\n }\n if (Array.isArray(value)) {\n return this.redactArray(value, context);\n }\n return this.redactObject(value as Record<string, unknown>, context);\n };\n\n private readonly redactArray = (value: unknown[], context: RedactContext): unknown[] => {\n const visibleItems = value\n .slice(0, this.maxArrayItems)\n .map((item) => this.redactValue(item, { depth: context.depth + 1 }));\n if (value.length <= this.maxArrayItems) {\n return visibleItems;\n }\n return [\n ...visibleItems,\n `[omitted ${value.length - this.maxArrayItems} array items from tool result]`,\n ];\n };\n\n private readonly redactObject = (\n value: Record<string, unknown>,\n context: RedactContext,\n ): Record<string, unknown> => {\n const entries = Object.entries(value);\n const visibleEntries = entries.slice(0, this.maxObjectKeys);\n const output = Object.fromEntries(\n visibleEntries.map(([key, item]) => [\n key,\n this.redactValue(item, { depth: context.depth + 1 }),\n ]),\n );\n if (entries.length > this.maxObjectKeys) {\n output._nextclawOmittedKeys = entries.length - this.maxObjectKeys;\n }\n return output;\n };\n\n private readonly redactString = (value: string): string => {\n if (/^data:[^,]+;base64,/i.test(value)) {\n return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;\n }\n if (isLargeBase64LikeString(value)) {\n return `[omitted base64-like payload: originalChars=${value.length}]`;\n }\n if (value.length <= this.maxStringValueChars) {\n return value;\n }\n return truncateMiddle(value, this.maxStringValueChars);\n };\n\n private readonly attachNotice = (\n value: unknown,\n params: { context: ToolResultContentContext; originalSerializedChars: number },\n ): unknown => {\n const notice = this.buildNotice(params.context, params.originalSerializedChars);\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return {\n ...(value as Record<string, unknown>),\n _nextclawToolResultNotice: notice,\n };\n }\n return {\n type: \"nextclaw.tool_result_sanitized\",\n notice,\n result: value,\n };\n };\n\n private readonly buildEnvelope = (params: {\n context: ToolResultContentContext;\n originalSerializedChars: number;\n previewSource: string;\n }): Record<string, unknown> => {\n const { context, originalSerializedChars, previewSource } = params;\n return {\n type: \"nextclaw.tool_result_truncated\",\n notice: this.buildNotice(context, originalSerializedChars),\n originalSerializedChars,\n visibleLimitChars: this.maxModelVisibleChars,\n preview: truncateMiddle(\n previewSource,\n Math.max(1_000, this.maxModelVisibleChars - 1_000),\n ),\n };\n };\n\n private readonly buildStringNotice = (\n context: ToolResultContentContext,\n originalChars: number,\n preview: string,\n ): string =>\n [\n TRUNCATION_MARKER,\n this.buildNotice(context, originalChars),\n \"\",\n preview,\n ].join(\"\\n\");\n\n private readonly buildNotice = (\n context: ToolResultContentContext,\n originalSerializedChars: number,\n ): string => {\n const { toolCallId: rawToolCallId, toolName: rawToolName } = context;\n const toolName = rawToolName ? ` tool=${rawToolName}` : \"\";\n const toolCallId = rawToolCallId ? ` toolCallId=${rawToolCallId}` : \"\";\n return `${TRUNCATION_MARKER}${toolName}${toolCallId} originalSerializedChars=${originalSerializedChars} visibleLimitChars=${this.maxModelVisibleChars}`;\n };\n\n private readonly buildOmittedHistoricalToolResult = (originalChars: number): string =>\n `${TRUNCATION_MARKER} older tool result omitted from active model context originalChars=${originalChars}`;\n\n private readonly boundModelContentText = (value: string): string => {\n if (value.length <= this.maxModelVisibleChars) {\n return value;\n }\n return truncateMiddle(value, this.maxModelVisibleChars);\n };\n}\n\nexport const defaultToolResultContentManager = new ToolResultContentManager();\n","import { readFileSync } from \"node:fs\";\nimport type { NcpMessagePart, OpenAIContentPart } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction formatAssetReferenceBlock(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n url?: string | null;\n sizeBytes?: number;\n}): string {\n const { fileName: rawFileName, mimeType: rawMimeType, assetUri: rawAssetUri, url: rawUrl, sizeBytes } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const url = readOptionalString(rawUrl);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Asset: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n ...(url ? [`[Preview URL: ${url}]`] : []),\n \"[Instruction: This file is not embedded in the prompt. If you need to inspect or transform it, use asset_export to copy it to a normal file path first.]\",\n ];\n return lines.join(\"\\n\");\n}\n\ntype ResolvedFilePart = {\n fileName: string;\n mimeType: string;\n assetUri: string | null;\n url: string | null;\n contentBase64: string | null;\n sizeBytes?: number;\n contentPath: string | null;\n};\n\nfunction resolveFilePart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): ResolvedFilePart {\n const assetUri = readOptionalString(part.assetUri);\n const stored = assetUri ? assetStore?.getByUri(assetUri) : null;\n return {\n fileName: readOptionalString(stored?.fileName) ?? readOptionalString(part.name) ?? \"asset\",\n mimeType:\n readOptionalString(stored?.mimeType) ??\n readOptionalString(part.mimeType) ??\n \"application/octet-stream\",\n assetUri,\n url: readOptionalString(part.url),\n contentBase64: readOptionalString(part.contentBase64),\n sizeBytes: stored?.sizeBytes ?? (typeof part.sizeBytes === \"number\" ? part.sizeBytes : undefined),\n contentPath: assetUri ? assetStore?.resolveContentPath(assetUri) ?? null : null,\n };\n}\n\nfunction formatImageAttachmentHint(params: {\n fileName?: string | null;\n mimeType?: string | null;\n assetUri?: string | null;\n sizeBytes?: number;\n}): string {\n const {\n fileName: rawFileName,\n mimeType: rawMimeType,\n assetUri: rawAssetUri,\n sizeBytes,\n } = params;\n const fileName = readOptionalString(rawFileName) ?? \"asset\";\n const mimeType = readOptionalString(rawMimeType) ?? \"application/octet-stream\";\n const assetUri = readOptionalString(rawAssetUri);\n const sizeText =\n typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)\n ? String(sizeBytes)\n : null;\n\n const lines = [\n `[Attached Image: ${fileName}]`,\n `[MIME: ${mimeType}]`,\n ...(assetUri ? [`[Asset URI: ${assetUri}]`] : []),\n ...(sizeText ? [`[Size Bytes: ${sizeText}]`] : []),\n assetUri\n ? \"[Instruction: This image is embedded in the prompt. If you need to transform or process the original file with tools, use the asset URI.]\"\n : \"[Instruction: This image is embedded in the prompt.]\",\n ];\n return lines.join(\"\\n\");\n}\n\nfunction isImageMimeType(value: string | null): boolean {\n return value?.startsWith(\"image/\") ?? false;\n}\n\nfunction isModelReachableImageUrl(value: string | null): value is string {\n return value !== null && (/^https?:\\/\\//i.test(value) || /^data:/i.test(value));\n}\n\nfunction buildImageDataUrl(mimeType: string, bytes: Uint8Array): string {\n return `data:${mimeType};base64,${Buffer.from(bytes).toString(\"base64\")}`;\n}\n\nfunction resolveImageContentPart(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): OpenAIContentPart | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n if (resolved.contentBase64) {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${resolved.mimeType};base64,${resolved.contentBase64}`,\n },\n };\n }\n\n if (resolved.contentPath) {\n return {\n type: \"image_url\",\n image_url: {\n url: buildImageDataUrl(resolved.mimeType, readFileSync(resolved.contentPath)),\n },\n };\n }\n\n const reachableImageUrl = resolved.url;\n if (isModelReachableImageUrl(reachableImageUrl)) {\n return {\n type: \"image_url\",\n image_url: {\n url: reachableImageUrl,\n },\n };\n }\n\n return null;\n}\n\nfunction resolveImageAttachmentHint(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n if (!isImageMimeType(resolved.mimeType)) {\n return null;\n }\n\n return formatImageAttachmentHint({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n sizeBytes: resolved.sizeBytes,\n });\n}\n\nfunction resolveAssetReferenceBlock(\n part: Extract<NcpMessagePart, { type: \"file\" }>,\n assetStore?: LocalAssetStore | null,\n): string | null {\n const resolved = resolveFilePart(part, assetStore);\n\n if (resolved.assetUri) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n assetUri: resolved.assetUri,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n if (resolved.url || resolved.contentBase64) {\n return formatAssetReferenceBlock({\n fileName: resolved.fileName,\n mimeType: resolved.mimeType,\n url: resolved.url,\n sizeBytes: resolved.sizeBytes,\n });\n }\n\n return null;\n}\n\nexport function buildNcpUserContent(\n parts: NcpMessagePart[],\n options: {\n assetStore?: LocalAssetStore | null;\n } = {},\n): string | OpenAIContentPart[] {\n const content: OpenAIContentPart[] = [];\n\n for (const part of parts) {\n if ((part.type === \"text\" || part.type === \"rich-text\") && part.text.trim().length > 0) {\n content.push({ type: \"text\", text: part.text });\n continue;\n }\n\n if (part.type !== \"file\") {\n continue;\n }\n\n const imageContentPart = resolveImageContentPart(part, options.assetStore);\n if (imageContentPart) {\n content.push(imageContentPart);\n const imageAttachmentHint = resolveImageAttachmentHint(part, options.assetStore);\n if (imageAttachmentHint) {\n content.push({ type: \"text\", text: imageAttachmentHint });\n }\n continue;\n }\n\n const assetReferenceBlock = resolveAssetReferenceBlock(part, options.assetStore);\n if (assetReferenceBlock) {\n content.push({ type: \"text\", text: assetReferenceBlock });\n }\n }\n\n if (content.length === 0) {\n return \"\";\n }\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text;\n }\n return content;\n}\n","import {\n sanitizeAssistantReplyTags,\n type NcpMessage,\n type NcpMessagePart,\n type NcpToolOutputContentItem,\n type OpenAIChatMessage,\n} from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../../assets/stores/local-asset.store.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../../tool-result/tool-result-content.manager.js\";\nimport { buildNcpUserContent } from \"../user-content.utils.js\";\n\nexport type NcpMessageToOpenAiMessagesOptions = {\n assetStore?: LocalAssetStore | null;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isTextLikePart(part: NcpMessagePart): part is Extract<NcpMessagePart, { type: \"text\" | \"rich-text\" }> {\n return part.type === \"text\" || part.type === \"rich-text\";\n}\n\nfunction readText(parts: readonly NcpMessagePart[]): string {\n return parts.filter(isTextLikePart).map((part) => part.text).join(\"\");\n}\n\nexport function ncpMessageToOpenAiMessages(\n rawMessage: NcpMessage,\n options: NcpMessageToOpenAiMessagesOptions = {},\n): OpenAIChatMessage[] {\n const message =\n rawMessage.role === \"assistant\" ? sanitizeAssistantReplyTags(rawMessage) : rawMessage;\n const parts = message.parts ?? [];\n\n if (message.role === \"user\") {\n return [\n {\n role: \"user\",\n content: buildNcpUserContent(parts, {\n assetStore: options.assetStore,\n }),\n },\n ];\n }\n\n if (message.role === \"system\" || message.role === \"service\") {\n return [{ role: \"system\", content: readText(parts) }];\n }\n\n if (message.role === \"tool\") {\n return [\n {\n role: \"tool\",\n content: readText(parts),\n tool_call_id: message.id,\n },\n ];\n }\n\n if (message.role !== \"assistant\") {\n return [];\n }\n\n const texts: string[] = [];\n const reasonings: string[] = [];\n const toolInvocations: Array<{\n toolCallId: string;\n toolName: string;\n args: unknown;\n result: unknown;\n resultContentItems?: NcpToolOutputContentItem[];\n }> = [];\n\n for (const part of parts) {\n if (part.type === \"reasoning\") {\n reasonings.push(part.text);\n }\n if (part.type === \"text\") {\n texts.push(part.text);\n }\n if (part.type === \"tool-invocation\" && part.state === \"result\" && part.result !== undefined) {\n toolInvocations.push({\n toolCallId: part.toolCallId ?? \"\",\n toolName: part.toolName,\n args: part.args ?? {},\n result: part.result,\n resultContentItems: part.resultContentItems,\n });\n }\n }\n\n const text = texts.join(\"\");\n const reasoning = reasonings.join(\"\");\n const toolResultContentManager =\n options.toolResultContentManager ?? defaultToolResultContentManager;\n\n if (toolInvocations.length === 0) {\n return [\n {\n role: \"assistant\",\n content: text,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n },\n ];\n }\n\n return [\n {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolInvocations.map((toolInvocation) => ({\n id: toolInvocation.toolCallId,\n type: \"function\" as const,\n function: {\n name: toolInvocation.toolName,\n arguments:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n },\n })),\n },\n ...toolInvocations.map((toolInvocation): OpenAIChatMessage => ({\n role: \"tool\",\n content: toolResultContentManager.toModelContent(toolInvocation.result, {\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n }),\n tool_call_id: toolInvocation.toolCallId,\n })),\n ...toolResultContentManager.toVisualObservationMessages(\n toolInvocations.map((toolInvocation) => ({\n toolCallId: toolInvocation.toolCallId,\n toolName: toolInvocation.toolName,\n args: isRecord(toolInvocation.args)\n ? (toolInvocation.args as Record<string, unknown>)\n : null,\n rawArgsText:\n typeof toolInvocation.args === \"string\"\n ? toolInvocation.args\n : JSON.stringify(toolInvocation.args ?? {}),\n result: toolInvocation.result,\n contentItems: toolInvocation.resultContentItems,\n })),\n ),\n ];\n}\n","import AjvPkg, { type ErrorObject, type ValidateFunction } from \"ajv\";\nimport type {\n NcpInvalidToolArgumentsResult,\n NcpLLMApiInput,\n NcpToolDefinition,\n NcpToolCallResult,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\nexport type ParsedToolArgs =\n | {\n ok: true;\n rawText: string;\n value: Record<string, unknown>;\n }\n | {\n ok: false;\n rawText: string;\n issues: string[];\n };\n\nconst AjvCtor = AjvPkg as unknown as new (opts?: object) => AjvLike;\n\ntype AjvLike = {\n compile: (schema: Record<string, unknown>) => ValidateFunction;\n};\n\nconst toolSchemaValidator = new AjvCtor({\n allErrors: true,\n strict: false,\n removeAdditional: false,\n});\nconst validatorCache = new WeakMap<Record<string, unknown>, ValidateFunction>();\nconst DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS = [\n \"oneOf\",\n \"anyOf\",\n \"allOf\",\n \"enum\",\n \"not\",\n] as const;\n\nexport function genId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringifyRawArgs(args: unknown): string {\n if (typeof args === \"string\") {\n return args;\n }\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n try {\n return JSON.stringify(args);\n } catch {\n return \"[unserializable-object]\";\n }\n }\n return String(args ?? \"\");\n}\n\nexport function getOpenAiFunctionParametersSchemaIssues(\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return ['parameters must be declared as a JSON Schema object'];\n }\n if (!isRecord(schema)) {\n return ['parameters must be a JSON Schema object'];\n }\n\n const issues: string[] = [];\n if (schema.type !== \"object\") {\n issues.push('root schema must set type to \"object\"');\n }\n\n for (const keyword of DISALLOWED_OPENAI_TOOL_SCHEMA_TOP_LEVEL_KEYWORDS) {\n if (keyword in schema) {\n issues.push(`root schema must not declare top-level \"${keyword}\"`);\n }\n }\n\n return issues;\n}\n\nexport function assertOpenAiFunctionParametersSchema(params: {\n toolName: string;\n schema: Record<string, unknown> | undefined;\n}): void {\n const issues = getOpenAiFunctionParametersSchemaIssues(params.schema);\n if (issues.length === 0) {\n return;\n }\n throw new Error(\n `Tool \"${params.toolName}\" declares an unsupported OpenAI-compatible parameters schema: ${issues.join(\n \"; \",\n )}. See docs/internal/openai-tool-schema.md.`,\n );\n}\n\nexport function buildOpenAiFunctionTool(definition: NcpToolDefinition): OpenAITool {\n assertOpenAiFunctionParametersSchema({\n toolName: definition.name,\n schema: definition.parameters,\n });\n return {\n type: \"function\" as const,\n function: {\n name: definition.name,\n description: definition.description,\n parameters: definition.parameters,\n },\n };\n}\n\nexport function parseToolArgs(args: unknown): ParsedToolArgs {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return {\n ok: true,\n rawText: stringifyRawArgs(args),\n value: args as Record<string, unknown>,\n };\n }\n\n const rawText = stringifyRawArgs(args);\n if (typeof args !== \"string\") {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments must be a JSON object string.\"],\n };\n }\n\n const trimmed = args.trim();\n if (!trimmed) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments are empty.\"],\n };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {\n ok: false,\n rawText,\n issues: [\"Tool arguments JSON must decode to an object.\"],\n };\n }\n return {\n ok: true,\n rawText,\n value: parsed as Record<string, unknown>,\n };\n } catch (error) {\n return {\n ok: false,\n rawText,\n issues: [error instanceof Error ? error.message : \"Failed to parse tool arguments JSON.\"],\n };\n }\n}\n\nexport function validateToolArgs(\n args: Record<string, unknown>,\n schema: Record<string, unknown> | undefined,\n): string[] {\n if (!schema) {\n return [];\n }\n const validate = getOrCreateValidator(schema);\n const valid = validate(args);\n if (valid) {\n return [];\n }\n return formatSchemaIssues(validate.errors);\n}\n\nfunction getOrCreateValidator(schema: Record<string, unknown>): ValidateFunction {\n const cached = validatorCache.get(schema);\n if (cached) {\n return cached;\n }\n const validate = toolSchemaValidator.compile(schema);\n validatorCache.set(schema, validate);\n return validate;\n}\n\nfunction formatSchemaIssues(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors || errors.length === 0) {\n return [\"Tool arguments do not match the declared schema.\"];\n }\n\n return errors.map((error) => {\n const instancePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n if (\n error.keyword === \"required\" &&\n \"missingProperty\" in error.params &&\n typeof error.params.missingProperty === \"string\"\n ) {\n const missingPath = instancePath\n ? `${instancePath}.${error.params.missingProperty}`\n : error.params.missingProperty;\n return `${missingPath} is required`;\n }\n if (\n error.keyword === \"additionalProperties\" &&\n \"additionalProperty\" in error.params &&\n typeof error.params.additionalProperty === \"string\"\n ) {\n const extraPath = instancePath\n ? `${instancePath}.${error.params.additionalProperty}`\n : error.params.additionalProperty;\n return `${extraPath} is not allowed`;\n }\n const label = instancePath || \"parameter\";\n return `${label}: ${error.message ?? \"invalid\"}`;\n });\n}\n\nexport function createInvalidToolArgumentsResult(params: {\n toolCallId: string;\n toolName: string;\n rawArgumentsText: string;\n issues: string[];\n}): NcpInvalidToolArgumentsResult {\n const { toolCallId, toolName, rawArgumentsText, issues } = params;\n return {\n ok: false,\n error: {\n code: \"invalid_tool_arguments\",\n message: \"Tool arguments are invalid.\",\n toolCallId,\n toolName,\n rawArgumentsText,\n issues,\n },\n };\n}\n\nexport function createToolExecutionFailedResult(params: {\n toolCallId: string;\n toolName: string;\n error: unknown;\n}): {\n ok: false;\n error: {\n code: \"tool_execution_failed\";\n message: string;\n toolCallId: string;\n toolName: string;\n };\n} {\n const { toolCallId, toolName, error } = params;\n return {\n ok: false,\n error: {\n code: \"tool_execution_failed\",\n message: error instanceof Error ? error.message : String(error),\n toolCallId,\n toolName,\n },\n };\n}\n\nexport function appendToolRoundToInput(\n input: NcpLLMApiInput,\n reasoning: string,\n text: string,\n toolResults: ReadonlyArray<NcpToolCallResult>,\n toolResultContentManager: ToolResultContentManager = defaultToolResultContentManager,\n): NcpLLMApiInput {\n const assistantMsg: OpenAIChatMessage = {\n role: \"assistant\",\n content: text || null,\n ...(reasoning ? { reasoning_content: reasoning } : {}),\n tool_calls: toolResults.map((tr) => ({\n id: tr.toolCallId,\n type: \"function\" as const,\n function: {\n name: tr.toolName,\n arguments: tr.rawArgsText,\n },\n })),\n };\n const toolMsgs: OpenAIChatMessage[] = toolResults.map((tr) => ({\n role: \"tool\" as const,\n content: toolResultContentManager.toModelContent(tr.result, {\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n }),\n tool_call_id: tr.toolCallId,\n }));\n const visualMessages = toolResultContentManager.toVisualObservationMessages(toolResults);\n return toolResultContentManager.compactInput({\n ...input,\n messages: [...input.messages, assistantMsg, ...toolMsgs, ...visualMessages],\n });\n}\n","import type {\n NcpContextBuilder,\n NcpContextPrepareOptions,\n NcpLLMApiInput,\n OpenAIChatMessage,\n OpenAITool,\n} from \"@nextclaw/ncp\";\nimport type { NcpAgentRunInput } from \"@nextclaw/ncp\";\nimport type { NcpToolRegistry } from \"@nextclaw/ncp\";\nimport type { LocalAssetStore } from \"../assets/stores/local-asset.store.js\";\nimport { ncpMessageToOpenAiMessages } from \"./utils/message-converter.utils.js\";\nimport { buildOpenAiFunctionTool } from \"./runtime.utils.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction mergeMessageAndRequestMetadata(input: NcpAgentRunInput): Record<string, unknown> {\n const messageMetadata = input.messages\n .slice()\n .reverse()\n .find((message) => isRecord(message.metadata))?.metadata;\n return {\n ...(isRecord(messageMetadata) ? messageMetadata : {}),\n ...(isRecord(input.metadata) ? input.metadata : {}),\n };\n}\n\nfunction readRequestedToolNames(metadata: Record<string, unknown>): string[] {\n const raw =\n metadata.requested_tools ??\n metadata.requestedTools ??\n metadata.requested_skills ??\n metadata.requestedSkills;\n if (!Array.isArray(raw)) {\n return [];\n }\n const deduped = new Set<string>();\n for (const item of raw) {\n const value = readOptionalString(item);\n if (value) {\n deduped.add(value);\n }\n }\n return [...deduped];\n}\n\ntype DefaultNcpContextBuilderOptions = {\n toolRegistry?: NcpToolRegistry;\n assetStore?: LocalAssetStore | null;\n};\n\nfunction isDefaultNcpContextBuilderOptions(\n value: NcpToolRegistry | DefaultNcpContextBuilderOptions | undefined,\n): value is DefaultNcpContextBuilderOptions {\n return Boolean(value) && typeof value === \"object\" && !(\"getToolDefinitions\" in value);\n}\n\nexport class DefaultNcpContextBuilder implements NcpContextBuilder {\n private readonly toolRegistry?: NcpToolRegistry;\n private readonly assetStore?: LocalAssetStore | null;\n\n constructor(toolRegistry?: NcpToolRegistry);\n constructor(options?: DefaultNcpContextBuilderOptions);\n constructor(toolRegistryOrOptions?: NcpToolRegistry | DefaultNcpContextBuilderOptions) {\n if (isDefaultNcpContextBuilderOptions(toolRegistryOrOptions)) {\n this.toolRegistry = toolRegistryOrOptions.toolRegistry;\n this.assetStore = toolRegistryOrOptions.assetStore;\n return;\n }\n this.toolRegistry = toolRegistryOrOptions;\n }\n\n prepare = (\n input: NcpAgentRunInput,\n options?: NcpContextPrepareOptions,\n ): NcpLLMApiInput => {\n const maxMessages = options?.maxMessages ?? 50;\n const sessionMessages = options?.sessionMessages ?? [];\n const systemPrompt = options?.systemPrompt;\n\n const requestMetadata = mergeMessageAndRequestMetadata(input);\n const requestedToolNames = readRequestedToolNames(requestMetadata);\n\n const messages: OpenAIChatMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of sessionMessages.slice(-maxMessages)) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n for (const msg of input.messages) {\n messages.push(\n ...ncpMessageToOpenAiMessages(msg, {\n assetStore: this.assetStore,\n }),\n );\n }\n\n const toolDefinitions = this.toolRegistry?.getToolDefinitions() ?? [];\n const filteredToolDefinitions =\n requestedToolNames.length > 0\n ? toolDefinitions.filter((definition) => requestedToolNames.includes(definition.name))\n : toolDefinitions;\n const tools: OpenAITool[] | undefined = filteredToolDefinitions.map(buildOpenAiFunctionTool);\n\n return {\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n model:\n readOptionalString(requestMetadata.model) ??\n readOptionalString(requestMetadata.llm_model) ??\n readOptionalString(requestMetadata.agent_model) ??\n undefined,\n thinkingLevel:\n readOptionalString(requestMetadata.thinking) ??\n readOptionalString(requestMetadata.thinking_level) ??\n readOptionalString(requestMetadata.thinkingLevel) ??\n readOptionalString(requestMetadata.thinking_effort) ??\n readOptionalString(requestMetadata.thinkingEffort) ??\n null,\n };\n };\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { copyFileSync, existsSync, readFileSync } from \"node:fs\";\nimport { copyFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\n\nconst ASSET_URI_SCHEME = \"asset://store/\";\n\nexport type StoredAssetRecord = {\n id: string;\n uri: string;\n storageKey: string;\n fileName: string;\n storedName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n sha256: string;\n};\n\nexport type AssetRef = {\n uri: string;\n};\n\nexport type AssetMeta = {\n uri: string;\n fileName: string;\n mimeType: string;\n sizeBytes: number;\n createdAt: string;\n};\n\nexport type AssetPutInput =\n | {\n kind: \"path\";\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }\n | {\n kind: \"bytes\";\n bytes: Uint8Array;\n fileName: string;\n mimeType?: string | null;\n createdAt?: Date;\n };\n\nfunction normalizeSegment(value: string): string {\n return value.replace(/[^\\w.-]+/g, \"_\").replace(/^_+|_+$/g, \"\") || \"asset.bin\";\n}\n\nfunction normalizeFileName(value: string): string {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : \"asset.bin\";\n}\n\nfunction normalizeMimeType(value: string | null | undefined): string {\n const normalized = value?.trim().toLowerCase() ?? \"\";\n return normalized.length > 0 ? normalized : \"application/octet-stream\";\n}\n\nfunction inferMimeTypeFromFileName(fileName: string): string | null {\n const normalized = fileName.trim().toLowerCase();\n if (normalized.endsWith(\".mp3\")) return \"audio/mpeg\";\n if (normalized.endsWith(\".m4a\")) return \"audio/mp4\";\n if (normalized.endsWith(\".wav\")) return \"audio/wav\";\n if (normalized.endsWith(\".ogg\")) return \"audio/ogg\";\n if (normalized.endsWith(\".opus\")) return \"audio/opus\";\n if (normalized.endsWith(\".flac\")) return \"audio/flac\";\n if (normalized.endsWith(\".aac\")) return \"audio/aac\";\n if (normalized.endsWith(\".weba\")) return \"audio/webm\";\n if (normalized.endsWith(\".mp4\") || normalized.endsWith(\".m4v\")) return \"video/mp4\";\n if (normalized.endsWith(\".mov\")) return \"video/quicktime\";\n if (normalized.endsWith(\".webm\")) return \"video/webm\";\n if (normalized.endsWith(\".mkv\")) return \"video/x-matroska\";\n if (normalized.endsWith(\".avi\")) return \"video/x-msvideo\";\n if (normalized.endsWith(\".wmv\")) return \"video/x-ms-wmv\";\n if (normalized.endsWith(\".png\")) return \"image/png\";\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (normalized.endsWith(\".gif\")) return \"image/gif\";\n if (normalized.endsWith(\".webp\")) return \"image/webp\";\n if (normalized.endsWith(\".svg\")) return \"image/svg+xml\";\n if (normalized.endsWith(\".pdf\")) return \"application/pdf\";\n if (normalized.endsWith(\".json\")) return \"application/json\";\n if (normalized.endsWith(\".txt\")) return \"text/plain\";\n return null;\n}\n\nfunction resolveStoredMimeType(fileName: string, mimeType?: string | null): string {\n const normalized = normalizeMimeType(mimeType);\n if (normalized !== \"application/octet-stream\") {\n return normalized;\n }\n return inferMimeTypeFromFileName(fileName) ?? normalized;\n}\n\nfunction buildAssetId(): string {\n return `asset_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`;\n}\n\nfunction ensureAssetRoot(rootDir: string): string {\n const normalized = rootDir.trim();\n if (!normalized) {\n throw new Error(\"LocalAssetStore requires a non-empty rootDir.\");\n }\n return resolve(normalized);\n}\n\nfunction buildStorageKey(timestamp: Date, assetId: string): string {\n const year = String(timestamp.getFullYear());\n const month = String(timestamp.getMonth() + 1).padStart(2, \"0\");\n const day = String(timestamp.getDate()).padStart(2, \"0\");\n return `${year}/${month}/${day}/${assetId}`;\n}\n\nfunction buildAssetUri(storageKey: string): string {\n return `${ASSET_URI_SCHEME}${storageKey}`;\n}\n\nfunction parseAssetUri(uri: string): string | null {\n const normalized = uri.trim();\n if (!normalized.startsWith(ASSET_URI_SCHEME)) {\n return null;\n }\n const storageKey = normalized.slice(ASSET_URI_SCHEME.length).replace(/^\\/+/, \"\").trim();\n return storageKey.length > 0 ? storageKey : null;\n}\n\nfunction ensureStorageKey(storageKey: string): string {\n const normalized = storageKey.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (!normalized) {\n throw new Error(\"Asset storage key must not be empty.\");\n }\n const segments = normalized.split(\"/\");\n if (segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n throw new Error(`Invalid asset storage key: ${storageKey}`);\n }\n return segments.join(\"/\");\n}\n\nfunction hydrateStoredAssetRecord(value: StoredAssetRecord): StoredAssetRecord {\n const fileName = normalizeFileName(value.fileName);\n return {\n ...value,\n fileName,\n storedName: normalizeSegment(value.storedName || fileName),\n mimeType: normalizeMimeType(value.mimeType),\n };\n}\n\nfunction toAssetMeta(record: StoredAssetRecord): AssetMeta {\n return {\n uri: record.uri,\n fileName: record.fileName,\n mimeType: record.mimeType,\n sizeBytes: record.sizeBytes,\n createdAt: record.createdAt,\n };\n}\n\nexport function isTextLikeAsset(params: { mimeType?: string | null; fileName?: string | null }): boolean {\n const mimeType = normalizeMimeType(params.mimeType);\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"text/xml\" ||\n mimeType === \"application/yaml\" ||\n mimeType === \"text/yaml\" ||\n mimeType === \"application/x-yaml\" ||\n mimeType === \"text/csv\"\n ) {\n return true;\n }\n\n const normalizedName = (params.fileName ?? \"\").trim().toLowerCase();\n return [\n \".json\",\n \".md\",\n \".txt\",\n \".csv\",\n \".xml\",\n \".yaml\",\n \".yml\",\n \".js\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n \".jsx\",\n \".py\",\n \".rb\",\n \".go\",\n \".rs\",\n \".java\",\n \".kt\",\n \".swift\",\n \".php\",\n \".css\",\n \".scss\",\n \".html\",\n \".sql\",\n \".sh\",\n ].some((suffix) => normalizedName.endsWith(suffix));\n}\n\nexport class LocalAssetStore {\n readonly rootDir: string;\n\n constructor(options: { rootDir: string }) {\n this.rootDir = ensureAssetRoot(options.rootDir);\n }\n\n put = async (input: AssetPutInput): Promise<AssetRef> => {\n const record =\n input.kind === \"path\"\n ? await this.putFromPath(input)\n : await this.putFromBytes({\n fileName: input.fileName,\n mimeType: input.mimeType,\n bytes: input.bytes,\n createdAt: input.createdAt,\n });\n return { uri: record.uri };\n };\n\n putBytes = async (params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromBytes(params);\n };\n\n putPath = async (params: {\n path: string;\n fileName?: string;\n mimeType?: string | null;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> => {\n return this.putFromPath({ kind: \"path\", ...params });\n };\n\n export = async (ref: AssetRef, targetPath: string): Promise<string> => {\n const record = await this.statRecord(ref.uri);\n if (!record) {\n throw new Error(`Asset not found: ${ref.uri}`);\n }\n const outputPath = resolve(targetPath);\n await ensureParentDirectory(outputPath);\n await copyFile(this.resolveContentPathOrThrow(record), outputPath);\n return outputPath;\n };\n\n stat = async (ref: AssetRef): Promise<AssetMeta | null> => {\n const record = await this.statRecord(ref.uri);\n return record ? toAssetMeta(record) : null;\n };\n\n getByUri = (uri: string): StoredAssetRecord | null => {\n const storageKey = parseAssetUri(uri);\n if (!storageKey) {\n return null;\n }\n const metaPath = join(this.resolveStorageKeyDirectory(storageKey), \"meta.json\");\n if (!existsSync(metaPath)) {\n return null;\n }\n const text = readFileSync(metaPath, \"utf8\");\n return hydrateStoredAssetRecord(JSON.parse(text) as StoredAssetRecord);\n };\n\n statRecord = async (uri: string): Promise<StoredAssetRecord | null> => {\n const record = this.getByUri(uri);\n if (!record) {\n return null;\n }\n try {\n await stat(this.resolveContentPathOrThrow(record));\n return record;\n } catch {\n return null;\n }\n };\n\n readAssetBytes = async (uri: string): Promise<Buffer | null> => {\n const record = await this.statRecord(uri);\n if (!record) {\n return null;\n }\n try {\n return await readFile(this.resolveContentPathOrThrow(record));\n } catch {\n return null;\n }\n };\n\n resolveContentPath = (uri: string): string | null => {\n const record = this.getByUri(uri);\n return record ? this.resolveContentPathOrThrow(record) : null;\n };\n\n private async putFromPath(input: Extract<AssetPutInput, { kind: \"path\" }>): Promise<StoredAssetRecord> {\n const sourcePath = resolve(input.path);\n const sourceStats = await stat(sourcePath);\n if (!sourceStats.isFile()) {\n throw new Error(`Asset source path is not a file: ${sourcePath}`);\n }\n const bytes = readFileSync(sourcePath);\n const record = this.buildRecord({\n fileName: input.fileName ?? basename(sourcePath),\n mimeType: input.mimeType,\n bytes,\n createdAt: input.createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n copyFileSync(sourcePath, join(assetDir, record.storedName));\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private async putFromBytes(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Uint8Array;\n createdAt?: Date;\n }): Promise<StoredAssetRecord> {\n const { bytes: rawBytes, createdAt, fileName, mimeType } = params;\n const bytes = Buffer.from(rawBytes);\n const record = this.buildRecord({\n fileName,\n mimeType,\n bytes,\n createdAt,\n });\n const assetDir = this.resolveStorageKeyDirectory(record.storageKey);\n await mkdir(assetDir, { recursive: true });\n await writeFile(join(assetDir, record.storedName), bytes);\n await this.writeMeta(assetDir, record);\n return record;\n }\n\n private buildRecord(params: {\n fileName: string;\n mimeType?: string | null;\n bytes: Buffer;\n createdAt?: Date;\n }): StoredAssetRecord {\n const { bytes, createdAt: rawCreatedAt, fileName: rawFileName, mimeType } = params;\n const createdAt = rawCreatedAt ?? new Date();\n const id = buildAssetId();\n const storageKey = buildStorageKey(createdAt, id);\n const fileName = normalizeFileName(rawFileName);\n return {\n id,\n uri: buildAssetUri(storageKey),\n storageKey,\n fileName,\n storedName: normalizeSegment(fileName),\n mimeType: resolveStoredMimeType(fileName, mimeType),\n sizeBytes: bytes.length,\n createdAt: createdAt.toISOString(),\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n\n private async writeMeta(assetDir: string, record: StoredAssetRecord): Promise<void> {\n await writeFile(join(assetDir, \"meta.json\"), `${JSON.stringify(record)}\\n`, \"utf8\");\n }\n\n private resolveContentPathOrThrow(record: StoredAssetRecord): string {\n return join(this.resolveStorageKeyDirectory(record.storageKey), record.storedName);\n }\n\n private resolveStorageKeyDirectory(storageKey: string): string {\n return join(this.rootDir, ensureStorageKey(storageKey));\n }\n}\n\nexport function buildAssetContentPath(params: {\n basePath: string;\n assetUri: string;\n}): string {\n const query = new URLSearchParams({ uri: params.assetUri });\n return `${params.basePath}?${query.toString()}`;\n}\n\nexport async function ensureParentDirectory(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n","import type { NcpRoundBuffer, NcpToolCallResult } from \"@nextclaw/ncp\";\n\nexport class DefaultNcpRoundBuffer implements NcpRoundBuffer {\n private text = \"\";\n private readonly toolCalls: NcpToolCallResult[] = [];\n private pending: { toolCallId: string; toolName: string; args: unknown } | null = null;\n\n appendText = (delta: string): void => {\n this.text += delta;\n };\n\n getText = (): string => {\n return this.text;\n };\n\n appendToolCall = (result: NcpToolCallResult): void => {\n this.toolCalls.push(result);\n };\n\n getToolCalls = (): ReadonlyArray<NcpToolCallResult> => {\n return [...this.toolCalls];\n };\n\n startToolCall = (toolCallId: string, toolName: string): void => {\n this.pending = { toolCallId, toolName, args: undefined };\n };\n\n appendToolCallArgs = (args: unknown): void => {\n if (this.pending) this.pending.args = args;\n };\n\n consumePendingToolCall = (): { toolCallId: string; toolName: string; args: unknown } | null => {\n const p = this.pending;\n this.pending = null;\n return p;\n };\n\n clear = (): void => {\n this.text = \"\";\n this.toolCalls.length = 0;\n this.pending = null;\n };\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n NcpAssistantTextStreamNormalizer,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n} from \"@nextclaw/ncp\";\nimport { NcpEventType } from \"@nextclaw/ncp\";\n\ntype StreamEventContext = Pick<NcpEncodeContext, \"sessionId\" | \"messageId\" | \"correlationId\">;\n\nexport type ToolCallBuffer = {\n id?: string;\n name?: string;\n argumentsText: string;\n emittedStart?: boolean;\n emittedArgsDelta?: boolean;\n emittedEnd?: boolean;\n pendingArgumentDeltas?: string[];\n};\n\nexport type ToolCallDelta = {\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n};\n\nexport type DeltaLike = {\n content?: string;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: ToolCallDelta[];\n};\n\nexport type StreamContentState = {\n textStarted: boolean;\n normalizer: NcpAssistantTextStreamNormalizer | null;\n};\n\nexport function getToolCallIndex(toolDelta: ToolCallDelta, fallback: number): number {\n const idx = toolDelta.index;\n return typeof idx === \"number\" && Number.isFinite(idx) ? idx : fallback;\n}\n\nexport function applyToolDelta(current: ToolCallBuffer, toolDelta: ToolCallDelta): ToolCallBuffer {\n const next: ToolCallBuffer = { ...current, argumentsText: current.argumentsText };\n if (typeof toolDelta.id === \"string\" && toolDelta.id.trim()) {\n next.id = toolDelta.id;\n }\n const fn = toolDelta.function;\n if (fn && typeof fn === \"object\" && !Array.isArray(fn)) {\n if (typeof fn.name === \"string\" && fn.name.trim()) {\n next.name = fn.name.trim();\n }\n if (typeof fn.arguments === \"string\" && fn.arguments.length > 0) {\n next.argumentsText += fn.arguments;\n }\n }\n return next;\n}\n\nexport function* emitTextDeltas(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n const content = delta.content;\n if (typeof content !== \"string\" || content.length === 0) return state;\n\n if (state.normalizer) {\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.push(content)) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n }\n\n if (!state.textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return {\n ...state,\n textStarted: true,\n };\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: content },\n });\n return state;\n}\n\nexport function* flushTextDeltas(\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!state.normalizer) {\n return state;\n }\n\n let textStarted = state.textStarted;\n for (const segment of state.normalizer.finish()) {\n if (segment.type === \"reasoning\") {\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: segment.text },\n });\n continue;\n }\n\n if (!textStarted) {\n yield createStreamEvent({ type: NcpEventType.MessageTextStart, payload: ctx });\n textStarted = true;\n }\n yield createStreamEvent({\n type: NcpEventType.MessageTextDelta,\n payload: { ...ctx, delta: segment.text },\n });\n }\n\n return {\n ...state,\n textStarted,\n };\n}\n\nexport function* closeTextPartBeforeToolCalls(\n delta: DeltaLike,\n ctx: StreamEventContext,\n state: StreamContentState,\n): Generator<NcpEndpointEvent, StreamContentState> {\n if (!Array.isArray(delta.tool_calls) || delta.tool_calls.length === 0) {\n return state;\n }\n\n let nextState = state;\n if (nextState.normalizer) {\n nextState = yield* flushTextDeltas(ctx, nextState);\n }\n if (!nextState.textStarted) {\n return nextState;\n }\n\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: ctx,\n });\n\n return {\n ...nextState,\n textStarted: false,\n };\n}\n\nexport function* emitReasoningDelta(\n delta: DeltaLike,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning !== \"string\" || !reasoning) return;\n\n yield createStreamEvent({\n type: NcpEventType.MessageReasoningDelta,\n payload: { ...ctx, delta: reasoning },\n });\n}\n\nclass ToolCallDeltaEmitter {\n constructor(\n private readonly buffers: Map<number, ToolCallBuffer>,\n private readonly ctx: StreamEventContext,\n ) {}\n\n emit = function* (\n this: ToolCallDeltaEmitter,\n delta: DeltaLike,\n options: { flushReadyBeforeNextIndex?: boolean },\n ): Generator<NcpEndpointEvent> {\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) return;\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.buffers.size);\n if (options.flushReadyBeforeNextIndex) {\n yield* flushReadyToolCallsBeforeIndex(this.buffers, index, this.ctx);\n }\n const prev = this.buffers.get(index) ?? {\n argumentsText: \"\",\n pendingArgumentDeltas: [],\n };\n const current = applyToolDelta(prev, toolDelta);\n const argsDelta =\n typeof toolDelta.function?.arguments === \"string\" &&\n toolDelta.function.arguments.length > 0\n ? toolDelta.function.arguments\n : null;\n const toolCallId = current.id;\n const toolName = current.name;\n if (toolCallId && toolName && !current.emittedStart) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallStart,\n payload: { ...this.ctx, toolCallId, toolName },\n });\n current.emittedStart = true;\n }\n\n if (argsDelta) {\n if (current.emittedStart && current.id) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: argsDelta,\n },\n });\n current.emittedArgsDelta = true;\n } else {\n current.pendingArgumentDeltas = [\n ...(current.pendingArgumentDeltas ?? []),\n argsDelta,\n ];\n }\n }\n\n if (current.emittedStart && current.id && (current.pendingArgumentDeltas?.length ?? 0) > 0) {\n for (const pendingDelta of current.pendingArgumentDeltas ?? []) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgsDelta,\n payload: {\n ...this.ctx,\n toolCallId: current.id,\n delta: pendingDelta,\n },\n });\n }\n current.emittedArgsDelta = true;\n current.pendingArgumentDeltas = [];\n }\n\n this.buffers.set(index, current);\n }\n };\n}\n\nexport function* emitToolCallDeltas(\n delta: DeltaLike,\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n options: { flushReadyBeforeNextIndex?: boolean } = {},\n): Generator<NcpEndpointEvent> {\n yield* new ToolCallDeltaEmitter(buffers, ctx).emit(delta, options);\n}\n\nfunction isCompleteToolCallArgs(argumentsText: string): boolean {\n const trimmed = argumentsText.trim();\n if (!trimmed) return false;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return Boolean(parsed) && typeof parsed === \"object\" && !Array.isArray(parsed);\n } catch {\n return false;\n }\n}\n\nfunction* flushReadyToolCallsBeforeIndex(\n buffers: Map<number, ToolCallBuffer>,\n beforeIndex: number,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [index, buf] of ordered) {\n if (index >= beforeIndex || buf.emittedEnd || !buf.id || !buf.name) continue;\n if (!isCompleteToolCallArgs(buf.argumentsText)) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function* flushToolCalls(\n buffers: Map<number, ToolCallBuffer>,\n ctx: StreamEventContext,\n): Generator<NcpEndpointEvent> {\n const ordered = Array.from(buffers.entries()).sort(([a], [b]) => a - b);\n for (const [, buf] of ordered) {\n if (!buf.id || !buf.name || buf.emittedEnd) continue;\n if (!buf.emittedArgsDelta) {\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallArgs,\n payload: { ...ctx, toolCallId: buf.id, args: buf.argumentsText },\n });\n }\n yield createStreamEvent({\n type: NcpEventType.MessageToolCallEnd,\n payload: { ...ctx, toolCallId: buf.id },\n });\n buf.emittedEnd = true;\n }\n}\n\nexport function createStreamContentState(\n reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode,\n): StreamContentState {\n return {\n textStarted: false,\n normalizer:\n reasoningNormalizationMode === \"think-tags\"\n ? new NcpAssistantTextStreamNormalizer(reasoningNormalizationMode)\n : null,\n };\n}\n","import {\n normalizeAssistantText,\n type NcpAssistantReasoningNormalizationMode,\n type OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\nimport { applyToolDelta, getToolCallIndex, type DeltaLike, type ToolCallBuffer } from \"./stream-encoder.utils.js\";\n\nexport type CollectedToolCall = {\n toolCallId: string;\n toolName: string;\n args: string;\n};\n\nexport class DefaultNcpRoundCollector {\n private rawText = \"\";\n private explicitReasoning = \"\";\n private readonly toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n constructor(\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode = \"off\",\n ) {}\n\n clear(): void {\n this.rawText = \"\";\n this.explicitReasoning = \"\";\n this.toolCallBuffers.clear();\n }\n\n consumeChunk(chunk: OpenAIChatChunk): void {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n const delta = choice.delta as DeltaLike | undefined;\n if (!delta) {\n return;\n }\n\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n this.rawText += delta.content;\n }\n\n const reasoning = delta.reasoning_content ?? delta.reasoning;\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n this.explicitReasoning += reasoning;\n }\n\n const toolDeltas = delta.tool_calls;\n if (!Array.isArray(toolDeltas)) {\n return;\n }\n\n for (const toolDelta of toolDeltas) {\n const index = getToolCallIndex(toolDelta, this.toolCallBuffers.size);\n const previous = this.toolCallBuffers.get(index) ?? { argumentsText: \"\" };\n const current = applyToolDelta(previous, toolDelta);\n this.toolCallBuffers.set(index, current);\n }\n }\n\n getText(): string {\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return this.rawText;\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).text;\n }\n\n getReasoning(): string {\n if (this.explicitReasoning.length > 0) {\n return this.explicitReasoning;\n }\n if (this.reasoningNormalizationMode !== \"think-tags\") {\n return \"\";\n }\n return normalizeAssistantText(this.rawText, this.reasoningNormalizationMode).reasoning;\n }\n\n getToolCalls(): CollectedToolCall[] {\n const orderedEntries = Array.from(this.toolCallBuffers.entries()).sort(([left], [right]) => left - right);\n const toolCalls: CollectedToolCall[] = [];\n\n for (const [, buffer] of orderedEntries) {\n if (!buffer.id || !buffer.name) {\n continue;\n }\n toolCalls.push({\n toolCallId: buffer.id,\n toolName: buffer.name,\n args: buffer.argumentsText,\n });\n }\n\n return toolCalls;\n }\n}\n","import type { NcpTool, NcpToolCallResult } from \"@nextclaw/ncp\";\nimport type { CollectedToolCall } from \"../round-collector.js\";\nimport {\n createInvalidToolArgumentsResult,\n createToolExecutionFailedResult,\n parseToolArgs,\n validateToolArgs,\n} from \"../runtime.utils.js\";\n\nexport type ExecuteCollectedToolCallOptions = {\n toolCall: CollectedToolCall;\n tool: NcpTool | undefined;\n execute: (tool: NcpTool | undefined, args: Record<string, unknown>) => Promise<unknown>;\n};\n\nexport async function executeCollectedToolCall(\n options: ExecuteCollectedToolCallOptions,\n): Promise<NcpToolCallResult> {\n const { toolCall, tool } = options;\n const parsedArgs = parseToolArgs(toolCall.args);\n if (!parsedArgs.ok) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: parsedArgs.issues,\n }),\n };\n }\n\n const validationIssues = tool\n ? [\n ...validateToolArgs(parsedArgs.value, tool.parameters),\n ...(tool.validateArgs?.(parsedArgs.value) ?? []),\n ]\n : [];\n if (validationIssues.length > 0) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: null,\n rawArgsText: parsedArgs.rawText,\n result: createInvalidToolArgumentsResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n rawArgumentsText: parsedArgs.rawText,\n issues: validationIssues,\n }),\n };\n }\n\n try {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: await options.execute(tool, parsedArgs.value),\n };\n } catch (error) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: parsedArgs.value,\n rawArgsText: parsedArgs.rawText,\n result: createToolExecutionFailedResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n error,\n }),\n };\n }\n}\n","import {\n createNcpEndpointEvent as createStreamEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpStreamEncoder,\n type OpenAIChatChunk,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport {\n closeTextPartBeforeToolCalls,\n createStreamContentState,\n type DeltaLike,\n emitReasoningDelta,\n emitTextDeltas,\n emitToolCallDeltas,\n flushTextDeltas,\n flushToolCalls,\n type ToolCallBuffer,\n} from \"./stream-encoder.utils.js\";\n\nexport type DefaultNcpStreamEncoderConfig = {\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolCallEndMode?: \"finish-only\" | \"sequential-index\";\n};\n\n/**\n * Converts LLM stream chunks to NCP events (text, reasoning, tool calls).\n * Does not emit RunFinished; that is the runtime's responsibility after the loop completes.\n */\nexport class DefaultNcpStreamEncoder implements NcpStreamEncoder {\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolCallEndMode: \"finish-only\" | \"sequential-index\";\n\n constructor(config: DefaultNcpStreamEncoderConfig = {}) {\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolCallEndMode = config.toolCallEndMode ?? \"finish-only\";\n }\n\n async *encode(\n stream: AsyncIterable<OpenAIChatChunk>,\n context: NcpEncodeContext,\n ): AsyncGenerator<NcpEndpointEvent> {\n const { sessionId, messageId } = context;\n const streamContext = {\n sessionId,\n messageId,\n correlationId: context.correlationId,\n };\n let state = createStreamContentState(this.reasoningNormalizationMode);\n const toolCallBuffers = new Map<number, ToolCallBuffer>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta as DeltaLike | undefined;\n if (delta) {\n yield* emitReasoningDelta(delta, streamContext);\n const nextState = yield* emitTextDeltas(delta, streamContext, state);\n state = nextState;\n state = yield* closeTextPartBeforeToolCalls(\n delta,\n streamContext,\n state,\n );\n yield* emitToolCallDeltas(delta, toolCallBuffers, streamContext, {\n flushReadyBeforeNextIndex: this.toolCallEndMode === \"sequential-index\",\n });\n }\n\n const finishReason = choice.finish_reason;\n if (typeof finishReason === \"string\" && finishReason.trim().length > 0) {\n state = yield* flushTextDeltas(streamContext, state);\n yield* flushToolCalls(toolCallBuffers, streamContext);\n if (state.textStarted) {\n yield createStreamEvent({\n type: NcpEventType.MessageTextEnd,\n payload: streamContext,\n });\n }\n }\n }\n }\n}\n","import type {\n NcpTool,\n NcpToolDefinition,\n NcpToolRegistry,\n} from \"@nextclaw/ncp\";\n\nexport class DefaultNcpToolRegistry implements NcpToolRegistry {\n private readonly tools = new Map<string, NcpTool>();\n\n constructor(tools: ReadonlyArray<NcpTool> = []) {\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n register = (tool: NcpTool): void => {\n this.tools.set(tool.name, tool);\n };\n\n listTools = (): ReadonlyArray<NcpTool> => {\n return [...this.tools.values()];\n };\n\n getTool = (name: string): NcpTool | undefined => {\n return this.tools.get(name);\n };\n\n getToolDefinitions = (): ReadonlyArray<NcpToolDefinition> => {\n return this.listTools().map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n };\n}\n","import type {\n NcpLLMApi,\n NcpLLMApiInput,\n NcpLLMApiOptions,\n OpenAIChatChunk,\n} from \"@nextclaw/ncp\";\n\nfunction getLastUserContent(messages: NcpLLMApiInput[\"messages\"]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m.role !== \"user\") continue;\n if (typeof m.content === \"string\") return m.content;\n if (Array.isArray(m.content)) {\n return m.content\n .map((p) => (p.type === \"text\" ? p.text : \"\"))\n .join(\"\");\n }\n }\n return \"\";\n}\n\nexport class EchoNcpLLMApi implements NcpLLMApi {\n generate = async function* (\n input: NcpLLMApiInput,\n options?: NcpLLMApiOptions,\n ): AsyncGenerator<OpenAIChatChunk> {\n const text = getLastUserContent(input.messages);\n const signal = options?.signal;\n for (const char of text) {\n if (signal?.aborted) break;\n yield {\n choices: [{ index: 0, delta: { content: char } }],\n };\n }\n yield {\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: \"stop\",\n },\n ],\n usage: { prompt_tokens: 0, completion_tokens: text.length, total_tokens: text.length },\n };\n };\n}\n","import {\n createNcpEndpointEvent as createRuntimeEvent,\n type NcpAssistantReasoningNormalizationMode,\n type NcpAgentConversationStateManager,\n type NcpAgentRunInput,\n type NcpAgentRunOptions,\n type NcpAgentRuntime,\n type NcpContextBuilder,\n type NcpEncodeContext,\n type NcpEndpointEvent,\n type NcpLLMApi,\n type NcpLLMApiInput,\n type NcpToolCallResult,\n type NcpStreamEncoder,\n type NcpToolRegistry,\n type OpenAIChatChunk,\n isHiddenNcpMessage,\n NcpEventType,\n} from \"@nextclaw/ncp\";\nimport { DefaultNcpStreamEncoder } from \"./stream-encoder.service.js\";\nimport {\n appendToolRoundToInput,\n genId,\n} from \"./runtime.utils.js\";\nimport {\n DefaultNcpRoundCollector,\n type CollectedToolCall,\n} from \"./round-collector.js\";\nimport { executeCollectedToolCall } from \"./utils/tool-call-execution.utils.js\";\nimport {\n defaultToolResultContentManager,\n type ToolResultContentManager,\n} from \"../tool-result/tool-result-content.manager.js\";\n\ntype RuntimeEncodeContext = NcpEncodeContext & {\n startedAt: string;\n};\n\nexport type DefaultNcpAgentRuntimeConfig = {\n contextBuilder: NcpContextBuilder;\n llmApi: NcpLLMApi;\n toolRegistry: NcpToolRegistry;\n stateManager: NcpAgentConversationStateManager;\n streamEncoder?: NcpStreamEncoder;\n reasoningNormalizationMode?: NcpAssistantReasoningNormalizationMode;\n toolResultContentManager?: ToolResultContentManager;\n};\n\nexport class DefaultNcpAgentRuntime implements NcpAgentRuntime {\n private readonly contextBuilder: NcpContextBuilder;\n private readonly llmApi: NcpLLMApi;\n private readonly toolRegistry: NcpToolRegistry;\n private readonly stateManager: NcpAgentConversationStateManager;\n private readonly streamEncoder: NcpStreamEncoder;\n private readonly reasoningNormalizationMode: NcpAssistantReasoningNormalizationMode;\n private readonly toolResultContentManager: ToolResultContentManager;\n\n constructor(config: DefaultNcpAgentRuntimeConfig) {\n this.contextBuilder = config.contextBuilder;\n this.llmApi = config.llmApi;\n this.toolRegistry = config.toolRegistry;\n this.stateManager = config.stateManager;\n this.reasoningNormalizationMode = config.reasoningNormalizationMode ?? \"off\";\n this.toolResultContentManager =\n config.toolResultContentManager ?? defaultToolResultContentManager;\n this.streamEncoder =\n config.streamEncoder ??\n new DefaultNcpStreamEncoder({\n reasoningNormalizationMode: this.reasoningNormalizationMode,\n });\n }\n\n run = async function* (\n this: DefaultNcpAgentRuntime,\n input: NcpAgentRunInput,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const ctxBase: NcpEncodeContext = {\n messageId: genId(),\n runId: (input as NcpAgentRunInput & { runId?: string }).runId ?? genId(),\n sessionId: input.sessionId,\n correlationId: input.correlationId,\n };\n\n const sessionMessages = this.stateManager.getSnapshot().messages;\n const modelInput = this.contextBuilder.prepare(input, {\n sessionMessages,\n });\n\n for (const msg of input.messages) {\n if (isHiddenNcpMessage(msg)) {\n continue;\n }\n const messageSent = createRuntimeEvent({\n type: NcpEventType.MessageSent,\n payload: { sessionId: input.sessionId, message: msg },\n });\n await this.stateManager.dispatch(messageSent);\n }\n\n const startedAt = new Date().toISOString();\n const ctx: RuntimeEncodeContext = { ...ctxBase, startedAt };\n const runStarted = createRuntimeEvent({\n type: NcpEventType.RunStarted,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n },\n }, ctx.startedAt);\n await this.stateManager.dispatch(runStarted);\n yield runStarted;\n\n for await (const event of this.runLoop(modelInput, ctx, options)) {\n await this.stateManager.dispatch(event);\n yield event;\n }\n };\n\n /**\n * Agent loop: LLM stream → encoder events → tool execution (if any) → next round or finish.\n * RunFinished is emitted only when the entire loop completes (no more tool calls).\n * The stream encoder does not emit RunFinished; it only converts chunks to NCP events.\n */\n private runLoop = async function* (\n this: DefaultNcpAgentRuntime,\n llmInput: NcpLLMApiInput,\n ctx: RuntimeEncodeContext,\n options?: NcpAgentRunOptions,\n ): AsyncGenerator<NcpEndpointEvent> {\n const roundCollector = new DefaultNcpRoundCollector(this.reasoningNormalizationMode);\n let currentInput = llmInput;\n let done = false;\n\n while (!done && !options?.signal?.aborted) {\n roundCollector.clear();\n\n const stream = this.llmApi.generate(currentInput, { signal: options?.signal });\n const tappedStream = this.tapStream(stream, (chunk) => roundCollector.consumeChunk(chunk));\n\n for await (const event of this.streamEncoder.encode(tappedStream, ctx)) {\n yield event;\n }\n\n const toolResults: NcpToolCallResult[] = [];\n for (const toolCall of roundCollector.getToolCalls()) {\n const toolResult = this.toolResultContentManager.normalizeToolCallResult(\n await this.executeToolCall(toolCall, ctx),\n );\n toolResults.push(toolResult);\n yield createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: toolResult.result,\n contentItems: toolResult.contentItems,\n },\n });\n }\n\n if (toolResults.length === 0) {\n const endedAt = new Date().toISOString();\n yield createRuntimeEvent({\n type: NcpEventType.RunFinished,\n payload: {\n sessionId: ctx.sessionId,\n messageId: ctx.messageId,\n runId: ctx.runId,\n startedAt: ctx.startedAt,\n endedAt,\n },\n }, endedAt);\n done = true;\n break;\n }\n\n currentInput = appendToolRoundToInput(\n currentInput,\n roundCollector.getReasoning(),\n roundCollector.getText(),\n toolResults,\n this.toolResultContentManager,\n );\n }\n };\n\n private executeToolCall = async function (\n this: DefaultNcpAgentRuntime,\n toolCall: CollectedToolCall,\n ctx: RuntimeEncodeContext,\n ): Promise<NcpToolCallResult> {\n return executeCollectedToolCall({\n toolCall,\n tool: this.toolRegistry.getTool(toolCall.toolName),\n execute: async (tool, args) => {\n const updateToolCallResult = async (updatedResult: unknown): Promise<void> => {\n const normalized = this.toolResultContentManager.normalizeToolCallResult({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? args as Record<string, unknown>\n : null,\n rawArgsText: toolCall.args,\n result: updatedResult,\n });\n await this.stateManager.dispatch(createRuntimeEvent({\n type: NcpEventType.MessageToolCallResult,\n payload: {\n sessionId: ctx.sessionId,\n toolCallId: toolCall.toolCallId,\n content: normalized.result,\n contentItems: normalized.contentItems,\n correlationId: ctx.correlationId,\n },\n }));\n };\n return tool\n ? await tool.execute(args, {\n toolCallId: toolCall.toolCallId,\n updateToolCallResult,\n })\n : undefined;\n },\n });\n };\n\n private tapStream = async function* (\n this: DefaultNcpAgentRuntime,\n stream: AsyncIterable<OpenAIChatChunk>,\n onChunk: (chunk: OpenAIChatChunk) => void,\n ): AsyncGenerator<OpenAIChatChunk> {\n for await (const chunk of stream) {\n onChunk(chunk);\n yield chunk;\n }\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/ncp-agent-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
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.
|
|
19
|
+
"@nextclaw/ncp": "0.7.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/node": "^20.17.6",
|