@aintela/chat 0.2.25 → 0.2.26

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer-C1uBjgTd.js","sources":["../src/models/InteractionPart.ts","../src/models/semanticKernelModel/models.ts","../src/models/ServerEvent.ts","../src/models/semanticKernelModel/serializer.ts"],"sourcesContent":["import { getRandomUUID } from '@lib/utils/envUtils';\nimport type { FunctionDetails, CodeExecutionResultDetails, ExecutableCodeDetails, ThoughtDetails, ErrorDetails, TextDetails, ToolEventDetails } from \"./ServerEvent\";\nimport { EventType } from \"./enums\";\n\nexport interface InteractionPart {\n id: string;\n eventType: EventType;\n author: string,\n functionDetails?: FunctionDetails;\n codeExecutionResultDetails?: CodeExecutionResultDetails;\n executableCodeDetails?: ExecutableCodeDetails;\n thoughtDetails?: ThoughtDetails;\n toolDetails?: ToolEventDetails,\n textDetails?: TextDetails;\n errorDetails?: ErrorDetails;\n visible?: boolean;\n created: Date;\n ended?: Date;\n text?: string;\n hasTask?: boolean;\n rawDetails?: any;\n\n //Chuck event properties\n textLastChunk?: string;\n thoughtLastChunk?: string;\n partial: boolean;\n\n //Helper properties\n isStillWriting: boolean;\n mustPush: boolean;\n textAppendable: boolean;\n waitingDetails?: {\n stopPoint?: Date;\n addTimer: boolean;\n isTimerRunning: boolean;\n status: string;\n startingPoint: Date\n loadDots?: boolean\n }\n}\n\n\nexport class InteractionPartUtils {\n static replaceFirstTwoTabsPerLine(value?: any): string {\n const regex = /^\\s{15}/gm;\n return typeof (value) === \"string\" ? value.replaceAll(regex, (match) => match.substring(15)) : value ?? \"\";\n }\n\n static jsonToString(json: any): string {\n if (json == null) return \"\";\n if (typeof json !== \"object\") return String(json);\n\n const charCollapsed = Array.isArray(json)\n ? (InteractionPartUtils.isCharArray(json) ? json.join(\"\") : null)\n : InteractionPartUtils.tryCollapseCharIndexedObject(json);\n if (charCollapsed != null) return charCollapsed;\n\n if (Array.isArray(json)) {\n try { return JSON.stringify(json, null, 2); }\n catch { return String(json); }\n }\n\n const objectProps = Object.keys(json);\n const textReponseLines: string[] = [];\n objectProps.forEach((prop: string) => {\n let value = json[prop];\n if (typeof value === 'object') {\n value = JSON.stringify(json[prop], null, 2);\n }\n const startChart = value?.toString().indexOf(\"\\n\") > -1 ? \"\\n\" : \"\";\n textReponseLines.push(`${prop}:${startChart}${value}`);\n });\n return textReponseLines.join(\"\\n\");\n }\n\n static functionDetailsToString(obj: any | undefined): string {\n if (obj == null) return \"\";\n if (typeof obj == \"string\") {\n obj = obj.replaceAll(\"\\\"{\", \"{\").replaceAll(\"}\\\"\", \"}\").replaceAll(\"'{\", \"{\").replaceAll(\"}'\", \"}\")\n obj = obj.replaceAll(\"\\\\\\\"\", \"\\\"\");\n try {\n obj = JSON.parse(obj)\n }\n catch {\n return obj;\n }\n if (typeof obj !== \"object\" || obj == null) return String(obj);\n }\n if (Array.isArray(obj)) {\n try { return JSON.stringify(obj, null, 2); }\n catch { return String(obj); }\n }\n\n const objectProps = Object.keys(obj);\n const textReponseLines: string[] = [];\n objectProps.forEach((prop: string) => {\n let value = obj?.[prop];\n if (typeof value === 'object') {\n value = JSON.stringify(value, null, 2);\n }\n const startChar = value?.toString().indexOf(\"\\n\") > -1 ? \"\\n\" : \"\";\n textReponseLines.push(`${prop}:${startChar}${value}`);\n });\n return textReponseLines.join(\"\\n\");\n }\n\n /**\n * Reads the server-generated SlotId from a UI render tool's result. The\n * result reaches the client as a plain object on the live path, but as a\n * JSON string — sometimes double-encoded (a JSON string of a JSON string) —\n * on the persisted / session-replay path. Unwrap up to two string layers\n * before reading the field. Returns undefined when absent or unparseable.\n */\n static uiSlotId(part?: InteractionPart): string | undefined {\n let r: unknown = part?.functionDetails?.response;\n for (let i = 0; i < 2 && typeof r === \"string\"; i++) {\n try { r = JSON.parse(r); } catch { return undefined; }\n }\n if (!r || typeof r !== \"object\") return undefined;\n const o = r as Record<string, unknown>;\n const v = o.SlotId ?? o.slotId;\n return typeof v === \"string\" ? v : undefined;\n }\n\n static fromError(errorMsg: string) {\n const errorPart: InteractionPart = {\n errorDetails: { errorMessage: errorMsg },\n eventType: EventType.ServerError,\n id: '',\n author: 'main',\n created: new Date(),\n partial: false,\n isStillWriting: false,\n mustPush: false,\n textAppendable: false\n }\n return errorPart;\n }\n\n static fromText(text: string, author?: string, id?: string): InteractionPart {\n const textPart: InteractionPart = {\n text: text,\n eventType: EventType.Text,\n id: id ?? getRandomUUID(),\n created: new Date(),\n author: author ?? \"main\",\n partial: false,\n isStillWriting: false,\n mustPush: false,\n textAppendable: false\n }\n return textPart;\n }\n\n /**\n * Builds the user-authored UI part for a `sendMessage(text, { ui })` turn. Mirrors the\n * shape `ServerEvent` produces from a persisted `UserUiContent` on reload, so the live\n * and replayed parts are identical: an `EventType.UserAnswer` carrying functionDetails\n * {name, args, isUi, status:'Done'} that routes through the uiTool dispatcher/registry.\n */\n static fromUserUi(name: string, args?: string, id?: string): InteractionPart {\n return {\n id: id ?? getRandomUUID(),\n eventType: EventType.UserAnswer,\n author: 'user',\n created: new Date(),\n partial: false,\n isStillWriting: false,\n mustPush: false,\n textAppendable: false,\n functionDetails: {\n id: '',\n name: name,\n args: args,\n status: 'Done',\n isUi: true,\n },\n };\n }\n\n static createWaiting(addTimer: boolean = false, isTimerRunning: boolean = true, status: string, startingPoint: Date, stopPoint?: Date): InteractionPart {\n if (!status)\n status = \"Waiting\";\n const partData = InteractionPartUtils.fromText(\"...\", undefined, \"waitingpart\");\n partData.eventType = EventType.Waiting;\n partData.waitingDetails = {\n startingPoint: startingPoint,\n addTimer: addTimer,\n isTimerRunning: isTimerRunning,\n status: status,\n stopPoint: stopPoint\n }\n return partData;\n }\n\n static createSuspended(): InteractionPart {\n const partData = InteractionPartUtils.fromText(\"SUSPEND\")\n partData.eventType = EventType.Suspended;\n return partData;\n }\n\n static getPartTextContent(part: InteractionPart): string {\n return part.text ?? \"\";\n }\n\n static FlatParts(parts: InteractionPart[]): InteractionPart | undefined {\n if (parts.length === 0)\n return undefined;\n\n const textParts = parts.filter((p) => p.eventType == EventType.Text);\n const onlyPart = textParts.length > 0 ? textParts[0] : parts[0];\n const unique_event_types: EventType[] = [... new Set(parts.map((p) => p.eventType))];\n\n if (unique_event_types.length == 1) {\n onlyPart.eventType = unique_event_types[0]\n }\n else {\n if (textParts.length > 0) {\n onlyPart.eventType = EventType.Text\n }\n }\n\n onlyPart.mustPush = !(onlyPart.eventType == EventType.Text || onlyPart.eventType == EventType.Thought || onlyPart.eventType == EventType.NotDefined || onlyPart.eventType == EventType.PartialFunctionCall);\n onlyPart.textAppendable = onlyPart.eventType == EventType.Text || onlyPart.eventType == EventType.Thought || onlyPart.eventType == EventType.PartialFunctionCall;\n\n for (const part of parts) {\n if (!onlyPart.codeExecutionResultDetails && part.codeExecutionResultDetails)\n onlyPart.codeExecutionResultDetails = part.codeExecutionResultDetails;\n if (!onlyPart.errorDetails && part.errorDetails)\n onlyPart.errorDetails = part.errorDetails;\n if (!onlyPart.executableCodeDetails && part.executableCodeDetails)\n onlyPart.executableCodeDetails = part.executableCodeDetails;\n if (!onlyPart.functionDetails && part.functionDetails)\n onlyPart.functionDetails = part.functionDetails;\n if (!onlyPart.rawDetails && part.rawDetails)\n onlyPart.rawDetails = part.rawDetails;\n if (!onlyPart.thoughtDetails && part.thoughtDetails)\n onlyPart.thoughtDetails = part.thoughtDetails;\n if (!onlyPart.errorDetails && part.errorDetails)\n onlyPart.errorDetails = part.errorDetails;\n }\n\n return onlyPart;\n }\n\n static isCharArray(value: any): value is string[] {\n return Array.isArray(value)\n && value.length > 0\n && value.every((item: any) => typeof item === \"string\" && item.length === 1);\n }\n\n /**\n * Detects objects like `{0: \"a\", 1: \"b\", 2: \"c\", ...}` — a string that was\n * spread/indexed into an object (e.g. `{...someString}` or the server\n * serializing a string as a char-indexed dict). Returns the reassembled\n * string, or `null` if the value doesn't match this pattern.\n */\n static tryCollapseCharIndexedObject(value: any): string | null {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) return null;\n const keys = Object.keys(value);\n if (keys.length === 0) return null;\n\n for (let i = 0; i < keys.length; i++) {\n if (keys[i] !== String(i)) return null;\n const v = value[keys[i]];\n if (typeof v !== \"string\" || v.length !== 1) return null;\n }\n\n return keys.map(k => value[k]).join(\"\");\n }\n\n static isCodeExecution(part: InteractionPart): boolean {\n return part.eventType === EventType.CodeExecutionResult ||\n part.eventType === EventType.ExecutableCode;\n }\n}","import './init'; // MUST be first - loads reflect-metadata\nimport { jsonObject, jsonMember, jsonArrayMember, AnyT } from 'typedjson';\nimport { type Artifact } from '../../models/Artifact'\n\n// // Enums\nexport type PartType = 'ToolEventContent' | 'StreamingToolEventContent' | 'TextContent' | 'StreamingFinalFunctionCallContent' | 'StreamingFinalFunctionResultContent' | 'StreamingClientOutputContent' | 'StreamingReasoningContent' | 'ImageContent' | 'FunctionCallContent' | 'FunctionResultContent' | 'FunctionClientOutputContent' | 'UserUiContent' | 'ChatMessageContent' | 'StreamingTextContent' | 'StreamingFunctionCallUpdateContent' | 'Unknown';\nexport const PartType = {\n // KernelContent derived types\n TextContent: \"TextContent\",\n ToolEventContent: \"ToolEventContent\",\n StreamingToolEventContent: \"StreamingToolEventContent\",\n StreamingReasoningContent: \"StreamingReasoningContent\",\n ImageContent: \"ImageContent\",\n FunctionCallContent: \"FunctionCallContent\",\n FunctionResultContent: \"FunctionResultContent\",\n FunctionClientOutputContent: \"FunctionClientOutputContent\",\n UserUiContent: \"UserUiContent\",\n ChatMessageContent: \"ChatMessageContent\",\n // StreamingKernelContent derived types\n StreamingTextContent: \"StreamingTextContent\",\n StreamingFunctionCallUpdateContent: \"StreamingFunctionCallUpdateContent\",\n StreamingFinalFunctionCallContent: \"StreamingFinalFunctionCallContent\",\n StreamingFinalFunctionResultContent: \"StreamingFinalFunctionResultContent\",\n StreamingClientOutputContent: \"StreamingClientOutputContent\"\n\n} as const;\n\n@jsonObject({ name: 'AuthorRole' })\nexport class AuthorRole {\n\n @jsonMember(String)\n label?: string;\n}\n\nexport enum Commands {\n OpenStream = 'OpenStream',\n CloseStream = 'CloseStream',\n Ignore = 'Ignore',\n}\n\n// Supporting Classes\n@jsonObject({ name: 'EventTypeInformation' })\nexport class EventTypeInformation {\n @jsonMember(String)\n type?: string;\n\n @jsonMember(String)\n fullName?: string;\n}\n\n@jsonObject({ name: 'LlmArtifact' })\nexport class LlmArtifact {\n @jsonMember(String)\n id!: string;\n\n @jsonMember(String)\n name?: string;\n\n @jsonMember(String)\n mimeType?: string;\n\n @jsonMember(String)\n description?: string;\n\n toArtifact(): Artifact {\n return {\n created: new Date(),\n updatedAt: new Date(),\n name: this.name ?? 'Not Defined',\n description: this.description,\n mimeType: this.mimeType,\n id: this.id\n }\n }\n}\n\n@jsonObject({ name: 'KernelContent' })\nexport abstract class KernelContent {\n @jsonMember(String)\n mimeType?: string;\n\n // InnerContent is ignored (JsonIgnore in C#)\n // Not decorated with @jsonMember\n innerContent?: any;\n\n @jsonMember(String)\n modelId?: string;\n\n // Decorated so subtypes deserialize it (mirrors StreamingKernelContent.metadata). A tool's\n // client-only payload rides here when the runtime collapses StreamingFinalFunctionResultContent →\n // the sealed FunctionResultContent (see ToKernelContent); the decoder reads `metadata.clientOutput`.\n @jsonMember(AnyT)\n metadata?: Record<string, any> | null;\n}\n\n\n// StreamingKernelContent Base Class (Abstract)\n@jsonObject({ name: 'StreamingKernelContent' })\nexport abstract class StreamingKernelContent {\n @jsonMember(Number)\n choiceIndex: number = 0;\n\n // InnerContent is ignored (JsonIgnore in C#)\n // Not decorated with @jsonMember\n innerContent?: any;\n\n @jsonMember(String)\n modelId?: string;\n\n @jsonMember(Object)\n metadata?: Record<string, any>;\n}\n\n\n// TextContent\n@jsonObject({ name: 'TextContent' })\nexport class TextContent extends KernelContent {\n\n @jsonMember(String)\n text?: string;\n\n // Encoding is ignored (JsonIgnore in C#)\n // Not decorated with @jsonMember\n encoding?: string;\n\n constructor() {\n super();\n this.encoding = 'UTF8';\n }\n\n toString(): string {\n return this.text ?? '';\n }\n}\n\n@jsonObject({ name: 'StreamingToolEventContent' })\nexport class StreamingToolEventContent extends StreamingKernelContent {\n\n @jsonMember(String)\n eventName?: string;\n\n @jsonMember(String)\n eventData?: string;\n\n @jsonMember(String)\n sessionId?: string;\n\n constructor() {\n super();\n }\n}\n\n// TextContent\n@jsonObject({ name: 'ToolEventContent' })\nexport class ToolEventContent extends KernelContent {\n\n @jsonMember(String)\n eventName?: string;\n\n @jsonMember(String)\n eventData?: string;\n\n @jsonMember(String)\n sessionId?: string;\n\n constructor() {\n super();\n }\n}\n\n// ImageContent (referenced but not fully defined in original)\n@jsonObject({ name: 'ImageContent' })\nexport class ImageContent extends KernelContent {\n @jsonMember(String)\n url?: string;\n\n @jsonMember(String)\n dataUri?: string;\n}\n\n// FunctionCallContent\n@jsonObject({ name: 'FunctionCallContent' })\nexport class FunctionCallContent extends KernelContent {\n @jsonMember(String)\n id?: string;\n\n @jsonMember(String)\n pluginName?: string;\n\n @jsonMember(String)\n functionName!: string;\n\n @jsonMember(AnyT)\n arguments?: any;\n\n // Exception is not serializable - omit jsonMember decorator\n exception?: Error;\n}\n\n// MUST extend StreamingKernelContent (NOT FunctionCallContent): on the server this is a\n// StreamingKernelContent (StreamingFunctionCallUpdateContent), and it arrives in `streamingParts`\n// (StreamingKernelContent[]). TypedJSON only resolves a polymorphic $type to a subtype of the\n// declared element type — extending FunctionCallContent made it unresolvable there, so it fell\n// back to base StreamingKernelContent and `isUi` (the whole subtype payload) was dropped. Wire\n// fields mirror StreamingFunctionCallUpdateContent (callId / name / arguments) plus isUi.\n@jsonObject({ name: 'StreamingFinalFunctionCallContent' })\nexport class StreamingFinalFunctionCallContent extends StreamingKernelContent {\n @jsonMember(String, { name: \"callId\" })\n id?: string;\n\n @jsonMember(String, { name: \"name\" })\n functionName?: string;\n\n @jsonMember(String)\n arguments?: string;\n\n @jsonMember(Boolean)\n isUi?: boolean;\n\n @jsonMember(String)\n friendlyArgsDescription?: string;\n\n // Ask-user component name ([KernelUIComponent]); null unless this is an ask-user tool.\n @jsonMember(String)\n askUserComponent?: string;\n}\n\n// FunctionResultContent\n@jsonObject({ name: 'FunctionResultContent' })\nexport class FunctionResultContent extends KernelContent {\n @jsonMember(String, { name: \"callId\" })\n id?: string;\n\n @jsonMember(String)\n pluginName?: string;\n\n @jsonMember(String)\n functionName?: string;\n\n @jsonMember(AnyT)\n result?: any;\n}\n\n// See StreamingFinalFunctionCallContent: must extend StreamingKernelContent so it resolves\n// inside `streamingParts` and keeps `isUi`. Wire fields per the server-side\n// StreamingFinalFunctionResultContent (callId / pluginName / functionName / result / isUi).\n@jsonObject({ name: 'StreamingFinalFunctionResultContent' })\nexport class StreamingFinalFunctionResultContent extends StreamingKernelContent {\n @jsonMember(String, { name: \"callId\" })\n id?: string;\n\n @jsonMember(String)\n pluginName?: string;\n\n @jsonMember(String)\n functionName?: string;\n\n @jsonMember(AnyT)\n result?: any;\n\n @jsonMember(Boolean)\n isUi?: boolean;\n\n // Client-only payload the tool wrote to its ToolClientOutput sink (a serialized JSON string),\n // correlated to this result by callId. Rides this result event live — never the model-facing\n // `result`; the durable replay form is FunctionClientOutputContent.\n @jsonMember(String)\n clientOutput?: string;\n\n // Ask-user component name ([KernelUIComponent]); null unless this is an ask-user tool.\n @jsonMember(String)\n askUserComponent?: string;\n}\n\n// Persisted, client-only sibling carrying a tool's ToolClientOutput payload on the Tool message\n// (server-side FunctionClientOutputContent : IClientOnlyContent — stripped from the model request,\n// kept for replay). Correlated to its result by callId; folded into the call part on session reload.\n@jsonObject({ name: 'FunctionClientOutputContent' })\nexport class FunctionClientOutputContent extends KernelContent {\n @jsonMember(String, { name: \"callId\" })\n id?: string;\n\n @jsonMember(String)\n data?: string;\n}\n\n// Non-terminal, client-only payload pushed WHILE an ask-user tool is parked (server-side\n// StreamingClientOutputContent, from RegisterHumanInput(callId, initialClientOutput) — issue #60). Unlike\n// the result-event clientOutput, it carries no result and does NOT close the call: it is folded onto the\n// parked call part by callId so the ask-user component renders pre-filled, leaving the call Executing until\n// the real answer arrives. The LLM never sees it.\n@jsonObject({ name: 'StreamingClientOutputContent' })\nexport class StreamingClientOutputContent extends StreamingKernelContent {\n @jsonMember(String, { name: \"callId\" })\n id?: string;\n\n @jsonMember(String)\n clientOutput?: string;\n}\n\n// Persisted, client-only sibling carrying a host UI representation for a USER turn\n// (server-side UserUiContent : IClientOnlyContent — stripped from the model request, kept for\n// replay). `name` selects a client-registered uiTool renderer; `args` is its serialized props\n// (JSON string). The live turn injects the same {name,args} as a UserAnswer part client-side;\n// this is the durable form that re-hydrates the component on session reload.\n@jsonObject({ name: 'UserUiContent' })\nexport class UserUiContent extends KernelContent {\n @jsonMember(String)\n name?: string;\n\n @jsonMember(String)\n args?: string;\n}\n\n// ChatMessageContent - defined before LlmEvent to avoid forward reference\n@jsonObject({ name: 'ChatMessageContent' })\nexport class ChatMessageContent extends KernelContent {\n @jsonMember(AuthorRole)\n role?: AuthorRole;\n\n @jsonArrayMember(() => KernelContent)\n items?: KernelContent[];\n}\n\n// StreamingFunctionCallUpdateContent\n@jsonObject({ name: 'StreamingFunctionCallUpdateContent' })\nexport class StreamingFunctionCallUpdateContent extends StreamingKernelContent {\n @jsonMember(String)\n callId?: string;\n\n @jsonMember(String)\n name?: string;\n\n @jsonMember(String)\n arguments?: string;\n\n @jsonMember(Number)\n functionCallIndex: number = 0;\n}\n\n// StreamingTextContent\n@jsonObject({ name: 'StreamingTextContent' })\nexport class StreamingTextContent extends StreamingKernelContent {\n @jsonMember(String)\n text?: string;\n\n // Encoding is not explicitly serialized in C#\n // Not decorated with @jsonMember\n encoding?: string;\n}\n\n@jsonObject({ name: 'StreamingReasoningContent' })\nexport class StreamingReasoningContent extends StreamingKernelContent {\n @jsonMember(String)\n text?: string;\n\n // Encoding is not explicitly serialized in C#\n // Not decorated with @jsonMember\n encoding?: string;\n}\n\n// InstructionSummary - defined before SessionInformation\n@jsonObject({ name: 'InstructionSummary' })\nexport class InstructionSummary {\n @jsonMember(String)\n instructionCategory: string = \"\"\n\n @jsonMember(String)\n description: string = \"\"\n\n @jsonMember(String)\n interactionId: string = \"\"\n}\n\n// SessionInformation - defined before LlmEvent to avoid forward reference\n@jsonObject({ name: 'SessionInformation' })\nexport class SessionInformation {\n @jsonMember(Number)\n size: number = 0\n\n @jsonMember(Number)\n originalSize: number = 0\n\n @jsonMember(Number)\n ratio: number = 0\n\n @jsonMember(Number)\n previousRatio: number = 0\n\n @jsonMember(Number)\n threshold: number = 0\n\n @jsonMember(Number)\n maxSize: number = 0\n\n @jsonMember(String)\n id?: string\n\n @jsonArrayMember(InstructionSummary)\n instructionSummaries?: InstructionSummary[] = []\n}\n\n// Main Event Class\n@jsonObject({ name: 'LlmEvent' })\nexport class LlmEvent {\n\n @jsonMember(Number)\n timestamp!: number;\n\n @jsonMember(String)\n mimeType!: string;\n\n @jsonMember(Boolean)\n partial!: boolean;\n\n @jsonMember(Boolean)\n turnComplete!: boolean;\n\n @jsonMember(Boolean)\n visible!: boolean;\n\n @jsonMember(String)\n serverError?: string;\n\n @jsonMember(String)\n interactionId!: string;\n\n @jsonMember(SessionInformation)\n sessionInformation?: SessionInformation;\n\n @jsonMember(EventTypeInformation)\n eventType?: EventTypeInformation;\n\n @jsonArrayMember(LlmArtifact)\n artifactsGenerated: LlmArtifact[] = [];\n\n @jsonMember(String)\n author?: string;\n\n @jsonMember(AuthorRole)\n role?: AuthorRole;\n\n @jsonMember(String)\n command?: Commands;\n\n @jsonMember(ChatMessageContent)\n content?: ChatMessageContent;\n\n @jsonArrayMember(() => StreamingKernelContent)\n streamingParts?: StreamingKernelContent[];\n\n subAgentId?: string;\n subAgentName?: string;\n text?: string;\n}\n\n@jsonObject({ name: 'PartialLlmEvent' })\nexport class PartialLlmEvent {\n\n @jsonMember(Number, { name: \"ts\" })\n timeStamp?: number;\n\n @jsonMember(String, { name: \"pt\" })\n partialText?: string;\n\n @jsonMember(String, { name: \"pr\" })\n partialReasoning?: string;\n\n @jsonMember(String, { name: \"fn\" })\n functionName?: string;\n\n @jsonArrayMember(() => StreamingKernelContent)\n streamingParts?: StreamingKernelContent[];\n\n @jsonMember(String, { name: \"fid\" })\n functionCallId?: string;\n\n @jsonMember(String, { name: \"tp\" })\n type?: string;\n\n @jsonMember(String, { name: \"itid\" })\n iteractionId?: string;\n\n @jsonMember(EventTypeInformation)\n partialEventType?: EventTypeInformation;\n\n @jsonMember(String, { name: \"said\" })\n subAgentId?: string;\n}\n\n\n@jsonObject({ name: 'StreamingResponse' })\nexport class StreamingResponse {\n\n @jsonMember(String)\n type!: string;\n\n @jsonMember(LlmEvent)\n event?: LlmEvent;\n\n @jsonMember(String)\n sessionId?: string;\n\n /**\n * Optional. Server piggybacks a freshly minted JWT on the next few Pong frames\n * after a WS upgrade where it auto-refreshed the token (inbound was expired or\n * near expiry). The client mirrors this into the stored user record so the\n * global fetch interceptor stops sending the stale token.\n */\n @jsonMember(String)\n accessToken?: string;\n\n @jsonMember(PartialLlmEvent, { name: \"pe\" })\n partialEvent?: PartialLlmEvent;\n\n @jsonMember(String)\n subAgentId?: string;\n\n @jsonMember(String)\n subAgentName?: string;\n\n /**\n * Server-assigned monotonic sequence number for events emitted by an InteractionRun.\n * Tracked client-side as `lastSeq` so reconnects can resume mid-stream via\n * `?lastSeq=N` on the WebSocket URL. Absent on control messages (Pong / Suspended)\n * and on RewindLost notices that carry the new starting seq directly.\n */\n @jsonMember(Number)\n seq?: number;\n}\n\n@jsonObject({ name: 'Payload' })\nexport class Payload {\n\n @jsonArrayMember(LlmEvent)\n events!: LlmEvent[];\n}\n\nexport interface InteractionStatistics {\n eventCount: number,\n unknonwCount: number,\n unparsedCount: number,\n totalTransfered: number,\n buffer: string[],\n startTime: Date,\n elapsed: number,\n tokensPerSecond: number,\n sessionInformation?: SessionInformation\n}\n\n","import { EventType, GetEventTypeFromPythonName, SkillLevel, GetEventTypeFromDotNetName } from './enums';\nimport { findAllNonNullNonEmptyProperties } from '../utils/objectUtils';\nimport { InteractionPartUtils, type InteractionPart } from './InteractionPart';\nimport { type EndMessageData } from './EndMessageData';\nimport { type ArtifactJson } from '@lib/utils/jsonDetector';\nimport { ANALYTICS_AGENT_NAME } from '@lib/utils/environmentUtils';\nimport { FunctionCallContent, FunctionClientOutputContent, FunctionResultContent, KernelContent, LlmArtifact, LlmEvent, PartType, SessionInformation, StreamingClientOutputContent, StreamingFinalFunctionCallContent, StreamingFinalFunctionResultContent, StreamingFunctionCallUpdateContent, StreamingKernelContent, StreamingReasoningContent, StreamingTextContent, StreamingToolEventContent, TextContent, ToolEventContent, UserUiContent } from './semanticKernelModel/models';\nimport { getRandomUUID } from '@lib/utils';\n\nexport interface FunctionDetails {\n id: string;\n args?: any;\n text?: string;\n name: string;\n start?: Date,\n end?: Date,\n response?: any;\n status: 'Composing' | 'Executing' | 'Done';\n silent?: boolean\n /** True when this targets a [KernelUiFunction] render tool — classified as `uiTool`. */\n isUi?: boolean\n /**\n * True when this targets a [KernelUIComponent] ask-user tool — classified as `askUser` and drawn\n * in the docked ask-user drawer (AskUserSheet). Derived from {@link askUserComponent}'s presence;\n * mirrors how {@link isUi} works, replacing the legacy hard-coded ask_user/askauth name matching.\n */\n isAskUser?: boolean\n /**\n * The ask-user component to draw (the server's [KernelUIComponent] value): e.g. `\"AskUserPart\"`,\n * `\"AskAuthPart\"`, `\"AskCreateAccount\"`. Resolved against the ui-tool registry's askUser entries.\n */\n askUserComponent?: string\n /** Server-provided human one-liner describing the call args, for the tool-call chip. */\n argsDescription?: string\n /**\n * Client-only payload the tool produced via its ToolClientOutput sink, correlated to this call\n * by id. A (possibly JSON) string off the wire — render data the LLM never saw. Arrives WITH the\n * result on the live path (StreamingFinalFunctionResultContent.clientOutput) and is folded from\n * the persisted FunctionClientOutputContent sibling on replay. Prefer this over `args` in a\n * uiTool renderer; it is only present once the call has RESPONDED.\n */\n clientOutput?: any\n}\n\nexport interface ThoughtDetails {\n text: string;\n}\n\nexport interface ToolEventDetails {\n eventName: string;\n eventData: string;\n subAgentId?: string;\n /** Id of the session that generated the event (server-stamped). Lets consumers\n * persist event-derived state to the right session even for stale/trailing events. */\n sessionId?: string;\n}\n\nexport interface TextDetails {\n hasCodeBlock?: boolean\n version: number;\n}\n\nexport interface ErrorDetails {\n errorMessage: string;\n}\n\nexport interface ExecutableCodeDetails {\n code: string;\n language: string;\n}\n\nexport interface CodeExecutionResultDetails {\n outcome: string;\n output?: string;\n}\n\ninterface CodeExecutionResult {\n outcome: string | null\n output: string | null\n}\n\ninterface ExecutableCode {\n code: string | null\n language: string | null\n}\n\ninterface PythonPart {\n thought?: boolean | null\n code_execution_result?: CodeExecutionResult | null\n executable_code?: ExecutableCode | null\n function_call?: Partial<FunctionDetails> | null\n function_response?: Partial<FunctionDetails> | null\n text?: string | null\n}\n\nexport interface PythonEventMessage {\n mime_type: string\n autor: string\n turn_complete?: boolean\n usage_metadata?: any\n end_message_data?: EndMessageData | null\n invocation_id?: string\n serverError?: string | null\n interrupted?: boolean | string\n is_final_response?: boolean\n session_information?: SessionInformation | null\n part_data?: PythonPart | null\n all_parts_data?: PythonPart[] | null\n interaction_id: string | null\n partial?: boolean | string\n artifact_generated?: ArtifactJson[]\n async_final_response?: boolean\n}\n\nexport class ServerEvent {\n uniqueId!: string;\n mimeType!: string;\n created!: Date;\n author: 'tool' | 'main' | 'system';\n eventType!: EventType;\n allEventTypes: EventType[] = [];\n interactionId: string;\n artifactsDelta: string[] = [];\n llmArtifacts?: LlmArtifact[] = [];\n partial!: boolean;\n turn_complete?: boolean;\n isFinalResponse?: boolean;\n interrupted?: boolean;\n model_session_id!: string;\n functionDetails?: FunctionDetails\n executableCodeDetails?: ExecutableCodeDetails;\n codeExecutionResultDetails?: CodeExecutionResultDetails;\n thoughtDefails?: ThoughtDetails;\n rawDetails?: any;\n rendered?: boolean;\n serverError?: string;\n server_session_id?: string | null;\n asyncFinalResponse?: boolean;\n agentServerBaseUrl?: string;\n parts: InteractionPart[] = [];\n endMessageData?: EndMessageData;\n command?: string;\n session_information?: SessionInformation;\n subAgentId?: string;\n subAgentName?: string;\n visible: boolean = true;\n\n constructor(interactionId: string) {\n this.interactionId = interactionId;\n this.author = \"main\";\n }\n\n public static createErrorEvent(errorMessage: string, interactionId: string) {\n const serverErrorEvent = new ServerEvent(interactionId)\n serverErrorEvent.turn_complete = true;\n serverErrorEvent.partial = false;\n serverErrorEvent.parts = []\n const errorPart: InteractionPart = {\n eventType: EventType.ServerError,\n errorDetails: {\n errorMessage: errorMessage\n },\n id: '',\n author: 'main',\n created: new Date(),\n partial: false,\n isStillWriting: false,\n mustPush: false,\n textAppendable: false\n }\n serverErrorEvent.parts.push(errorPart);\n return serverErrorEvent;\n }\n\n static parseFlatPropertiesTypedEvent(event: LlmEvent) {\n const serverMessage: ServerEvent = new ServerEvent(event.interactionId);\n\n serverMessage.serverError = event.serverError;\n\n if (!event.interactionId) {\n\n throw new Error(\"Interaction ID is required\");\n }\n\n\n serverMessage.model_session_id = \"\";\n serverMessage.server_session_id = null;\n serverMessage.asyncFinalResponse = event.turnComplete;\n serverMessage.command = event.command?.toString();\n if (event.sessionInformation)\n serverMessage.session_information = event.sessionInformation as SessionInformation\n\n // The agent occasionally emits terminal events (notably the\n // `turnComplete: true` packet) without an `author` field. The\n // previous strict throw here got swallowed by the WS handler's\n // try/catch (WebSocketConnectionV2.handleEvent), which meant\n // `serverMessage.turn_complete` never propagated and the store\n // was stuck at `turnOpen: true` forever. Treat missing-author\n // events as `main` (same as the switch default below) so the\n // turn-complete signal reaches `setTurnOpen(false)`.\n if (!event.author || event.author == \"\") {\n console.warn('[ServerEvent] event with no author; defaulting to \"main\"', {\n interactionId: event.interactionId,\n turnComplete: event.turnComplete,\n });\n }\n\n switch (event?.author) {\n case ANALYTICS_AGENT_NAME:\n serverMessage.author = \"tool\";\n break;\n case \"system\":\n serverMessage.author = \"system\";\n break;\n default:\n serverMessage.author = \"main\";\n }\n serverMessage.mimeType = event.mimeType;\n serverMessage.created = new Date(event.timestamp);\n serverMessage.eventType = EventType.NotDefined;\n\n serverMessage.partial = event.partial?.toString()?.toLowerCase() === \"true\"\n\n serverMessage.turn_complete = event.turnComplete;\n serverMessage.visible = event.visible;\n serverMessage.isFinalResponse = event.turnComplete ?? false;\n\n serverMessage.artifactsDelta = []\n if (event.artifactsGenerated && event.artifactsGenerated.length > 0) {\n serverMessage.created = new Date(event.timestamp);\n serverMessage.llmArtifacts = event.artifactsGenerated;\n }\n\n serverMessage.subAgentId = event.subAgentId;\n serverMessage.subAgentName = event.subAgentName;\n\n return serverMessage;\n }\n\n static getPartType(part: KernelContent | StreamingKernelContent): PartType {\n if (part instanceof TextContent) {\n return \"TextContent\"\n }\n else if (part instanceof FunctionCallContent) {\n return \"FunctionCallContent\"\n }\n else if (part instanceof FunctionResultContent) {\n return \"FunctionResultContent\"\n }\n else if (part instanceof StreamingFunctionCallUpdateContent) {\n return \"StreamingFunctionCallUpdateContent\"\n }\n else if (part instanceof StreamingFinalFunctionCallContent) {\n return \"StreamingFinalFunctionCallContent\"\n }\n else if (part instanceof StreamingFinalFunctionResultContent) {\n return \"StreamingFinalFunctionResultContent\"\n }\n else if (part instanceof FunctionClientOutputContent) {\n return \"FunctionClientOutputContent\"\n }\n else if (part instanceof UserUiContent) {\n return \"UserUiContent\"\n }\n else if (part instanceof StreamingTextContent) {\n return \"StreamingTextContent\"\n }\n else if (part instanceof StreamingReasoningContent) {\n return \"StreamingReasoningContent\"\n }\n else if (part instanceof ToolEventContent) {\n return \"ToolEventContent\"\n }\n else if (part instanceof StreamingToolEventContent) {\n return \"StreamingToolEventContent\"\n }\n else {\n return \"Unknown\";\n }\n }\n\n static parseFromTypedEvent(event: LlmEvent) {\n const serverMessage = ServerEvent.parseFlatPropertiesTypedEvent(event);\n\n if (serverMessage.serverError) {\n serverMessage.parts.push(InteractionPartUtils.fromError(serverMessage.serverError));\n return serverMessage;\n }\n\n //For turncomplete msgs for instance\n if (!event.content && !event.streamingParts)\n return serverMessage;\n\n serverMessage.parts = [];\n\n const mergedParts: KernelContent[] | StreamingKernelContent[] = [...event.content?.items ?? [], ...event.streamingParts ?? []];\n\n serverMessage.eventType = GetEventTypeFromDotNetName(event.eventType?.type ?? '');\n\n let index = 0;\n for (const serverPart of mergedParts) {\n let part: InteractionPart = {\n id: \"\",\n author: serverMessage.author,\n eventType: serverMessage.eventType,\n created: new Date(),\n visible: serverMessage.visible,\n partial: serverMessage.partial,\n isStillWriting: false,\n mustPush: false,\n textAppendable: false\n }\n index++;\n\n const partType: PartType = ServerEvent.getPartType(serverPart);\n\n\n type functionType = FunctionCallContent & FunctionResultContent & StreamingFinalFunctionCallContent & StreamingFinalFunctionResultContent;\n\n if (partType == PartType.FunctionCallContent || partType == PartType.FunctionResultContent || partType == PartType.StreamingFinalFunctionCallContent || partType == PartType.StreamingFinalFunctionResultContent) {\n var serverCall = serverPart as functionType;\n\n if (serverCall.id == \"Server Error\") {\n part.eventType = EventType.ServerError\n part.errorDetails = {\n errorMessage: JSON.stringify(serverCall.arguments)\n }\n part.functionDetails = undefined;\n }\n else {\n part.eventType = partType == PartType.FunctionCallContent || partType == PartType.StreamingFinalFunctionCallContent ? EventType.FunctionCall : EventType.FunctionResponse;\n let result: any = undefined;\n try {\n if (serverCall?.result) {\n if (typeof serverCall.result === \"object\") {\n result = serverCall.result;\n } else if (typeof serverCall.result === \"string\") {\n const parsed = JSON.parse(serverCall.result);\n result = (typeof parsed === \"object\" && parsed !== null)\n ? parsed\n : serverCall.result;\n } else {\n result = serverCall.result;\n }\n }\n }\n catch (error) {\n console.warn(\"Parse function error\", error)\n result = serverCall?.result;\n }\n part.thoughtDetails = {\n text: ''\n }\n part.functionDetails = {\n id: serverCall?.id ?? '',\n args: serverCall?.arguments,\n start: partType == PartType.FunctionCallContent ? serverMessage.created : undefined,\n end: partType == PartType.FunctionResultContent ? serverMessage.created : undefined,\n text: JSON.stringify(serverCall?.arguments) ?? '',\n name: (serverCall?.functionName ?? \"\"),\n status: part.eventType == EventType.FunctionCall ? 'Executing' : 'Done',\n response: result,\n isUi: serverCall?.isUi === true\n // FunctionCall/Result is sealed server-side, so UI render tools carry\n // the flag in the call args as `__isUi` (see StreamingFinalFunctionCallContent.\n // ToKernelContent). The top-level isUi covers the transient streaming part;\n // this covers the persisted FunctionCallContent the client actually keeps.\n || (typeof serverCall?.arguments === 'object'\n && serverCall?.arguments !== null\n && (serverCall.arguments as Record<string, unknown>).__isUi === true),\n // Friendly args summary for the chip — mirrors __isUi: the live streaming part\n // carries `friendlyArgsDescription`; the persisted FunctionCall carries\n // `__argsDescription` in its args (see StreamingFinalFunctionCallContent.ToKernelContent).\n argsDescription: serverCall?.friendlyArgsDescription\n ?? (typeof serverCall?.arguments === 'object' && serverCall?.arguments !== null\n ? (serverCall.arguments as Record<string, unknown>).__argsDescription as string | undefined\n : undefined),\n // Client-only payload riding the RESULT event. The streaming form carries it\n // top-level (clientOutput); when the runtime collapses that to a sealed\n // FunctionResultContent (ToKernelContent) the payload rides in metadata, and\n // the client's part flattener keeps THAT collapsed part — so read both. Calls\n // leave it undefined. The persisted-replay form folds in via FunctionClientOutputContent.\n clientOutput: serverCall?.clientOutput\n ?? (serverCall?.metadata as Record<string, unknown> | undefined)?.clientOutput,\n // Ask-user component ([KernelUIComponent]). Mirrors __isUi/clientOutput across the\n // three shapes: the live streaming part carries it top-level (askUserComponent), a\n // persisted FunctionCall carries `__askUserComponent` in its args, and a collapsed\n // FunctionResult carries it in metadata (see the two ToKernelContent methods).\n askUserComponent: serverCall?.askUserComponent\n ?? (typeof serverCall?.arguments === 'object' && serverCall?.arguments !== null\n ? (serverCall.arguments as Record<string, unknown>).__askUserComponent as string | undefined\n : undefined)\n ?? (serverCall?.metadata as Record<string, unknown> | undefined)?.askUserComponent as string | undefined,\n }\n // isAskUser mirrors isUi: derived from the component's presence, so classification\n // and the drawer key off a single flag (see classifyPart / AskUserSheet).\n part.functionDetails.isAskUser = !!part.functionDetails.askUserComponent;\n\n event.text = serverCall?.arguments;\n }\n }\n else if (partType == PartType.StreamingTextContent) {\n part.eventType = EventType.Text;\n part.text = (serverPart as StreamingTextContent)?.text?.replaceAll(\"\\\\n\", \"\\n\");;\n part.textLastChunk = (serverPart as StreamingTextContent).text;\n event.text = part.text;\n }\n else if (partType == PartType.TextContent) {\n part.eventType = EventType.Text;\n part.text = (serverPart as TextContent)?.text?.replaceAll(\"\\\\n\", \"\\n\");;\n part.textLastChunk = (serverPart as TextContent).text;\n event.text = part.text;\n }\n else if (partType == PartType.StreamingReasoningContent) {\n part.eventType = EventType.Thought;\n part.thoughtDetails = {\n text: (serverPart as StreamingReasoningContent)?.text?.replaceAll(\"\\\\n\", \"\\n\") ?? \"\"\n }\n part.text = (serverPart as StreamingReasoningContent)?.text?.replaceAll(\"\\\\n\", \"\\n\")\n part.textLastChunk = (serverPart as StreamingReasoningContent).text;\n event.text = part.text;\n }\n else if (partType == PartType.StreamingFunctionCallUpdateContent) {\n const partialFunctionCall = (serverPart as StreamingFunctionCallUpdateContent);\n part.eventType = EventType.PartialFunctionCall;\n part.text = partialFunctionCall.arguments;\n part.thoughtDetails = {\n text: ''\n }\n part.functionDetails = {\n id: partialFunctionCall.callId ?? '',\n text: part.text,\n status: 'Composing',\n name: partialFunctionCall?.name ?? 'Unknown',\n }\n event.text = part.text;\n }\n else if (partType == PartType.ToolEventContent || partType == PartType.StreamingToolEventContent) {\n part.eventType = EventType.ToolEvent;\n const toolEvent = (serverPart as ToolEventContent);\n part.toolDetails = {\n eventName: toolEvent.eventName ?? \"\",\n eventData: toolEvent.eventData ?? \"\",\n sessionId: toolEvent.sessionId ?? undefined,\n }\n }\n else if (partType == PartType.FunctionClientOutputContent) {\n // Persisted, client-only sibling of a function result (replay path). Carries the\n // tool's ToolClientOutput payload keyed by callId; it is folded into the matching\n // call part (functionDetails.clientOutput) by the session decoder and never renders\n // on its own. The live path delivers the same payload on the result event instead.\n const clientOutput = (serverPart as FunctionClientOutputContent);\n part.eventType = EventType.FunctionClientOutput;\n part.functionDetails = {\n id: clientOutput.id ?? '',\n name: '',\n status: 'Done',\n clientOutput: clientOutput.data,\n }\n }\n else if (partType == PartType.StreamingClientOutputContent) {\n // Non-terminal prefill pushed while an ask-user tool is PARKED (issue #60). Same call-id\n // fold as the persisted sibling above, but it must NOT close the call — no status here, so\n // interactionService folds clientOutput onto the parked call and leaves it Executing.\n const clientOutput = (serverPart as StreamingClientOutputContent);\n part.eventType = EventType.FunctionClientOutput;\n part.functionDetails = {\n id: clientOutput.id ?? '',\n name: '',\n // The parked call stays Executing; interactionService folds only clientOutput onto it and\n // leaves the existing status untouched, so this is just to satisfy the type.\n status: 'Executing',\n clientOutput: clientOutput.clientOutput,\n }\n }\n else if (partType == PartType.UserUiContent) {\n // Client-only UI representation for this user turn (replay path). Routes through the\n // uiTool dispatcher via functionDetails (name → registry key, args → props), but is\n // authored by the user: rendered on the user side (MessageUser) and excluded from the\n // agent side (MessageAgent). The live turn injects this same shape client-side; this\n // branch re-hydrates it on session reload.\n const userUi = (serverPart as UserUiContent);\n part.eventType = EventType.UserAnswer;\n part.author = 'user';\n part.functionDetails = {\n id: '',\n name: userUi.name ?? '',\n args: userUi.args,\n status: 'Done',\n isUi: true,\n }\n }\n else {\n part.eventType = EventType.NotDefined;\n console.warn(`Got a unmapped event_type:${serverMessage.eventType}, data:`, partType, serverPart)\n continue;\n }\n\n serverMessage.parts.push(part);\n }\n\n return serverMessage;\n }\n\n static createFromThought(interactionId: string, thinkingText: string): ServerEvent {\n const thinkingEvent: ServerEvent = {\n author: \"main\",\n visible: true,\n eventType: EventType.Thought,\n uniqueId: new Date().getTime().toString(),\n interactionId: interactionId,\n allEventTypes: [EventType.Thought],\n artifactsDelta: [''],\n model_session_id: \"\",\n created: new Date(),\n turn_complete: false,\n partial: true,\n asyncFinalResponse: false,\n mimeType: \"text/plain\",\n parts: [\n {\n thoughtDetails: {\n text: thinkingText,\n },\n id: getRandomUUID(),\n created: new Date(),\n eventType: EventType.Thought,\n author: \"main\",\n isStillWriting: false,\n textAppendable: true,\n partial: true,\n mustPush: true\n }\n ]\n }\n return thinkingEvent\n }\n\n static createFromFunctionName(functionName: string, interactionId: string, callData?: any): ServerEvent {\n const callEvent = ServerEvent.createFromText(\"\",interactionId);\n callEvent.parts[0].text = undefined;\n callEvent.parts[0].thoughtDetails = undefined;\n callEvent.parts[0].textAppendable = false;\n callEvent.parts[0].mustPush = true;\n \n callEvent.parts[0].functionDetails = {\n name: functionName,\n id:'callId',\n status: 'Executing',\n start: new Date(),\n end:undefined,\n text:'dfsdfdf',\n args:callData\n }\n return callEvent;\n }\n\n static createFromText(message: string, interactionId: string, thinkingData?: string): ServerEvent {\n\n const textEvent: ServerEvent = {\n author: \"main\",\n visible: true,\n eventType: EventType.Text,\n uniqueId: new Date().getTime().toString(),\n interactionId: interactionId,\n allEventTypes: [EventType.Text],\n artifactsDelta: [''],\n model_session_id: \"\",\n created: new Date(),\n turn_complete: false,\n partial: true,\n asyncFinalResponse: false,\n mimeType: \"text/plain\",\n parts: [\n {\n // Optional reasoning trace shown next to the message. Parts\n // with `eventType: Text` AND a populated `thoughtDetails`\n // render the text in the body and the trace in the\n // thinking strip.\n thoughtDetails: thinkingData ? {\n text: thinkingData\n } : undefined,\n id: getRandomUUID(),\n created: new Date(),\n // Part eventType MUST match the outer event's eventType.\n // Was previously `Thought` here, which made the merger\n // classify a streamed Text part as a Thought (rendered\n // in the trace strip instead of the message body) —\n // the chat would show the message during streaming and\n // then \"disappear\" once the part was reclassified.\n eventType: EventType.Text,\n author: \"main\",\n isStillWriting: false,\n textAppendable: true,\n partial: true,\n mustPush: true,\n text: message\n }\n ]\n }\n return textEvent;\n }\n\n} ","import './init'; // MUST be first - loads reflect-metadata\n\nimport { TypedJSON, type IndexedObject, JsonObjectMetadata } from 'typedjson';\nimport {\n LlmEvent,\n KernelContent,\n TextContent,\n ImageContent,\n FunctionCallContent,\n FunctionResultContent,\n ChatMessageContent,\n StreamingKernelContent,\n StreamingTextContent,\n StreamingFunctionCallUpdateContent,\n StreamingResponse,\n Payload,\n InstructionSummary,\n StreamingReasoningContent,\n ToolEventContent,\n StreamingFinalFunctionCallContent,\n StreamingFinalFunctionResultContent,\n StreamingClientOutputContent,\n FunctionClientOutputContent,\n UserUiContent\n} from './models';\n\n// All known content types for polymorphic deserialization\nconst KNOWN_CONTENT_TYPES = [\n // KernelContent derived types\n TextContent,\n ImageContent,\n FunctionCallContent,\n ToolEventContent,\n FunctionResultContent,\n FunctionClientOutputContent,\n UserUiContent,\n ChatMessageContent,\n // StreamingKernelContent derived types\n StreamingTextContent,\n StreamingFunctionCallUpdateContent,\n StreamingReasoningContent,\n StreamingFinalFunctionCallContent,\n StreamingFinalFunctionResultContent,\n StreamingClientOutputContent,\n InstructionSummary\n];\n\n/**\n * Helper function to get constructor name (replaces typedjson internal nameof)\n */\nfunction getConstructorName(constructor: Function): string {\n return constructor.name;\n}\n\n/**\n * Custom type emitter for .NET compatibility\n * Emits \"$type\" property for polymorphic types to match .NET serialization\n */\nexport function dotNetTypeEmitter(\n targetObject: IndexedObject,\n sourceObject: IndexedObject,\n expectedSourceType: Function,\n sourceTypeMetadata?: JsonObjectMetadata,\n) {\n // Add \"$type\" property for polymorphic deserialization (matches .NET's JsonPolymorphic)\n if (sourceObject.constructor !== expectedSourceType) {\n targetObject[\"$type\"] = sourceTypeMetadata?.name ?? getConstructorName(sourceObject.constructor);\n }\n}\n\nexport function dotnetTypeResolver(\n sourceObject: IndexedObject,\n knownTypes: Map<string, Function>,\n): Function | undefined {\n if (sourceObject[\"$type\"] != null) {\n return knownTypes.get(sourceObject[\"$type\"]);\n }\n}\n\n/**\n * Creates a configured TypedJSON serializer for Event objects\n * Includes all known types for polymorphic serialization\n */\nexport function createEventSerializer(): TypedJSON<LlmEvent> {\n const serializer = new TypedJSON(LlmEvent);\n\n serializer.config({\n knownTypes: KNOWN_CONTENT_TYPES,\n typeHintEmitter: dotNetTypeEmitter,\n typeResolver: dotnetTypeResolver\n });\n\n return serializer;\n}\n\nexport function createPayloadSerializer(): TypedJSON<Payload> {\n const serializer = new TypedJSON<Payload>(Payload);\n\n serializer.config({\n knownTypes: KNOWN_CONTENT_TYPES,\n typeHintEmitter: dotNetTypeEmitter,\n typeResolver: dotnetTypeResolver\n });\n\n return serializer;\n}\n\nexport function createStreamingResponseSerializer(): TypedJSON<StreamingResponse> {\n const serializer = new TypedJSON<StreamingResponse>(StreamingResponse);\n\n serializer.config({\n knownTypes: KNOWN_CONTENT_TYPES,\n typeHintEmitter: dotNetTypeEmitter,\n typeResolver: dotnetTypeResolver\n });\n\n return serializer;\n}\n\n/**\n * Sanitizes JSON string by fixing control characters that may come from .NET serialization\n * This handles cases where newlines, tabs, and other control characters are not properly escaped\n */\nexport function sanitizeJsonString(jsonStr: string): string {\n try {\n // First, try to parse as-is (in case it's already valid)\n JSON.parse(jsonStr);\n return jsonStr;\n } catch (e) {\n // If parsing fails, we need to escape unescaped control characters within string values\n // We'll do this by processing character by character, tracking when we're inside a string\n\n let result = '';\n let inString = false;\n\n for (let i = 0; i < jsonStr.length; i++) {\n const char = jsonStr[i];\n const code = char.charCodeAt(0);\n\n // Handle backslash - check if it's starting an escape sequence\n if (char === '\\\\' && inString && i + 1 < jsonStr.length) {\n const nextChar = jsonStr[i + 1];\n // Valid escape sequences in JSON: \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\uXXXX\n if (nextChar === '\"' || nextChar === '\\\\' || nextChar === '/' ||\n nextChar === 'b' || nextChar === 'f' || nextChar === 'n' ||\n nextChar === 'r' || nextChar === 't') {\n // Valid single-char escape - copy both characters\n result += char + nextChar;\n i++; // Skip the next character\n continue;\n } else if (nextChar === 'u' && i + 5 < jsonStr.length) {\n // Unicode escape sequence \\uXXXX - copy all 6 characters\n result += jsonStr.substring(i, i + 6);\n i += 5; // Skip the next 5 characters (u and 4 hex digits)\n continue;\n } else {\n // Invalid escape sequence - just add the backslash\n result += char;\n continue;\n }\n }\n\n // Track string boundaries (but not if it's escaped)\n if (char === '\"') {\n // Check if this quote is escaped by looking back\n let numBackslashes = 0;\n for (let j = i - 1; j >= 0 && jsonStr[j] === '\\\\'; j--) {\n numBackslashes++;\n }\n // If there's an even number of backslashes (including 0), the quote is not escaped\n if (numBackslashes % 2 === 0) {\n inString = !inString;\n }\n result += char;\n continue;\n }\n\n // If we're inside a string and encounter an unescaped control character, escape it\n if (inString && code < 32) {\n switch (char) {\n case '\\n':\n result += '\\\\n';\n break;\n case '\\r':\n result += '\\\\r';\n break;\n case '\\t':\n result += '\\\\t';\n break;\n case '\\f':\n result += '\\\\f';\n break;\n case '\\b':\n result += '\\\\b';\n break;\n default:\n // For other control characters, use unicode escape\n const hex = code.toString(16).padStart(4, '0');\n result += `\\\\u${hex}`;\n break;\n }\n } else {\n result += char;\n }\n }\n\n return result;\n }\n}\n\n/**\n * Deserializes a JSON string into a Payload, with automatic sanitization of control characters\n */\nexport function deserializePayload(json: string): StreamingResponse | undefined {\n const sanitized = sanitizeJsonString(json);\n const serializer = createStreamingResponseSerializer();\n return serializer.parse(sanitized);\n}\n\n/**\n * Deserializes a JSON string into an Event object, with automatic sanitization of control characters\n */\nexport function deserializeEvent(json: string): LlmEvent | undefined {\n const sanitized = sanitizeJsonString(json);\n const serializer = createEventSerializer();\n return serializer.parse(sanitized);\n}\n\n/**\n * Serializes an Event object into a JSON string\n */\nexport function serializeEvent(event: LlmEvent): string {\n const serializer = createEventSerializer();\n return serializer.stringify(event);\n}\n\n/**\n * Creates a configured TypedJSON serializer for KernelContent objects\n */\nexport function createKernelContentSerializer(): TypedJSON<KernelContent> {\n const serializer = new TypedJSON(KernelContent);\n\n serializer.config({\n knownTypes: KNOWN_CONTENT_TYPES,\n typeHintEmitter: dotNetTypeEmitter,\n typeResolver: dotnetTypeResolver\n });\n\n return serializer;\n}\n\n/**\n * Creates a configured TypedJSON serializer for StreamingKernelContent objects\n */\nexport function createStreamingKernelContentSerializer(): TypedJSON<StreamingKernelContent> {\n const serializer = new TypedJSON(StreamingKernelContent);\n\n serializer.config({\n knownTypes: [\n StreamingTextContent,\n StreamingFunctionCallUpdateContent\n ],\n typeHintEmitter: dotNetTypeEmitter\n });\n\n return serializer;\n}\n"],"names":["_InteractionPartUtils","value","regex","match","json","charCollapsed","objectProps","textReponseLines","prop","startChart","obj","startChar","part","r","_a","i","o","v","errorMsg","EventType","text","author","id","getRandomUUID","name","args","addTimer","isTimerRunning","status","startingPoint","stopPoint","partData","parts","textParts","onlyPart","unique_event_types","item","keys","k","__name","InteractionPartUtils","PartType","AuthorRole","__publicField","__decorateClass","jsonMember","jsonObject","EventTypeInformation","LlmArtifact","KernelContent","AnyT","StreamingKernelContent","TextContent","StreamingToolEventContent","ToolEventContent","ImageContent","FunctionCallContent","StreamingFinalFunctionCallContent","FunctionResultContent","StreamingFinalFunctionResultContent","FunctionClientOutputContent","StreamingClientOutputContent","UserUiContent","ChatMessageContent","jsonArrayMember","StreamingFunctionCallUpdateContent","StreamingTextContent","StreamingReasoningContent","InstructionSummary","SessionInformation","LlmEvent","PartialLlmEvent","StreamingResponse","Payload","_ServerEvent","interactionId","errorMessage","serverErrorEvent","errorPart","event","serverMessage","ANALYTICS_AGENT_NAME","_c","_b","mergedParts","GetEventTypeFromDotNetName","serverPart","partType","serverCall","result","parsed","error","_d","_e","_f","_g","_h","partialFunctionCall","toolEvent","clientOutput","userUi","thinkingText","functionName","callData","callEvent","message","thinkingData","ServerEvent","KNOWN_CONTENT_TYPES","getConstructorName","constructor","dotNetTypeEmitter","targetObject","sourceObject","expectedSourceType","sourceTypeMetadata","dotnetTypeResolver","knownTypes","createEventSerializer","serializer","TypedJSON","createStreamingResponseSerializer","sanitizeJsonString","jsonStr","inString","char","code","nextChar","numBackslashes","j","hex","deserializePayload","sanitized","deserializeEvent","serializeEvent"],"mappings":"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"}
package/dist/services.js CHANGED
@@ -1,6 +1,6 @@
1
- import { A as a, a as r, E as s, H as o, I as c, L as n, W as i } from "./httpArtifactService-Dh9LGQ9a.js";
1
+ import { A as a, a as r, E as s, H as o, I as c, L as n, W as i } from "./httpArtifactService-DFlQzSgN.js";
2
2
  import { A as v } from "./artifactHtmlHandler-CMQJf1cX.js";
3
- import { H, d as f } from "./httpSessionService-5Kr__oQL.js";
3
+ import { H, d as f } from "./httpSessionService-D9JXx3JD.js";
4
4
  export {
5
5
  a as AgentGatewayService,
6
6
  r as AgentGatewayWSAsync,
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ import { InteractionPart } from '../../../../models/InteractionPart';
3
+ import { PartRendererProps } from './types';
4
+ export interface AskUserDispatcherProps extends Partial<PartRendererProps> {
5
+ /** The ask-user function part (only field required, so the drawer can render it standalone). */
6
+ part: InteractionPart;
7
+ /** Drop the card chrome — set by the docked AskUserSheet. */
8
+ embedded?: boolean;
9
+ }
10
+ /**
11
+ * The generic ask-user renderer. Every ask-user part (server-flagged
12
+ * `functionDetails.isAskUser` via `[KernelUIComponent]`, or legacy ask_user/askauth by name) routes
13
+ * here; this dispatcher resolves the named component (`functionDetails.askUserComponent`) against the
14
+ * host's `uiTools` registry `askUser` entries and draws it. The library's own `AskUserPart`
15
+ * (questionnaire) and `AskAuthPart` (sign-in) are the built-in fallbacks when the host hasn't
16
+ * registered the component — so `AskCreateAccount` (host-registered) and the built-ins share one path.
17
+ *
18
+ * Mirrors {@link UiToolDispatcher} for the `uiTool` kind. Used both inline (the locked transcript card
19
+ * once answered) and, with `embedded`, inside the docked {@link AskUserSheet} while parked.
20
+ */
21
+ declare const AskUserDispatcher: React.FC<AskUserDispatcherProps>;
22
+ export default AskUserDispatcher;
@@ -1,6 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  import { InteractionPart } from '../../../../models/InteractionPart';
3
3
  import { Interaction } from '../../../../models/Interaction';
4
+ import { FunctionDetails } from '../../../../models/ServerEvent';
4
5
  export type PartKind = 'text' | 'thought' | 'function' | 'waiting' | 'suspended' | 'boxed' | 'uiTool' | 'askUser' | 'askAuth';
5
6
  export interface PartRendererProps {
6
7
  part: InteractionPart;
@@ -25,3 +26,19 @@ export declare const isAskUser: (name?: string | null) => boolean;
25
26
  * bare `askauth`; live LLM connectors qualify it as `{Plugin}-askauth` / `{Plugin}_askauth`.
26
27
  */
27
28
  export declare const isAskAuth: (name?: string | null) => boolean;
29
+ /** Built-in ask-user component names (the server's [KernelUIComponent] values for the SDK tools). */
30
+ export declare const ASK_USER_COMPONENT = "AskUserPart";
31
+ export declare const ASK_AUTH_COMPONENT = "AskAuthPart";
32
+ /**
33
+ * True when a function part is an ask-user (human-in-the-loop) prompt — drawn in the docked
34
+ * AskUserSheet, not inline as tool chatter. Prefers the first-class server flag
35
+ * (`functionDetails.isAskUser`, from [KernelUIComponent]); falls back to the legacy hard-coded
36
+ * ask_user/askauth name match so a pre-flag server still routes correctly.
37
+ */
38
+ export declare const isAskUserPart: (fd?: FunctionDetails | null) => boolean;
39
+ /**
40
+ * The ask-user component to draw for a part: the server-stamped `askUserComponent` when present,
41
+ * else the legacy name-based default (AskAuthPart for askauth, AskUserPart otherwise). Returns
42
+ * `undefined` when the part is not an ask-user part.
43
+ */
44
+ export declare const askUserComponentOf: (fd?: FunctionDetails | null) => string | undefined;
@@ -63,6 +63,29 @@ export interface UiToolActionContext extends UiToolContext {
63
63
  }
64
64
  export type UiToolRenderFn<TArgs> = (args: TArgs, ctx: UiToolContext) => React.ReactNode;
65
65
  export type UiToolActionFn<TArgs> = (args: TArgs, ctx: UiToolActionContext) => void | Promise<void>;
66
+ /**
67
+ * The interactive face of an ASK-USER component — a human-in-the-loop prompt drawn in the docked
68
+ * ask-user drawer (`AskUserSheet`) while the tool call is PARKED, keyed by the component NAME the
69
+ * server stamps via `[KernelUIComponent]` (`functionDetails.askUserComponent`), not by the wire tool
70
+ * name. Same `(args, ctx)` shape as a render tool.
71
+ */
72
+ export type UiToolAskUserQuestionFn<TArgs> = (args: TArgs, ctx: UiToolContext) => React.ReactNode;
73
+ /**
74
+ * The ANSWERED face of an ask-user component — the locked summary drawn inline in the transcript once
75
+ * the tool has responded. Receives the tool's response (also available as `ctx.response`), so a host
76
+ * can render "you answered X" without re-deriving it from args.
77
+ */
78
+ export type UiToolAskUserResponseFn<TArgs> = (args: TArgs, ctx: UiToolContext, response: unknown) => React.ReactNode;
79
+ /**
80
+ * A host ask-user registration: the interactive `question` (required, drawn while parked) plus an
81
+ * optional locked `response` summary (drawn inline once answered). Omit `response` to reuse `question`
82
+ * in both states — the question component then owns its own answered/locked view (as the built-in
83
+ * `AskUserPart`/`AskAuthPart` do).
84
+ */
85
+ export interface UiToolAskUserRenderers<TArgs> {
86
+ question: UiToolAskUserQuestionFn<TArgs>;
87
+ response?: UiToolAskUserResponseFn<TArgs>;
88
+ }
66
89
  export interface UiToolRenderOptions<TArgs> {
67
90
  /** Runtime arg guard/coercion. Return `null` to render nothing (treated as invalid args). */
68
91
  parse?: (raw: unknown) => TArgs | null;
@@ -90,17 +113,39 @@ export interface UiToolActionEntry {
90
113
  parse?: (raw: unknown) => any;
91
114
  status?: string | ((args: any, ctx: UiToolActionContext) => string | null);
92
115
  }
93
- export type UiToolEntry = UiToolRenderEntry | UiToolActionEntry;
116
+ export interface UiToolAskUserEntry {
117
+ kind: 'askUser';
118
+ name: string;
119
+ question: UiToolAskUserQuestionFn<any>;
120
+ response?: UiToolAskUserResponseFn<any>;
121
+ parse?: (raw: unknown) => any;
122
+ }
123
+ export type UiToolEntry = UiToolRenderEntry | UiToolActionEntry | UiToolAskUserEntry;
94
124
  /** A built, read-only registry passed to `<AiChatProvider uiTools={…} />`. */
95
125
  export interface UiToolRegistry {
96
- /** Resolve the entry for a RAW (possibly `UI_`-prefixed / connector-qualified) tool name. */
126
+ /** Resolve the render/action entry for a RAW (possibly `UI_`-prefixed / connector-qualified) tool name. */
97
127
  resolve(rawName: string | undefined | null): UiToolEntry | undefined;
128
+ /**
129
+ * Resolve an ASK-USER component by its exact name (the `[KernelUIComponent]` value the server
130
+ * stamps as `functionDetails.askUserComponent`). Exact match only — component names are authored
131
+ * verbatim, not connector-qualified.
132
+ */
133
+ resolveAskUser(componentName: string | undefined | null): UiToolAskUserEntry | undefined;
98
134
  /** All registered (normalized) names. */
99
135
  names(): string[];
100
136
  }
101
137
  export interface UiToolRegistryBuilder {
102
138
  render<TArgs = UiToolArgs>(name: string, render: UiToolRenderFn<TArgs>, opts?: UiToolRenderOptions<TArgs>): UiToolRegistryBuilder;
103
139
  action<TArgs = UiToolArgs>(name: string, run: UiToolActionFn<TArgs>, opts?: UiToolActionOptions<TArgs>): UiToolRegistryBuilder;
140
+ /**
141
+ * Register an ASK-USER component drawn in the docked drawer (`AskUserSheet`). `componentName` must
142
+ * match the server's `[KernelUIComponent("…")]` value (arrives as `functionDetails.askUserComponent`).
143
+ * `AskUserPart` (questionnaire) and `AskAuthPart` (sign-in) are handled built-in by `AskUserDispatcher`
144
+ * when unregistered, so consumers only register their own components (e.g. `AskCreateAccount`).
145
+ * Pass `{ question, response? }`: `question` is the interactive parked form, `response` the optional
146
+ * locked summary shown once answered.
147
+ */
148
+ askUser<TArgs = UiToolArgs>(componentName: string, renderers: UiToolAskUserRenderers<TArgs>, opts?: UiToolRenderOptions<TArgs>): UiToolRegistryBuilder;
104
149
  build(): UiToolRegistry;
105
150
  }
106
151
  /**
@@ -15,6 +15,17 @@ export interface FunctionDetails {
15
15
  silent?: boolean;
16
16
  /** True when this targets a [KernelUiFunction] render tool — classified as `uiTool`. */
17
17
  isUi?: boolean;
18
+ /**
19
+ * True when this targets a [KernelUIComponent] ask-user tool — classified as `askUser` and drawn
20
+ * in the docked ask-user drawer (AskUserSheet). Derived from {@link askUserComponent}'s presence;
21
+ * mirrors how {@link isUi} works, replacing the legacy hard-coded ask_user/askauth name matching.
22
+ */
23
+ isAskUser?: boolean;
24
+ /**
25
+ * The ask-user component to draw (the server's [KernelUIComponent] value): e.g. `"AskUserPart"`,
26
+ * `"AskAuthPart"`, `"AskCreateAccount"`. Resolved against the ui-tool registry's askUser entries.
27
+ */
28
+ askUserComponent?: string;
18
29
  /** Server-provided human one-liner describing the call args, for the tool-call chip. */
19
30
  argsDescription?: string;
20
31
  /**
@@ -1,5 +1,5 @@
1
1
  import { Artifact } from '../../models/Artifact';
2
- export type PartType = 'ToolEventContent' | 'StreamingToolEventContent' | 'TextContent' | 'StreamingFinalFunctionCallContent' | 'StreamingFinalFunctionResultContent' | 'StreamingReasoningContent' | 'ImageContent' | 'FunctionCallContent' | 'FunctionResultContent' | 'FunctionClientOutputContent' | 'UserUiContent' | 'ChatMessageContent' | 'StreamingTextContent' | 'StreamingFunctionCallUpdateContent' | 'Unknown';
2
+ export type PartType = 'ToolEventContent' | 'StreamingToolEventContent' | 'TextContent' | 'StreamingFinalFunctionCallContent' | 'StreamingFinalFunctionResultContent' | 'StreamingClientOutputContent' | 'StreamingReasoningContent' | 'ImageContent' | 'FunctionCallContent' | 'FunctionResultContent' | 'FunctionClientOutputContent' | 'UserUiContent' | 'ChatMessageContent' | 'StreamingTextContent' | 'StreamingFunctionCallUpdateContent' | 'Unknown';
3
3
  export declare const PartType: {
4
4
  readonly TextContent: "TextContent";
5
5
  readonly ToolEventContent: "ToolEventContent";
@@ -15,6 +15,7 @@ export declare const PartType: {
15
15
  readonly StreamingFunctionCallUpdateContent: "StreamingFunctionCallUpdateContent";
16
16
  readonly StreamingFinalFunctionCallContent: "StreamingFinalFunctionCallContent";
17
17
  readonly StreamingFinalFunctionResultContent: "StreamingFinalFunctionResultContent";
18
+ readonly StreamingClientOutputContent: "StreamingClientOutputContent";
18
19
  };
19
20
  export declare class AuthorRole {
20
21
  label?: string;
@@ -82,6 +83,7 @@ export declare class StreamingFinalFunctionCallContent extends StreamingKernelCo
82
83
  arguments?: string;
83
84
  isUi?: boolean;
84
85
  friendlyArgsDescription?: string;
86
+ askUserComponent?: string;
85
87
  }
86
88
  export declare class FunctionResultContent extends KernelContent {
87
89
  id?: string;
@@ -96,11 +98,16 @@ export declare class StreamingFinalFunctionResultContent extends StreamingKernel
96
98
  result?: any;
97
99
  isUi?: boolean;
98
100
  clientOutput?: string;
101
+ askUserComponent?: string;
99
102
  }
100
103
  export declare class FunctionClientOutputContent extends KernelContent {
101
104
  id?: string;
102
105
  data?: string;
103
106
  }
107
+ export declare class StreamingClientOutputContent extends StreamingKernelContent {
108
+ id?: string;
109
+ clientOutput?: string;
110
+ }
104
111
  export declare class UserUiContent extends KernelContent {
105
112
  name?: string;
106
113
  args?: string;
@@ -1,7 +1,7 @@
1
1
  var L = Object.defineProperty;
2
2
  var d = (e, t) => L(e, "name", { value: t, configurable: !0 });
3
3
  import { useMemo as h, useState as v, useCallback as g, useEffect as C } from "react";
4
- import { H } from "./httpSessionService-5Kr__oQL.js";
4
+ import { H } from "./httpSessionService-D9JXx3JD.js";
5
5
  const w = 6e4, y = 60 * w, l = 24 * y;
6
6
  function k(e) {
7
7
  if (!e) return;
@@ -104,4 +104,4 @@ d(Y, "useChatSessions");
104
104
  export {
105
105
  Y as u
106
106
  };
107
- //# sourceMappingURL=useChatSessions-DttlifVk.js.map
107
+ //# sourceMappingURL=useChatSessions-C1rHmRuS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChatSessions-DttlifVk.js","sources":["../src/hooks/useChatSessions.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { ChatSession } from '@lib/models/ChatSession';\nimport type { ISessionService } from '@lib/services/servers/sessionService/ISessionService';\nimport { HttpSessionService } from '../services';\n\n/**\n * One row in a session-picker UI. `raw` is the original ChatSession the\n * server returned; everything else is a derived label the hook computed\n * (and the host's `decorate` callback may have overridden).\n */\nexport interface ChatSessionListItem {\n id: string;\n title: string;\n snippet?: string;\n /** Compact relative-time label (\"now\", \"5m\", \"2h\", \"Mar 14\"). */\n timeLabel?: string;\n /** Optional per-row tag — host-supplied via the `decorate` callback. */\n kind?: string;\n updatedAt?: Date;\n raw: ChatSession;\n}\n\n/**\n * Sessions bucketed by recency. The order of `label` reflects display\n * order top-down (\"Today\" first, \"Older\" last).\n */\nexport interface ChatSessionGroup {\n label: string;\n items: ChatSessionListItem[];\n}\n\nexport interface UseChatSessionsOptions {\n sessionService?: ISessionService;\n /**\n * If provided, the live (current) session is merged into the list —\n * replacing an existing entry by id, or prepended if not yet on the\n * server. Lets a \"New chat\" row appear instantly without waiting for\n * the server roundtrip.\n */\n liveSession?: ChatSession | null;\n\n accessToken: string,\n serverBaseUrl: string,\n /**\n * Per-row override hook. Whatever fields you return are merged on top\n * of the hook's computed item — typical use is adding a `kind` tag for\n * application-specific session types (`'chat' | 'composer' | ...`) the\n * library doesn't know about.\n */\n decorate?: (session: ChatSession) => Partial<ChatSessionListItem>;\n}\n\nexport interface UseChatSessionsResult {\n /** Flat list (live session merged in, server order preserved). */\n sessions: ChatSession[];\n /** Same data bucketed by recency. */\n groups: ChatSessionGroup[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n /** Optimistic rename — patches local state immediately, rolls back on failure. */\n rename: (id: string, title: string) => Promise<void>;\n /** Optimistic remove — drops from local state immediately, rolls back on failure. */\n remove: (id: string) => Promise<void>;\n}\n\nconst MINUTE_MS = 60_000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\nfunction toDate(value: Date | string | undefined | null): Date | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return value;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? undefined : d;\n}\n\nfunction formatTimeLabel(date: Date | undefined): string {\n if (!date) return '';\n const diff = Date.now() - date.getTime();\n if (diff < MINUTE_MS) return 'now';\n if (diff < HOUR_MS) return `${Math.floor(diff / MINUTE_MS)}m`;\n if (diff < DAY_MS) return `${Math.floor(diff / HOUR_MS)}h`;\n if (diff < 7 * DAY_MS) return `${Math.floor(diff / DAY_MS)}d`;\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\nfunction startOfToday(): Date {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\nfunction groupByTime(items: ChatSessionListItem[]): ChatSessionGroup[] {\n const today = startOfToday();\n const yesterday = new Date(today.getTime() - DAY_MS);\n const weekAgo = new Date(today.getTime() - 7 * DAY_MS);\n const monthAgo = new Date(today.getTime() - 30 * DAY_MS);\n\n // Insertion-ordered map preserves the bucket display order.\n const buckets: Array<[string, ChatSessionListItem[]]> = [\n ['Today', []],\n ['Yesterday', []],\n ['This Week', []],\n ['This Month', []],\n ['Older', []],\n ];\n\n for (const item of items) {\n const u = item.updatedAt;\n if (!u) { buckets[4][1].push(item); continue; }\n if (u >= today) buckets[0][1].push(item);\n else if (u >= yesterday) buckets[1][1].push(item);\n else if (u >= weekAgo) buckets[2][1].push(item);\n else if (u >= monthAgo) buckets[3][1].push(item);\n else buckets[4][1].push(item);\n }\n\n return buckets\n .filter(([, list]) => list.length > 0)\n .map(([label, list]) => ({ label, items: list }));\n}\n\nfunction buildItem(\n session: ChatSession,\n decorate?: (s: ChatSession) => Partial<ChatSessionListItem>,\n): ChatSessionListItem {\n const updatedAt = toDate(session.updatedAt) ?? toDate(session.created);\n const base: ChatSessionListItem = {\n id: session.id ?? session.browserScopeId ?? '',\n title: session.overview || session.userDescription || '(untitled chat)',\n snippet: session.lastQuestion ?? undefined,\n timeLabel: formatTimeLabel(updatedAt),\n kind: session.agentType as string | undefined,\n updatedAt,\n raw: session,\n };\n return { ...base, ...(decorate?.(session) ?? {}) };\n}\n\n/**\n * Fetch + organise the user's chat sessions for a picker UI. Backend-agnostic\n * — the host injects an `ISessionService` so the same hook drives an HTTP\n * client, an in-memory fake, or whatever else.\n *\n * Replaces the duplicated `useEffect(async () => sessionService.getAllSessions())`\n * + grouping logic that lived in DataExplorerViewV2 and MobileSessionsList,\n * and consolidates the optimistic rename/delete pattern.\n */\nexport function useChatSessions(opts: UseChatSessionsOptions): UseChatSessionsResult {\n\n const defaultSessionService = useMemo(() => {\n return new HttpSessionService(opts.serverBaseUrl, opts.accessToken);\n }, [opts.accessToken, opts.serverBaseUrl]);\n\n const { sessionService, liveSession, decorate } = {\n sessionService: defaultSessionService,\n liveSession: opts.liveSession,\n decorate: opts.decorate\n };\n const [sessions, setSessions] = useState<ChatSession[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const list = await sessionService.getAllSessions();\n setSessions(list);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n }, [sessionService]);\n\n useEffect(() => { void refresh(); }, [refresh]);\n\n const merged = useMemo(() => {\n if (!liveSession?.id) return sessions;\n const idx = sessions.findIndex(s => s.id === liveSession.id);\n if (idx === -1) return [liveSession, ...sessions];\n const copy = sessions.slice();\n copy[idx] = liveSession;\n return copy;\n }, [sessions, liveSession]);\n\n const items = useMemo(\n () => merged.map(s => buildItem(s, decorate)),\n [merged, decorate],\n );\n\n const groups = useMemo(() => groupByTime(items), [items]);\n\n const rename = useCallback(async (id: string, title: string) => {\n setSessions(current =>\n current.map(s => (s.id === id ? { ...s, overview: title } : s)),\n );\n try {\n await sessionService.patchSession(id, { overview: title });\n } catch (err) {\n console.error('[useChatSessions] rename failed; refreshing to roll back:', err);\n void refresh();\n }\n }, [sessionService, refresh]);\n\n const remove = useCallback(async (id: string) => {\n setSessions(current => current.filter(s => s.id !== id));\n try {\n await sessionService.removeSession(id);\n } catch (err) {\n console.error('[useChatSessions] remove failed; refreshing to roll back:', err);\n void refresh();\n }\n }, [sessionService, refresh]);\n\n return { sessions: merged, groups, isLoading, error, refresh, rename, remove };\n}\n"],"names":["MINUTE_MS","HOUR_MS","DAY_MS","toDate","value","d","__name","formatTimeLabel","date","diff","startOfToday","groupByTime","items","today","yesterday","weekAgo","monthAgo","buckets","item","u","list","label","buildItem","session","decorate","updatedAt","useChatSessions","opts","defaultSessionService","useMemo","HttpSessionService","sessionService","liveSession","sessions","setSessions","useState","isLoading","setIsLoading","error","setError","refresh","useCallback","err","useEffect","merged","idx","s","copy","groups","rename","id","title","current","remove"],"mappings":"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"}
1
+ {"version":3,"file":"useChatSessions-C1rHmRuS.js","sources":["../src/hooks/useChatSessions.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { ChatSession } from '@lib/models/ChatSession';\nimport type { ISessionService } from '@lib/services/servers/sessionService/ISessionService';\nimport { HttpSessionService } from '../services';\n\n/**\n * One row in a session-picker UI. `raw` is the original ChatSession the\n * server returned; everything else is a derived label the hook computed\n * (and the host's `decorate` callback may have overridden).\n */\nexport interface ChatSessionListItem {\n id: string;\n title: string;\n snippet?: string;\n /** Compact relative-time label (\"now\", \"5m\", \"2h\", \"Mar 14\"). */\n timeLabel?: string;\n /** Optional per-row tag — host-supplied via the `decorate` callback. */\n kind?: string;\n updatedAt?: Date;\n raw: ChatSession;\n}\n\n/**\n * Sessions bucketed by recency. The order of `label` reflects display\n * order top-down (\"Today\" first, \"Older\" last).\n */\nexport interface ChatSessionGroup {\n label: string;\n items: ChatSessionListItem[];\n}\n\nexport interface UseChatSessionsOptions {\n sessionService?: ISessionService;\n /**\n * If provided, the live (current) session is merged into the list —\n * replacing an existing entry by id, or prepended if not yet on the\n * server. Lets a \"New chat\" row appear instantly without waiting for\n * the server roundtrip.\n */\n liveSession?: ChatSession | null;\n\n accessToken: string,\n serverBaseUrl: string,\n /**\n * Per-row override hook. Whatever fields you return are merged on top\n * of the hook's computed item — typical use is adding a `kind` tag for\n * application-specific session types (`'chat' | 'composer' | ...`) the\n * library doesn't know about.\n */\n decorate?: (session: ChatSession) => Partial<ChatSessionListItem>;\n}\n\nexport interface UseChatSessionsResult {\n /** Flat list (live session merged in, server order preserved). */\n sessions: ChatSession[];\n /** Same data bucketed by recency. */\n groups: ChatSessionGroup[];\n isLoading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n /** Optimistic rename — patches local state immediately, rolls back on failure. */\n rename: (id: string, title: string) => Promise<void>;\n /** Optimistic remove — drops from local state immediately, rolls back on failure. */\n remove: (id: string) => Promise<void>;\n}\n\nconst MINUTE_MS = 60_000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\nfunction toDate(value: Date | string | undefined | null): Date | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return value;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? undefined : d;\n}\n\nfunction formatTimeLabel(date: Date | undefined): string {\n if (!date) return '';\n const diff = Date.now() - date.getTime();\n if (diff < MINUTE_MS) return 'now';\n if (diff < HOUR_MS) return `${Math.floor(diff / MINUTE_MS)}m`;\n if (diff < DAY_MS) return `${Math.floor(diff / HOUR_MS)}h`;\n if (diff < 7 * DAY_MS) return `${Math.floor(diff / DAY_MS)}d`;\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\nfunction startOfToday(): Date {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\nfunction groupByTime(items: ChatSessionListItem[]): ChatSessionGroup[] {\n const today = startOfToday();\n const yesterday = new Date(today.getTime() - DAY_MS);\n const weekAgo = new Date(today.getTime() - 7 * DAY_MS);\n const monthAgo = new Date(today.getTime() - 30 * DAY_MS);\n\n // Insertion-ordered map preserves the bucket display order.\n const buckets: Array<[string, ChatSessionListItem[]]> = [\n ['Today', []],\n ['Yesterday', []],\n ['This Week', []],\n ['This Month', []],\n ['Older', []],\n ];\n\n for (const item of items) {\n const u = item.updatedAt;\n if (!u) { buckets[4][1].push(item); continue; }\n if (u >= today) buckets[0][1].push(item);\n else if (u >= yesterday) buckets[1][1].push(item);\n else if (u >= weekAgo) buckets[2][1].push(item);\n else if (u >= monthAgo) buckets[3][1].push(item);\n else buckets[4][1].push(item);\n }\n\n return buckets\n .filter(([, list]) => list.length > 0)\n .map(([label, list]) => ({ label, items: list }));\n}\n\nfunction buildItem(\n session: ChatSession,\n decorate?: (s: ChatSession) => Partial<ChatSessionListItem>,\n): ChatSessionListItem {\n const updatedAt = toDate(session.updatedAt) ?? toDate(session.created);\n const base: ChatSessionListItem = {\n id: session.id ?? session.browserScopeId ?? '',\n title: session.overview || session.userDescription || '(untitled chat)',\n snippet: session.lastQuestion ?? undefined,\n timeLabel: formatTimeLabel(updatedAt),\n kind: session.agentType as string | undefined,\n updatedAt,\n raw: session,\n };\n return { ...base, ...(decorate?.(session) ?? {}) };\n}\n\n/**\n * Fetch + organise the user's chat sessions for a picker UI. Backend-agnostic\n * — the host injects an `ISessionService` so the same hook drives an HTTP\n * client, an in-memory fake, or whatever else.\n *\n * Replaces the duplicated `useEffect(async () => sessionService.getAllSessions())`\n * + grouping logic that lived in DataExplorerViewV2 and MobileSessionsList,\n * and consolidates the optimistic rename/delete pattern.\n */\nexport function useChatSessions(opts: UseChatSessionsOptions): UseChatSessionsResult {\n\n const defaultSessionService = useMemo(() => {\n return new HttpSessionService(opts.serverBaseUrl, opts.accessToken);\n }, [opts.accessToken, opts.serverBaseUrl]);\n\n const { sessionService, liveSession, decorate } = {\n sessionService: defaultSessionService,\n liveSession: opts.liveSession,\n decorate: opts.decorate\n };\n const [sessions, setSessions] = useState<ChatSession[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const list = await sessionService.getAllSessions();\n setSessions(list);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n }, [sessionService]);\n\n useEffect(() => { void refresh(); }, [refresh]);\n\n const merged = useMemo(() => {\n if (!liveSession?.id) return sessions;\n const idx = sessions.findIndex(s => s.id === liveSession.id);\n if (idx === -1) return [liveSession, ...sessions];\n const copy = sessions.slice();\n copy[idx] = liveSession;\n return copy;\n }, [sessions, liveSession]);\n\n const items = useMemo(\n () => merged.map(s => buildItem(s, decorate)),\n [merged, decorate],\n );\n\n const groups = useMemo(() => groupByTime(items), [items]);\n\n const rename = useCallback(async (id: string, title: string) => {\n setSessions(current =>\n current.map(s => (s.id === id ? { ...s, overview: title } : s)),\n );\n try {\n await sessionService.patchSession(id, { overview: title });\n } catch (err) {\n console.error('[useChatSessions] rename failed; refreshing to roll back:', err);\n void refresh();\n }\n }, [sessionService, refresh]);\n\n const remove = useCallback(async (id: string) => {\n setSessions(current => current.filter(s => s.id !== id));\n try {\n await sessionService.removeSession(id);\n } catch (err) {\n console.error('[useChatSessions] remove failed; refreshing to roll back:', err);\n void refresh();\n }\n }, [sessionService, refresh]);\n\n return { sessions: merged, groups, isLoading, error, refresh, rename, remove };\n}\n"],"names":["MINUTE_MS","HOUR_MS","DAY_MS","toDate","value","d","__name","formatTimeLabel","date","diff","startOfToday","groupByTime","items","today","yesterday","weekAgo","monthAgo","buckets","item","u","list","label","buildItem","session","decorate","updatedAt","useChatSessions","opts","defaultSessionService","useMemo","HttpSessionService","sessionService","liveSession","sessions","setSessions","useState","isLoading","setIsLoading","error","setError","refresh","useCallback","err","useEffect","merged","idx","s","copy","groups","rename","id","title","current","remove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aintela/chat",
3
- "version": "0.2.25",
3
+ "version": "0.2.26",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"