@nextclaw/ncp-agent-runtime 0.3.47 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -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
  }
@@ -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":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/assets/stores/local-asset.store.ts","../src/runtime/context-builder.service.ts","../src/runtime/user-content.utils.ts","../src/tool-result/tool-result-content.manager.ts","../src/runtime/utils/message-converter.utils.ts","../src/runtime/round-buffer.ts","../src/runtime/round-collector.ts","../src/runtime/utils/tool-call-execution.utils.ts","../src/runtime/stream-encoder.service.ts","../src/runtime/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
- if (serialized.ok && serialized.text.length <= this.maxModelVisibleChars) return {
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 (isLargeDataUrl(value)) return `[omitted data URL payload: mime=${readDataUrlMime(value)}, originalChars=${value.length}]`;
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
- function* emitToolCallDeltas(delta, buffers, ctx) {
1323
- const toolDeltas = delta.tool_calls;
1324
- if (!Array.isArray(toolDeltas)) return;
1325
- for (const toolDelta of toolDeltas) {
1326
- const index = getToolCallIndex(toolDelta, buffers.size);
1327
- const current = applyToolDelta(buffers.get(index) ?? {
1328
- argumentsText: "",
1329
- pendingArgumentDeltas: []
1330
- }, toolDelta);
1331
- const argsDelta = typeof toolDelta.function?.arguments === "string" && toolDelta.function.arguments.length > 0 ? toolDelta.function.arguments : null;
1332
- const toolCallId = current.id;
1333
- const toolName = current.name;
1334
- if (toolCallId && toolName && !current.emittedStart) {
1335
- yield {
1336
- type: NcpEventType.MessageToolCallStart,
1337
- payload: {
1338
- ...ctx,
1339
- toolCallId,
1340
- toolName
1341
- }
1342
- };
1343
- current.emittedStart = true;
1344
- }
1345
- if (argsDelta) if (current.emittedStart && current.id) {
1346
- yield {
1347
- type: NcpEventType.MessageToolCallArgsDelta,
1348
- payload: {
1349
- ...ctx,
1350
- toolCallId: current.id,
1351
- delta: argsDelta
1352
- }
1353
- };
1354
- current.emittedArgsDelta = true;
1355
- } else current.pendingArgumentDeltas = [...current.pendingArgumentDeltas ?? [], argsDelta];
1356
- if (current.emittedStart && current.id && (current.pendingArgumentDeltas?.length ?? 0) > 0) {
1357
- for (const pendingDelta of current.pendingArgumentDeltas ?? []) yield {
1358
- type: NcpEventType.MessageToolCallArgsDelta,
1359
- payload: {
1360
- ...ctx,
1361
- toolCallId: current.id,
1362
- delta: pendingDelta
1363
- }
1364
- };
1365
- current.emittedArgsDelta = true;
1366
- current.pendingArgumentDeltas = [];
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
- buffers.set(index, current);
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 ctx = {
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 runStarted = {
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
- yield {
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.47",
3
+ "version": "0.4.1",
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.6.6"
19
+ "@nextclaw/ncp": "0.7.1"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^20.17.6",