@aintela/chat 0.2.26 → 0.2.28

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-BPina6fX.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 // A streaming FINAL call/result event carries two reps of the same call: the collapsed\n // FunctionCall/Result (content.items) buries isUi/askUserComponent/clientOutput in `__`-args\n // — and a NO-ARG tool's don't survive decode — while the StreamingFinal* sibling\n // (streamingParts) carries them TOP-LEVEL. Fold those signals in from whichever sibling has\n // them, so collapsing to one part can't drop them (else a parked no-arg ask-user tool like\n // update_profile loses askUserComponent and its drawer never surfaces).\n if (onlyPart.functionDetails && part.functionDetails && part !== onlyPart) {\n const od = onlyPart.functionDetails, pd = part.functionDetails;\n if (!od.askUserComponent && pd.askUserComponent) od.askUserComponent = pd.askUserComponent;\n if (!od.isUi && pd.isUi) od.isUi = true;\n if (!od.clientOutput && pd.clientOutput) od.clientOutput = pd.clientOutput;\n od.isAskUser = od.isAskUser || pd.isAskUser || !!od.askUserComponent;\n }\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// The client-render hints for a tool call/result — one value object carried by the streaming final\n// types (server: ToolCallPresentation). Live wire is camelCase (these member names); on the reload\n// path it rides raw inside FunctionCall/Result `metadata[\"aia:presentation\"]` with PascalCase keys,\n// which ServerEvent reads case-insensitively.\n@jsonObject({ name: 'ToolCallPresentation' })\nexport class ToolCallPresentation {\n @jsonMember(Boolean)\n isUi?: boolean;\n\n @jsonMember(String)\n askUserComponent?: string;\n\n @jsonMember(String)\n argsDescription?: string;\n}\n\n// The metadata key the presentation rides under on a collapsed (persisted) FunctionCall/Result.\nexport const PresentationMetadataKey = 'aia:presentation';\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. Wire fields mirror StreamingFunctionCallUpdateContent\n// (callId / name / arguments) plus the presentation object.\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 // Client-render hints (isUi / askUserComponent / argsDescription) as one object.\n @jsonMember(ToolCallPresentation)\n presentation?: ToolCallPresentation;\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`. Wire fields per the server-side StreamingFinalFunctionResultContent\n// (callId / pluginName / functionName / result / presentation / clientOutput).\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 // Client-render hints (isUi / askUserComponent) as one object.\n @jsonMember(ToolCallPresentation)\n presentation?: ToolCallPresentation;\n\n // Client-only payload the tool wrote via CallContext.SetClientData (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. Kept separate from\n // `presentation` (a data payload, not a render hint).\n @jsonMember(String)\n clientOutput?: 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, PresentationMetadataKey, SessionInformation, StreamingClientOutputContent, StreamingFinalFunctionCallContent, StreamingFinalFunctionResultContent, StreamingFunctionCallUpdateContent, StreamingKernelContent, StreamingReasoningContent, StreamingTextContent, StreamingToolEventContent, TextContent, ToolEventContent, UserUiContent } from './semanticKernelModel/models';\nimport { getRandomUUID } from '@lib/utils';\n\n/**\n * The client-render hints for a tool call/result, read from whichever shape arrived:\n * • a LIVE streaming part carries them top-level as `presentation` (camelCase), or\n * • a persisted/collapsed FunctionCall/Result carries them in `metadata[\"aia:presentation\"]`\n * (PascalCase, from the session-load serializer).\n * Fields are read case-insensitively so one mapping covers both. Replaces the old scattered\n * top-level flags + `__`-args smuggling.\n */\nfunction readPresentation(serverCall: any): { isUi: boolean; askUserComponent?: string; argsDescription?: string } {\n const raw = serverCall?.presentation\n ?? (serverCall?.metadata as Record<string, unknown> | undefined)?.[PresentationMetadataKey];\n if (!raw || typeof raw !== 'object') return { isUi: false };\n const o = raw as Record<string, unknown>;\n const pick = (camel: string, pascal: string) => o[camel] ?? o[pascal];\n return {\n isUi: pick('isUi', 'IsUi') === true,\n askUserComponent: (pick('askUserComponent', 'AskUserComponent') as string | undefined) || undefined,\n argsDescription: (pick('argsDescription', 'ArgsDescription') as string | undefined) || undefined,\n };\n}\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 StreamingClientOutputContent) {\n return \"StreamingClientOutputContent\"\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 // Client-render hints ride as ONE presentation object (no more `__`-args smuggling):\n // a live streaming part carries it top-level as `presentation` (camelCase); a\n // persisted/collapsed FunctionCall/Result carries it in metadata[\"aia:presentation\"]\n // (PascalCase). readPresentation reads either, case-insensitively.\n const presentation = readPresentation(serverCall);\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: presentation.isUi,\n argsDescription: presentation.argsDescription,\n // Client-only payload riding the RESULT event: live top-level `clientOutput`, or\n // metadata.clientOutput on the collapsed/persisted result. Calls leave it undefined.\n // The persisted-replay form also folds in via FunctionClientOutputContent.\n clientOutput: serverCall?.clientOutput\n ?? (serverCall?.metadata as Record<string, unknown> | undefined)?.clientOutput,\n askUserComponent: presentation.askUserComponent,\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","od","pd","item","keys","k","__name","InteractionPartUtils","PartType","AuthorRole","__publicField","__decorateClass","jsonMember","jsonObject","EventTypeInformation","LlmArtifact","KernelContent","AnyT","StreamingKernelContent","TextContent","StreamingToolEventContent","ToolEventContent","ImageContent","FunctionCallContent","ToolCallPresentation","PresentationMetadataKey","StreamingFinalFunctionCallContent","FunctionResultContent","StreamingFinalFunctionResultContent","FunctionClientOutputContent","StreamingClientOutputContent","UserUiContent","ChatMessageContent","jsonArrayMember","StreamingFunctionCallUpdateContent","StreamingTextContent","StreamingReasoningContent","InstructionSummary","SessionInformation","LlmEvent","PartialLlmEvent","StreamingResponse","Payload","readPresentation","serverCall","raw","pick","camel","pascal","_ServerEvent","interactionId","errorMessage","serverErrorEvent","errorPart","event","serverMessage","ANALYTICS_AGENT_NAME","_c","_b","mergedParts","GetEventTypeFromDotNetName","serverPart","partType","result","parsed","error","presentation","_d","_e","_f","_g","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-DFlQzSgN.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-B668XBHO.js";
2
2
  import { A as v } from "./artifactHtmlHandler-CMQJf1cX.js";
3
- import { H, d as f } from "./httpSessionService-D9JXx3JD.js";
3
+ import { H, d as f } from "./httpSessionService-BuT5FlDc.js";
4
4
  export {
5
5
  a as AgentGatewayService,
6
6
  r as AgentGatewayWSAsync,
@@ -0,0 +1 @@
1
+ export {};
@@ -77,13 +77,17 @@ export declare class FunctionCallContent extends KernelContent {
77
77
  arguments?: any;
78
78
  exception?: Error;
79
79
  }
80
+ export declare class ToolCallPresentation {
81
+ isUi?: boolean;
82
+ askUserComponent?: string;
83
+ argsDescription?: string;
84
+ }
85
+ export declare const PresentationMetadataKey = "aia:presentation";
80
86
  export declare class StreamingFinalFunctionCallContent extends StreamingKernelContent {
81
87
  id?: string;
82
88
  functionName?: string;
83
89
  arguments?: string;
84
- isUi?: boolean;
85
- friendlyArgsDescription?: string;
86
- askUserComponent?: string;
90
+ presentation?: ToolCallPresentation;
87
91
  }
88
92
  export declare class FunctionResultContent extends KernelContent {
89
93
  id?: string;
@@ -96,9 +100,8 @@ export declare class StreamingFinalFunctionResultContent extends StreamingKernel
96
100
  pluginName?: string;
97
101
  functionName?: string;
98
102
  result?: any;
99
- isUi?: boolean;
103
+ presentation?: ToolCallPresentation;
100
104
  clientOutput?: string;
101
- askUserComponent?: string;
102
105
  }
103
106
  export declare class FunctionClientOutputContent extends KernelContent {
104
107
  id?: 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-D9JXx3JD.js";
4
+ import { H } from "./httpSessionService-BuT5FlDc.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-C1rHmRuS.js.map
107
+ //# sourceMappingURL=useChatSessions-DsHPo0GV.js.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"useChatSessions-DsHPo0GV.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":";;;;AAkEA,MAAMA,IAAY,KACZC,IAAU,KAAKD,GACfE,IAAS,KAAKD;AAEpB,SAASE,EAAOC,GAA2D;AACvE,MAAI,CAACA,EAAO;AACZ,MAAIA,aAAiB,KAAM,QAAOA;AAClC,QAAMC,IAAI,IAAI,KAAKD,CAAK;AACxB,SAAO,OAAO,MAAMC,EAAE,QAAA,CAAS,IAAI,SAAYA;AACnD;AALSC,EAAAH,GAAA;AAOT,SAASI,EAAgBC,GAAgC;AACrD,MAAI,CAACA,EAAM,QAAO;AAClB,QAAMC,IAAO,KAAK,IAAA,IAAQD,EAAK,QAAA;AAC/B,SAAIC,IAAOT,IAAkB,QACzBS,IAAOR,IAAgB,GAAG,KAAK,MAAMQ,IAAOT,CAAS,CAAC,MACtDS,IAAOP,IAAe,GAAG,KAAK,MAAMO,IAAOR,CAAO,CAAC,MACnDQ,IAAO,IAAIP,IAAe,GAAG,KAAK,MAAMO,IAAOP,CAAM,CAAC,MACnDM,EAAK,mBAAmB,QAAW,EAAE,OAAO,SAAS,KAAK,WAAW;AAChF;AARSF,EAAAC,GAAA;AAUT,SAASG,IAAqB;AAC1B,QAAML,wBAAQ,KAAA;AACd,SAAAA,EAAE,SAAS,GAAG,GAAG,GAAG,CAAC,GACdA;AACX;AAJSC,EAAAI,GAAA;AAMT,SAASC,EAAYC,GAAkD;AACnE,QAAMC,IAAQH,EAAA,GACRI,IAAY,IAAI,KAAKD,EAAM,QAAA,IAAYX,CAAM,GAC7Ca,IAAU,IAAI,KAAKF,EAAM,QAAA,IAAY,IAAIX,CAAM,GAC/Cc,IAAW,IAAI,KAAKH,EAAM,QAAA,IAAY,KAAKX,CAAM,GAGjDe,IAAkD;AAAA,IACpD,CAAC,SAAS,CAAA,CAAE;AAAA,IACZ,CAAC,aAAa,CAAA,CAAE;AAAA,IAChB,CAAC,aAAa,CAAA,CAAE;AAAA,IAChB,CAAC,cAAc,CAAA,CAAE;AAAA,IACjB,CAAC,SAAS,CAAA,CAAE;AAAA,EAAA;AAGhB,aAAWC,KAAQN,GAAO;AACtB,UAAMO,IAAID,EAAK;AACf,QAAI,CAACC,GAAG;AAAE,MAAAF,EAAQ,CAAC,EAAE,CAAC,EAAE,KAAKC,CAAI;AAAG;AAAA,IAAU;AAC9C,IAAIC,KAAKN,IAAOI,EAAQ,CAAC,EAAE,CAAC,EAAE,KAAKC,CAAI,IAC9BC,KAAKL,IAAWG,EAAQ,CAAC,EAAE,CAAC,EAAE,KAAKC,CAAI,IACvCC,KAAKJ,IAASE,EAAQ,CAAC,EAAE,CAAC,EAAE,KAAKC,CAAI,IACrCC,KAAKH,IAAUC,EAAQ,CAAC,EAAE,CAAC,EAAE,KAAKC,CAAI,MAClC,CAAC,EAAE,CAAC,EAAE,KAAKA,CAAI;AAAA,EAChC;AAEA,SAAOD,EACF,OAAO,CAAC,CAAA,EAAGG,CAAI,MAAMA,EAAK,SAAS,CAAC,EACpC,IAAI,CAAC,CAACC,GAAOD,CAAI,OAAO,EAAE,OAAAC,GAAO,OAAOD,EAAA,EAAO;AACxD;AA5BSd,EAAAK,GAAA;AA8BT,SAASW,EACLC,GACAC,GACmB;AACnB,QAAMC,IAAYtB,EAAOoB,EAAQ,SAAS,KAAKpB,EAAOoB,EAAQ,OAAO;AAUrE,SAAO,EAAE,GATyB;AAAA,IAC9B,IAAIA,EAAQ,MAAMA,EAAQ,kBAAkB;AAAA,IAC5C,OAAOA,EAAQ,YAAYA,EAAQ,mBAAmB;AAAA,IACtD,SAASA,EAAQ,gBAAgB;AAAA,IACjC,WAAWhB,EAAgBkB,CAAS;AAAA,IACpC,MAAMF,EAAQ;AAAA,IACd,WAAAE;AAAA,IACA,KAAKF;AAAA,EAAA,GAES,IAAIC,KAAA,gBAAAA,EAAWD,OAAY,CAAA,EAAC;AAClD;AAfSjB,EAAAgB,GAAA;AA0BF,SAASI,EAAgBC,GAAqD;AAEjF,QAAMC,IAAwBC,EAAQ,MAC3B,IAAIC,EAAmBH,EAAK,eAAeA,EAAK,WAAW,GACnE,CAACA,EAAK,aAAaA,EAAK,aAAa,CAAC,GAEnC,EAAE,gBAAAI,GAAgB,aAAAC,GAAa,UAAAR,MAAa;AAAA,IAC9C,gBAAgBI;AAAA,IAChB,aAAaD,EAAK;AAAA,IAClB,UAAUA,EAAK;AAAA,EAAA,GAEb,CAACM,GAAUC,CAAW,IAAIC,EAAwB,CAAA,CAAE,GACpD,CAACC,GAAWC,CAAY,IAAIF,EAAS,EAAI,GACzC,CAACG,GAAOC,CAAQ,IAAIJ,EAAuB,IAAI,GAG/CK,IAAUC,EAAY,YAAY;AACpC,IAAAJ,EAAa,EAAI,GACjBE,EAAS,IAAI;AACb,QAAI;AACA,YAAMnB,IAAO,MAAMW,EAAe,eAAA;AAClC,MAAAG,EAAYd,CAAI;AAAA,IACpB,SAASsB,GAAK;AACV,MAAAH,EAASG,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC;AAAA,IAChE,UAAA;AACI,MAAAL,EAAa,EAAK;AAAA,IACtB;AAAA,EACJ,GAAG,CAACN,CAAc,CAAC;AAEnB,EAAAY,EAAU,MAAM;AAAE,IAAKH,EAAA;AAAA,EAAW,GAAG,CAACA,CAAO,CAAC;AAE9C,QAAMI,IAASf,EAAQ,MAAM;AACzB,QAAI,EAACG,KAAA,QAAAA,EAAa,IAAI,QAAOC;AAC7B,UAAMY,IAAMZ,EAAS,UAAU,OAAKa,EAAE,OAAOd,EAAY,EAAE;AAC3D,QAAIa,MAAQ,GAAI,QAAO,CAACb,GAAa,GAAGC,CAAQ;AAChD,UAAMc,IAAOd,EAAS,MAAA;AACtB,WAAAc,EAAKF,CAAG,IAAIb,GACLe;AAAA,EACX,GAAG,CAACd,GAAUD,CAAW,CAAC,GAEpBpB,IAAQiB;AAAA,IACV,MAAMe,EAAO,IAAI,OAAKtB,EAAUwB,GAAGtB,CAAQ,CAAC;AAAA,IAC5C,CAACoB,GAAQpB,CAAQ;AAAA,EAAA,GAGfwB,IAASnB,EAAQ,MAAMlB,EAAYC,CAAK,GAAG,CAACA,CAAK,CAAC,GAElDqC,IAASR,EAAY,OAAOS,GAAYC,MAAkB;AAC5D,IAAAjB;AAAA,MAAY,CAAAkB,MACRA,EAAQ,IAAI,CAAAN,MAAMA,EAAE,OAAOI,IAAK,EAAE,GAAGJ,GAAG,UAAUK,EAAA,IAAUL,CAAE;AAAA,IAAA;AAElE,QAAI;AACA,YAAMf,EAAe,aAAamB,GAAI,EAAE,UAAUC,GAAO;AAAA,IAC7D,SAAST,GAAK;AACV,cAAQ,MAAM,6DAA6DA,CAAG,GACzEF,EAAA;AAAA,IACT;AAAA,EACJ,GAAG,CAACT,GAAgBS,CAAO,CAAC,GAEtBa,IAASZ,EAAY,OAAOS,MAAe;AAC7C,IAAAhB,EAAY,OAAWkB,EAAQ,OAAO,OAAKN,EAAE,OAAOI,CAAE,CAAC;AACvD,QAAI;AACA,YAAMnB,EAAe,cAAcmB,CAAE;AAAA,IACzC,SAASR,GAAK;AACV,cAAQ,MAAM,6DAA6DA,CAAG,GACzEF,EAAA;AAAA,IACT;AAAA,EACJ,GAAG,CAACT,GAAgBS,CAAO,CAAC;AAE5B,SAAO,EAAE,UAAUI,GAAQ,QAAAI,GAAQ,WAAAZ,GAAW,OAAAE,GAAO,SAAAE,GAAS,QAAAS,GAAQ,QAAAI,EAAA;AAC1E;AAtEgB/C,EAAAoB,GAAA;"}
package/dist/utils.js CHANGED
@@ -1,5 +1,5 @@
1
- import { A as e, D as t, l as r, n as i, o, q as n, r as c, s as d, t as l, u as A } from "./environmentUtils-BaKw5_VD.js";
2
- import { A as g, a as U, b as E, G as p, d as m, c as S, e as B, f as L, g as h, h as v, i as N, j as D, k as _, l as f, m as C, n as b, o as x, p as O, q as G, r as V, s as F, t as T, u as k, v as u } from "./auth-DbmLacBc.js";
1
+ import { A as e, D as t, l as r, n as i, o, q as n, r as c, s as d, t as l, u as A } from "./environmentUtils-CUVZ6Dq1.js";
2
+ import { A as g, a as U, b as E, G as p, d as m, c as S, e as B, f as L, g as h, h as v, i as N, j as D, k as _, l as f, m as C, n as b, o as x, p as O, q as G, r as V, s as F, t as T, u as k, v as u } from "./auth-GFZAFz7L.js";
3
3
  import { S as W, c as y, a as M, e as q, b as H, i as P, p as j, d as w, s as z, h as J, t as K } from "./promptHighlight-BHSQkdFs.js";
4
4
  export {
5
5
  g as ALLOWED_DOMAINS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aintela/chat",
3
- "version": "0.2.26",
3
+ "version": "0.2.28",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"file":"environmentUtils-BaKw5_VD.js","sources":["../src/utils/envUtils.ts","../src/models/enums.ts","../src/utils/envOverrides.ts","../src/utils/environmentUtils.ts"],"sourcesContent":["/**\n * Environment utilities for cross-platform (browser/Node.js) environment variable access\n */\n\n// Type-safe environment variable access\nexport function getEnvVar(key: string): string | undefined {\n // Check if we're in a browser environment with Vite\n if (typeof window !== 'undefined' && typeof import.meta !== 'undefined') {\n return (import.meta as any).env?.[key];\n }\n\n // Node.js environment\n return process.env[key];\n}\n\n// Check if we're running in a Vite environment (browser)\nexport function isViteEnvironment(): boolean {\n return typeof window !== 'undefined' && typeof import.meta !== 'undefined';\n}\n\n// Check if we're running in Node.js\nexport function isNodeEnvironment(): boolean {\n return typeof process !== 'undefined' && !!process.versions?.node;\n}\n\nexport function getRandomUUID(): string {\n return globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n}\n\n// Default export for compatibility\nexport default {\n getEnvVar,\n isViteEnvironment,\n isNodeEnvironment\n};\n","import type { ConnectionState } from \"./connectionState\";\nimport type { Theme } from \"@mui/material/styles\";\nimport PsychologyIcon from '@mui/icons-material/Psychology';\nimport FlashOnIcon from '@mui/icons-material/FlashOn';\nimport RocketLaunchIcon from '@mui/icons-material/RocketLaunch';\nimport GeneratingTokensOutlined from '@mui/icons-material/GeneratingTokensOutlined';\nimport AutoFixHighIcon from '@mui/icons-material/AutoFixHigh';\nimport SortByAlphaOutlined from \"@mui/icons-material/SortByAlphaOutlined\";\nimport AllInclusiveIcon from '@mui/icons-material/AllInclusive';\n\nexport type ChatEventType = 'ChatEvent' | 'ChatResponse' | 'ChatRequest';\nexport const ChatEventType = {\n ChatEvent: 'ChatEvent',\n ChatResponse: 'ChatResponse',\n ChatRequest: 'ChatRequest',\n} as const;\n\nexport type RunMode = 'interactive' | 'autonomous';\nexport const RunMode = {\n Interactive: 'interactive',\n Autonomous: 'autonomous'\n} as const;\n\nexport type ChatAction = 'SendMessage' | 'Suspend' | 'Ping' | 'Close' | 'Other' | 'AnswerHumanTool';\nexport const ChatAction = {\n SendMessage: 'SendMessage',\n Other: 'Other',\n Suspend: 'Suspend',\n Close: 'Close',\n Ping: 'Ping',\n AnswerHumanTool: 'AnswerHumanTool'\n} as const;\n\n\nexport type EventType = 'partial_function_call' | 'tool_event' | 'function_call' | 'not_defined' | 'function_response' | 'function_client_output' | 'user_answer' | 'video' | 'thought' | 'inline_data' | 'file_data' | 'code_execution_result' | 'executable_code' | 'text' | 'other' | 'waiting' | 'suspended' | 'server_error';\nexport const EventType = {\n FunctionCall: 'function_call',\n PartialFunctionCall: 'partial_function_call',\n FunctionResponse: 'function_response',\n // Persisted, client-only sibling carrying a tool's ToolClientOutput payload, keyed by call id.\n // Folded into its call part on replay (never rendered on its own); the live turn delivers the\n // same payload inline on the StreamingFinalFunctionResultContent result event.\n FunctionClientOutput: 'function_client_output',\n // A user turn's rich UI representation (from UserUiContent). Carries functionDetails {name,args,\n // isUi,status:'Done'} so it routes through the uiTool dispatcher/registry exactly like an\n // agent-emitted UI tool — but authored by the user and rendered on the user side of the turn.\n UserAnswer: 'user_answer',\n Video: 'video',\n Thought: 'thought',\n InlineData: 'inline_data',\n FileData: 'file_data',\n CodeExecutionResult: 'code_execution_result',\n ExecutableCode: 'executable_code',\n Other: 'other',\n Text: 'text',\n ToolEvent: 'tool_event',\n ServerError: 'server_error',\n NotDefined: 'not_defined',\n Waiting: 'waiting',\n Suspended: 'suspended'\n} as const;\n\nexport const GetEventTypeFromPythonName = (name: string): EventType => {\n switch (name.trim().toLowerCase()) {\n case 'function_call':\n return EventType.FunctionCall;\n case 'function_response':\n return EventType.FunctionResponse;\n case 'executable_code':\n return EventType.ExecutableCode;\n case 'code_execution_result':\n return EventType.CodeExecutionResult;\n case 'video_metadata':\n return EventType.Video;\n case 'thought':\n return EventType.Thought;\n case 'inline_data':\n return EventType.InlineData;\n case 'file_data':\n return EventType.FileData;\n case 'text':\n return EventType.Text;\n case 'not_defined':\n return EventType.NotDefined;\n default:\n return EventType.Other;\n }\n}\n\nexport const GetEventTypeFromDotNetName = (name: string): EventType => {\n switch (name.toLocaleLowerCase()) {\n case 'functioncall':\n return EventType.FunctionCall;\n case 'functionresponse':\n return EventType.FunctionResponse;\n case 'text':\n return EventType.Text;\n case 'partialfunctioncall':\n return EventType.PartialFunctionCall;\n case 'partialText':\n return EventType.Text;\n case 'unknown':\n return EventType.Other;\n default:\n return EventType.NotDefined;\n }\n}\n\nexport const EventTypeDescriptions = {\n [EventType.FunctionCall]: 'Executing function call',\n [EventType.FunctionResponse]: 'Getting response',\n [EventType.Video]: 'Video',\n [EventType.Thought]: 'Thought',\n [EventType.InlineData]: 'InlineData',\n [EventType.FileData]: 'FileData',\n [EventType.CodeExecutionResult]: 'Coding...',\n [EventType.ExecutableCode]: 'Coding...',\n [EventType.Other]: 'Other',\n [EventType.Text]: 'Text',\n [EventType.NotDefined]: 'NotDefined'\n};\n\nexport type ResponseType = 'Regular' | 'Artifact';\nexport const ResponseType = {\n Regular: 'Regular',\n Artifact: 'Artifact',\n} as const;\n\nexport type AuthorType = 'User' | 'Agent' | \"System\";\nexport const AuthorType = {\n User: 'User',\n Agent: 'Agent',\n System: 'System'\n} as const;\n\nexport type ArtifactType = 'Dashboard' | 'Chart' | 'Code';\nexport const ArtifactType = {\n Dashboard: 'Dashboard',\n Chart: 'Chart',\n Code: 'Code',\n} as const;\n\n// Agent selection types\nexport type AgentType = 'BI_Envision_Agent' | 'BI_Master_Customer_Agent' | 'BI_Dedicated_Customer_Agent' | 'Unknown';\nexport const AgentType = {\n BI_Envision_Agent: 'BI_Envision_Agent',\n BI_Master_Customer_Agent: 'BI_Master_Customer_Agent',\n BI_Dedicated_Customer_Agent: 'BI_Dedicated_Customer_Agent',\n Unknown: 'Unknown',\n} as const;\n\n// Agent mode\nexport type AgentMode = 'Interactive' | 'Newsletter'\nexport const AgentMode = {\n Interactive: 'Interactive',\n Newsletter: 'Newsletter'\n} as const;\n\nexport const AgentConfig = {\n [AgentType.BI_Envision_Agent]: {\n name: 'Envision',\n description: 'Analisa dados de vendas globais\\ncom insights consolidados de todos os clientes\\ne métricas agregadas do mercado'\n },\n [AgentType.BI_Master_Customer_Agent]: {\n name: 'Clientes Master',\n description: 'Visão consolidada de todos os clientes\\ncom análises comparativas e benchmarks\\nentre diferentes organizações'\n },\n [AgentType.BI_Dedicated_Customer_Agent]: {\n name: 'Cliente Único',\n description: 'Foco em um cliente específico\\ncom análises detalhadas e personalizadas\\npara sua organização'\n },\n [AgentType.Unknown]: {\n name: 'Não definido',\n description: 'Não definido'\n }\n} as const;\n\nexport type SkillLevel = 'FAST' | 'BALANCED' | 'PRO' | 'LIVE'\nexport const SkillLevel = {\n 'FAST': 'FAST',\n 'BALANCED': 'BALANCED',\n 'PRO': 'PRO',\n 'LIVE': 'LIVE',\n} as const;\n\n// Model selection types\nexport type ModelType = 'claude-opus-4-6' | 'claude-sonnet-4-6' | 'gemini_3_1_flash_lite_preview' | 'gemini_3_5_flash' | 'gemini-3.1-pro-preview' | 'gpt-5.1' | 'glm-5' | 'glm-4.7' | 'glm-4.7-flash' | 'kimi-k2.6' | 'kimi-k2-turbo-preview' | 'gpt-5.2' | 'gpt-5.4' | 'gpt-5.4-mini' | 'deepseek-v4-pro' | 'deepseek-v4-flash' | 'wen3.6-plus' | 'qwen3.7-max' | 'uiToolShowcase';\nexport const ModelType = {\n 'gemini_3_5_flash': 'gemini-3.5-flash',\n 'gemini_3_1_pro_preview': 'gemini-3.1-pro-preview',\n 'gemini_3_1_flash_lite_preview': 'gemini-3.1-flash-lite-preview',\n 'Gemini_live_2_5_flash_preview': 'gemini-live-2.5-flash-lite',\n 'Claude_Sonnet_4_6': 'claude-sonnet-4-6',\n 'Claude_Opus_4_6': 'claude-opus-4-6',\n 'Gpt_5_1': 'gpt-5.1',\n 'Gpt_5_2': 'gpt-5.2',\n 'Gpt_5_5': 'gpt-5.5-2026-04-23',\n 'Gpt_5_4_mini': 'gpt-5.4-mini',\n 'Glm-5_2': 'Glm-5.2',\n 'Glm_4.7': 'Glm-4.7',\n 'Glm_4.7_flash': 'Glm-4.7-Flash',\n 'Kimi_K26': 'kimi-k2.6',\n 'Kimi_Turbo': 'kimi-k2-turbo-preview',\n 'DeepSeek_v4_Pro': 'deepseek-v4-pro',\n 'DeepSeek_v4-Flash': 'deepseek-v4-flash',\n 'Qwen3_6-plus': 'qwen3.6-plus',\n 'Qwen3_7-max': 'qwen3.7-max',\n 'CorporateTravelDashboard': \"CorporateTravelDashboard\",\n 'ShowGuideDemo': \"ShowGuideDemo\",\n 'uiToolShowcase': 'uiToolShowcase',\n 'AUTO': 'AUTO'\n} as const;\n\nexport const ModelConfig = {\n [ModelType.Claude_Opus_4_6]: {\n name: 'Claude Opus 4.6',\n description: 'Modelo mais avançado da anthropic, no entanto, não tão rápido como o Sonnet',\n icon: AllInclusiveIcon,\n contextWindow: '1M tokens',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType.Claude_Sonnet_4_6]: {\n name: 'Claude Sonnet 4.6',\n description: 'Ótima relação velocidade/qualidade',\n icon: AllInclusiveIcon,\n contextWindow: '1M tokens',\n speed: 'Fast',\n quality: 'High'\n },\n [ModelType.gemini_3_1_pro_preview]: {\n name: 'Gemini 3.1 Pro',\n description: 'Modelo mais avançado\\nMelhor qualidade para tarefas complexas\\nContexto: 2M tokens',\n icon: PsychologyIcon,\n contextWindow: '2M tokens',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType.gemini_3_5_flash]: {\n name: 'Gemini 3.5 Flash',\n description: 'Equilibrio ideal entre velocidade e qualidade\\nÓtimo para a maioria das tarefas\\nContexto: 1M tokens',\n icon: FlashOnIcon,\n contextWindow: '1M tokens',\n speed: 'Fast',\n quality: 'High'\n },\n [ModelType.gemini_3_1_flash_lite_preview]: {\n name: 'Gemini 3 Lite Flash',\n description: 'NOVO: Equilibrio ideal entre velocidade e qualidade\\nÓtimo para a maioria das tarefas\\nContexto: 1M tokens',\n icon: FlashOnIcon,\n contextWindow: '1M tokens',\n speed: 'Fast',\n quality: 'High'\n },\n\n [ModelType.Gpt_5_1]: {\n name: 'Chat GPT 5.1',\n description: 'Chat GPT 5.1',\n icon: RocketLaunchIcon,\n contextWindow: '200k tokens',\n speed: 'Good',\n quality: 'High'\n },\n [ModelType.Gpt_5_2]: {\n name: 'Chat GPT 5.2',\n description: 'Chat GPT 5.2',\n icon: RocketLaunchIcon,\n contextWindow: '200k tokens',\n speed: 'Good',\n quality: 'Highest'\n },\n [ModelType.Gpt_5_5]: {\n name: 'Chat GPT 5.5',\n description: 'A melhor inteligência em escala para fluxos de trabalho de agentes, codificação e profissionais.',\n icon: RocketLaunchIcon,\n contextWindow: '200k tokens',\n speed: 'Good',\n quality: 'Highest'\n },\n [ModelType.Gpt_5_4_mini]: {\n name: 'Chat GPT 5.4 Mini',\n description: 'Modelo compacto mais robusto da OpenAi até momento para codificação, uso de computadores e subagentes.',\n icon: RocketLaunchIcon,\n contextWindow: '200k tokens',\n speed: 'Fast',\n quality: 'Highest'\n },\n [ModelType[\"Glm-5_2\"]]: {\n name: 'Z.ai Glm-5',\n description: 'Modelo open weights bem competente da Z.Ai. Apesar de gerar respostas mais longas o modelo é muito capaz.',\n icon: SortByAlphaOutlined,\n contextWindow: '200k tokens',\n speed: 'Good',\n quality: 'Highest'\n },\n [ModelType[\"Glm_4.7\"]]: {\n name: 'Z.ai Glm-4.7',\n description: '',\n icon: SortByAlphaOutlined,\n contextWindow: '200k tokens',\n speed: 'Fast',\n quality: 'High'\n },\n [ModelType[\"Glm_4.7_flash\"]]: {\n name: 'Z.ai Glm-4.7',\n description: '',\n icon: SortByAlphaOutlined,\n contextWindow: '200k tokens',\n speed: 'Good',\n quality: 'High'\n },\n [ModelType.DeepSeek_v4_Pro]: {\n name: 'DeepSeek Reasoner',\n description: 'Modelo da DeepSeek com modo de raciocínio profundo (thinking mode).\\nIdeal para tarefas complexas que se beneficiam de cadeia de pensamento extensa.',\n icon: PsychologyIcon,\n contextWindow: '128k tokens',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType[\"DeepSeek_v4-Flash\"]]: {\n name: 'DeepSeek Chat',\n description: 'Modelo de chat rápido da DeepSeek, sem modo de raciocínio.\\nÓtimo equilíbrio entre velocidade e qualidade para uso geral.',\n icon: FlashOnIcon,\n contextWindow: '128k tokens',\n speed: 'Fast',\n quality: 'High'\n },\n [ModelType.Kimi_K26]: {\n name: 'Kimi K2.6 Pro',\n description: 'Modelo híbrido da Moonshot com modo de raciocínio (thinking) ativado por padrão.\\nMelhor capacidade da família K2 para tarefas complexas.',\n icon: PsychologyIcon,\n contextWindow: '256k tokens',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType.Kimi_Turbo]: {\n name: 'Kimi K2 Turbo',\n description: 'Variante rápida (não-thinking) da Moonshot.\\nÓtima relação velocidade/qualidade para uso geral.',\n icon: FlashOnIcon,\n contextWindow: '256k tokens',\n speed: 'Fast',\n quality: 'High'\n },\n [ModelType[\"Qwen3_6-plus\"]]: {\n name: 'Qwen 3.6 Plus - Alibaba',\n description: 'Multimodal nativo, context window - 1 milhão de tokens, codificação agentiva',\n icon: FlashOnIcon,\n contextWindow: '1 milhão',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType[\"Qwen3_7-max\"]]: {\n name: 'Qwen 3.7 Max - Alibaba',\n description: 'Multimodal nativo, context window - 1 milhão de tokens, codificação agentiva',\n icon: FlashOnIcon,\n contextWindow: '1 milhão',\n speed: 'Moderate',\n quality: 'Highest'\n },\n [ModelType.uiToolShowcase]: {\n name: 'UiToolShowcase - Testing',\n description: 'Cria um stream de testes.',\n icon: GeneratingTokensOutlined,\n contextWindow: '256k tokens',\n speed: 'Fast',\n quality: 'High'\n }\n\n} as const;\n\nexport type ModelVendor = 'Google' | 'Anthropic' | 'OpenAI' | 'ZhiPu' | 'Moonshot' | 'DeepSeek' | 'Unknown';\n\nexport function getModelVendor(modelId: string | undefined): ModelVendor {\n if (!modelId) return 'Unknown';\n const id = modelId.toLowerCase();\n if (id.startsWith('gemini') || id.startsWith('live')) return 'Google';\n if (id.startsWith('claude')) return 'Anthropic';\n if (id.startsWith('gpt')) return 'OpenAI';\n if (id.startsWith('glm')) return 'ZhiPu';\n if (id.startsWith('kimi')) return 'Moonshot';\n if (id.startsWith('deepseek')) return 'DeepSeek';\n if (id === 'auto') return 'Unknown';\n return 'Unknown';\n}\n\nexport const getConnectionStateColor = (connectionState: ConnectionState, theme: Theme) => {\n switch (connectionState) {\n case 'Connected':\n return theme.palette.primary.light;\n case 'Paused':\n return theme.palette.warning.light;\n case 'Disconnected':\n return theme.palette.text.secondary;\n case 'Connecting':\n return theme.palette.success.dark;\n case 'Unknown':\n return theme.palette.text.secondary;\n default:\n return theme.palette.text.secondary;\n }\n};","/**\n * Deployment-URL overrides (e.g. a staging environment), resolved per environment:\n *\n * - Node (SSR / tests): real environment variables, read at call time.\n * - Browser: `process` doesn't exist. The HOST app's Vite build statically\n * replaces these exact `process.env.X` member expressions via `define`\n * (see envision-abi dashboard-app vite.config.ts — the same channel it\n * already uses for `process.env.MODE`). Without such a define the read\n * throws on the bare `process` global → caught → no override.\n *\n * NOTE: `import.meta.env.VITE_*` is NOT usable here — this package builds in\n * Vite lib mode, which inlines `import.meta.env` at PACKAGE build time, so a\n * consumer's VITE_* values can never reach the published dist. `process.env.X`\n * member expressions survive the lib build, which is what makes the consumer\n * `define` channel work.\n *\n * The reads must stay literal static member accesses (no dynamic key lookup),\n * or the consumer's define replacement won't match them.\n */\n\n/** Base URL of the .NET agent server (overrides `https://agent.tripapi.com.br`). */\nexport function agentBaseUrlOverride(): string | undefined {\n try {\n return process.env.AGENT_BASE_URL || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Public base URL of the dashboard client app (overrides `https://client-agent.tripapi.com.br`). */\nexport function clientBaseUrlOverride(): string | undefined {\n try {\n return process.env.CLIENT_BASE_URL || undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Environment detection and URL resolution utilities\n * Provides different base URLs for client vs server-side execution\n */\n\nimport { clientBaseUrlOverride } from './envOverrides';\n\nconst PROD_CLIENT_BASE_URL = \"https://client-agent.tripapi.com.br\";\n\n// Static server configuration\nexport const DEV_SERVER_CONFIG = {\n // When running on server-side, use localhost with the port\n SERVER_BASE_URL: 'http://localhost:3000',\n // When running on server-side, use localhost with the port\n CLIENT_BASE_URL: 'http://localhost:5800',\n\n CUSTOM_HEADERS: {}\n} as const;\n\nexport const ANALYTICS_AGENT_NAME = \"analytics_agent\"\n\n/**\n * Detects if code is running in browser vs server environment\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * Detects if code is running in Node.js server environment\n */\nexport function isServer(): boolean {\n return typeof process !== 'undefined' && process.versions?.node !== undefined;\n}\n\n/**\n * Gets the appropriate base URL for API calls\n * - Browser: Returns empty string (uses relative URLs)\n * - Server: Returns full localhost URL\n */\n\nexport function getServerBaseAbUrl(): string {\n if (isBrowser()) {\n return \"\";\n }\n\n if (isServer()) {\n // Explicit env override (e.g. staging) wins; else prod default / dev localhost\n const baseUrl = clientBaseUrlOverride() ?? (process.env.MODE == 'production' ? PROD_CLIENT_BASE_URL : DEV_SERVER_CONFIG.SERVER_BASE_URL);\n\n return baseUrl;\n }\n\n throw new Error(\"Could not resolve server URL\")\n}\n\nexport function getServerBaseUrl(): string {\n if (isBrowser()) {\n if (window.location.host.indexOf(\"localhost\") > -1 || window.location.host.indexOf(\"host.docker.internal\") > -1)\n return DEV_SERVER_CONFIG.SERVER_BASE_URL\n else\n return \"\";\n }\n\n if (isServer()) {\n // Explicit env override (e.g. staging) wins; else prod default / dev localhost\n const baseUrl = clientBaseUrlOverride() ?? (process.env.MODE == 'production' ? PROD_CLIENT_BASE_URL : DEV_SERVER_CONFIG.SERVER_BASE_URL);\n\n return baseUrl;\n }\n\n throw new Error(\"Could not resolve server URL\")\n}\n\nexport function getServerClientBaseUrl(): string {\n return clientBaseUrlOverride() ?? (process.env.MODE !== 'production' ? `http://localhost:5800` : PROD_CLIENT_BASE_URL)\n}\n\n// The library no longer ships URL helpers — hosts pass `serverBaseUrl` to\n// AiChatProvider explicitly. This stub remains only for legacy call sites\n// inside the carved code; remove once those are migrated.\nexport function getAgentServerBaseUrl(): string {\n return \"\";\n}\n\n/**\n * Resolves a relative API path to full URL when needed\n * @param relativePath - API path like \"/api/sessions\"\n * @returns Full URL for server, relative path for browser\n */\nexport function resolveApiUrl(relativePath: string): string {\n const baseUrl = getServerBaseUrl();\n\n // Ensure relativePath starts with /\n const cleanPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\n\n return `${baseUrl}${cleanPath}`;\n}\n\n/**\n * Gets environment info for debugging\n */\nexport function getEnvironmentInfo() {\n return {\n isBrowser: isBrowser(),\n isServer: isServer(),\n baseUrl: getServerBaseUrl(),\n userAgent: isBrowser() ? navigator.userAgent : 'Node.js',\n nodeVersion: isServer() ? process.version : 'N/A'\n };\n}\n"],"names":["getEnvVar","key","__vite_import_meta_env__","__name","getRandomUUID","ChatEventType","RunMode","ChatAction","EventType","GetEventTypeFromPythonName","name","GetEventTypeFromDotNetName","EventTypeDescriptions","ResponseType","AuthorType","ArtifactType","AgentType","AgentMode","AgentConfig","SkillLevel","ModelType","ModelConfig","AllInclusiveIcon","PsychologyIcon","FlashOnIcon","RocketLaunchIcon","SortByAlphaOutlined","GeneratingTokensOutlined","getModelVendor","modelId","id","getConnectionStateColor","connectionState","theme","agentBaseUrlOverride","clientBaseUrlOverride","PROD_CLIENT_BASE_URL","DEV_SERVER_CONFIG","ANALYTICS_AGENT_NAME","isBrowser","isServer","_a","getServerBaseUrl","getServerClientBaseUrl","getAgentServerBaseUrl","resolveApiUrl","relativePath","baseUrl","cleanPath","getEnvironmentInfo"],"mappings":"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"}