@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.
@@ -1 +1 @@
1
- {"version":3,"file":"httpSessionService-D9JXx3JD.js","sources":["../src/services/sessionEventDecoder.ts","../src/services/httpSessionService.ts"],"sourcesContent":["import { ServerEvent } from '../models/ServerEvent';\nimport { LlmEvent } from '../models/semanticKernelModel/models';\nimport { createEventSerializer } from '../models/semanticKernelModel/serializer';\nimport { EventType } from '../models/enums';\nimport type { Interaction } from '../models/Interaction';\nimport type { InteractionPart } from '../models/InteractionPart';\nimport type { Artifact } from '../models/Artifact';\n\n/**\n * Strip the persistence-only `$type: \"MongoDbEvent\"` marker from the wire\n * object before handing it to typedjson. The server's session-detail endpoint\n * returns base-class `Event` instances (not `MongoDbEvent`), but downstream\n * resources that come through other code paths sometimes carry that marker;\n * leaving it in confuses typedjson because it isn't registered in\n * `KNOWN_CONTENT_TYPES`.\n */\nfunction stripMongoDbDiscriminator(raw: unknown): unknown {\n if (raw === null || typeof raw !== 'object') return raw;\n const obj = raw as Record<string, unknown>;\n if (obj['$type'] === 'MongoDbEvent') {\n const { ['$type']: _drop, ...rest } = obj;\n return rest;\n }\n return obj;\n}\n\nfunction firstUserText(events: LlmEvent[]): string | undefined {\n for (const e of events) {\n if (e.role?.label?.toLowerCase() !== 'user') continue;\n const item = e.content?.items?.find(p => 'text' in p && typeof (p as Record<string, unknown>).text === 'string');\n if (item) return (item as { text?: string }).text;\n }\n return undefined;\n}\n\n// The .NET semantic-kernel metadata key that carries the model's reasoning\n// trace on persisted (consolidated) events. typedjson drops `metadata` on\n// KernelContent-derived items (it's undecorated), so the reasoning only\n// survives on the RAW wire object — we read it from there.\nconst REASONING_METADATA_KEY = 'ChatResponseMessage.ReasoningContent';\n\n/**\n * Pull the reasoning trace out of a raw wire event. The server duplicates it\n * onto the message `content.metadata` and onto each text item's `metadata`;\n * prefer the event-level copy, fall back to the first item that carries one.\n */\nfunction extractReasoning(rawEvent: unknown): string | undefined {\n const content = (rawEvent as { content?: Record<string, any> })?.content;\n if (!content) return undefined;\n const fromContent = content.metadata?.[REASONING_METADATA_KEY];\n if (typeof fromContent === 'string' && fromContent.trim()) return fromContent.trim();\n for (const item of content.items ?? []) {\n const r = item?.metadata?.[REASONING_METADATA_KEY];\n if (typeof r === 'string' && r.trim()) return r.trim();\n }\n return undefined;\n}\n\nfunction isFunctionCallType(t: EventType): boolean {\n return t === EventType.FunctionCall || t === EventType.PartialFunctionCall;\n}\n\n/**\n * Fold a FunctionResponse part onto the call part it answers, mirroring the\n * final state a live `merge` would have reached for that call: the call's\n * parsed `args`/`name`/`start` are preserved and the response's\n * `response`/`status`/`end` are layered on. eventType flips to\n * FunctionResponse, which is the completed-call shape the UI renders.\n */\nfunction foldResponseIntoCall(call: InteractionPart, response: InteractionPart): InteractionPart {\n return {\n ...call,\n eventType: EventType.FunctionResponse,\n functionDetails: {\n id: call.functionDetails!.id,\n name: response.functionDetails?.name ?? call.functionDetails!.name,\n args: call.functionDetails!.args ?? response.functionDetails?.args,\n text: call.functionDetails!.text,\n response: response.functionDetails?.response,\n status: response.functionDetails?.status ?? 'Done',\n start: call.functionDetails!.start,\n end: response.functionDetails?.end ?? call.functionDetails!.end,\n silent: call.functionDetails!.silent,\n },\n };\n}\n\n/**\n * Rebuilds the `Interaction[]` the chat UI renders from the historical event\n * log returned by <c>GET /sessions/{id}</c>.\n *\n * Unlike the live turn loop, this does NOT route events through\n * `InteractionService.merge`. The merge pipeline (and its `FlatParts` step) is\n * built for the *live* stream, where each event carries a single content item\n * arriving incrementally; it flattens every event down to one part. The\n * *persisted* log is different: the server stores consolidated blocks where a\n * single event's `content.items` holds many parts at once — e.g. a text\n * preamble plus several FunctionCalls. Running those through `merge` collapsed\n * each event to one part and silently dropped the rest (every function call in\n * a multi-item event disappeared on replay).\n *\n * This restore path instead reads *every* item as its own `InteractionPart`\n * (via `ServerEvent.parseFromTypedEvent`, which already maps one part per\n * item) and only applies the one piece of merge logic replay genuinely needs:\n * folding each FunctionResponse onto the call it answers, keyed by `callId`.\n * No copy-on-write cloning, no event-bus side effects, no streaming-append.\n */\nexport function decodeSessionEvents(rawEvents: unknown[]): Interaction[] {\n const serializer = createEventSerializer();\n\n // Parse + group by interactionId, preserving first-seen order so the\n // rendered timeline mirrors the wire-log order. Keep the typed LlmEvent\n // alongside the mapped ServerEvent — the former carries the role label\n // used to derive the interaction's question.\n const order: string[] = [];\n const grouped = new Map<string, { llm: LlmEvent[]; server: ServerEvent[]; raw: unknown[] }>();\n for (const raw of rawEvents) {\n const stripped = stripMongoDbDiscriminator(raw);\n const llmEvent = serializer.parse(stripped as Record<string, unknown>);\n if (!llmEvent) continue;\n const serverEvent = ServerEvent.parseFromTypedEvent(llmEvent);\n if (!serverEvent) continue;\n\n const key = serverEvent.interactionId ?? '__root__';\n let bucket = grouped.get(key);\n if (!bucket) {\n bucket = { llm: [], server: [], raw: [] };\n grouped.set(key, bucket);\n order.push(key);\n }\n bucket.llm.push(llmEvent);\n bucket.server.push(serverEvent);\n // Keep the stripped raw object — typedjson drops the item `metadata`\n // that holds the reasoning trace, so we recover it from here.\n bucket.raw.push(stripped);\n }\n\n const interactions: Interaction[] = [];\n for (const interactionId of order) {\n const { llm, server, raw } = grouped.get(interactionId)!;\n\n const parts: InteractionPart[] = [];\n const artifactData: Artifact[] = [];\n // callId → index in `parts` of the (possibly already folded) call part.\n const callIndex = new Map<string, number>();\n\n const pushPart = (part: InteractionPart) => {\n const stamped: InteractionPart = {\n ...part,\n id: `${parts.length + 1}-${interactionId}`,\n partial: false,\n isStillWriting: false,\n };\n parts.push(stamped);\n return parts.length - 1;\n };\n\n for (let i = 0; i < server.length; i++) {\n const event = server[i];\n\n // `user` events are the question (captured below as\n // interactionQuestion), and `system` events are injected context\n // (schema, instructions) — neither renders as a chat part. The\n // live turn loop never feeds these through merge either; only the\n // persisted log co-locates them under the turn's interactionId.\n const role = llm[i].role?.label?.toLowerCase();\n if (role === 'user' || role === 'system') {\n // The user/system text isn't a chat part (the question is captured as\n // interactionQuestion via firstUserText). But a user turn may carry a client-only\n // UI representation — a UserUiContent that ServerEvent mapped to a UserAnswer part —\n // which must re-hydrate on reload. Push those; drop everything else on this event.\n if (role === 'user') {\n for (const part of event.parts) {\n if (part.eventType === EventType.UserAnswer) pushPart(part);\n }\n }\n continue;\n }\n\n // Artifacts: dedupe by id, last write wins (same as the live merge).\n if (event.llmArtifacts && event.llmArtifacts.length > 0) {\n for (const llmArtifact of event.llmArtifacts) {\n const artifact = llmArtifact.toArtifact();\n const i = artifactData.findIndex(a => a.id === artifact.id);\n if (i === -1) artifactData.push(artifact);\n else artifactData[i] = artifact;\n }\n }\n\n // The model's reasoning trace for this step lives in the event's\n // metadata (dropped by typedjson — read from raw). It rides the\n // event's text item, so attach it to the first text part: a\n // non-empty answer keeps its body and carries the trace in the\n // thinking strip; an empty \"thinking-only\" step becomes a Thought.\n const reasoning = extractReasoning(raw[i]);\n let reasoningUsed = false;\n\n for (const part of event.parts) {\n const callId = part.functionDetails?.id;\n\n // A response folds onto its matching call rather than becoming\n // a separate part.\n if (part.eventType === EventType.FunctionResponse && callId && callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n parts[idx] = foldResponseIntoCall(parts[idx], part);\n continue;\n }\n\n // A client-only output sibling folds its payload onto the call it belongs to\n // (never a separate part). This is the persisted/replay counterpart of the live\n // StreamingFinalFunctionResultContent.clientOutput; a uiTool renderer reads it.\n if (part.eventType === EventType.FunctionClientOutput && callId) {\n if (callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n const prev = parts[idx];\n parts[idx] = {\n ...prev,\n functionDetails: {\n ...prev.functionDetails!,\n clientOutput: part.functionDetails?.clientOutput,\n },\n };\n }\n // No matching call (shouldn't happen — the call precedes its Tool message):\n // drop it rather than render a standalone part.\n continue;\n }\n\n // A repeated full call for an id we've already seen (e.g. a\n // full FunctionCall following a PartialFunctionCall) updates the\n // existing part in place instead of duplicating it.\n if (isFunctionCallType(part.eventType) && callId && callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n const prev = parts[idx];\n parts[idx] = {\n ...prev,\n eventType: part.eventType,\n functionDetails: { ...prev.functionDetails!, ...part.functionDetails! },\n };\n continue;\n }\n\n if (part.eventType === EventType.Text) {\n const hasText = !!part.text && part.text.length > 0;\n const attachReasoning = !!reasoning && !reasoningUsed;\n\n // Empty text with no reasoning to carry is a bare\n // placeholder — the consolidated log emits these alongside\n // function calls; dropping them keeps the timeline clean.\n if (!hasText && !attachReasoning && !part.thoughtDetails) {\n continue;\n }\n\n if (attachReasoning) {\n pushPart({\n ...part,\n eventType: hasText ? EventType.Text : EventType.Thought,\n thoughtDetails: { text: reasoning! },\n });\n reasoningUsed = true;\n continue;\n }\n\n pushPart(part);\n continue;\n }\n\n const idx = pushPart(part);\n if (isFunctionCallType(part.eventType) && callId) {\n callIndex.set(callId, idx);\n }\n }\n\n // Reasoning with no text item to ride on (rare) — surface it so\n // the trace isn't silently lost.\n if (reasoning && !reasoningUsed) {\n pushPart({\n id: '', author: event.author, eventType: EventType.Thought,\n created: event.created, partial: false, isStillWriting: false,\n mustPush: false, textAppendable: false,\n thoughtDetails: { text: reasoning },\n });\n }\n }\n\n const functionMap = new Map<string, InteractionPart>();\n for (const [callId, idx] of callIndex) functionMap.set(callId, parts[idx]);\n\n interactions.push({\n created: server[0]?.created ?? new Date(),\n interactionId,\n artifactData,\n partial: false,\n turn_complete: true,\n parts,\n version: server.length,\n functionMap,\n interactionQuestion: firstUserText(llm) ?? '',\n });\n }\n\n return interactions;\n}\n","import { ChatSession, Customer, decodeSessionEvents, Interaction, ISessionService } from \"..\";\n\n/**\n * Wire shape returned by `GET /sessions` and the `.header` of `GET /sessions/{id}`.\n * Mirrors `Envision.SemanticKernel.Models.Session.SessionHeader` on the C#\n * side after the default camelCase rename ASP.NET Core applies on serialize.\n */\ninterface SessionHeaderWire {\n id: string;\n created?: string | null;\n updatedAt?: string | null;\n user?: ChatSession['user'];\n customer?: ChatSession['customer'];\n overview?: string | null;\n agentType?: ChatSession['agentType'];\n userDescription?: string | null;\n lastQuestion?: string | null;\n activityCount?: number;\n lastGeneratedOverview?: string | null;\n artifacts?: string[];\n}\n\ninterface SessionDetailWire {\n header: SessionHeaderWire;\n events: unknown[];\n}\n\nfunction headerToChatSession(h: SessionHeaderWire, interactions: Interaction[] = []): ChatSession {\n return {\n id: h.id,\n browserScopeId: h.id,\n fullyLoaded: interactions.length > 0,\n interactions,\n artifacts: h.artifacts ?? [],\n overview: h.overview ?? '',\n agentType: h.agentType as ChatSession['agentType'],\n userDescription: h.userDescription ?? undefined,\n lastQuestion: h.lastQuestion ?? undefined,\n customer: h.customer ?? null,\n activityCount: h.activityCount ?? 0,\n user: h.user as ChatSession['user'],\n lastGeneratedOverview: h.lastGeneratedOverview ? new Date(h.lastGeneratedOverview) : null,\n sessionRunMode: 'normal' as ChatSession['sessionRunMode'],\n created: h.created ? new Date(h.created) : undefined,\n updatedAt: h.updatedAt ? new Date(h.updatedAt) : undefined,\n } as ChatSession;\n}\n\n/**\n * Minimal ISessionService over the WSServer's REST `/sessions` endpoints.\n *\n * Reads from the unified `Sessions` collection. The list endpoint returns\n * header projections; the detail endpoint returns header + the raw\n * `LlmEvent[]` log which we replay through `decodeSessionEvents` to rebuild\n * the chat UI's `Interaction[]`. Mutation methods are no-ops — write paths\n * are exercised by the live agent turn loop and the WS connection, not by\n * REST calls from the picker.\n */\nexport class HttpSessionService implements ISessionService {\n private serverBaseUrl: string;\n private accessToken: string;\n\n constructor(serverBaseUrl: string, accessToken: string) {\n this.serverBaseUrl = serverBaseUrl.replace(/\\/$/, '');\n this.accessToken = accessToken;\n }\n\n private get headers(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.accessToken}`,\n };\n }\n\n async getAllSessions(): Promise<ChatSession[]> {\n const r = await fetch(`${this.serverBaseUrl}/sessions?top=50`, {\n headers: this.headers,\n });\n if (!r.ok) throw new Error(`getAllSessions HTTP ${r.status}`);\n const headers = (await r.json()) as SessionHeaderWire[];\n return headers.map(h => headerToChatSession(h));\n }\n\n async retrieveSession(sessionId: string): Promise<ChatSession | null> {\n const r = await fetch(`${this.serverBaseUrl}/sessions/${sessionId}`, {\n headers: this.headers,\n });\n if (r.status === 404) return null;\n if (!r.ok) throw new Error(`retrieveSession HTTP ${r.status}`);\n const detail = (await r.json()) as SessionDetailWire;\n const interactions = decodeSessionEvents(detail.events ?? []);\n // The decoder doesn't know the sessionId — stamp it now so downstream\n // consumers (artifact loaders, debugging surfaces) can correlate back.\n for (const it of interactions) it.sessionId = detail.header.id;\n return headerToChatSession(detail.header, interactions);\n }\n\n async getLastUsedSession(): Promise<ChatSession | null> {\n const all = await this.getAllSessions();\n return all[0] ?? null;\n }\n\n // — Most write paths are inert: after the dual-collection collapse the\n // server populates Session UI-header fields automatically during the turn.\n // The two exceptions are rename (`patchSession` → PATCH /Session/Overview)\n // and delete (`removeSession` → DELETE /Session/{id}), which are driven by\n // the picker UI and have no WS-side equivalent. —\n\n async removeSession(sessionId: string): Promise<void> {\n const r = await fetch(`${this.serverBaseUrl}/Session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n headers: this.headers,\n });\n if (!r.ok) throw new Error(`removeSession HTTP ${r.status}`);\n }\n async createSession(_sessionId: string, _agentName: string, _customer?: Customer): Promise<ChatSession | null> { return null; }\n async createAgentSession(): Promise<any> { return { sessionId: null }; }\n async closeSession(_sessionId: string): Promise<void> { /* no-op */ }\n async generateOverviewForCurrentSession(_sys: string, _model: string): Promise<string | null> { return null; }\n async storeSession(session: ChatSession): Promise<any> { return { data: session }; }\n async patchSession(sessionId: string, partial: Partial<ChatSession>): Promise<void> {\n // SessionController.PatchOverview binds sessionId/overview from the\n // query string (no body, no route params). Anything else on `partial`\n // has no server-side endpoint yet — ignore it instead of guessing.\n if (partial.overview == null) return;\n const url =\n `${this.serverBaseUrl}/Session/Overview` +\n `?sessionId=${encodeURIComponent(sessionId)}` +\n `&overview=${encodeURIComponent(partial.overview)}`;\n const r = await fetch(url, { method: 'PATCH', headers: this.headers });\n if (!r.ok) throw new Error(`patchSession HTTP ${r.status}`);\n }\n delayedPatchActiveSession(_partial: Partial<ChatSession>): void { /* no-op */ }\n\n async patchActiveSession(_partial: Partial<ChatSession>): Promise<ChatSession | null> {\n return Promise.resolve(null);\n }\n async getLlmSessionInformation(): Promise<any> { return { id: null, instructionSummaries: [] }; }\n transformIntoInstances(session: ChatSession): ChatSession { return session; }\n}\n"],"names":["stripMongoDbDiscriminator","raw","obj","_drop","rest","__name","firstUserText","events","e","_b","_a","item","_d","_c","p","REASONING_METADATA_KEY","extractReasoning","rawEvent","content","fromContent","r","isFunctionCallType","EventType","foldResponseIntoCall","call","response","_e","decodeSessionEvents","rawEvents","serializer","createEventSerializer","order","grouped","stripped","llmEvent","serverEvent","ServerEvent","key","bucket","interactions","interactionId","llm","server","parts","artifactData","callIndex","pushPart","part","stamped","i","event","role","llmArtifact","artifact","a","reasoning","reasoningUsed","callId","idx","prev","hasText","attachReasoning","functionMap","headerToChatSession","h","_HttpSessionService","serverBaseUrl","accessToken","__publicField","sessionId","detail","it","_sessionId","_agentName","_customer","_sys","_model","session","partial","url","_partial","HttpSessionService"],"mappings":"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"}
1
+ {"version":3,"file":"httpSessionService-BuT5FlDc.js","sources":["../src/services/sessionEventDecoder.ts","../src/services/httpSessionService.ts"],"sourcesContent":["import { ServerEvent } from '../models/ServerEvent';\nimport { LlmEvent } from '../models/semanticKernelModel/models';\nimport { createEventSerializer } from '../models/semanticKernelModel/serializer';\nimport { EventType } from '../models/enums';\nimport type { Interaction } from '../models/Interaction';\nimport type { InteractionPart } from '../models/InteractionPart';\nimport type { Artifact } from '../models/Artifact';\n\n/**\n * Strip the persistence-only `$type: \"MongoDbEvent\"` marker from the wire\n * object before handing it to typedjson. The server's session-detail endpoint\n * returns base-class `Event` instances (not `MongoDbEvent`), but downstream\n * resources that come through other code paths sometimes carry that marker;\n * leaving it in confuses typedjson because it isn't registered in\n * `KNOWN_CONTENT_TYPES`.\n */\nfunction stripMongoDbDiscriminator(raw: unknown): unknown {\n if (raw === null || typeof raw !== 'object') return raw;\n const obj = raw as Record<string, unknown>;\n if (obj['$type'] === 'MongoDbEvent') {\n const { ['$type']: _drop, ...rest } = obj;\n return rest;\n }\n return obj;\n}\n\nfunction firstUserText(events: LlmEvent[]): string | undefined {\n for (const e of events) {\n if (e.role?.label?.toLowerCase() !== 'user') continue;\n const item = e.content?.items?.find(p => 'text' in p && typeof (p as Record<string, unknown>).text === 'string');\n if (item) return (item as { text?: string }).text;\n }\n return undefined;\n}\n\n// The .NET semantic-kernel metadata key that carries the model's reasoning\n// trace on persisted (consolidated) events. typedjson drops `metadata` on\n// KernelContent-derived items (it's undecorated), so the reasoning only\n// survives on the RAW wire object — we read it from there.\nconst REASONING_METADATA_KEY = 'ChatResponseMessage.ReasoningContent';\n\n/**\n * Pull the reasoning trace out of a raw wire event. The server duplicates it\n * onto the message `content.metadata` and onto each text item's `metadata`;\n * prefer the event-level copy, fall back to the first item that carries one.\n */\nfunction extractReasoning(rawEvent: unknown): string | undefined {\n const content = (rawEvent as { content?: Record<string, any> })?.content;\n if (!content) return undefined;\n const fromContent = content.metadata?.[REASONING_METADATA_KEY];\n if (typeof fromContent === 'string' && fromContent.trim()) return fromContent.trim();\n for (const item of content.items ?? []) {\n const r = item?.metadata?.[REASONING_METADATA_KEY];\n if (typeof r === 'string' && r.trim()) return r.trim();\n }\n return undefined;\n}\n\nfunction isFunctionCallType(t: EventType): boolean {\n return t === EventType.FunctionCall || t === EventType.PartialFunctionCall;\n}\n\n/**\n * Fold a FunctionResponse part onto the call part it answers, mirroring the\n * final state a live `merge` would have reached for that call: the call's\n * parsed `args`/`name`/`start` are preserved and the response's\n * `response`/`status`/`end` are layered on. eventType flips to\n * FunctionResponse, which is the completed-call shape the UI renders.\n */\nfunction foldResponseIntoCall(call: InteractionPart, response: InteractionPart): InteractionPart {\n return {\n ...call,\n eventType: EventType.FunctionResponse,\n functionDetails: {\n id: call.functionDetails!.id,\n name: response.functionDetails?.name ?? call.functionDetails!.name,\n args: call.functionDetails!.args ?? response.functionDetails?.args,\n text: call.functionDetails!.text,\n response: response.functionDetails?.response,\n status: response.functionDetails?.status ?? 'Done',\n start: call.functionDetails!.start,\n end: response.functionDetails?.end ?? call.functionDetails!.end,\n silent: call.functionDetails!.silent,\n },\n };\n}\n\n/**\n * Rebuilds the `Interaction[]` the chat UI renders from the historical event\n * log returned by <c>GET /sessions/{id}</c>.\n *\n * Unlike the live turn loop, this does NOT route events through\n * `InteractionService.merge`. The merge pipeline (and its `FlatParts` step) is\n * built for the *live* stream, where each event carries a single content item\n * arriving incrementally; it flattens every event down to one part. The\n * *persisted* log is different: the server stores consolidated blocks where a\n * single event's `content.items` holds many parts at once — e.g. a text\n * preamble plus several FunctionCalls. Running those through `merge` collapsed\n * each event to one part and silently dropped the rest (every function call in\n * a multi-item event disappeared on replay).\n *\n * This restore path instead reads *every* item as its own `InteractionPart`\n * (via `ServerEvent.parseFromTypedEvent`, which already maps one part per\n * item) and only applies the one piece of merge logic replay genuinely needs:\n * folding each FunctionResponse onto the call it answers, keyed by `callId`.\n * No copy-on-write cloning, no event-bus side effects, no streaming-append.\n */\nexport function decodeSessionEvents(rawEvents: unknown[]): Interaction[] {\n const serializer = createEventSerializer();\n\n // Parse + group by interactionId, preserving first-seen order so the\n // rendered timeline mirrors the wire-log order. Keep the typed LlmEvent\n // alongside the mapped ServerEvent — the former carries the role label\n // used to derive the interaction's question.\n const order: string[] = [];\n const grouped = new Map<string, { llm: LlmEvent[]; server: ServerEvent[]; raw: unknown[] }>();\n for (const raw of rawEvents) {\n const stripped = stripMongoDbDiscriminator(raw);\n const llmEvent = serializer.parse(stripped as Record<string, unknown>);\n if (!llmEvent) continue;\n const serverEvent = ServerEvent.parseFromTypedEvent(llmEvent);\n if (!serverEvent) continue;\n\n const key = serverEvent.interactionId ?? '__root__';\n let bucket = grouped.get(key);\n if (!bucket) {\n bucket = { llm: [], server: [], raw: [] };\n grouped.set(key, bucket);\n order.push(key);\n }\n bucket.llm.push(llmEvent);\n bucket.server.push(serverEvent);\n // Keep the stripped raw object — typedjson drops the item `metadata`\n // that holds the reasoning trace, so we recover it from here.\n bucket.raw.push(stripped);\n }\n\n const interactions: Interaction[] = [];\n for (const interactionId of order) {\n const { llm, server, raw } = grouped.get(interactionId)!;\n\n const parts: InteractionPart[] = [];\n const artifactData: Artifact[] = [];\n // callId → index in `parts` of the (possibly already folded) call part.\n const callIndex = new Map<string, number>();\n\n const pushPart = (part: InteractionPart) => {\n const stamped: InteractionPart = {\n ...part,\n id: `${parts.length + 1}-${interactionId}`,\n partial: false,\n isStillWriting: false,\n };\n parts.push(stamped);\n return parts.length - 1;\n };\n\n for (let i = 0; i < server.length; i++) {\n const event = server[i];\n\n // `user` events are the question (captured below as\n // interactionQuestion), and `system` events are injected context\n // (schema, instructions) — neither renders as a chat part. The\n // live turn loop never feeds these through merge either; only the\n // persisted log co-locates them under the turn's interactionId.\n const role = llm[i].role?.label?.toLowerCase();\n if (role === 'user' || role === 'system') {\n // The user/system text isn't a chat part (the question is captured as\n // interactionQuestion via firstUserText). But a user turn may carry a client-only\n // UI representation — a UserUiContent that ServerEvent mapped to a UserAnswer part —\n // which must re-hydrate on reload. Push those; drop everything else on this event.\n if (role === 'user') {\n for (const part of event.parts) {\n if (part.eventType === EventType.UserAnswer) pushPart(part);\n }\n }\n continue;\n }\n\n // Artifacts: dedupe by id, last write wins (same as the live merge).\n if (event.llmArtifacts && event.llmArtifacts.length > 0) {\n for (const llmArtifact of event.llmArtifacts) {\n const artifact = llmArtifact.toArtifact();\n const i = artifactData.findIndex(a => a.id === artifact.id);\n if (i === -1) artifactData.push(artifact);\n else artifactData[i] = artifact;\n }\n }\n\n // The model's reasoning trace for this step lives in the event's\n // metadata (dropped by typedjson — read from raw). It rides the\n // event's text item, so attach it to the first text part: a\n // non-empty answer keeps its body and carries the trace in the\n // thinking strip; an empty \"thinking-only\" step becomes a Thought.\n const reasoning = extractReasoning(raw[i]);\n let reasoningUsed = false;\n\n for (const part of event.parts) {\n const callId = part.functionDetails?.id;\n\n // A response folds onto its matching call rather than becoming\n // a separate part.\n if (part.eventType === EventType.FunctionResponse && callId && callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n parts[idx] = foldResponseIntoCall(parts[idx], part);\n continue;\n }\n\n // A client-only output sibling folds its payload onto the call it belongs to\n // (never a separate part). This is the persisted/replay counterpart of the live\n // StreamingFinalFunctionResultContent.clientOutput; a uiTool renderer reads it.\n if (part.eventType === EventType.FunctionClientOutput && callId) {\n if (callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n const prev = parts[idx];\n parts[idx] = {\n ...prev,\n functionDetails: {\n ...prev.functionDetails!,\n clientOutput: part.functionDetails?.clientOutput,\n },\n };\n }\n // No matching call (shouldn't happen — the call precedes its Tool message):\n // drop it rather than render a standalone part.\n continue;\n }\n\n // A repeated full call for an id we've already seen (e.g. a\n // full FunctionCall following a PartialFunctionCall) updates the\n // existing part in place instead of duplicating it.\n if (isFunctionCallType(part.eventType) && callId && callIndex.has(callId)) {\n const idx = callIndex.get(callId)!;\n const prev = parts[idx];\n parts[idx] = {\n ...prev,\n eventType: part.eventType,\n functionDetails: { ...prev.functionDetails!, ...part.functionDetails! },\n };\n continue;\n }\n\n if (part.eventType === EventType.Text) {\n const hasText = !!part.text && part.text.length > 0;\n const attachReasoning = !!reasoning && !reasoningUsed;\n\n // Empty text with no reasoning to carry is a bare\n // placeholder — the consolidated log emits these alongside\n // function calls; dropping them keeps the timeline clean.\n if (!hasText && !attachReasoning && !part.thoughtDetails) {\n continue;\n }\n\n if (attachReasoning) {\n pushPart({\n ...part,\n eventType: hasText ? EventType.Text : EventType.Thought,\n thoughtDetails: { text: reasoning! },\n });\n reasoningUsed = true;\n continue;\n }\n\n pushPart(part);\n continue;\n }\n\n const idx = pushPart(part);\n if (isFunctionCallType(part.eventType) && callId) {\n callIndex.set(callId, idx);\n }\n }\n\n // Reasoning with no text item to ride on (rare) — surface it so\n // the trace isn't silently lost.\n if (reasoning && !reasoningUsed) {\n pushPart({\n id: '', author: event.author, eventType: EventType.Thought,\n created: event.created, partial: false, isStillWriting: false,\n mustPush: false, textAppendable: false,\n thoughtDetails: { text: reasoning },\n });\n }\n }\n\n const functionMap = new Map<string, InteractionPart>();\n for (const [callId, idx] of callIndex) functionMap.set(callId, parts[idx]);\n\n interactions.push({\n created: server[0]?.created ?? new Date(),\n interactionId,\n artifactData,\n partial: false,\n turn_complete: true,\n parts,\n version: server.length,\n functionMap,\n interactionQuestion: firstUserText(llm) ?? '',\n });\n }\n\n return interactions;\n}\n","import { ChatSession, Customer, decodeSessionEvents, Interaction, ISessionService } from \"..\";\n\n/**\n * Wire shape returned by `GET /sessions` and the `.header` of `GET /sessions/{id}`.\n * Mirrors `Envision.SemanticKernel.Models.Session.SessionHeader` on the C#\n * side after the default camelCase rename ASP.NET Core applies on serialize.\n */\ninterface SessionHeaderWire {\n id: string;\n created?: string | null;\n updatedAt?: string | null;\n user?: ChatSession['user'];\n customer?: ChatSession['customer'];\n overview?: string | null;\n agentType?: ChatSession['agentType'];\n userDescription?: string | null;\n lastQuestion?: string | null;\n activityCount?: number;\n lastGeneratedOverview?: string | null;\n artifacts?: string[];\n}\n\ninterface SessionDetailWire {\n header: SessionHeaderWire;\n events: unknown[];\n}\n\nfunction headerToChatSession(h: SessionHeaderWire, interactions: Interaction[] = []): ChatSession {\n return {\n id: h.id,\n browserScopeId: h.id,\n fullyLoaded: interactions.length > 0,\n interactions,\n artifacts: h.artifacts ?? [],\n overview: h.overview ?? '',\n agentType: h.agentType as ChatSession['agentType'],\n userDescription: h.userDescription ?? undefined,\n lastQuestion: h.lastQuestion ?? undefined,\n customer: h.customer ?? null,\n activityCount: h.activityCount ?? 0,\n user: h.user as ChatSession['user'],\n lastGeneratedOverview: h.lastGeneratedOverview ? new Date(h.lastGeneratedOverview) : null,\n sessionRunMode: 'normal' as ChatSession['sessionRunMode'],\n created: h.created ? new Date(h.created) : undefined,\n updatedAt: h.updatedAt ? new Date(h.updatedAt) : undefined,\n } as ChatSession;\n}\n\n/**\n * Minimal ISessionService over the WSServer's REST `/sessions` endpoints.\n *\n * Reads from the unified `Sessions` collection. The list endpoint returns\n * header projections; the detail endpoint returns header + the raw\n * `LlmEvent[]` log which we replay through `decodeSessionEvents` to rebuild\n * the chat UI's `Interaction[]`. Mutation methods are no-ops — write paths\n * are exercised by the live agent turn loop and the WS connection, not by\n * REST calls from the picker.\n */\nexport class HttpSessionService implements ISessionService {\n private serverBaseUrl: string;\n private accessToken: string;\n\n constructor(serverBaseUrl: string, accessToken: string) {\n this.serverBaseUrl = serverBaseUrl.replace(/\\/$/, '');\n this.accessToken = accessToken;\n }\n\n private get headers(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.accessToken}`,\n };\n }\n\n async getAllSessions(): Promise<ChatSession[]> {\n const r = await fetch(`${this.serverBaseUrl}/sessions?top=50`, {\n headers: this.headers,\n });\n if (!r.ok) throw new Error(`getAllSessions HTTP ${r.status}`);\n const headers = (await r.json()) as SessionHeaderWire[];\n return headers.map(h => headerToChatSession(h));\n }\n\n async retrieveSession(sessionId: string): Promise<ChatSession | null> {\n const r = await fetch(`${this.serverBaseUrl}/sessions/${sessionId}`, {\n headers: this.headers,\n });\n if (r.status === 404) return null;\n if (!r.ok) throw new Error(`retrieveSession HTTP ${r.status}`);\n const detail = (await r.json()) as SessionDetailWire;\n const interactions = decodeSessionEvents(detail.events ?? []);\n // The decoder doesn't know the sessionId — stamp it now so downstream\n // consumers (artifact loaders, debugging surfaces) can correlate back.\n for (const it of interactions) it.sessionId = detail.header.id;\n return headerToChatSession(detail.header, interactions);\n }\n\n async getLastUsedSession(): Promise<ChatSession | null> {\n const all = await this.getAllSessions();\n return all[0] ?? null;\n }\n\n // — Most write paths are inert: after the dual-collection collapse the\n // server populates Session UI-header fields automatically during the turn.\n // The two exceptions are rename (`patchSession` → PATCH /Session/Overview)\n // and delete (`removeSession` → DELETE /Session/{id}), which are driven by\n // the picker UI and have no WS-side equivalent. —\n\n async removeSession(sessionId: string): Promise<void> {\n const r = await fetch(`${this.serverBaseUrl}/Session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n headers: this.headers,\n });\n if (!r.ok) throw new Error(`removeSession HTTP ${r.status}`);\n }\n async createSession(_sessionId: string, _agentName: string, _customer?: Customer): Promise<ChatSession | null> { return null; }\n async createAgentSession(): Promise<any> { return { sessionId: null }; }\n async closeSession(_sessionId: string): Promise<void> { /* no-op */ }\n async generateOverviewForCurrentSession(_sys: string, _model: string): Promise<string | null> { return null; }\n async storeSession(session: ChatSession): Promise<any> { return { data: session }; }\n async patchSession(sessionId: string, partial: Partial<ChatSession>): Promise<void> {\n // SessionController.PatchOverview binds sessionId/overview from the\n // query string (no body, no route params). Anything else on `partial`\n // has no server-side endpoint yet — ignore it instead of guessing.\n if (partial.overview == null) return;\n const url =\n `${this.serverBaseUrl}/Session/Overview` +\n `?sessionId=${encodeURIComponent(sessionId)}` +\n `&overview=${encodeURIComponent(partial.overview)}`;\n const r = await fetch(url, { method: 'PATCH', headers: this.headers });\n if (!r.ok) throw new Error(`patchSession HTTP ${r.status}`);\n }\n delayedPatchActiveSession(_partial: Partial<ChatSession>): void { /* no-op */ }\n\n async patchActiveSession(_partial: Partial<ChatSession>): Promise<ChatSession | null> {\n return Promise.resolve(null);\n }\n async getLlmSessionInformation(): Promise<any> { return { id: null, instructionSummaries: [] }; }\n transformIntoInstances(session: ChatSession): ChatSession { return session; }\n}\n"],"names":["stripMongoDbDiscriminator","raw","obj","_drop","rest","__name","firstUserText","events","e","_b","_a","item","_d","_c","p","REASONING_METADATA_KEY","extractReasoning","rawEvent","content","fromContent","r","isFunctionCallType","EventType","foldResponseIntoCall","call","response","_e","decodeSessionEvents","rawEvents","serializer","createEventSerializer","order","grouped","stripped","llmEvent","serverEvent","ServerEvent","key","bucket","interactions","interactionId","llm","server","parts","artifactData","callIndex","pushPart","part","stamped","i","event","role","llmArtifact","artifact","a","reasoning","reasoningUsed","callId","idx","prev","hasText","attachReasoning","functionMap","headerToChatSession","h","_HttpSessionService","serverBaseUrl","accessToken","__publicField","sessionId","detail","it","_sessionId","_agentName","_customer","_sys","_model","session","partial","url","_partial","HttpSessionService"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import "reflect-metadata";
2
- import { C as s, F as o, a as n, I as r, L as i, S as c, b as l, c as p, d as S, e as C, T as A, f as d, g, h as I, i as v, s as E, j as h } from "./serializer-C1uBjgTd.js";
2
+ import { C as s, F as o, a as n, I as r, L as i, S as c, b as l, c as p, d as S, e as C, T as A, f as d, g, h as I, i as v, s as E, j as h } from "./serializer-BPina6fX.js";
3
3
  import { A as T, a as u, C as L, M as x, b as P, S as R, i as f } from "./Memory-DjLZqgbF.js";
4
4
  import { C as y, C as M } from "./ClientMessage-EKgfuTp8.js";
5
5
  import { C as D, P as B } from "./Prompt-DZb7OaPp.js";
6
- import { A as F, a as b, b as k, c as N, d as H, e as G, C as O, f as W, D as w, E as z, g as J, G as j, h as q, M as K, i as X, R as Y, j as Q, S as Z, l as $, m as ee, n as ae, o as te, p as se, q as oe, r as ne, s as re, t as ie, u as ce } from "./environmentUtils-BaKw5_VD.js";
7
- import { A as pe, a as Se, E as Ce, H as Ae, I as de, L as ge, W as Ie } from "./httpArtifactService-DFlQzSgN.js";
6
+ import { A as F, a as b, b as k, c as N, d as H, e as G, C as O, f as W, D as w, E as z, g as J, G as j, h as q, M as K, i as X, R as Y, j as Q, S as Z, l as $, m as ee, n as ae, o as te, p as se, q as oe, r as ne, s as re, t as ie, u as ce } from "./environmentUtils-CUVZ6Dq1.js";
7
+ import { A as pe, a as Se, E as Ce, H as Ae, I as de, L as ge, W as Ie } from "./httpArtifactService-B668XBHO.js";
8
8
  import { A as Ee } from "./artifactHtmlHandler-CMQJf1cX.js";
9
- import { H as me, d as Te } from "./httpSessionService-D9JXx3JD.js";
9
+ import { H as me, d as Te } from "./httpSessionService-BuT5FlDc.js";
10
10
  import { APPBAR_V2_HEIGHT as Le, AgentActivityV2 as xe, AiChat as Pe, AiChatDrawer as Re, AiChatFloating as fe, AiChatFloatingV2 as Ue, AiChatProvider as ye, AiChatServiceContext as Me, AiChatV2Pane as _e, AppBarV2 as De, AppRailV2 as Be, AppShellV2 as Ve, ArtifactRender as Fe, BoxedPart as be, BrainIcon as ke, ChartIcon as Ne, ChatIcon as He, ChatPane as Ge, ChatsHistoryV2 as Oe, CheckIcon as We, ChevronIcon as we, ChevronRightIcon as ze, CloseIcon as Je, CodeIcon as je, ComposerIcon as qe, DEFAULT_PART_RENDERERS as Ke, DashboardIcon as Xe, DataExplorerIcon as Ye, DelayTextComponent as Qe, EnvironmentProvider as Ze, FileIcon as $e, FunctionPart as ea, GlobeIcon as aa, HistoryIcon as ta, IDLE_TIMEOUT as sa, InertEnvironmentProvider as oa, JsxErrorBoundary as na, LIVE_TSX_DEFAULT_MAX_CHARS_FOR_FULL as ra, LastPromptsV2 as ia, LinearBackgroundProgress as ca, LinearProgressBarWithMarkers as la, ListCheckIcon as pa, LiveJsxBlock as Sa, LiveTsxConfigProvider as Ca, LlmResponseRender as Aa, LoadingDots as da, LockClosedIcon as ga, LockOpenIcon as Ia, MOBILE_NAV_DEFAULT as va, MarkdownExtended as Ea, MenuIcon as ha, Message as ma, MobileDrawerV2 as Ta, PanelIcon as ua, PauseIcon as La, PinIcon as xa, PlusIcon as Pa, PromptDateMarkers as Ra, PromptV2 as fa, RunProgressPanelV2 as Ua, RunProgressStripV2 as ya, SearchIcon as Ma, SendIcon as _a, SessionStateManagerService as Da, SparkleIcon as Ba, Sparkline as Va, StopIcon as Fa, Stopwatch as ba, SubAgentBox as ka, SubAgentBoxV2 as Na, SuspendedPart as Ha, TableIcon as Ga, TaskListV2 as Oa, TerminalIcon as Wa, TextPart as wa, ThoughtPart as za, ToolIcon as Ja, TrashIcon as ja, UiToolDispatcher as qa, UsersIcon as Ka, V2_CHART_PALETTE as Xa, WARNING_THRESHOLD as Ya, WaitingPart as Qa, classifyPart as Za, configureFriendlyMapping as $a, createAiChatSessionStore as et, createAiChatSessionStore as at, createUiToolRegistry as tt, extendDefaultScope as st, extendModuleRegistry as ot, getDefaultJsxScope as nt, getFriendlyLabel as rt, parseClientOutput as it, parseContentBlocks as ct, parseUiArgs as lt, useAiChatServices as pt, useAiChatSessionStore as St, useEnvironment as Ct, useEnvironmentOptional as At, useLiveTsxMaxCharsForFull as dt, useResponsiveLayout as gt, v2Card as It, v2Chip as vt, v2IconBtn as Et, v2MonoMeta as ht, v2SectionLabel as mt, v2Theme as Tt } from "./components.js";
11
11
  import { u as Lt, a as xt, b as Pt, c as Rt } from "./useContainerWidth-0EA-kdzl.js";
12
- import { A as Ut, a as yt, b as Mt, G as _t, d as Dt, c as Bt, e as Vt, f as Ft, g as bt, h as kt, i as Nt, j as Ht, k as Gt, l as Ot, m as Wt, n as wt, o as zt, p as Jt, q as jt, r as qt, s as Kt, t as Xt, u as Yt, v as Qt } from "./auth-DbmLacBc.js";
12
+ import { A as Ut, a as yt, b as Mt, G as _t, d as Dt, c as Bt, e as Vt, f as Ft, g as bt, h as kt, i as Nt, j as Ht, k as Gt, l as Ot, m as Wt, n as wt, o as zt, p as Jt, q as jt, r as qt, s as Kt, t as Xt, u as Yt, v as Qt } from "./auth-GFZAFz7L.js";
13
13
  import { S as $t, c as es, a as as, e as ts, b as ss, i as os, p as ns, d as rs, s as is, h as cs, t as ls } from "./promptHighlight-BHSQkdFs.js";
14
- import { u as Ss } from "./useChatSessions-C1rHmRuS.js";
14
+ import { u as Ss } from "./useChatSessions-DsHPo0GV.js";
15
15
  import { Score as As } from "./interfaces.js";
16
16
  export {
17
17
  Ut as ALLOWED_DOMAINS,
package/dist/models.js CHANGED
@@ -1,8 +1,8 @@
1
- import { C as a, F as s, a as n, I as o, L as i, S as r, b as C, c as l, d as p, e as S, T as g, f as m, g as T, h as c, i as y, s as E, j as d } from "./serializer-C1uBjgTd.js";
1
+ import { C as a, F as s, a as n, I as o, L as i, S as r, b as C, c as l, d as p, e as S, T as g, f as m, g as T, h as c, i as y, s as E, j as d } from "./serializer-BPina6fX.js";
2
2
  import { A as M, a as v, C as f, M as u, b as x, S as h, i as R } from "./Memory-DjLZqgbF.js";
3
3
  import { C as F, C as U } from "./ClientMessage-EKgfuTp8.js";
4
4
  import { C as L, P as N } from "./Prompt-DZb7OaPp.js";
5
- import { a as G, b as I, c as _, d as j, e as D, C as k, f as B, E as J, g as K, G as V, h as q, M as w, i as H, R as O, j as Q, S as W, m as X, p as Y } from "./environmentUtils-BaKw5_VD.js";
5
+ import { a as G, b as I, c as _, d as j, e as D, C as k, f as B, E as J, g as K, G as V, h as q, M as w, i as H, R as O, j as Q, S as W, m as X, p as Y } from "./environmentUtils-CUVZ6Dq1.js";
6
6
  export {
7
7
  M as Account,
8
8
  G as AgentConfig,