@nextclaw/ncp 0.6.6 → 0.7.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
@@ -22,6 +22,17 @@ declare function isHiddenNcpMessage(message: Pick<NcpMessage, "metadata"> | null
22
22
  * - `error` — Terminated with an error; `parts` may be incomplete.
23
23
  */
24
24
  type NcpMessageStatus = "pending" | "streaming" | "final" | "error";
25
+ /**
26
+ * Message lifecycle timing.
27
+ *
28
+ * For assistant messages, these fields describe when the response started and
29
+ * stopped being produced. They are intentionally message-level and not tied to
30
+ * a specific runtime implementation such as an NCP run.
31
+ */
32
+ type NcpMessageLifecycle = {
33
+ startedAt?: string;
34
+ endedAt?: string;
35
+ };
25
36
  /** Plain text content. The most common part type. */
26
37
  type NcpTextPart = {
27
38
  type: "text";
@@ -142,7 +153,8 @@ type NcpMessage = {
142
153
  role: NcpMessageRole;
143
154
  status: NcpMessageStatus;
144
155
  parts: NcpMessagePart[]; /** ISO 8601 timestamp (e.g. `"2024-01-15T10:30:00.000Z"`). */
145
- timestamp: string; /** Arbitrary transport- or application-level metadata. */
156
+ timestamp: string; /** Optional lifecycle timing for this message. */
157
+ lifecycle?: NcpMessageLifecycle; /** Arbitrary transport- or application-level metadata. */
146
158
  metadata?: Record<string, unknown>;
147
159
  };
148
160
  //#endregion
@@ -374,12 +386,15 @@ type NcpRunStartedPayload = {
374
386
  messageId?: string;
375
387
  threadId?: string;
376
388
  runId?: string;
389
+ startedAt?: string;
377
390
  } & NcpCorrelationPayload;
378
391
  type NcpRunFinishedPayload = {
379
392
  sessionId?: string;
380
393
  messageId?: string;
381
394
  threadId?: string;
382
395
  runId?: string;
396
+ startedAt?: string;
397
+ endedAt?: string;
383
398
  } & NcpCorrelationPayload;
384
399
  type NcpRunErrorPayload = {
385
400
  sessionId?: string;
@@ -387,6 +402,8 @@ type NcpRunErrorPayload = {
387
402
  error?: string;
388
403
  threadId?: string;
389
404
  runId?: string;
405
+ startedAt?: string;
406
+ endedAt?: string;
390
407
  } & NcpCorrelationPayload;
391
408
  type NcpRunMetadataPayload = {
392
409
  sessionId?: string;
@@ -486,7 +503,10 @@ declare enum NcpEventType {
486
503
  TypingEnd = "typing.end",
487
504
  PresenceUpdated = "presence.updated"
488
505
  }
489
- type NcpEndpointEvent = {
506
+ type NcpEventTiming = {
507
+ /** ISO 8601 timestamp for when the event happened in the producer's domain. */occurredAt?: string;
508
+ };
509
+ type NcpEndpointEvent = NcpEventTiming & ({
490
510
  type: NcpEventType.EndpointReady;
491
511
  } | {
492
512
  type: NcpEventType.MessageRequest;
@@ -584,6 +604,12 @@ type NcpEndpointEvent = {
584
604
  } | {
585
605
  type: NcpEventType.MessageReaction;
586
606
  payload: NcpMessageReactionPayload;
607
+ });
608
+ type NcpEndpointEventDraft = NcpEndpointEvent extends infer Event ? Event extends NcpEndpointEvent ? Omit<Event, "occurredAt"> : never : never;
609
+ declare function createNcpEndpointEvent<T extends NcpEndpointEventDraft>(event: T & {
610
+ occurredAt?: string;
611
+ }, occurredAt?: string): T & {
612
+ occurredAt: string;
587
613
  };
588
614
  type NcpEndpointSubscriber = (event: NcpEndpointEvent) => void;
589
615
  //#endregion
@@ -844,6 +870,7 @@ interface NcpTool {
844
870
  execute(args: unknown, context?: NcpToolExecutionContext): Promise<unknown>;
845
871
  }
846
872
  type NcpToolExecutionContext = {
873
+ abortSignal?: AbortSignal;
847
874
  toolCallId: string;
848
875
  updateToolCallResult?: (result: unknown) => Promise<void>;
849
876
  };
@@ -1035,5 +1062,5 @@ declare function normalizeAssistantText(text: string, mode: NcpAssistantReasonin
1035
1062
  declare function createNcpRunHandle(envelope: NcpRequestEnvelope): NcpRunHandle;
1036
1063
  declare function consumeNcpRunHandle(events: AsyncIterable<NcpEndpointEvent>, fallback: NcpRunHandle): Promise<NcpRunHandle>;
1037
1064
  //#endregion
1038
- export { ListMessagesOptions, ListSessionsOptions, NCP_INTERNAL_VISIBILITY_METADATA_KEY, NcpActionPart, NcpAgentClientEndpoint, NcpAgentConversationHydrationParams, NcpAgentConversationSnapshot, NcpAgentConversationStateManager, NcpAgentRunApi, NcpAgentRunExecutionContext, NcpAgentRunInput, NcpAgentRunOptions, NcpAgentRunSendOptions, NcpAgentRunStreamOptions, NcpAgentRuntime, NcpAgentSendEnvelope, NcpAgentServerEndpoint, NcpAgentStreamProvider, NcpAssistantReasoningNormalizationMode, NcpAssistantReasoningSegment, NcpAssistantTextStreamNormalizer, NcpCardPart, NcpCompletedEnvelope, NcpContextBuilder, NcpContextPrepareOptions, NcpContextWindowUpdatedPayload, NcpConversationSnapshot, NcpConversationStateManager, NcpCorrelationPayload, NcpEncodeContext, NcpEndpoint, NcpEndpointEvent, NcpEndpointKind, NcpEndpointLatency, NcpEndpointManifest, NcpEndpointSubscriber, NcpError, NcpErrorCode, NcpEventType, NcpExtensionPart, NcpFailedEnvelope, NcpFilePart, NcpInvalidToolArgumentsResult, NcpLLMApi, NcpLLMApiInput, NcpLLMApiOptions, NcpMessage, NcpMessageAbortPayload, NcpMessageAcceptedPayload, NcpMessageDeliveredPayload, NcpMessagePart, NcpMessageReactionPayload, NcpMessageReadPayload, NcpMessageRecalledPayload, NcpMessageRole, NcpMessageSentPayload, NcpMessageStatus, NcpOutboundMessageDraft, NcpPendingToolCall, NcpPresenceUpdatedPayload, NcpProviderRuntimeRoute, NcpReasoningDeltaPayload, NcpReasoningEndPayload, NcpReasoningPart, NcpReasoningStartPayload, NcpReplyTagParseResult, NcpRequestEnvelope, NcpResponseEnvelope, NcpRichTextPart, NcpRoundBuffer, NcpRunContext, NcpRunErrorPayload, NcpRunFinalMetadata, NcpRunFinishedPayload, NcpRunHandle, NcpRunMetadataPayload, NcpRunReadyMetadata, NcpRunStartedPayload, NcpSessionApi, NcpSessionPatch, NcpSessionStatus, NcpSessionSummary, NcpSourcePart, NcpStepStartPart, NcpStreamEncoder, NcpStreamRequestPayload, NcpTextDeltaPayload, NcpTextEndPayload, NcpTextPart, NcpTextStartPayload, NcpTool, NcpToolCallArgsDeltaPayload, NcpToolCallArgsPayload, NcpToolCallEndPayload, NcpToolCallResult, NcpToolCallResultPayload, NcpToolCallStartPayload, NcpToolDefinition, NcpToolExecutionContext, NcpToolInvocationPart, NcpToolOutputContentItem, NcpToolOutputImageItem, NcpToolOutputTextItem, NcpToolRegistry, NcpTypingEndPayload, NcpTypingStartPayload, OpenAIChatChunk, OpenAIChatMessage, OpenAIContentPart, OpenAITool, OpenAIToolCall, OpenAIToolCallDelta, consumeNcpRunHandle, createNcpRunHandle, isHiddenNcpMessage, normalizeAssistantText, readAssistantReasoningNormalizationMode, readAssistantReasoningNormalizationModeFromMetadata, sanitizeAssistantReplyTags, stripReplyTagsFromText, writeAssistantReasoningNormalizationModeToMetadata };
1065
+ export { ListMessagesOptions, ListSessionsOptions, NCP_INTERNAL_VISIBILITY_METADATA_KEY, NcpActionPart, NcpAgentClientEndpoint, NcpAgentConversationHydrationParams, NcpAgentConversationSnapshot, NcpAgentConversationStateManager, NcpAgentRunApi, NcpAgentRunExecutionContext, NcpAgentRunInput, NcpAgentRunOptions, NcpAgentRunSendOptions, NcpAgentRunStreamOptions, NcpAgentRuntime, NcpAgentSendEnvelope, NcpAgentServerEndpoint, NcpAgentStreamProvider, NcpAssistantReasoningNormalizationMode, NcpAssistantReasoningSegment, NcpAssistantTextStreamNormalizer, NcpCardPart, NcpCompletedEnvelope, NcpContextBuilder, NcpContextPrepareOptions, NcpContextWindowUpdatedPayload, NcpConversationSnapshot, NcpConversationStateManager, NcpCorrelationPayload, NcpEncodeContext, NcpEndpoint, NcpEndpointEvent, NcpEndpointEventDraft, NcpEndpointKind, NcpEndpointLatency, NcpEndpointManifest, NcpEndpointSubscriber, NcpError, NcpErrorCode, NcpEventTiming, NcpEventType, NcpExtensionPart, NcpFailedEnvelope, NcpFilePart, NcpInvalidToolArgumentsResult, NcpLLMApi, NcpLLMApiInput, NcpLLMApiOptions, NcpMessage, NcpMessageAbortPayload, NcpMessageAcceptedPayload, NcpMessageDeliveredPayload, NcpMessageLifecycle, NcpMessagePart, NcpMessageReactionPayload, NcpMessageReadPayload, NcpMessageRecalledPayload, NcpMessageRole, NcpMessageSentPayload, NcpMessageStatus, NcpOutboundMessageDraft, NcpPendingToolCall, NcpPresenceUpdatedPayload, NcpProviderRuntimeRoute, NcpReasoningDeltaPayload, NcpReasoningEndPayload, NcpReasoningPart, NcpReasoningStartPayload, NcpReplyTagParseResult, NcpRequestEnvelope, NcpResponseEnvelope, NcpRichTextPart, NcpRoundBuffer, NcpRunContext, NcpRunErrorPayload, NcpRunFinalMetadata, NcpRunFinishedPayload, NcpRunHandle, NcpRunMetadataPayload, NcpRunReadyMetadata, NcpRunStartedPayload, NcpSessionApi, NcpSessionPatch, NcpSessionStatus, NcpSessionSummary, NcpSourcePart, NcpStepStartPart, NcpStreamEncoder, NcpStreamRequestPayload, NcpTextDeltaPayload, NcpTextEndPayload, NcpTextPart, NcpTextStartPayload, NcpTool, NcpToolCallArgsDeltaPayload, NcpToolCallArgsPayload, NcpToolCallEndPayload, NcpToolCallResult, NcpToolCallResultPayload, NcpToolCallStartPayload, NcpToolDefinition, NcpToolExecutionContext, NcpToolInvocationPart, NcpToolOutputContentItem, NcpToolOutputImageItem, NcpToolOutputTextItem, NcpToolRegistry, NcpTypingEndPayload, NcpTypingStartPayload, OpenAIChatChunk, OpenAIChatMessage, OpenAIContentPart, OpenAITool, OpenAIToolCall, OpenAIToolCallDelta, consumeNcpRunHandle, createNcpEndpointEvent, createNcpRunHandle, isHiddenNcpMessage, normalizeAssistantText, readAssistantReasoningNormalizationMode, readAssistantReasoningNormalizationModeFromMetadata, sanitizeAssistantReplyTags, stripReplyTagsFromText, writeAssistantReasoningNormalizationModeToMetadata };
1039
1066
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/message.ts","../src/types/manifest.ts","../src/types/errors.ts","../src/types/session.types.ts","../src/agent-runtime/llm-api.ts","../src/types/events.ts","../src/types/run.ts","../src/types/endpoint.ts","../src/endpoint/agent-client-endpoint.ts","../src/endpoint/agent-server-endpoint.ts","../src/types/agent-runtime.types.ts","../src/agent-backend/controller.ts","../src/toolkit/conversation-state.ts","../src/toolkit/agent/agent-conversation-state-manager.ts","../src/toolkit/reply-tags.ts","../src/toolkit/reasoning-normalization.ts","../src/toolkit/run-handle.utils.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/message.ts","../src/types/manifest.ts","../src/types/errors.ts","../src/types/session.types.ts","../src/agent-runtime/llm-api.ts","../src/types/events.ts","../src/types/run.ts","../src/types/endpoint.ts","../src/endpoint/agent-client-endpoint.ts","../src/endpoint/agent-server-endpoint.ts","../src/types/agent-runtime.types.ts","../src/agent-backend/controller.ts","../src/toolkit/conversation-state.ts","../src/toolkit/agent/agent-conversation-state-manager.ts","../src/toolkit/reply-tags.ts","../src/toolkit/reasoning-normalization.ts","../src/toolkit/run-handle.utils.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -41,6 +41,12 @@ let NcpEventType = /* @__PURE__ */ function(NcpEventType) {
41
41
  NcpEventType["PresenceUpdated"] = "presence.updated";
42
42
  return NcpEventType;
43
43
  }({});
44
+ function createNcpEndpointEvent(event, occurredAt = event.occurredAt ?? (/* @__PURE__ */ new Date()).toISOString()) {
45
+ return {
46
+ ...event,
47
+ occurredAt
48
+ };
49
+ }
44
50
  //#endregion
45
51
  //#region src/toolkit/reply-tags.ts
46
52
  const REPLY_TO_CURRENT_PATTERN = /\[\[\s*reply_to_current\s*\]\]/gi;
@@ -319,6 +325,6 @@ function consumeNcpRunHandle(events, fallback) {
319
325
  });
320
326
  }
321
327
  //#endregion
322
- export { NCP_INTERNAL_VISIBILITY_METADATA_KEY, NcpAssistantTextStreamNormalizer, NcpEventType, consumeNcpRunHandle, createNcpRunHandle, isHiddenNcpMessage, normalizeAssistantText, readAssistantReasoningNormalizationMode, readAssistantReasoningNormalizationModeFromMetadata, sanitizeAssistantReplyTags, stripReplyTagsFromText, writeAssistantReasoningNormalizationModeToMetadata };
328
+ export { NCP_INTERNAL_VISIBILITY_METADATA_KEY, NcpAssistantTextStreamNormalizer, NcpEventType, consumeNcpRunHandle, createNcpEndpointEvent, createNcpRunHandle, isHiddenNcpMessage, normalizeAssistantText, readAssistantReasoningNormalizationMode, readAssistantReasoningNormalizationModeFromMetadata, sanitizeAssistantReplyTags, stripReplyTagsFromText, writeAssistantReasoningNormalizationModeToMetadata };
323
329
 
324
330
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/types/message.ts","../src/types/events.ts","../src/toolkit/reply-tags.ts","../src/toolkit/reasoning-normalization.ts","../src/toolkit/run-handle.utils.ts"],"sourcesContent":["/**\n * Participants in an NCP conversation.\n *\n * - `user` — A human end-user interacting with the system.\n * - `assistant` — An AI model generating responses.\n * - `system` — Configuration or instruction injected before the conversation.\n * - `tool` — The result returned by a tool invocation.\n * - `service` — A platform-side notification or event (e.g. a bot posting a card),\n * distinct from an AI assistant response.\n */\nexport type NcpMessageRole = \"user\" | \"assistant\" | \"system\" | \"tool\" | \"service\";\n\nexport const NCP_INTERNAL_VISIBILITY_METADATA_KEY = \"ncp_internal_visibility\";\n\nexport function isHiddenNcpMessage(message: Pick<NcpMessage, \"metadata\"> | null | undefined): boolean {\n return message?.metadata?.[NCP_INTERNAL_VISIBILITY_METADATA_KEY] === \"hidden\";\n}\n\n/**\n * Lifecycle state of a message.\n *\n * Applies to both streaming and non-streaming endpoints:\n * - `pending` — Created but not yet sent or received.\n * - `streaming` — Actively receiving incremental deltas.\n * - `final` — Fully received; no further updates expected.\n * - `error` — Terminated with an error; `parts` may be incomplete.\n */\nexport type NcpMessageStatus = \"pending\" | \"streaming\" | \"final\" | \"error\";\n\n// ---------------------------------------------------------------------------\n// Core portable parts\n// ---------------------------------------------------------------------------\n\n/** Plain text content. The most common part type. */\nexport type NcpTextPart = {\n type: \"text\";\n text: string;\n};\n\n/**\n * A file attachment, delivered either as a URL or inline Base64 content.\n *\n * `url` and `contentBase64` are mutually exclusive — populate exactly one.\n */\nexport type NcpFilePart = {\n type: \"file\";\n name?: string;\n mimeType?: string;\n /** Stable logical asset reference managed by the hosting app. */\n assetUri?: string;\n /** Remote URL pointing to the file. Mutually exclusive with `contentBase64`. */\n url?: string;\n /** Inline file content encoded as Base64. Mutually exclusive with `url`. */\n contentBase64?: string;\n sizeBytes?: number;\n};\n\n/** A cited source or reference, typically surfaced alongside AI-generated content. */\nexport type NcpSourcePart = {\n type: \"source\";\n title?: string;\n url?: string;\n /** Short excerpt from the source relevant to the message. */\n snippet?: string;\n};\n\n/**\n * Marks the beginning of a logical reasoning step in a multi-step response.\n * Used by chain-of-thought or agentic flows to delimit discrete steps.\n */\nexport type NcpStepStartPart = {\n type: \"step-start\";\n stepId?: string;\n /** Human-readable label for the step (e.g. \"Searching the web\"). */\n title?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Agent-oriented parts\n// ---------------------------------------------------------------------------\n\n/** Internal reasoning text produced by the model before its final response. */\nexport type NcpReasoningPart = {\n type: \"reasoning\";\n text: string;\n};\n\nexport type NcpToolOutputTextItem = {\n type: \"input_text\";\n text: string;\n};\n\nexport type NcpToolOutputImageItem = {\n type: \"input_image\";\n imageUrl: string;\n mimeType?: string;\n detail?: \"low\" | \"high\" | \"auto\" | \"original\";\n originalDataChars?: number;\n dataOmitted?: boolean;\n};\n\nexport type NcpToolOutputContentItem =\n | NcpToolOutputTextItem\n | NcpToolOutputImageItem;\n\n/**\n * Represents a tool call and its lifecycle.\n *\n * State semantics (aligned with the Vercel AI SDK convention):\n * - `\"call\"` — The model has emitted a complete tool call; `args` is populated.\n * - `\"partial-call\"` — Arguments are still being streamed; `args` may be incomplete.\n * - `\"result\"` — The tool has returned; `result` is populated.\n * - `\"cancelled\"` — The tool was interrupted before a result was delivered.\n */\nexport type NcpToolInvocationPart = {\n type: \"tool-invocation\";\n toolName: string;\n toolCallId?: string;\n state?: \"call\" | \"partial-call\" | \"result\" | \"cancelled\";\n /** Tool input arguments. May be partial when `state === \"partial-call\"`. */\n args?: unknown;\n /** Tool output. Populated when `state === \"result\"`. */\n result?: unknown;\n /** Model-visible structured output items. Text is bounded; images remain image items. */\n resultContentItems?: NcpToolOutputContentItem[];\n};\n\n// ---------------------------------------------------------------------------\n// Collaboration-platform parts\n// ---------------------------------------------------------------------------\n\n/**\n * A rich card with arbitrary structured data.\n * Rendering is delegated to the platform (e.g. Slack block kit, Teams card).\n */\nexport type NcpCardPart = {\n type: \"card\";\n payload: Record<string, unknown>;\n};\n\n/** Formatted text with an explicit markup format hint. */\nexport type NcpRichTextPart = {\n type: \"rich-text\";\n format: \"markdown\" | \"html\" | \"plain\";\n text: string;\n};\n\n/**\n * An interactive action button or trigger exposed to the user.\n * The platform is responsible for rendering and routing the action.\n */\nexport type NcpActionPart = {\n type: \"action\";\n actionId: string;\n /** Display label shown to the user. */\n label: string;\n /** Arbitrary data forwarded to the action handler. */\n payload?: unknown;\n};\n\n// ---------------------------------------------------------------------------\n// Open extension slot\n// ---------------------------------------------------------------------------\n\n/**\n * Escape hatch for custom or future part types not yet in the NCP spec.\n *\n * Use this to avoid forking the protocol during early iterations.\n * Once a part type stabilizes, promote it to a first-class `NcpXxxPart`.\n */\nexport type NcpExtensionPart = {\n type: \"extension\";\n /** Namespaced identifier for the custom part (e.g. `\"myapp.highlight\"`). */\n extensionType: string;\n data: unknown;\n};\n\n// ---------------------------------------------------------------------------\n// Unified part union\n// ---------------------------------------------------------------------------\n\n/** Union of all recognized NCP message part types. */\nexport type NcpMessagePart =\n | NcpTextPart\n | NcpFilePart\n | NcpSourcePart\n | NcpStepStartPart\n | NcpReasoningPart\n | NcpToolInvocationPart\n | NcpCardPart\n | NcpRichTextPart\n | NcpActionPart\n | NcpExtensionPart;\n\n// ---------------------------------------------------------------------------\n// Message envelope\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical message envelope exchanged and persisted in NCP.\n *\n * A message is composed of an ordered list of typed `parts`, allowing\n * heterogeneous content (text, files, tool calls, etc.) in a single message.\n */\nexport type NcpMessage = {\n /** Globally unique message identifier. */\n id: string;\n /** The session this message belongs to. */\n sessionId: string;\n role: NcpMessageRole;\n status: NcpMessageStatus;\n parts: NcpMessagePart[];\n /** ISO 8601 timestamp (e.g. `\"2024-01-15T10:30:00.000Z\"`). */\n timestamp: string;\n /** Arbitrary transport- or application-level metadata. */\n metadata?: Record<string, unknown>;\n};\n","import type { OpenAITool } from \"../agent-runtime/llm-api.js\";\nimport type { NcpError } from \"./errors.js\";\nimport type { NcpMessage, NcpToolOutputContentItem } from \"./message.js\";\n\n/**\n * NCP event and payload definitions.\n *\n * Streaming content (text, reasoning, tool args) uses start → delta sequence → end.\n * The same content can be sent as a single full event (e.g. message.incoming or message.completed)\n * instead; endpoints or upper layers choose as needed.\n */\n\n// ---------------------------------------------------------------------------\n// Message envelopes (used by request/incoming/completed/failed)\n// ---------------------------------------------------------------------------\n\nexport type NcpCorrelationPayload = {\n correlationId?: string;\n};\n\nexport type NcpRequestEnvelope = {\n sessionId: string;\n message: NcpMessage;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n providerRoute?: NcpProviderRuntimeRoute;\n tools?: ReadonlyArray<OpenAITool>;\n};\n\nexport type NcpOutboundMessageDraft = Omit<NcpMessage, \"sessionId\"> & {\n sessionId?: string;\n};\n\nexport type NcpAgentSendEnvelope = Omit<NcpRequestEnvelope, \"sessionId\" | \"message\"> & {\n sessionId?: string;\n message: NcpMessage | NcpOutboundMessageDraft;\n};\n\nexport type NcpProviderRuntimeRoute = {\n model: string;\n apiKey?: string | null;\n apiBase?: string | null;\n headers: Record<string, string>;\n};\n\n/** Payload for message.incoming: message content from the other peer (partial or full). */\nexport type NcpResponseEnvelope = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpCompletedEnvelope = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpFailedEnvelope = {\n sessionId: string;\n messageId?: string;\n error: NcpError;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpMessageAcceptedPayload = {\n messageId: string;\n transportId?: string;\n} & NcpCorrelationPayload;\n\n/** Payload for message.abort: identifies which session's active execution to cancel. */\nexport type NcpMessageAbortPayload = {\n sessionId: string;\n messageId?: string;\n} & NcpCorrelationPayload;\n\n/**\n * Payload for message.stream-request: attach to the live event stream of a session.\n * Used when reconnecting during an active response or attaching another live reader.\n */\nexport type NcpStreamRequestPayload = {\n sessionId: string;\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Payload for message.sent: the local peer has sent a message (outbound).\n * Typically non-streaming; add the message to the local conversation state.\n */\nexport type NcpMessageSentPayload = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// IM: typing indicator (user or bot)\n// ---------------------------------------------------------------------------\n\nexport type NcpTypingStartPayload = {\n sessionId: string;\n /** Participant who is typing (human user or bot/assistant). */\n userId?: string;\n};\n\nexport type NcpTypingEndPayload = {\n sessionId: string;\n /** Participant who stopped typing (human user or bot/assistant). */\n userId?: string;\n};\n\n// ---------------------------------------------------------------------------\n// IM: presence (online/offline/away)\n// ---------------------------------------------------------------------------\n\nexport type NcpPresenceUpdatedPayload = {\n sessionId: string;\n /** Participant this presence applies to (human user or bot/assistant). */\n userId?: string;\n status: \"online\" | \"offline\" | \"away\";\n};\n\n// ---------------------------------------------------------------------------\n// IM: read receipt, delivery receipt, recall, reaction\n// ---------------------------------------------------------------------------\n\nexport type NcpMessageReadPayload = {\n sessionId: string;\n messageId: string;\n readAt?: string;\n readerId?: string;\n};\n\nexport type NcpMessageDeliveredPayload = {\n sessionId: string;\n messageId: string;\n};\n\nexport type NcpMessageRecalledPayload = {\n sessionId: string;\n messageId: string;\n};\n\nexport type NcpMessageReactionPayload = {\n sessionId: string;\n messageId: string;\n reaction: string;\n added: boolean;\n /** Participant who added or removed the reaction (human user or bot/assistant). */\n userId?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Run lifecycle (aligned with agent-chat RUN_*)\n// ---------------------------------------------------------------------------\n\nexport type NcpRunStartedPayload = {\n sessionId?: string;\n messageId?: string;\n threadId?: string;\n runId?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunFinishedPayload = {\n sessionId?: string;\n messageId?: string;\n threadId?: string;\n runId?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunErrorPayload = {\n sessionId?: string;\n messageId?: string;\n error?: string;\n threadId?: string;\n runId?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunMetadataPayload = {\n sessionId?: string;\n messageId?: string;\n runId?: string;\n metadata: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpContextWindowUpdatedPayload = {\n sessionId: string;\n contextWindow: Record<string, unknown>;\n};\n\n// ---------------------------------------------------------------------------\n// Text stream (aligned with agent-chat TEXT_*)\n// Streaming: text-start → text-delta sequence → text-end. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpTextStartPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpTextDeltaPayload = {\n sessionId: string;\n messageId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpTextEndPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Reasoning stream (aligned with agent-chat REASONING_*)\n// Streaming: reasoning-start → reasoning-delta sequence → reasoning-end. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpReasoningStartPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpReasoningDeltaPayload = {\n sessionId: string;\n messageId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpReasoningEndPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Tool call stream (aligned with agent-chat TOOL_CALL_*)\n// Streaming: tool-call-start → tool-call-args or tool-call-args-delta sequence → tool-call-end; then tool-call-result. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpToolCallStartPayload = {\n sessionId: string;\n messageId?: string;\n toolCallId: string;\n toolName: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallArgsPayload = {\n sessionId: string;\n toolCallId: string;\n args: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallArgsDeltaPayload = {\n sessionId: string;\n messageId?: string;\n toolCallId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallEndPayload = {\n sessionId: string;\n toolCallId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallResultPayload = {\n sessionId: string;\n toolCallId: string;\n content: unknown;\n contentItems?: NcpToolOutputContentItem[];\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Event type enum\n// ---------------------------------------------------------------------------\n\nexport enum NcpEventType {\n EndpointReady = \"endpoint.ready\",\n EndpointError = \"endpoint.error\",\n MessageRequest = \"message.request\",\n MessageStreamRequest = \"message.stream-request\",\n MessageSent = \"message.sent\",\n MessageAccepted = \"message.accepted\",\n MessageIncoming = \"message.incoming\",\n MessageCompleted = \"message.completed\",\n MessageFailed = \"message.failed\",\n MessageAbort = \"message.abort\",\n MessageTextStart = \"message.text-start\",\n MessageTextDelta = \"message.text-delta\",\n MessageTextEnd = \"message.text-end\",\n MessageReasoningStart = \"message.reasoning-start\",\n MessageReasoningDelta = \"message.reasoning-delta\",\n MessageReasoningEnd = \"message.reasoning-end\",\n MessageToolCallStart = \"message.tool-call-start\",\n MessageToolCallArgs = \"message.tool-call-args\",\n MessageToolCallArgsDelta = \"message.tool-call-args-delta\",\n MessageToolCallEnd = \"message.tool-call-end\",\n MessageToolCallResult = \"message.tool-call-result\",\n MessageRead = \"message.read\",\n MessageDelivered = \"message.delivered\",\n MessageRecalled = \"message.recalled\",\n MessageReaction = \"message.reaction\",\n RunStarted = \"run.started\",\n RunFinished = \"run.finished\",\n RunError = \"run.error\",\n RunMetadata = \"run.metadata\",\n ContextWindowUpdated = \"context-window.updated\",\n TypingStart = \"typing.start\",\n TypingEnd = \"typing.end\",\n PresenceUpdated = \"presence.updated\",\n}\n\n// ---------------------------------------------------------------------------\n// Event union (aligned with agent-chat EventType + endpoint lifecycle)\n// ---------------------------------------------------------------------------\n\nexport type NcpEndpointEvent =\n | { type: NcpEventType.EndpointReady }\n | { type: NcpEventType.MessageRequest; payload: NcpAgentSendEnvelope }\n | { type: NcpEventType.MessageStreamRequest; payload: NcpStreamRequestPayload }\n | { type: NcpEventType.MessageSent; payload: NcpMessageSentPayload }\n | { type: NcpEventType.MessageAccepted; payload: NcpMessageAcceptedPayload }\n | { type: NcpEventType.MessageIncoming; payload: NcpResponseEnvelope }\n | { type: NcpEventType.MessageCompleted; payload: NcpCompletedEnvelope }\n | { type: NcpEventType.MessageFailed; payload: NcpFailedEnvelope }\n | { type: NcpEventType.MessageAbort; payload: NcpMessageAbortPayload }\n | { type: NcpEventType.EndpointError; payload: NcpError }\n | { type: NcpEventType.RunStarted; payload: NcpRunStartedPayload }\n | { type: NcpEventType.RunFinished; payload: NcpRunFinishedPayload }\n | { type: NcpEventType.RunError; payload: NcpRunErrorPayload }\n | { type: NcpEventType.RunMetadata; payload: NcpRunMetadataPayload }\n | { type: NcpEventType.ContextWindowUpdated; payload: NcpContextWindowUpdatedPayload }\n | { type: NcpEventType.MessageTextStart; payload: NcpTextStartPayload }\n | { type: NcpEventType.MessageTextDelta; payload: NcpTextDeltaPayload }\n | { type: NcpEventType.MessageTextEnd; payload: NcpTextEndPayload }\n | { type: NcpEventType.MessageReasoningStart; payload: NcpReasoningStartPayload }\n | { type: NcpEventType.MessageReasoningDelta; payload: NcpReasoningDeltaPayload }\n | { type: NcpEventType.MessageReasoningEnd; payload: NcpReasoningEndPayload }\n | { type: NcpEventType.MessageToolCallStart; payload: NcpToolCallStartPayload }\n | { type: NcpEventType.MessageToolCallArgs; payload: NcpToolCallArgsPayload }\n | { type: NcpEventType.MessageToolCallArgsDelta; payload: NcpToolCallArgsDeltaPayload }\n | { type: NcpEventType.MessageToolCallEnd; payload: NcpToolCallEndPayload }\n | { type: NcpEventType.MessageToolCallResult; payload: NcpToolCallResultPayload }\n | { type: NcpEventType.TypingStart; payload: NcpTypingStartPayload }\n | { type: NcpEventType.TypingEnd; payload: NcpTypingEndPayload }\n | { type: NcpEventType.PresenceUpdated; payload: NcpPresenceUpdatedPayload }\n | { type: NcpEventType.MessageRead; payload: NcpMessageReadPayload }\n | { type: NcpEventType.MessageDelivered; payload: NcpMessageDeliveredPayload }\n | { type: NcpEventType.MessageRecalled; payload: NcpMessageRecalledPayload }\n | { type: NcpEventType.MessageReaction; payload: NcpMessageReactionPayload };\n\nexport type NcpEndpointSubscriber = (event: NcpEndpointEvent) => void;\n","import type { NcpMessage } from \"../types/message.js\";\n\nexport type NcpReplyTagParseResult = {\n content: string;\n replyTo?: string;\n};\n\nconst REPLY_TO_CURRENT_PATTERN = /\\[\\[\\s*reply_to_current\\s*\\]\\]/gi;\nconst REPLY_TO_ID_PATTERN = /\\[\\[\\s*reply_to\\s*:\\s*([^\\]]+?)\\s*\\]\\]/i;\n\nfunction normalizeReplyTarget(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function stripReplyTagsFromText(content: string, currentMessageId?: string): NcpReplyTagParseResult {\n let nextContent = content;\n let replyTo: string | undefined;\n\n if (REPLY_TO_CURRENT_PATTERN.test(nextContent)) {\n replyTo = normalizeReplyTarget(currentMessageId);\n nextContent = nextContent.replace(REPLY_TO_CURRENT_PATTERN, \"\").trim();\n }\n\n const explicitReplyTarget = nextContent.match(REPLY_TO_ID_PATTERN)?.[1];\n if (explicitReplyTarget) {\n replyTo = normalizeReplyTarget(explicitReplyTarget);\n nextContent = nextContent.replace(REPLY_TO_ID_PATTERN, \"\").trim();\n }\n\n return replyTo ? { content: nextContent, replyTo } : { content: nextContent };\n}\n\nexport function sanitizeAssistantReplyTags(\n message: NcpMessage,\n currentMessageId = message.id,\n): NcpMessage {\n if (message.role !== \"assistant\") {\n return {\n ...message,\n parts: [...message.parts],\n metadata: message.metadata ? { ...message.metadata } : undefined,\n };\n }\n\n const firstTextIndex = message.parts.findIndex((part) => part.type === \"text\");\n const nextMetadata = message.metadata ? { ...message.metadata } : undefined;\n const existingReplyTo = normalizeReplyTarget(nextMetadata?.reply_to);\n\n if (firstTextIndex < 0) {\n return {\n ...message,\n parts: [...message.parts],\n metadata: nextMetadata,\n };\n }\n\n const firstTextPart = message.parts[firstTextIndex];\n if (!firstTextPart || firstTextPart.type !== \"text\") {\n return {\n ...message,\n parts: [...message.parts],\n metadata: nextMetadata,\n };\n }\n\n const { content, replyTo } = stripReplyTagsFromText(firstTextPart.text, currentMessageId);\n const effectiveReplyTo = replyTo ?? existingReplyTo;\n const nextParts = message.parts.flatMap((part, index) => {\n if (index !== firstTextIndex || part.type !== \"text\") {\n return [part];\n }\n if (content.length === 0) {\n return [];\n }\n return [{ ...part, text: content }];\n });\n\n if (effectiveReplyTo) {\n return {\n ...message,\n parts: nextParts,\n metadata: {\n ...nextMetadata,\n reply_to: effectiveReplyTo,\n },\n };\n }\n\n return {\n ...message,\n parts: nextParts,\n metadata: nextMetadata,\n };\n}\n","export type NcpAssistantReasoningNormalizationMode = \"off\" | \"think-tags\";\n\nexport type NcpAssistantReasoningSegment = {\n type: \"text\" | \"reasoning\";\n text: string;\n};\n\nconst THINK_OPEN_TAG = \"<think>\";\nconst THINK_CLOSE_TAG = \"</think>\";\nconst FINAL_OPEN_TAG = \"<final>\";\nconst FINAL_CLOSE_TAG = \"</final>\";\nconst LEADING_CONTROL_TAGS = [THINK_CLOSE_TAG, FINAL_OPEN_TAG, FINAL_CLOSE_TAG] as const;\nconst MAX_REASONING_DELIMITER_TAIL = THINK_CLOSE_TAG.length - 1;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWhitespace(char: string): boolean {\n return /\\s/.test(char);\n}\n\nfunction normalizeMode(value: unknown): NcpAssistantReasoningNormalizationMode | null {\n if (value === \"off\" || value === \"think-tags\") {\n return value;\n }\n return null;\n}\n\nfunction readLeadingThinkTagState(\n buffer: string,\n): { status: \"matched\"; consumed: number } | { status: \"pending\" | \"rejected\" } {\n let cursor = 0;\n while (cursor < buffer.length && isWhitespace(buffer[cursor]!)) {\n cursor += 1;\n }\n\n const rest = buffer.slice(cursor);\n if (rest.startsWith(THINK_OPEN_TAG)) {\n return {\n status: \"matched\",\n consumed: cursor + THINK_OPEN_TAG.length,\n };\n }\n if (THINK_OPEN_TAG.startsWith(rest)) {\n return { status: \"pending\" };\n }\n return { status: \"rejected\" };\n}\n\nfunction stripLeadingControlTags(buffer: string): { buffer: string; pending: boolean } {\n let nextBuffer = buffer;\n\n while (true) {\n let cursor = 0;\n while (cursor < nextBuffer.length && isWhitespace(nextBuffer[cursor]!)) {\n cursor += 1;\n }\n\n const rest = nextBuffer.slice(cursor);\n if (rest.length === 0) {\n return { buffer: \"\", pending: false };\n }\n\n const matchedTag = LEADING_CONTROL_TAGS.find((tag) => rest.startsWith(tag));\n if (matchedTag) {\n nextBuffer = rest.slice(matchedTag.length);\n continue;\n }\n\n if (LEADING_CONTROL_TAGS.some((tag) => tag.startsWith(rest))) {\n return { buffer: rest, pending: true };\n }\n\n return { buffer: rest, pending: false };\n }\n}\n\nfunction findReasoningBoundary(buffer: string): { index: number; tag: string } | null {\n const indices = [\n { index: buffer.indexOf(THINK_CLOSE_TAG), tag: THINK_CLOSE_TAG },\n { index: buffer.indexOf(FINAL_OPEN_TAG), tag: FINAL_OPEN_TAG },\n ].filter((entry) => entry.index >= 0);\n\n if (indices.length === 0) {\n return null;\n }\n\n return indices.reduce((left, right) => (right.index < left.index ? right : left));\n}\n\nexport function readAssistantReasoningNormalizationMode(\n value: unknown,\n): NcpAssistantReasoningNormalizationMode | null {\n if (typeof value === \"string\") {\n return normalizeMode(value);\n }\n if (isRecord(value)) {\n return normalizeMode(value.mode);\n }\n return null;\n}\n\nexport function readAssistantReasoningNormalizationModeFromMetadata(\n metadata: Record<string, unknown> | null | undefined,\n): NcpAssistantReasoningNormalizationMode | null {\n if (!metadata) {\n return null;\n }\n return (\n readAssistantReasoningNormalizationMode(metadata.reasoning_normalization) ??\n readAssistantReasoningNormalizationMode(metadata.reasoningNormalization) ??\n normalizeMode(metadata.reasoning_normalization_mode) ??\n normalizeMode(metadata.reasoningNormalizationMode)\n );\n}\n\nexport function writeAssistantReasoningNormalizationModeToMetadata(\n metadata: Record<string, unknown>,\n mode: NcpAssistantReasoningNormalizationMode,\n): Record<string, unknown> {\n const nextMetadata = {\n ...metadata,\n };\n delete nextMetadata.reasoningNormalization;\n delete nextMetadata.reasoningNormalizationMode;\n delete nextMetadata.reasoning_normalization_mode;\n nextMetadata.reasoning_normalization = { mode };\n return nextMetadata;\n}\n\nexport class NcpAssistantTextStreamNormalizer {\n private buffer = \"\";\n private phase: \"initial\" | \"reasoning\" | \"text\" = \"initial\";\n private stripLeadingTextControlTags = false;\n\n constructor(private readonly mode: NcpAssistantReasoningNormalizationMode = \"off\") {}\n\n push(delta: string): NcpAssistantReasoningSegment[] {\n if (!delta) {\n return [];\n }\n if (this.mode !== \"think-tags\") {\n return [{ type: \"text\", text: delta }];\n }\n\n this.buffer += delta;\n return this.flush(false);\n }\n\n finish(): NcpAssistantReasoningSegment[] {\n if (this.mode !== \"think-tags\") {\n return [];\n }\n return this.flush(true);\n }\n\n private flush(final: boolean): NcpAssistantReasoningSegment[] {\n const segments: NcpAssistantReasoningSegment[] = [];\n\n while (true) {\n if (this.phase === \"initial\") {\n const leadingState = readLeadingThinkTagState(this.buffer);\n if (leadingState.status === \"matched\") {\n this.buffer = this.buffer.slice(leadingState.consumed);\n this.phase = \"reasoning\";\n continue;\n }\n if (leadingState.status === \"pending\" && !final) {\n return segments;\n }\n this.phase = \"text\";\n continue;\n }\n\n if (this.phase === \"reasoning\") {\n const boundary = findReasoningBoundary(this.buffer);\n if (boundary) {\n const reasoningText = this.buffer.slice(0, boundary.index);\n if (reasoningText.length > 0) {\n segments.push({ type: \"reasoning\", text: reasoningText });\n }\n this.buffer = this.buffer.slice(boundary.index + boundary.tag.length);\n this.phase = \"text\";\n this.stripLeadingTextControlTags = true;\n continue;\n }\n\n const safeLength = final ? this.buffer.length : Math.max(0, this.buffer.length - MAX_REASONING_DELIMITER_TAIL);\n if (safeLength === 0) {\n return segments;\n }\n segments.push({\n type: \"reasoning\",\n text: this.buffer.slice(0, safeLength),\n });\n this.buffer = this.buffer.slice(safeLength);\n if (!final) {\n return segments;\n }\n continue;\n }\n\n if (this.stripLeadingTextControlTags) {\n const stripped = stripLeadingControlTags(this.buffer);\n if (stripped.pending && !final) {\n this.buffer = stripped.buffer;\n return segments;\n }\n this.buffer = stripped.buffer;\n this.stripLeadingTextControlTags = false;\n }\n\n if (this.buffer.length === 0) {\n return segments;\n }\n\n segments.push({\n type: \"text\",\n text: this.buffer,\n });\n this.buffer = \"\";\n return segments;\n }\n }\n}\n\nexport function normalizeAssistantText(\n text: string,\n mode: NcpAssistantReasoningNormalizationMode,\n): {\n text: string;\n reasoning: string;\n parts: NcpAssistantReasoningSegment[];\n} {\n const normalizer = new NcpAssistantTextStreamNormalizer(mode);\n const parts = [...normalizer.push(text), ...normalizer.finish()].filter((part) => part.text.length > 0);\n\n return {\n text: parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n reasoning: parts\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\"),\n parts,\n };\n}\n","import {\n type NcpEndpointEvent,\n NcpEventType,\n type NcpRequestEnvelope,\n type NcpRunHandle,\n} from \"../types/ncp.types.js\";\n\nexport function createNcpRunHandle(envelope: NcpRequestEnvelope): NcpRunHandle {\n return {\n sessionId: envelope.sessionId,\n userMessageId: envelope.message.id,\n assistantMessageId: null,\n runId: null,\n ...(envelope.correlationId ? { correlationId: envelope.correlationId } : {}),\n };\n}\n\nexport function consumeNcpRunHandle(\n events: AsyncIterable<NcpEndpointEvent>,\n fallback: NcpRunHandle,\n): Promise<NcpRunHandle> {\n let resolved = false;\n let handle = fallback;\n\n return new Promise<NcpRunHandle>((resolve, reject) => {\n const resolveOnce = (): void => {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(handle);\n };\n\n void (async () => {\n try {\n for await (const event of events) {\n if (event.type === NcpEventType.RunStarted) {\n handle = {\n ...handle,\n assistantMessageId: event.payload.messageId ?? null,\n runId: event.payload.runId ?? null,\n };\n resolveOnce();\n }\n }\n resolveOnce();\n } catch (error) {\n if (!resolved) reject(error);\n }\n })();\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/types/message.ts","../src/types/events.ts","../src/toolkit/reply-tags.ts","../src/toolkit/reasoning-normalization.ts","../src/toolkit/run-handle.utils.ts"],"sourcesContent":["/**\n * Participants in an NCP conversation.\n *\n * - `user` — A human end-user interacting with the system.\n * - `assistant` — An AI model generating responses.\n * - `system` — Configuration or instruction injected before the conversation.\n * - `tool` — The result returned by a tool invocation.\n * - `service` — A platform-side notification or event (e.g. a bot posting a card),\n * distinct from an AI assistant response.\n */\nexport type NcpMessageRole = \"user\" | \"assistant\" | \"system\" | \"tool\" | \"service\";\n\nexport const NCP_INTERNAL_VISIBILITY_METADATA_KEY = \"ncp_internal_visibility\";\n\nexport function isHiddenNcpMessage(message: Pick<NcpMessage, \"metadata\"> | null | undefined): boolean {\n return message?.metadata?.[NCP_INTERNAL_VISIBILITY_METADATA_KEY] === \"hidden\";\n}\n\n/**\n * Lifecycle state of a message.\n *\n * Applies to both streaming and non-streaming endpoints:\n * - `pending` — Created but not yet sent or received.\n * - `streaming` — Actively receiving incremental deltas.\n * - `final` — Fully received; no further updates expected.\n * - `error` — Terminated with an error; `parts` may be incomplete.\n */\nexport type NcpMessageStatus = \"pending\" | \"streaming\" | \"final\" | \"error\";\n\n/**\n * Message lifecycle timing.\n *\n * For assistant messages, these fields describe when the response started and\n * stopped being produced. They are intentionally message-level and not tied to\n * a specific runtime implementation such as an NCP run.\n */\nexport type NcpMessageLifecycle = {\n startedAt?: string;\n endedAt?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Core portable parts\n// ---------------------------------------------------------------------------\n\n/** Plain text content. The most common part type. */\nexport type NcpTextPart = {\n type: \"text\";\n text: string;\n};\n\n/**\n * A file attachment, delivered either as a URL or inline Base64 content.\n *\n * `url` and `contentBase64` are mutually exclusive — populate exactly one.\n */\nexport type NcpFilePart = {\n type: \"file\";\n name?: string;\n mimeType?: string;\n /** Stable logical asset reference managed by the hosting app. */\n assetUri?: string;\n /** Remote URL pointing to the file. Mutually exclusive with `contentBase64`. */\n url?: string;\n /** Inline file content encoded as Base64. Mutually exclusive with `url`. */\n contentBase64?: string;\n sizeBytes?: number;\n};\n\n/** A cited source or reference, typically surfaced alongside AI-generated content. */\nexport type NcpSourcePart = {\n type: \"source\";\n title?: string;\n url?: string;\n /** Short excerpt from the source relevant to the message. */\n snippet?: string;\n};\n\n/**\n * Marks the beginning of a logical reasoning step in a multi-step response.\n * Used by chain-of-thought or agentic flows to delimit discrete steps.\n */\nexport type NcpStepStartPart = {\n type: \"step-start\";\n stepId?: string;\n /** Human-readable label for the step (e.g. \"Searching the web\"). */\n title?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Agent-oriented parts\n// ---------------------------------------------------------------------------\n\n/** Internal reasoning text produced by the model before its final response. */\nexport type NcpReasoningPart = {\n type: \"reasoning\";\n text: string;\n};\n\nexport type NcpToolOutputTextItem = {\n type: \"input_text\";\n text: string;\n};\n\nexport type NcpToolOutputImageItem = {\n type: \"input_image\";\n imageUrl: string;\n mimeType?: string;\n detail?: \"low\" | \"high\" | \"auto\" | \"original\";\n originalDataChars?: number;\n dataOmitted?: boolean;\n};\n\nexport type NcpToolOutputContentItem =\n | NcpToolOutputTextItem\n | NcpToolOutputImageItem;\n\n/**\n * Represents a tool call and its lifecycle.\n *\n * State semantics (aligned with the Vercel AI SDK convention):\n * - `\"call\"` — The model has emitted a complete tool call; `args` is populated.\n * - `\"partial-call\"` — Arguments are still being streamed; `args` may be incomplete.\n * - `\"result\"` — The tool has returned; `result` is populated.\n * - `\"cancelled\"` — The tool was interrupted before a result was delivered.\n */\nexport type NcpToolInvocationPart = {\n type: \"tool-invocation\";\n toolName: string;\n toolCallId?: string;\n state?: \"call\" | \"partial-call\" | \"result\" | \"cancelled\";\n /** Tool input arguments. May be partial when `state === \"partial-call\"`. */\n args?: unknown;\n /** Tool output. Populated when `state === \"result\"`. */\n result?: unknown;\n /** Model-visible structured output items. Text is bounded; images remain image items. */\n resultContentItems?: NcpToolOutputContentItem[];\n};\n\n// ---------------------------------------------------------------------------\n// Collaboration-platform parts\n// ---------------------------------------------------------------------------\n\n/**\n * A rich card with arbitrary structured data.\n * Rendering is delegated to the platform (e.g. Slack block kit, Teams card).\n */\nexport type NcpCardPart = {\n type: \"card\";\n payload: Record<string, unknown>;\n};\n\n/** Formatted text with an explicit markup format hint. */\nexport type NcpRichTextPart = {\n type: \"rich-text\";\n format: \"markdown\" | \"html\" | \"plain\";\n text: string;\n};\n\n/**\n * An interactive action button or trigger exposed to the user.\n * The platform is responsible for rendering and routing the action.\n */\nexport type NcpActionPart = {\n type: \"action\";\n actionId: string;\n /** Display label shown to the user. */\n label: string;\n /** Arbitrary data forwarded to the action handler. */\n payload?: unknown;\n};\n\n// ---------------------------------------------------------------------------\n// Open extension slot\n// ---------------------------------------------------------------------------\n\n/**\n * Escape hatch for custom or future part types not yet in the NCP spec.\n *\n * Use this to avoid forking the protocol during early iterations.\n * Once a part type stabilizes, promote it to a first-class `NcpXxxPart`.\n */\nexport type NcpExtensionPart = {\n type: \"extension\";\n /** Namespaced identifier for the custom part (e.g. `\"myapp.highlight\"`). */\n extensionType: string;\n data: unknown;\n};\n\n// ---------------------------------------------------------------------------\n// Unified part union\n// ---------------------------------------------------------------------------\n\n/** Union of all recognized NCP message part types. */\nexport type NcpMessagePart =\n | NcpTextPart\n | NcpFilePart\n | NcpSourcePart\n | NcpStepStartPart\n | NcpReasoningPart\n | NcpToolInvocationPart\n | NcpCardPart\n | NcpRichTextPart\n | NcpActionPart\n | NcpExtensionPart;\n\n// ---------------------------------------------------------------------------\n// Message envelope\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical message envelope exchanged and persisted in NCP.\n *\n * A message is composed of an ordered list of typed `parts`, allowing\n * heterogeneous content (text, files, tool calls, etc.) in a single message.\n */\nexport type NcpMessage = {\n /** Globally unique message identifier. */\n id: string;\n /** The session this message belongs to. */\n sessionId: string;\n role: NcpMessageRole;\n status: NcpMessageStatus;\n parts: NcpMessagePart[];\n /** ISO 8601 timestamp (e.g. `\"2024-01-15T10:30:00.000Z\"`). */\n timestamp: string;\n /** Optional lifecycle timing for this message. */\n lifecycle?: NcpMessageLifecycle;\n /** Arbitrary transport- or application-level metadata. */\n metadata?: Record<string, unknown>;\n};\n","import type { OpenAITool } from \"../agent-runtime/llm-api.js\";\nimport type { NcpError } from \"./errors.js\";\nimport type { NcpMessage, NcpToolOutputContentItem } from \"./message.js\";\n\n/**\n * NCP event and payload definitions.\n *\n * Streaming content (text, reasoning, tool args) uses start → delta sequence → end.\n * The same content can be sent as a single full event (e.g. message.incoming or message.completed)\n * instead; endpoints or upper layers choose as needed.\n */\n\n// ---------------------------------------------------------------------------\n// Message envelopes (used by request/incoming/completed/failed)\n// ---------------------------------------------------------------------------\n\nexport type NcpCorrelationPayload = {\n correlationId?: string;\n};\n\nexport type NcpRequestEnvelope = {\n sessionId: string;\n message: NcpMessage;\n correlationId?: string;\n metadata?: Record<string, unknown>;\n providerRoute?: NcpProviderRuntimeRoute;\n tools?: ReadonlyArray<OpenAITool>;\n};\n\nexport type NcpOutboundMessageDraft = Omit<NcpMessage, \"sessionId\"> & {\n sessionId?: string;\n};\n\nexport type NcpAgentSendEnvelope = Omit<NcpRequestEnvelope, \"sessionId\" | \"message\"> & {\n sessionId?: string;\n message: NcpMessage | NcpOutboundMessageDraft;\n};\n\nexport type NcpProviderRuntimeRoute = {\n model: string;\n apiKey?: string | null;\n apiBase?: string | null;\n headers: Record<string, string>;\n};\n\n/** Payload for message.incoming: message content from the other peer (partial or full). */\nexport type NcpResponseEnvelope = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpCompletedEnvelope = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpFailedEnvelope = {\n sessionId: string;\n messageId?: string;\n error: NcpError;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpMessageAcceptedPayload = {\n messageId: string;\n transportId?: string;\n} & NcpCorrelationPayload;\n\n/** Payload for message.abort: identifies which session's active execution to cancel. */\nexport type NcpMessageAbortPayload = {\n sessionId: string;\n messageId?: string;\n} & NcpCorrelationPayload;\n\n/**\n * Payload for message.stream-request: attach to the live event stream of a session.\n * Used when reconnecting during an active response or attaching another live reader.\n */\nexport type NcpStreamRequestPayload = {\n sessionId: string;\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Payload for message.sent: the local peer has sent a message (outbound).\n * Typically non-streaming; add the message to the local conversation state.\n */\nexport type NcpMessageSentPayload = {\n sessionId: string;\n message: NcpMessage;\n metadata?: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// IM: typing indicator (user or bot)\n// ---------------------------------------------------------------------------\n\nexport type NcpTypingStartPayload = {\n sessionId: string;\n /** Participant who is typing (human user or bot/assistant). */\n userId?: string;\n};\n\nexport type NcpTypingEndPayload = {\n sessionId: string;\n /** Participant who stopped typing (human user or bot/assistant). */\n userId?: string;\n};\n\n// ---------------------------------------------------------------------------\n// IM: presence (online/offline/away)\n// ---------------------------------------------------------------------------\n\nexport type NcpPresenceUpdatedPayload = {\n sessionId: string;\n /** Participant this presence applies to (human user or bot/assistant). */\n userId?: string;\n status: \"online\" | \"offline\" | \"away\";\n};\n\n// ---------------------------------------------------------------------------\n// IM: read receipt, delivery receipt, recall, reaction\n// ---------------------------------------------------------------------------\n\nexport type NcpMessageReadPayload = {\n sessionId: string;\n messageId: string;\n readAt?: string;\n readerId?: string;\n};\n\nexport type NcpMessageDeliveredPayload = {\n sessionId: string;\n messageId: string;\n};\n\nexport type NcpMessageRecalledPayload = {\n sessionId: string;\n messageId: string;\n};\n\nexport type NcpMessageReactionPayload = {\n sessionId: string;\n messageId: string;\n reaction: string;\n added: boolean;\n /** Participant who added or removed the reaction (human user or bot/assistant). */\n userId?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Run lifecycle (aligned with agent-chat RUN_*)\n// ---------------------------------------------------------------------------\n\nexport type NcpRunStartedPayload = {\n sessionId?: string;\n messageId?: string;\n threadId?: string;\n runId?: string;\n startedAt?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunFinishedPayload = {\n sessionId?: string;\n messageId?: string;\n threadId?: string;\n runId?: string;\n startedAt?: string;\n endedAt?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunErrorPayload = {\n sessionId?: string;\n messageId?: string;\n error?: string;\n threadId?: string;\n runId?: string;\n startedAt?: string;\n endedAt?: string;\n} & NcpCorrelationPayload;\n\nexport type NcpRunMetadataPayload = {\n sessionId?: string;\n messageId?: string;\n runId?: string;\n metadata: Record<string, unknown>;\n} & NcpCorrelationPayload;\n\nexport type NcpContextWindowUpdatedPayload = {\n sessionId: string;\n contextWindow: Record<string, unknown>;\n};\n\n// ---------------------------------------------------------------------------\n// Text stream (aligned with agent-chat TEXT_*)\n// Streaming: text-start → text-delta sequence → text-end. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpTextStartPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpTextDeltaPayload = {\n sessionId: string;\n messageId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpTextEndPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Reasoning stream (aligned with agent-chat REASONING_*)\n// Streaming: reasoning-start → reasoning-delta sequence → reasoning-end. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpReasoningStartPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpReasoningDeltaPayload = {\n sessionId: string;\n messageId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpReasoningEndPayload = {\n sessionId: string;\n messageId: string;\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Tool call stream (aligned with agent-chat TOOL_CALL_*)\n// Streaming: tool-call-start → tool-call-args or tool-call-args-delta sequence → tool-call-end; then tool-call-result. Alternative: message.incoming / message.completed with full NcpMessage.\n// ---------------------------------------------------------------------------\n\nexport type NcpToolCallStartPayload = {\n sessionId: string;\n messageId?: string;\n toolCallId: string;\n toolName: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallArgsPayload = {\n sessionId: string;\n toolCallId: string;\n args: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallArgsDeltaPayload = {\n sessionId: string;\n messageId?: string;\n toolCallId: string;\n delta: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallEndPayload = {\n sessionId: string;\n toolCallId: string;\n} & NcpCorrelationPayload;\n\nexport type NcpToolCallResultPayload = {\n sessionId: string;\n toolCallId: string;\n content: unknown;\n contentItems?: NcpToolOutputContentItem[];\n} & NcpCorrelationPayload;\n\n// ---------------------------------------------------------------------------\n// Event type enum\n// ---------------------------------------------------------------------------\n\nexport enum NcpEventType {\n EndpointReady = \"endpoint.ready\",\n EndpointError = \"endpoint.error\",\n MessageRequest = \"message.request\",\n MessageStreamRequest = \"message.stream-request\",\n MessageSent = \"message.sent\",\n MessageAccepted = \"message.accepted\",\n MessageIncoming = \"message.incoming\",\n MessageCompleted = \"message.completed\",\n MessageFailed = \"message.failed\",\n MessageAbort = \"message.abort\",\n MessageTextStart = \"message.text-start\",\n MessageTextDelta = \"message.text-delta\",\n MessageTextEnd = \"message.text-end\",\n MessageReasoningStart = \"message.reasoning-start\",\n MessageReasoningDelta = \"message.reasoning-delta\",\n MessageReasoningEnd = \"message.reasoning-end\",\n MessageToolCallStart = \"message.tool-call-start\",\n MessageToolCallArgs = \"message.tool-call-args\",\n MessageToolCallArgsDelta = \"message.tool-call-args-delta\",\n MessageToolCallEnd = \"message.tool-call-end\",\n MessageToolCallResult = \"message.tool-call-result\",\n MessageRead = \"message.read\",\n MessageDelivered = \"message.delivered\",\n MessageRecalled = \"message.recalled\",\n MessageReaction = \"message.reaction\",\n RunStarted = \"run.started\",\n RunFinished = \"run.finished\",\n RunError = \"run.error\",\n RunMetadata = \"run.metadata\",\n ContextWindowUpdated = \"context-window.updated\",\n TypingStart = \"typing.start\",\n TypingEnd = \"typing.end\",\n PresenceUpdated = \"presence.updated\",\n}\n\n// ---------------------------------------------------------------------------\n// Event union (aligned with agent-chat EventType + endpoint lifecycle)\n// ---------------------------------------------------------------------------\n\nexport type NcpEventTiming = {\n /** ISO 8601 timestamp for when the event happened in the producer's domain. */\n occurredAt?: string;\n};\n\nexport type NcpEndpointEvent = NcpEventTiming & (\n | { type: NcpEventType.EndpointReady }\n | { type: NcpEventType.MessageRequest; payload: NcpAgentSendEnvelope }\n | { type: NcpEventType.MessageStreamRequest; payload: NcpStreamRequestPayload }\n | { type: NcpEventType.MessageSent; payload: NcpMessageSentPayload }\n | { type: NcpEventType.MessageAccepted; payload: NcpMessageAcceptedPayload }\n | { type: NcpEventType.MessageIncoming; payload: NcpResponseEnvelope }\n | { type: NcpEventType.MessageCompleted; payload: NcpCompletedEnvelope }\n | { type: NcpEventType.MessageFailed; payload: NcpFailedEnvelope }\n | { type: NcpEventType.MessageAbort; payload: NcpMessageAbortPayload }\n | { type: NcpEventType.EndpointError; payload: NcpError }\n | { type: NcpEventType.RunStarted; payload: NcpRunStartedPayload }\n | { type: NcpEventType.RunFinished; payload: NcpRunFinishedPayload }\n | { type: NcpEventType.RunError; payload: NcpRunErrorPayload }\n | { type: NcpEventType.RunMetadata; payload: NcpRunMetadataPayload }\n | { type: NcpEventType.ContextWindowUpdated; payload: NcpContextWindowUpdatedPayload }\n | { type: NcpEventType.MessageTextStart; payload: NcpTextStartPayload }\n | { type: NcpEventType.MessageTextDelta; payload: NcpTextDeltaPayload }\n | { type: NcpEventType.MessageTextEnd; payload: NcpTextEndPayload }\n | { type: NcpEventType.MessageReasoningStart; payload: NcpReasoningStartPayload }\n | { type: NcpEventType.MessageReasoningDelta; payload: NcpReasoningDeltaPayload }\n | { type: NcpEventType.MessageReasoningEnd; payload: NcpReasoningEndPayload }\n | { type: NcpEventType.MessageToolCallStart; payload: NcpToolCallStartPayload }\n | { type: NcpEventType.MessageToolCallArgs; payload: NcpToolCallArgsPayload }\n | { type: NcpEventType.MessageToolCallArgsDelta; payload: NcpToolCallArgsDeltaPayload }\n | { type: NcpEventType.MessageToolCallEnd; payload: NcpToolCallEndPayload }\n | { type: NcpEventType.MessageToolCallResult; payload: NcpToolCallResultPayload }\n | { type: NcpEventType.TypingStart; payload: NcpTypingStartPayload }\n | { type: NcpEventType.TypingEnd; payload: NcpTypingEndPayload }\n | { type: NcpEventType.PresenceUpdated; payload: NcpPresenceUpdatedPayload }\n | { type: NcpEventType.MessageRead; payload: NcpMessageReadPayload }\n | { type: NcpEventType.MessageDelivered; payload: NcpMessageDeliveredPayload }\n | { type: NcpEventType.MessageRecalled; payload: NcpMessageRecalledPayload }\n | { type: NcpEventType.MessageReaction; payload: NcpMessageReactionPayload }\n);\n\nexport type NcpEndpointEventDraft = NcpEndpointEvent extends infer Event\n ? Event extends NcpEndpointEvent\n ? Omit<Event, \"occurredAt\">\n : never\n : never;\n\nexport function createNcpEndpointEvent<T extends NcpEndpointEventDraft>(\n event: T & { occurredAt?: string },\n occurredAt = event.occurredAt ?? new Date().toISOString(),\n): T & { occurredAt: string } {\n return {\n ...event,\n occurredAt,\n };\n}\n\nexport type NcpEndpointSubscriber = (event: NcpEndpointEvent) => void;\n","import type { NcpMessage } from \"../types/message.js\";\n\nexport type NcpReplyTagParseResult = {\n content: string;\n replyTo?: string;\n};\n\nconst REPLY_TO_CURRENT_PATTERN = /\\[\\[\\s*reply_to_current\\s*\\]\\]/gi;\nconst REPLY_TO_ID_PATTERN = /\\[\\[\\s*reply_to\\s*:\\s*([^\\]]+?)\\s*\\]\\]/i;\n\nfunction normalizeReplyTarget(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function stripReplyTagsFromText(content: string, currentMessageId?: string): NcpReplyTagParseResult {\n let nextContent = content;\n let replyTo: string | undefined;\n\n if (REPLY_TO_CURRENT_PATTERN.test(nextContent)) {\n replyTo = normalizeReplyTarget(currentMessageId);\n nextContent = nextContent.replace(REPLY_TO_CURRENT_PATTERN, \"\").trim();\n }\n\n const explicitReplyTarget = nextContent.match(REPLY_TO_ID_PATTERN)?.[1];\n if (explicitReplyTarget) {\n replyTo = normalizeReplyTarget(explicitReplyTarget);\n nextContent = nextContent.replace(REPLY_TO_ID_PATTERN, \"\").trim();\n }\n\n return replyTo ? { content: nextContent, replyTo } : { content: nextContent };\n}\n\nexport function sanitizeAssistantReplyTags(\n message: NcpMessage,\n currentMessageId = message.id,\n): NcpMessage {\n if (message.role !== \"assistant\") {\n return {\n ...message,\n parts: [...message.parts],\n metadata: message.metadata ? { ...message.metadata } : undefined,\n };\n }\n\n const firstTextIndex = message.parts.findIndex((part) => part.type === \"text\");\n const nextMetadata = message.metadata ? { ...message.metadata } : undefined;\n const existingReplyTo = normalizeReplyTarget(nextMetadata?.reply_to);\n\n if (firstTextIndex < 0) {\n return {\n ...message,\n parts: [...message.parts],\n metadata: nextMetadata,\n };\n }\n\n const firstTextPart = message.parts[firstTextIndex];\n if (!firstTextPart || firstTextPart.type !== \"text\") {\n return {\n ...message,\n parts: [...message.parts],\n metadata: nextMetadata,\n };\n }\n\n const { content, replyTo } = stripReplyTagsFromText(firstTextPart.text, currentMessageId);\n const effectiveReplyTo = replyTo ?? existingReplyTo;\n const nextParts = message.parts.flatMap((part, index) => {\n if (index !== firstTextIndex || part.type !== \"text\") {\n return [part];\n }\n if (content.length === 0) {\n return [];\n }\n return [{ ...part, text: content }];\n });\n\n if (effectiveReplyTo) {\n return {\n ...message,\n parts: nextParts,\n metadata: {\n ...nextMetadata,\n reply_to: effectiveReplyTo,\n },\n };\n }\n\n return {\n ...message,\n parts: nextParts,\n metadata: nextMetadata,\n };\n}\n","export type NcpAssistantReasoningNormalizationMode = \"off\" | \"think-tags\";\n\nexport type NcpAssistantReasoningSegment = {\n type: \"text\" | \"reasoning\";\n text: string;\n};\n\nconst THINK_OPEN_TAG = \"<think>\";\nconst THINK_CLOSE_TAG = \"</think>\";\nconst FINAL_OPEN_TAG = \"<final>\";\nconst FINAL_CLOSE_TAG = \"</final>\";\nconst LEADING_CONTROL_TAGS = [THINK_CLOSE_TAG, FINAL_OPEN_TAG, FINAL_CLOSE_TAG] as const;\nconst MAX_REASONING_DELIMITER_TAIL = THINK_CLOSE_TAG.length - 1;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWhitespace(char: string): boolean {\n return /\\s/.test(char);\n}\n\nfunction normalizeMode(value: unknown): NcpAssistantReasoningNormalizationMode | null {\n if (value === \"off\" || value === \"think-tags\") {\n return value;\n }\n return null;\n}\n\nfunction readLeadingThinkTagState(\n buffer: string,\n): { status: \"matched\"; consumed: number } | { status: \"pending\" | \"rejected\" } {\n let cursor = 0;\n while (cursor < buffer.length && isWhitespace(buffer[cursor]!)) {\n cursor += 1;\n }\n\n const rest = buffer.slice(cursor);\n if (rest.startsWith(THINK_OPEN_TAG)) {\n return {\n status: \"matched\",\n consumed: cursor + THINK_OPEN_TAG.length,\n };\n }\n if (THINK_OPEN_TAG.startsWith(rest)) {\n return { status: \"pending\" };\n }\n return { status: \"rejected\" };\n}\n\nfunction stripLeadingControlTags(buffer: string): { buffer: string; pending: boolean } {\n let nextBuffer = buffer;\n\n while (true) {\n let cursor = 0;\n while (cursor < nextBuffer.length && isWhitespace(nextBuffer[cursor]!)) {\n cursor += 1;\n }\n\n const rest = nextBuffer.slice(cursor);\n if (rest.length === 0) {\n return { buffer: \"\", pending: false };\n }\n\n const matchedTag = LEADING_CONTROL_TAGS.find((tag) => rest.startsWith(tag));\n if (matchedTag) {\n nextBuffer = rest.slice(matchedTag.length);\n continue;\n }\n\n if (LEADING_CONTROL_TAGS.some((tag) => tag.startsWith(rest))) {\n return { buffer: rest, pending: true };\n }\n\n return { buffer: rest, pending: false };\n }\n}\n\nfunction findReasoningBoundary(buffer: string): { index: number; tag: string } | null {\n const indices = [\n { index: buffer.indexOf(THINK_CLOSE_TAG), tag: THINK_CLOSE_TAG },\n { index: buffer.indexOf(FINAL_OPEN_TAG), tag: FINAL_OPEN_TAG },\n ].filter((entry) => entry.index >= 0);\n\n if (indices.length === 0) {\n return null;\n }\n\n return indices.reduce((left, right) => (right.index < left.index ? right : left));\n}\n\nexport function readAssistantReasoningNormalizationMode(\n value: unknown,\n): NcpAssistantReasoningNormalizationMode | null {\n if (typeof value === \"string\") {\n return normalizeMode(value);\n }\n if (isRecord(value)) {\n return normalizeMode(value.mode);\n }\n return null;\n}\n\nexport function readAssistantReasoningNormalizationModeFromMetadata(\n metadata: Record<string, unknown> | null | undefined,\n): NcpAssistantReasoningNormalizationMode | null {\n if (!metadata) {\n return null;\n }\n return (\n readAssistantReasoningNormalizationMode(metadata.reasoning_normalization) ??\n readAssistantReasoningNormalizationMode(metadata.reasoningNormalization) ??\n normalizeMode(metadata.reasoning_normalization_mode) ??\n normalizeMode(metadata.reasoningNormalizationMode)\n );\n}\n\nexport function writeAssistantReasoningNormalizationModeToMetadata(\n metadata: Record<string, unknown>,\n mode: NcpAssistantReasoningNormalizationMode,\n): Record<string, unknown> {\n const nextMetadata = {\n ...metadata,\n };\n delete nextMetadata.reasoningNormalization;\n delete nextMetadata.reasoningNormalizationMode;\n delete nextMetadata.reasoning_normalization_mode;\n nextMetadata.reasoning_normalization = { mode };\n return nextMetadata;\n}\n\nexport class NcpAssistantTextStreamNormalizer {\n private buffer = \"\";\n private phase: \"initial\" | \"reasoning\" | \"text\" = \"initial\";\n private stripLeadingTextControlTags = false;\n\n constructor(private readonly mode: NcpAssistantReasoningNormalizationMode = \"off\") {}\n\n push(delta: string): NcpAssistantReasoningSegment[] {\n if (!delta) {\n return [];\n }\n if (this.mode !== \"think-tags\") {\n return [{ type: \"text\", text: delta }];\n }\n\n this.buffer += delta;\n return this.flush(false);\n }\n\n finish(): NcpAssistantReasoningSegment[] {\n if (this.mode !== \"think-tags\") {\n return [];\n }\n return this.flush(true);\n }\n\n private flush(final: boolean): NcpAssistantReasoningSegment[] {\n const segments: NcpAssistantReasoningSegment[] = [];\n\n while (true) {\n if (this.phase === \"initial\") {\n const leadingState = readLeadingThinkTagState(this.buffer);\n if (leadingState.status === \"matched\") {\n this.buffer = this.buffer.slice(leadingState.consumed);\n this.phase = \"reasoning\";\n continue;\n }\n if (leadingState.status === \"pending\" && !final) {\n return segments;\n }\n this.phase = \"text\";\n continue;\n }\n\n if (this.phase === \"reasoning\") {\n const boundary = findReasoningBoundary(this.buffer);\n if (boundary) {\n const reasoningText = this.buffer.slice(0, boundary.index);\n if (reasoningText.length > 0) {\n segments.push({ type: \"reasoning\", text: reasoningText });\n }\n this.buffer = this.buffer.slice(boundary.index + boundary.tag.length);\n this.phase = \"text\";\n this.stripLeadingTextControlTags = true;\n continue;\n }\n\n const safeLength = final ? this.buffer.length : Math.max(0, this.buffer.length - MAX_REASONING_DELIMITER_TAIL);\n if (safeLength === 0) {\n return segments;\n }\n segments.push({\n type: \"reasoning\",\n text: this.buffer.slice(0, safeLength),\n });\n this.buffer = this.buffer.slice(safeLength);\n if (!final) {\n return segments;\n }\n continue;\n }\n\n if (this.stripLeadingTextControlTags) {\n const stripped = stripLeadingControlTags(this.buffer);\n if (stripped.pending && !final) {\n this.buffer = stripped.buffer;\n return segments;\n }\n this.buffer = stripped.buffer;\n this.stripLeadingTextControlTags = false;\n }\n\n if (this.buffer.length === 0) {\n return segments;\n }\n\n segments.push({\n type: \"text\",\n text: this.buffer,\n });\n this.buffer = \"\";\n return segments;\n }\n }\n}\n\nexport function normalizeAssistantText(\n text: string,\n mode: NcpAssistantReasoningNormalizationMode,\n): {\n text: string;\n reasoning: string;\n parts: NcpAssistantReasoningSegment[];\n} {\n const normalizer = new NcpAssistantTextStreamNormalizer(mode);\n const parts = [...normalizer.push(text), ...normalizer.finish()].filter((part) => part.text.length > 0);\n\n return {\n text: parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n reasoning: parts\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\"),\n parts,\n };\n}\n","import {\n type NcpEndpointEvent,\n NcpEventType,\n type NcpRequestEnvelope,\n type NcpRunHandle,\n} from \"../types/ncp.types.js\";\n\nexport function createNcpRunHandle(envelope: NcpRequestEnvelope): NcpRunHandle {\n return {\n sessionId: envelope.sessionId,\n userMessageId: envelope.message.id,\n assistantMessageId: null,\n runId: null,\n ...(envelope.correlationId ? { correlationId: envelope.correlationId } : {}),\n };\n}\n\nexport function consumeNcpRunHandle(\n events: AsyncIterable<NcpEndpointEvent>,\n fallback: NcpRunHandle,\n): Promise<NcpRunHandle> {\n let resolved = false;\n let handle = fallback;\n\n return new Promise<NcpRunHandle>((resolve, reject) => {\n const resolveOnce = (): void => {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(handle);\n };\n\n void (async () => {\n try {\n for await (const event of events) {\n if (event.type === NcpEventType.RunStarted) {\n handle = {\n ...handle,\n assistantMessageId: event.payload.messageId ?? null,\n runId: event.payload.runId ?? null,\n };\n resolveOnce();\n }\n }\n resolveOnce();\n } catch (error) {\n if (!resolved) reject(error);\n }\n })();\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ncp",
3
- "version": "0.6.6",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "description": "NextClaw Communication Protocol core abstractions and types.",
6
6
  "type": "module",