@nextclaw/ncp-toolkit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -74,6 +74,7 @@ type AgentSessionRecord = {
74
74
  sessionId: string;
75
75
  messages: NcpMessage[];
76
76
  updatedAt: string;
77
+ metadata?: Record<string, unknown>;
77
78
  };
78
79
  type LiveSessionExecution = {
79
80
  controller: AbortController;
package/dist/index.js CHANGED
@@ -2,14 +2,22 @@
2
2
  import {
3
3
  NcpEventType
4
4
  } from "@nextclaw/ncp";
5
- var DEFAULT_ASSISTANT_ROLE = "assistant";
6
- var cloneMessage = (message) => {
5
+
6
+ // src/agent/agent-conversation-message-normalizer.ts
7
+ import { sanitizeAssistantReplyTags } from "@nextclaw/ncp";
8
+ function cloneConversationMessage(message) {
7
9
  return {
8
10
  ...message,
9
11
  parts: [...message.parts],
10
12
  metadata: message.metadata ? { ...message.metadata } : void 0
11
13
  };
12
- };
14
+ }
15
+ function normalizeConversationMessage(message) {
16
+ return cloneConversationMessage(sanitizeAssistantReplyTags(message));
17
+ }
18
+
19
+ // src/agent/agent-conversation-state-manager.ts
20
+ var DEFAULT_ASSISTANT_ROLE = "assistant";
13
21
  var buildRuntimeError = (payload) => {
14
22
  const message = payload.error?.trim();
15
23
  return {
@@ -39,8 +47,8 @@ var DefaultNcpAgentConversationStateManager = class {
39
47
  return this.snapshotCache;
40
48
  }
41
49
  const snapshot = {
42
- messages: this.messages.map((message) => cloneMessage(message)),
43
- streamingMessage: this.streamingMessage ? cloneMessage(this.streamingMessage) : null,
50
+ messages: this.messages.map((message) => cloneConversationMessage(message)),
51
+ streamingMessage: this.streamingMessage ? cloneConversationMessage(this.streamingMessage) : null,
44
52
  error: this.error ? { ...this.error, details: this.error.details ? { ...this.error.details } : void 0 } : null,
45
53
  activeRun: this.activeRun ? { ...this.activeRun } : null
46
54
  };
@@ -66,7 +74,7 @@ var DefaultNcpAgentConversationStateManager = class {
66
74
  this.notifyListeners();
67
75
  }
68
76
  hydrate(payload) {
69
- this.messages = payload.messages.map((message) => cloneMessage(message));
77
+ this.messages = payload.messages.map((message) => normalizeConversationMessage(message));
70
78
  this.streamingMessage = null;
71
79
  this.error = null;
72
80
  this.activeRun = payload.activeRun ? {
@@ -387,7 +395,7 @@ var DefaultNcpAgentConversationStateManager = class {
387
395
  }
388
396
  const messageIndex = this.messages.findIndex((message) => message.id === messageId);
389
397
  if (messageIndex >= 0) {
390
- const existingMessage = cloneMessage(this.messages[messageIndex]);
398
+ const existingMessage = cloneConversationMessage(this.messages[messageIndex]);
391
399
  const nextMessages = [...this.messages];
392
400
  nextMessages.splice(messageIndex, 1);
393
401
  this.messages = nextMessages;
@@ -471,7 +479,7 @@ var DefaultNcpAgentConversationStateManager = class {
471
479
  return nextParts;
472
480
  }
473
481
  upsertMessage(message) {
474
- const normalizedMessage = cloneMessage(message);
482
+ const normalizedMessage = normalizeConversationMessage(message);
475
483
  const messageIndex = this.messages.findIndex((item) => item.id === normalizedMessage.id);
476
484
  if (messageIndex < 0) {
477
485
  this.messages = [...this.messages, normalizedMessage];
@@ -487,7 +495,7 @@ var DefaultNcpAgentConversationStateManager = class {
487
495
  if (!nextStreamingMessage && !this.streamingMessage) {
488
496
  return;
489
497
  }
490
- this.streamingMessage = nextStreamingMessage ? cloneMessage(nextStreamingMessage) : null;
498
+ this.streamingMessage = nextStreamingMessage ? normalizeConversationMessage(nextStreamingMessage) : null;
491
499
  this.stateVersion += 1;
492
500
  }
493
501
  setError(nextError) {
@@ -652,21 +660,19 @@ var AgentRunExecutor = class {
652
660
  metadata: envelope.metadata
653
661
  }
654
662
  };
655
- let messageSentPublished = false;
663
+ await session.stateManager.dispatch(messageSent);
664
+ await this.persistSession(envelope.sessionId);
665
+ yield structuredClone(messageSent);
656
666
  try {
657
667
  for await (const event of session.runtime.run(
658
668
  {
659
669
  sessionId: envelope.sessionId,
660
670
  messages: [envelope.message],
661
- correlationId: envelope.correlationId
671
+ correlationId: envelope.correlationId,
672
+ metadata: envelope.metadata
662
673
  },
663
674
  { signal: controller.signal }
664
675
  )) {
665
- if (!messageSentPublished) {
666
- messageSentPublished = true;
667
- await this.persistSession(envelope.sessionId);
668
- yield structuredClone(messageSent);
669
- }
670
676
  await this.persistSession(envelope.sessionId);
671
677
  yield structuredClone(event);
672
678
  }
@@ -1076,7 +1082,8 @@ var DefaultNcpAgentBackend = class {
1076
1082
  await this.sessionStore.saveSession({
1077
1083
  sessionId,
1078
1084
  messages: readMessages(snapshot),
1079
- updatedAt: now()
1085
+ updatedAt: now(),
1086
+ metadata: session.activeExecution?.requestEnvelope.metadata
1080
1087
  });
1081
1088
  }
1082
1089
  };
@@ -1092,7 +1099,8 @@ function toSessionSummary(session, liveSession) {
1092
1099
  sessionId: session.sessionId,
1093
1100
  messageCount: session.messages.length,
1094
1101
  updatedAt: session.updatedAt,
1095
- status: liveSession?.activeExecution ? "running" : "idle"
1102
+ status: liveSession?.activeExecution ? "running" : "idle",
1103
+ ...session.metadata ? { metadata: structuredClone(session.metadata) } : {}
1096
1104
  };
1097
1105
  }
1098
1106
  function toLiveSessionSummary(session) {
@@ -1101,7 +1109,8 @@ function toLiveSessionSummary(session) {
1101
1109
  sessionId: session.sessionId,
1102
1110
  messageCount: readMessages(snapshot).length,
1103
1111
  updatedAt: now(),
1104
- status: session.activeExecution ? "running" : "idle"
1112
+ status: session.activeExecution ? "running" : "idle",
1113
+ ...session.activeExecution?.requestEnvelope.metadata ? { metadata: structuredClone(session.activeExecution.requestEnvelope.metadata) } : {}
1105
1114
  };
1106
1115
  }
1107
1116
  function now() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ncp-toolkit",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Toolkit implementations built on top of the NextClaw Communication Protocol.",
6
6
  "type": "module",
@@ -15,7 +15,7 @@
15
15
  "dist"
16
16
  ],
17
17
  "dependencies": {
18
- "@nextclaw/ncp": "0.2.0"
18
+ "@nextclaw/ncp": "0.3.0"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@types/node": "^20.17.6",
@@ -23,7 +23,7 @@
23
23
  "tsup": "^8.3.5",
24
24
  "typescript": "^5.6.3",
25
25
  "vitest": "^2.1.2",
26
- "@nextclaw/ncp-agent-runtime": "0.1.1"
26
+ "@nextclaw/ncp-agent-runtime": "0.2.0"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsup src/index.ts --format esm --dts --out-dir dist",